xiaozhi-client 1.7.11-beta.0 → 1.7.12-beta.1
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/WebServerStandalone.js +1 -1
- package/dist/WebServerStandalone.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/package.json +2 -2
- package/package.json +2 -2
- package/web/dist/assets/{index-CWZK78QG.js → index-Cb1nqXtT.js} +3 -3
- package/web/dist/assets/index-Cb1nqXtT.js.map +1 -0
- package/web/dist/index.html +1 -1
- package/web/dist/assets/index-CWZK78QG.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -93,7 +93,7 @@ data: ${r}
|
|
|
93
93
|
</div>
|
|
94
94
|
</body>
|
|
95
95
|
</html>
|
|
96
|
-
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&pr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var dr,eo=C(()=>{"use strict";P();dr=class{static{c(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=p.withTag("StatusApiHandler"),this.statusService=e}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return this.logger.debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getClientStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return this.logger.debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getRestartStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return this.logger.debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async checkClientConnected(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.json(this.createSuccessResponse({connected:t}))}catch(t){this.logger.error("\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_CONNECTION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25");return e.json(r,500)}}async getLastHeartbeat(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return this.logger.debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.json(this.createSuccessResponse({lastHeartbeat:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25:",t);let r=this.createErrorResponse("HEARTBEAT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25");return e.json(r,500)}}async getActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return this.logger.debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,500)}}async updateClientStatus(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object"){let r=this.createErrorResponse("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return e.json(r,400)}return this.statusService.updateClientInfo(t,"http-api"),this.logger.info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,400)}}async setActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await e.req.json();if(!Array.isArray(t)){let r=this.createErrorResponse("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");return e.json(r,400)}return this.statusService.setActiveMCPServers(t),this.logger.info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_UPDATE_ERROR",t instanceof Error?t.message:"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,400)}}async resetStatus(e){try{return this.logger.info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),this.logger.info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u7F6E\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_RESET_ERROR",t instanceof Error?t.message:"\u91CD\u7F6E\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}}});var it,to=C(()=>{"use strict";it=(n=>(n.MCP="mcp",n.COZE="coze",n.HTTP="http",n.FUNCTION="function",n))(it||{})});import _c from"ajv";import mr from"dayjs";var fr,ro=C(()=>{"use strict";P();ne();Gt();Qt();to();fr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=p.withTag("ToolApiHandler"),this.ajv=new _c({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:n,args:s}=t;if(!r||!n){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}if(this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${n}\uFF0C\u53C2\u6570:`,JSON.stringify(s)),!oe.isInitialized()){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}let i=await oe.getInstance();await this.validateServiceAndTool(i,r,n),r==="customMCP"&&await this.validateCustomMCPArguments(i,n,s||{});let a;if(r==="customMCP")a=await i.callTool(n,s||{});else{let l=`${r}__${n}`;a=await i.callTool(l,s||{})}return e.json(this.createSuccessResponse(a,"\u5DE5\u5177\u8C03\u7528\u6210\u529F"))}catch(t){this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),n="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?n="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?n="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?n="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?n="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?n="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?n="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(n="TIMEOUT_ERROR");let s=this.createErrorResponse(n,r);return e.json(s,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!d.configExists()){let s=this.createErrorResponse("CONFIG_NOT_FOUND","\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");return e.json(s,404)}let t=[],r="";try{t=d.getCustomMCPTools(),r=d.getConfigPath()}catch(s){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",s);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!d.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let s=this.createErrorResponse("INVALID_TOOL_CONFIG","\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49");return e.json(s,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let n={list:r,total:r.length};return e.json(this.createSuccessResponse(n,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`))}catch(t){this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getDisabledTools(){try{let e=d.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),n=await new Ie().getAllCachedTools(),s=d.getConfig(),i=new Set(Object.keys(s.mcpServers||{})),a=[];for(let l of n){if(t.has(l.name))continue;let g=l.name.split("__")[0];if(!i.has(g)){this.logger.debug(`\u5DE5\u5177 ${l.name} \u5BF9\u5E94\u7684 MCP \u670D\u52A1 ${g} \u5DF2\u5220\u9664\uFF0C\u8DF3\u8FC7\u663E\u793A`);continue}let h={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:g,toolName:l.name.split("__").slice(1).join("__")}}};a.push(h)}return this.logger.debug(`\u4ECE ${n.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${a.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),a}catch(e){return this.logger.error("\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\u5931\u8D25:",e),[]}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let n=e.getCustomMCPTools().map(s=>s.name);throw n.length===0?new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 customMCP \u5DE5\u5177\u3002\u8BF7\u68C0\u67E5 xiaozhi.config.json \u4E2D\u7684 customMCP \u914D\u7F6E\u3002`):new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u53EF\u7528\u7684 customMCP \u5DE5\u5177: ${n.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let s=e.getCustomMCPTools().find(i=>i.name===r);s&&!s.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),s&&!s.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(n){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,n),new Error(`customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49\u3002`)}return}}async validateCustomMCPArguments(e,t,r){try{let s=e.getCustomMCPTools().find(l=>l.name===t);if(!s)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!s.inputSchema){this.logger.warn(`customMCP \u5DE5\u5177 '${t}' \u6CA1\u6709\u5B9A\u4E49 inputSchema\uFF0C\u8DF3\u8FC7\u53C2\u6570\u9A8C\u8BC1`);return}let i=this.ajv.compile(s.inputSchema);if(!i(r)){let h=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(u=>{let f=u.instancePath||u.schemaPath||"",m=u.message||"\u672A\u77E5\u9519\u8BEF";if(u.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${u.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(u.keyword==="type"){let O=u.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${f} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${O}`}if(u.keyword==="enum"){let O=u.params?.allowedValues||[];return`\u53C2\u6570 ${f} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${O.join(", ")}`}return`\u53C2\u6570 ${f} ${m}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,h),new Error(h)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(n){throw n instanceof Error&&n.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?n:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,n),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${n instanceof Error?n.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{this.logger.info("\u5904\u7406\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42");let t=await e.req.json();return this.isNewFormatRequest(t)?await this.handleNewFormatAddTool(e,t):await this.handleLegacyFormatAddTool(e,t)}catch(t){this.logger.error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:n}=this.handleAddToolError(t);return e.json(n,r)}}isNewFormatRequest(e){return e&&typeof e=="object"&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:n}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(it).includes(r)){let s=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(it).join(", ")}`);return e.json(s,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,n);case"coze":return await this.handleAddCozeTool(e,n);case"http":case"function":{let s=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`);return e.json(s,501)}default:{let s=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(s,400)}}}async handleLegacyFormatAddTool(e,t){this.logger.info("\u5904\u7406\u65E7\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF08\u5411\u540E\u517C\u5BB9\uFF09");let{workflow:r,customName:n,customDescription:s,parameterConfig:i}=t,a=this.performPreChecks(r,n,s);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,n,s,i);return d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:n,customName:s,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${n}`),!r||!n){let j=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(j,400)}if(!oe.isInitialized()){let j=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(j,503)}let a=await oe.getInstance();try{await this.validateServiceAndTool(a,r,n)}catch(j){let Dt=j instanceof Error?j.message:String(j),me=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Dt);return e.json(me,404)}let g=await new Ie().getAllCachedTools(),h=`${r}__${n}`,u=g.find(j=>j.name===h);if(!u){let j=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${n}`);return e.json(j,404)}let f=s||h,m=d.getCustomMCPTools();if(new Set(m.map(j=>j.name)).has(f)){let j=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${f}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(j,409)}let ie={name:f,description:i||u.description||`MCP \u5DE5\u5177: ${r}/${n}`,inputSchema:u.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:n}},stats:{usageCount:0,lastUsedTime:mr().format("YYYY-MM-DD HH:mm:ss")}};d.addCustomMCPTool(ie),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${n}`);let te=d.getServerToolsConfig(r);te?.toolName&&(te[n].enable=!0,d.updateServerToolsConfig(r,te),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${n}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${f}`);let Nt={tool:ie,toolName:f,toolType:"mcp",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(Nt,`MCP \u5DE5\u5177 "${f}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:n,customDescription:s,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,n,s);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,n,s,i);d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(g,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t){let s=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(s,400)}this.logger.info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();if(!r||typeof r!="object"){let s=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(s,400)}if(this.isNewFormatRequest(r))return await this.handleNewFormatUpdateTool(e,t,r);let n=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(n,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:n}=this.handleUpdateToolError(t);return e.json(n,r)}}async handleNewFormatUpdateTool(e,t,r){let{type:n,data:s}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${n}`),!Object.values(it).includes(n)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${n}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(it).join(", ")}`);return e.json(i,400)}switch(n){case"coze":return await this.handleUpdateCozeTool(e,t,s);case"mcp":case"http":case"function":{let i=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${n} \u6682\u4E0D\u652F\u6301\u66F4\u65B0\u64CD\u4F5C\uFF0C\u76EE\u524D\u4EC5\u652F\u6301 Coze \u7C7B\u578B`);return e.json(i,501)}default:{let i=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${n}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:n,customName:s,customDescription:i,parameterConfig:a}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=d.getCustomMCPTools().find(m=>m.name===t);if(!g){let m=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(m,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let m=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(m,400)}!n.workflow_id&&g.handler?.config?.workflow_id&&(n.workflow_id=g.handler.config.workflow_id),!n.workflow_id&&n.app_id&&this.logger.warn(`\u5DE5\u4F5C\u6D41 ${t} \u7F3A\u5C11 workflow_id\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u67D0\u4E9B\u529F\u80FD`),this.validateWorkflowUpdateData(n);let h=this.generateInputSchema(n,a),u={...g,description:i||g.description,inputSchema:h};d.updateCustomMCPTool(t,u),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let f={tool:u,toolName:t,toolType:"coze",updatedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(f,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`))}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`)}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("UPDATE_CUSTOM_TOOL_ERROR",`\u66F4\u65B0\u5DE5\u5177\u914D\u7F6E\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t){let s=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(s,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let n=d.getCustomMCPTools().find(s=>s.name===t);if(n&&n.handler.type==="mcp"){let s=n.handler.config;if(s.serviceName&&s.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`);let i=d.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,d.updateServerToolsConfig(s.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return d.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:n}=this.handleRemoveToolError(t);return e.json(n,r)}}convertWorkflowToTool(e,t,r,n){this.validateWorkflowData(e);let s=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(s),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,n),g=this.createHttpHandler(e),h={name:i,description:a,inputSchema:l,handler:g};return this.validateGeneratedTool(h),h}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[n,s]of Object.entries(t))r=r.replace(new RegExp(n,"g"),s);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");this.validateRequiredFields(e),this.validateFieldFormats(e),this.validateFieldLengths(e),this.validateBusinessLogic(e)}validateWorkflowUpdateData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32")}if(e.workflow_name){if(typeof e.workflow_name!="string"||e.workflow_name.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26")}if(e.app_id){if(typeof e.app_id!="string"||e.app_id.trim()==="")throw new Error("\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.app_id.length>50)throw new Error("\u5E94\u7528ID\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}validateRequiredFields(e){let t=[{field:"workflow_id",name:"\u5DE5\u4F5C\u6D41ID"},{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0"},{field:"app_id",name:"\u5E94\u7528ID"}];for(let{field:r,name:n}of t){let s=e[r];if(!s||typeof s!="string"||s.trim()==="")throw new Error(`${n}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.icon_url?.trim())try{new URL(e.icon_url)}catch{throw new Error("\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw new Error("\u521B\u5EFA\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233");if(e.updated_at&&(!Number.isInteger(e.updated_at)||e.updated_at<=0))throw new Error("\u66F4\u65B0\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233")}validateFieldLengths(e){let t=[{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0",max:100},{field:"description",name:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0",max:500},{field:"app_id",name:"\u5E94\u7528ID",max:50}];for(let{field:r,name:n,max:s}of t){let i=e[r];if(i&&i.length>s)throw new Error(`${n}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${s}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw new Error("\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw new Error("\u521B\u5EFA\u8005\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32")}if(e.created_at&&e.updated_at&&e.updated_at<e.created_at)throw new Error("\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4");let t=["admin","root","system","config","password","token"],r=e.workflow_name.toLowerCase();for(let n of t)if(r.includes(n))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${n}`)}resolveToolNameConflict(e){let t=d.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),n=e,s=1;for(;r.has(n);)if(n=`${e}_${s}`,s++,s>999)throw new Error(`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return n}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=d.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!d.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),this.validateProxyHandler(e.handler)}validateToolStructure(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");let t=["name","description","inputSchema","handler"];for(let r of t)if(!(r in e)||e[r]==null)throw new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\u8BA4\u8BC1\u7C7B\u578B\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E4B\u4E00: ${t.join(", ")}`);if(e.type==="bearer"){if(!e.token||typeof e.token!="string")throw new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let n=r.slice(2,-2).trim();if(!n||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(n))throw new Error(`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684required\u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4")}generateInputSchema(e,t){return t&&t.parameters.length>0?this.generateInputSchemaFromConfig(t):{type:"object",properties:{input:{type:"string",description:"\u8F93\u5165\u5185\u5BB9"}},required:["input"],additionalProperties:!1}}generateInputSchemaFromConfig(e){let t={},r=[];for(let n of e.parameters)t[n.fieldName]={type:n.type,description:n.description},n.required&&r.push(n.fieldName);return{type:"object",properties:t,required:r.length>0?r:void 0,additionalProperties:!1}}handleAddToolError(e){let t=e instanceof Error?e.message:"\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{statusCode:400,errorResponse:this.createErrorResponse("MISSING_REQUIRED_FIELD",t)}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",t)}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{statusCode:503,errorResponse:this.createErrorResponse("SERVICE_NOT_INITIALIZED",t)}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{statusCode:409,errorResponse:this.createErrorResponse("TOOL_NAME_CONFLICT",`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`)}:this.isValidationError(t)?{statusCode:400,errorResponse:this.createErrorResponse("VALIDATION_ERROR",this.formatValidationError(t))}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\uFF1A1) \u76F8\u5173\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1B2) \u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38\uFF1B3) \u914D\u7F6E\u6587\u4EF6\u6743\u9650\u662F\u5426\u6B63\u786E`)}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",t)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("ADD_CUSTOM_TOOL_ERROR",`\u6DFB\u52A0\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}handleRemoveToolError(e){let t=e instanceof Error?e.message:"\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E\uFF0C\u6216\u5237\u65B0\u9875\u9762\u67E5\u770B\u6700\u65B0\u7684\u5DE5\u5177\u5217\u8868`)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:{statusCode:500,errorResponse:this.createErrorResponse("REMOVE_CUSTOM_TOOL_ERROR",`\u5220\u9664\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}isValidationError(e){return["\u4E0D\u80FD\u4E3A\u7A7A","\u5FC5\u987B\u662F","\u683C\u5F0F\u65E0\u6548","\u8FC7\u957F","\u8FC7\u77ED","\u9A8C\u8BC1\u5931\u8D25","\u65E0\u6548","\u4E0D\u7B26\u5408","\u8D85\u8FC7","\u5C11\u4E8E","\u654F\u611F\u8BCD","\u65F6\u95F4","URL"].some(r=>e.includes(r))}formatValidationError(e){let t={\u5DE5\u4F5C\u6D41ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41ID",\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41\u540D\u79F0",\u5E94\u7528ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5E94\u7528ID",\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548:"\u5DE5\u4F5C\u6D41ID\u5E94\u4E3A\u6570\u5B57\u683C\u5F0F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u914D\u7F6E",\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548:"\u5E94\u7528ID\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26",\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u540D\u79F0",\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7500\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u63CF\u8FF0",\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u56FE\u6807URL\u5730\u5740",\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4:"\u5DE5\u4F5C\u6D41\u7684\u65F6\u95F4\u4FE1\u606F\u6709\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u6570\u636E",\u654F\u611F\u8BCD:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u5305\u542B\u654F\u611F\u8BCD\u6C47\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5"};for(let[r,n]of Object.entries(t))if(e.includes(r))return n;return e}performPreChecks(e,t,r){let n=this.checkBasicParameters(e,t,r);if(n)return n;let s=this.checkSystemStatus();if(s)return s;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570")};if(typeof e!="object")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B")};if(!e.workflow_id||typeof e.workflow_id!="string"||!e.workflow_id.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(!e.workflow_name||typeof e.workflow_name!="string"||!e.workflow_name.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(t!==void 0){if(typeof t!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(t.trim()==="")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32")};if(t.length>50)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}if(r!==void 0){if(typeof r!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(r.length>200)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26")}}return null}checkSystemStatus(){try{let e=d.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=d.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,n=1024*1024;if(r>n)return{statusCode:413,errorResponse:this.createErrorResponse("PAYLOAD_TOO_LARGE","\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4")}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}}});var wt=T((tC,no)=>{"use strict";var kc="2.0.0",jc=Number.MAX_SAFE_INTEGER||9007199254740991,Hc=16,zc=250,Uc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];no.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Hc,MAX_SAFE_BUILD_LENGTH:zc,MAX_SAFE_INTEGER:jc,RELEASE_TYPES:Uc,SEMVER_SPEC_VERSION:kc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Rt=T((rC,so)=>{"use strict";var Fc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...o)=>console.error("SEMVER",...o):()=>{};so.exports=Fc});var at=T((we,oo)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:mn,MAX_SAFE_BUILD_LENGTH:Vc,MAX_LENGTH:Wc}=wt(),Bc=Rt();we=oo.exports={};var qc=we.re=[],Gc=we.safeRe=[],v=we.src=[],Xc=we.safeSrc=[],S=we.t={},Jc=0,fn="[a-zA-Z0-9-]",Kc=[["\\s",1],["\\d",Wc],[fn,Vc]],Yc=c(o=>{for(let[e,t]of Kc)o=o.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return o},"makeSafeRegex"),M=c((o,e,t)=>{let r=Yc(e),n=Jc++;Bc(o,n,e),S[o]=n,v[n]=e,Xc[n]=r,qc[n]=new RegExp(e,t?"g":void 0),Gc[n]=new RegExp(r,t?"g":void 0)},"createToken");M("NUMERICIDENTIFIER","0|[1-9]\\d*");M("NUMERICIDENTIFIERLOOSE","\\d+");M("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${fn}*`);M("MAINVERSION",`(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})`);M("MAINVERSIONLOOSE",`(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASEIDENTIFIER",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIER]})`);M("PRERELEASEIDENTIFIERLOOSE",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASE",`(?:-(${v[S.PRERELEASEIDENTIFIER]}(?:\\.${v[S.PRERELEASEIDENTIFIER]})*))`);M("PRERELEASELOOSE",`(?:-?(${v[S.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${v[S.PRERELEASEIDENTIFIERLOOSE]})*))`);M("BUILDIDENTIFIER",`${fn}+`);M("BUILD",`(?:\\+(${v[S.BUILDIDENTIFIER]}(?:\\.${v[S.BUILDIDENTIFIER]})*))`);M("FULLPLAIN",`v?${v[S.MAINVERSION]}${v[S.PRERELEASE]}?${v[S.BUILD]}?`);M("FULL",`^${v[S.FULLPLAIN]}$`);M("LOOSEPLAIN",`[v=\\s]*${v[S.MAINVERSIONLOOSE]}${v[S.PRERELEASELOOSE]}?${v[S.BUILD]}?`);M("LOOSE",`^${v[S.LOOSEPLAIN]}$`);M("GTLT","((?:<|>)?=?)");M("XRANGEIDENTIFIERLOOSE",`${v[S.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);M("XRANGEIDENTIFIER",`${v[S.NUMERICIDENTIFIER]}|x|X|\\*`);M("XRANGEPLAIN",`[v=\\s]*(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:${v[S.PRERELEASE]})?${v[S.BUILD]}?)?)?`);M("XRANGEPLAINLOOSE",`[v=\\s]*(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:${v[S.PRERELEASELOOSE]})?${v[S.BUILD]}?)?)?`);M("XRANGE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAIN]}$`);M("XRANGELOOSE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAINLOOSE]}$`);M("COERCEPLAIN",`(^|[^\\d])(\\d{1,${mn}})(?:\\.(\\d{1,${mn}}))?(?:\\.(\\d{1,${mn}}))?`);M("COERCE",`${v[S.COERCEPLAIN]}(?:$|[^\\d])`);M("COERCEFULL",v[S.COERCEPLAIN]+`(?:${v[S.PRERELEASE]})?(?:${v[S.BUILD]})?(?:$|[^\\d])`);M("COERCERTL",v[S.COERCE],!0);M("COERCERTLFULL",v[S.COERCEFULL],!0);M("LONETILDE","(?:~>?)");M("TILDETRIM",`(\\s*)${v[S.LONETILDE]}\\s+`,!0);we.tildeTrimReplace="$1~";M("TILDE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAIN]}$`);M("TILDELOOSE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAINLOOSE]}$`);M("LONECARET","(?:\\^)");M("CARETTRIM",`(\\s*)${v[S.LONECARET]}\\s+`,!0);we.caretTrimReplace="$1^";M("CARET",`^${v[S.LONECARET]}${v[S.XRANGEPLAIN]}$`);M("CARETLOOSE",`^${v[S.LONECARET]}${v[S.XRANGEPLAINLOOSE]}$`);M("COMPARATORLOOSE",`^${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]})$|^$`);M("COMPARATOR",`^${v[S.GTLT]}\\s*(${v[S.FULLPLAIN]})$|^$`);M("COMPARATORTRIM",`(\\s*)${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]}|${v[S.XRANGEPLAIN]})`,!0);we.comparatorTrimReplace="$1$2$3";M("HYPHENRANGE",`^\\s*(${v[S.XRANGEPLAIN]})\\s+-\\s+(${v[S.XRANGEPLAIN]})\\s*$`);M("HYPHENRANGELOOSE",`^\\s*(${v[S.XRANGEPLAINLOOSE]})\\s+-\\s+(${v[S.XRANGEPLAINLOOSE]})\\s*$`);M("STAR","(<|>)?=?\\s*\\*");M("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");M("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Cr=T((sC,io)=>{"use strict";var Zc=Object.freeze({loose:!0}),Qc=Object.freeze({}),el=c(o=>o?typeof o!="object"?Zc:o:Qc,"parseOptions");io.exports=el});var Cn=T((iC,lo)=>{"use strict";var ao=/^[0-9]+$/,co=c((o,e)=>{if(typeof o=="number"&&typeof e=="number")return o===e?0:o<e?-1:1;let t=ao.test(o),r=ao.test(e);return t&&r&&(o=+o,e=+e),o===e?0:t&&!r?-1:r&&!t?1:o<e?-1:1},"compareIdentifiers"),tl=c((o,e)=>co(e,o),"rcompareIdentifiers");lo.exports={compareIdentifiers:co,rcompareIdentifiers:tl}});var B=T((cC,uo)=>{"use strict";var vr=Rt(),{MAX_LENGTH:go,MAX_SAFE_INTEGER:Sr}=wt(),{safeRe:Er,t:yr}=at(),rl=Cr(),{compareIdentifiers:vn}=Cn(),Sn=class o{static{c(this,"SemVer")}constructor(e,t){if(t=rl(t),e instanceof o){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>go)throw new TypeError(`version is longer than ${go} characters`);vr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Er[yr.LOOSE]:Er[yr.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>Sr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Sr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Sr||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<Sr)return s}return n}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(vr("SemVer.compare",this.version,this.options,e),!(e instanceof o)){if(typeof e=="string"&&e===this.version)return 0;e=new o(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof o||(e=new o(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof o||(e=new o(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],n=e.prerelease[t];if(vr("prerelease compare",t,r,n),r===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(r===void 0)return-1;if(r===n)continue;return vn(r,n)}while(++t)}compareBuild(e){e instanceof o||(e=new o(e,this.options));let t=0;do{let r=this.build[t],n=e.build[t];if(vr("build compare",t,r,n),r===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(r===void 0)return-1;if(r===n)continue;return vn(r,n)}while(++t)}inc(e,t,r){if(e.startsWith("pre")){if(!t&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(t){let n=`-${t}`.match(this.options.loose?Er[yr.PRERELEASELOOSE]:Er[yr.PRERELEASE]);if(!n||n[1]!==t)throw new Error(`invalid identifier: ${t}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t,r),this.inc("pre",t,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",t,r),this.inc("pre",t,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let n=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[n];else{let s=this.prerelease.length;for(;--s>=0;)typeof this.prerelease[s]=="number"&&(this.prerelease[s]++,s=-2);if(s===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(n)}}if(t){let s=[t,n];r===!1&&(s=[t]),vn(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=s):this.prerelease=s}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};uo.exports=Sn});var Ue=T((gC,ho)=>{"use strict";var po=B(),nl=c((o,e,t=!1)=>{if(o instanceof po)return o;try{return new po(o,e)}catch(r){if(!t)return null;throw r}},"parse");ho.exports=nl});var fo=T((pC,mo)=>{"use strict";var sl=Ue(),ol=c((o,e)=>{let t=sl(o,e);return t?t.version:null},"valid");mo.exports=ol});var vo=T((dC,Co)=>{"use strict";var il=Ue(),al=c((o,e)=>{let t=il(o.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Co.exports=al});var yo=T((fC,Eo)=>{"use strict";var So=B(),cl=c((o,e,t,r,n)=>{typeof t=="string"&&(n=r,r=t,t=void 0);try{return new So(o instanceof So?o.version:o,t).inc(e,r,n).version}catch{return null}},"inc");Eo.exports=cl});var Po=T((vC,Mo)=>{"use strict";var To=Ue(),ll=c((o,e)=>{let t=To(o,null,!0),r=To(e,null,!0),n=t.compare(r);if(n===0)return null;let s=n>0,i=s?t:r,a=s?r:t,l=!!i.prerelease.length;if(!!a.prerelease.length&&!l){if(!a.patch&&!a.minor)return"major";if(a.compareMain(i)===0)return a.minor&&!a.patch?"minor":"patch"}let h=l?"pre":"";return t.major!==r.major?h+"major":t.minor!==r.minor?h+"minor":t.patch!==r.patch?h+"patch":"prerelease"},"diff");Mo.exports=ll});var Ro=T((EC,wo)=>{"use strict";var gl=B(),ul=c((o,e)=>new gl(o,e).major,"major");wo.exports=ul});var Io=T((TC,bo)=>{"use strict";var pl=B(),hl=c((o,e)=>new pl(o,e).minor,"minor");bo.exports=hl});var Ao=T((PC,$o)=>{"use strict";var dl=B(),ml=c((o,e)=>new dl(o,e).patch,"patch");$o.exports=ml});var xo=T((RC,Oo)=>{"use strict";var fl=Ue(),Cl=c((o,e)=>{let t=fl(o,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Oo.exports=Cl});var pe=T((IC,Do)=>{"use strict";var No=B(),vl=c((o,e,t)=>new No(o,t).compare(new No(e,t)),"compare");Do.exports=vl});var _o=T((AC,Lo)=>{"use strict";var Sl=pe(),El=c((o,e,t)=>Sl(e,o,t),"rcompare");Lo.exports=El});var jo=T((xC,ko)=>{"use strict";var yl=pe(),Tl=c((o,e)=>yl(o,e,!0),"compareLoose");ko.exports=Tl});var Tr=T((DC,zo)=>{"use strict";var Ho=B(),Ml=c((o,e,t)=>{let r=new Ho(o,t),n=new Ho(e,t);return r.compare(n)||r.compareBuild(n)},"compareBuild");zo.exports=Ml});var Fo=T((_C,Uo)=>{"use strict";var Pl=Tr(),wl=c((o,e)=>o.sort((t,r)=>Pl(t,r,e)),"sort");Uo.exports=wl});var Wo=T((jC,Vo)=>{"use strict";var Rl=Tr(),bl=c((o,e)=>o.sort((t,r)=>Rl(r,t,e)),"rsort");Vo.exports=bl});var bt=T((zC,Bo)=>{"use strict";var Il=pe(),$l=c((o,e,t)=>Il(o,e,t)>0,"gt");Bo.exports=$l});var Mr=T((FC,qo)=>{"use strict";var Al=pe(),Ol=c((o,e,t)=>Al(o,e,t)<0,"lt");qo.exports=Ol});var En=T((WC,Go)=>{"use strict";var xl=pe(),Nl=c((o,e,t)=>xl(o,e,t)===0,"eq");Go.exports=Nl});var yn=T((qC,Xo)=>{"use strict";var Dl=pe(),Ll=c((o,e,t)=>Dl(o,e,t)!==0,"neq");Xo.exports=Ll});var Pr=T((XC,Jo)=>{"use strict";var _l=pe(),kl=c((o,e,t)=>_l(o,e,t)>=0,"gte");Jo.exports=kl});var wr=T((KC,Ko)=>{"use strict";var jl=pe(),Hl=c((o,e,t)=>jl(o,e,t)<=0,"lte");Ko.exports=Hl});var Tn=T((ZC,Yo)=>{"use strict";var zl=En(),Ul=yn(),Fl=bt(),Vl=Pr(),Wl=Mr(),Bl=wr(),ql=c((o,e,t,r)=>{switch(e){case"===":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o===t;case"!==":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o!==t;case"":case"=":case"==":return zl(o,t,r);case"!=":return Ul(o,t,r);case">":return Fl(o,t,r);case">=":return Vl(o,t,r);case"<":return Wl(o,t,r);case"<=":return Bl(o,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Yo.exports=ql});var Qo=T((ev,Zo)=>{"use strict";var Gl=B(),Xl=Ue(),{safeRe:Rr,t:br}=at(),Jl=c((o,e)=>{if(o instanceof Gl)return o;if(typeof o=="number"&&(o=String(o)),typeof o!="string")return null;e=e||{};let t=null;if(!e.rtl)t=o.match(e.includePrerelease?Rr[br.COERCEFULL]:Rr[br.COERCE]);else{let l=e.includePrerelease?Rr[br.COERCERTLFULL]:Rr[br.COERCERTL],g;for(;(g=l.exec(o))&&(!t||t.index+t[0].length!==o.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],n=t[3]||"0",s=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Xl(`${r}.${n}.${s}${i}${a}`,e)},"coerce");Zo.exports=Jl});var ti=T((rv,ei)=>{"use strict";var Mn=class{static{c(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let n=this.map.keys().next().value;this.delete(n)}this.map.set(e,t)}return this}};ei.exports=Mn});var he=T((sv,oi)=>{"use strict";var Kl=/\s+/g,Pn=class o{static{c(this,"Range")}constructor(e,t){if(t=Zl(t),e instanceof o)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new o(e.raw,t);if(e instanceof wn)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e.trim().replace(Kl," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(n=>!ni(n[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&og(n[0])){this.set=[n];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let t=this.set[e];for(let r=0;r<t.length;r++)r>0&&(this.formatted+=" "),this.formatted+=t[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let r=((this.options.includePrerelease&&ng)|(this.options.loose&&sg))+":"+e,n=ri.get(r);if(n)return n;let s=this.options.loose,i=s?J[q.HYPHENRANGELOOSE]:J[q.HYPHENRANGE];e=e.replace(i,mg(this.options.includePrerelease)),A("hyphen replace",e),e=e.replace(J[q.COMPARATORTRIM],eg),A("comparator trim",e),e=e.replace(J[q.TILDETRIM],tg),A("tilde trim",e),e=e.replace(J[q.CARETTRIM],rg),A("caret trim",e);let a=e.split(" ").map(u=>ig(u,this.options)).join(" ").split(/\s+/).map(u=>dg(u,this.options));s&&(a=a.filter(u=>(A("loose invalid filter",u,this.options),!!u.match(J[q.COMPARATORLOOSE])))),A("range list",a);let l=new Map,g=a.map(u=>new wn(u,this.options));for(let u of g){if(ni(u))return[u];l.set(u.value,u)}l.size>1&&l.has("")&&l.delete("");let h=[...l.values()];return ri.set(r,h),h}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Range is required");return this.set.some(r=>si(r,t)&&e.set.some(n=>si(n,t)&&r.every(s=>n.every(i=>s.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Ql(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(fg(this.set[t],e,this.options))return!0;return!1}};oi.exports=Pn;var Yl=ti(),ri=new Yl,Zl=Cr(),wn=It(),A=Rt(),Ql=B(),{safeRe:J,t:q,comparatorTrimReplace:eg,tildeTrimReplace:tg,caretTrimReplace:rg}=at(),{FLAG_INCLUDE_PRERELEASE:ng,FLAG_LOOSE:sg}=wt(),ni=c(o=>o.value==="<0.0.0-0","isNullSet"),og=c(o=>o.value==="","isAny"),si=c((o,e)=>{let t=!0,r=o.slice(),n=r.pop();for(;t&&r.length;)t=r.every(s=>n.intersects(s,e)),n=r.pop();return t},"isSatisfiable"),ig=c((o,e)=>(o=o.replace(J[q.BUILD],""),A("comp",o,e),o=lg(o,e),A("caret",o),o=ag(o,e),A("tildes",o),o=ug(o,e),A("xrange",o),o=hg(o,e),A("stars",o),o),"parseComparator"),K=c(o=>!o||o.toLowerCase()==="x"||o==="*","isX"),ag=c((o,e)=>o.trim().split(/\s+/).map(t=>cg(t,e)).join(" "),"replaceTildes"),cg=c((o,e)=>{let t=e.loose?J[q.TILDELOOSE]:J[q.TILDE];return o.replace(t,(r,n,s,i,a)=>{A("tilde",o,r,n,s,i,a);let l;return K(n)?l="":K(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:K(i)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(A("replaceTilde pr",a),l=`>=${n}.${s}.${i}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${i} <${n}.${+s+1}.0-0`,A("tilde return",l),l})},"replaceTilde"),lg=c((o,e)=>o.trim().split(/\s+/).map(t=>gg(t,e)).join(" "),"replaceCarets"),gg=c((o,e)=>{A("caret",o,e);let t=e.loose?J[q.CARETLOOSE]:J[q.CARET],r=e.includePrerelease?"-0":"";return o.replace(t,(n,s,i,a,l)=>{A("caret",o,n,s,i,a,l);let g;return K(s)?g="":K(i)?g=`>=${s}.0.0${r} <${+s+1}.0.0-0`:K(a)?s==="0"?g=`>=${s}.${i}.0${r} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.0${r} <${+s+1}.0.0-0`:l?(A("replaceCaret pr",l),s==="0"?i==="0"?g=`>=${s}.${i}.${a}-${l} <${s}.${i}.${+a+1}-0`:g=`>=${s}.${i}.${a}-${l} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.${a}-${l} <${+s+1}.0.0-0`):(A("no pr"),s==="0"?i==="0"?g=`>=${s}.${i}.${a}${r} <${s}.${i}.${+a+1}-0`:g=`>=${s}.${i}.${a}${r} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.${a} <${+s+1}.0.0-0`),A("caret return",g),g})},"replaceCaret"),ug=c((o,e)=>(A("replaceXRanges",o,e),o.split(/\s+/).map(t=>pg(t,e)).join(" ")),"replaceXRanges"),pg=c((o,e)=>{o=o.trim();let t=e.loose?J[q.XRANGELOOSE]:J[q.XRANGE];return o.replace(t,(r,n,s,i,a,l)=>{A("xRange",o,r,n,s,i,a,l);let g=K(s),h=g||K(i),u=h||K(a),f=u;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",g?n===">"||n==="<"?r="<0.0.0-0":r="*":n&&f?(h&&(i=0),a=0,n===">"?(n=">=",h?(s=+s+1,i=0,a=0):(i=+i+1,a=0)):n==="<="&&(n="<",h?s=+s+1:i=+i+1),n==="<"&&(l="-0"),r=`${n+s}.${i}.${a}${l}`):h?r=`>=${s}.0.0${l} <${+s+1}.0.0-0`:u&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),A("xRange return",r),r})},"replaceXRange"),hg=c((o,e)=>(A("replaceStars",o,e),o.trim().replace(J[q.STAR],"")),"replaceStars"),dg=c((o,e)=>(A("replaceGTE0",o,e),o.trim().replace(J[e.includePrerelease?q.GTE0PRE:q.GTE0],"")),"replaceGTE0"),mg=c(o=>(e,t,r,n,s,i,a,l,g,h,u,f)=>(K(r)?t="":K(n)?t=`>=${r}.0.0${o?"-0":""}`:K(s)?t=`>=${r}.${n}.0${o?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${o?"-0":""}`,K(g)?l="":K(h)?l=`<${+g+1}.0.0-0`:K(u)?l=`<${g}.${+h+1}.0-0`:f?l=`<=${g}.${h}.${u}-${f}`:o?l=`<${g}.${h}.${+u+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),fg=c((o,e,t)=>{for(let r=0;r<o.length;r++)if(!o[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<o.length;r++)if(A(o[r].semver),o[r].semver!==wn.ANY&&o[r].semver.prerelease.length>0){let n=o[r].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0},"testSet")});var It=T((iv,ui)=>{"use strict";var $t=Symbol("SemVer ANY"),In=class o{static{c(this,"Comparator")}static get ANY(){return $t}constructor(e,t){if(t=ii(t),e instanceof o){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),bn("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===$t?this.value="":this.value=this.operator+this.semver.version,bn("comp",this)}parse(e){let t=this.options.loose?ai[ci.COMPARATORLOOSE]:ai[ci.COMPARATOR],r=e.match(t);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new li(r[2],this.options.loose):this.semver=$t}toString(){return this.value}test(e){if(bn("Comparator.test",e,this.options.loose),this.semver===$t||e===$t)return!0;if(typeof e=="string")try{e=new li(e,this.options)}catch{return!1}return Rn(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new gi(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new gi(this.value,t).test(e.semver):(t=ii(t),t.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!t.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||Rn(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Rn(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};ui.exports=In;var ii=Cr(),{safeRe:ai,t:ci}=at(),Rn=Tn(),bn=Rt(),li=B(),gi=he()});var At=T((cv,pi)=>{"use strict";var Cg=he(),vg=c((o,e,t)=>{try{e=new Cg(e,t)}catch{return!1}return e.test(o)},"satisfies");pi.exports=vg});var di=T((gv,hi)=>{"use strict";var Sg=he(),Eg=c((o,e)=>new Sg(o,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");hi.exports=Eg});var fi=T((pv,mi)=>{"use strict";var yg=B(),Tg=he(),Mg=c((o,e,t)=>{let r=null,n=null,s=null;try{s=new Tg(e,t)}catch{return null}return o.forEach(i=>{s.test(i)&&(!r||n.compare(i)===-1)&&(r=i,n=new yg(r,t))}),r},"maxSatisfying");mi.exports=Mg});var vi=T((dv,Ci)=>{"use strict";var Pg=B(),wg=he(),Rg=c((o,e,t)=>{let r=null,n=null,s=null;try{s=new wg(e,t)}catch{return null}return o.forEach(i=>{s.test(i)&&(!r||n.compare(i)===1)&&(r=i,n=new Pg(r,t))}),r},"minSatisfying");Ci.exports=Rg});var yi=T((fv,Ei)=>{"use strict";var $n=B(),bg=he(),Si=bt(),Ig=c((o,e)=>{o=new bg(o,e);let t=new $n("0.0.0");if(o.test(t)||(t=new $n("0.0.0-0"),o.test(t)))return t;t=null;for(let r=0;r<o.set.length;++r){let n=o.set[r],s=null;n.forEach(i=>{let a=new $n(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||Si(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Si(t,s))&&(t=s)}return t&&o.test(t)?t:null},"minVersion");Ei.exports=Ig});var Mi=T((vv,Ti)=>{"use strict";var $g=he(),Ag=c((o,e)=>{try{return new $g(o,e).range||"*"}catch{return null}},"validRange");Ti.exports=Ag});var Ir=T((Ev,bi)=>{"use strict";var Og=B(),Ri=It(),{ANY:xg}=Ri,Ng=he(),Dg=At(),Pi=bt(),wi=Mr(),Lg=wr(),_g=Pr(),kg=c((o,e,t,r)=>{o=new Og(o,r),e=new Ng(e,r);let n,s,i,a,l;switch(t){case">":n=Pi,s=Lg,i=wi,a=">",l=">=";break;case"<":n=wi,s=_g,i=Pi,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Dg(o,e,r))return!1;for(let g=0;g<e.set.length;++g){let h=e.set[g],u=null,f=null;if(h.forEach(m=>{m.semver===xg&&(m=new Ri(">=0.0.0")),u=u||m,f=f||m,n(m.semver,u.semver,r)?u=m:i(m.semver,f.semver,r)&&(f=m)}),u.operator===a||u.operator===l||(!f.operator||f.operator===a)&&s(o,f.semver))return!1;if(f.operator===l&&i(o,f.semver))return!1}return!0},"outside");bi.exports=kg});var $i=T((Tv,Ii)=>{"use strict";var jg=Ir(),Hg=c((o,e,t)=>jg(o,e,">",t),"gtr");Ii.exports=Hg});var Oi=T((Pv,Ai)=>{"use strict";var zg=Ir(),Ug=c((o,e,t)=>zg(o,e,"<",t),"ltr");Ai.exports=Ug});var Di=T((Rv,Ni)=>{"use strict";var xi=he(),Fg=c((o,e,t)=>(o=new xi(o,t),e=new xi(e,t),o.intersects(e,t)),"intersects");Ni.exports=Fg});var _i=T((Iv,Li)=>{"use strict";var Vg=At(),Wg=pe();Li.exports=(o,e,t)=>{let r=[],n=null,s=null,i=o.sort((h,u)=>Wg(h,u,t));for(let h of i)Vg(h,e,t)?(s=h,n||(n=h)):(s&&r.push([n,s]),s=null,n=null);n&&r.push([n,null]);let a=[];for(let[h,u]of r)h===u?a.push(h):!u&&h===i[0]?a.push("*"):u?h===i[0]?a.push(`<=${u}`):a.push(`${h} - ${u}`):a.push(`>=${h}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Fi=T(($v,Ui)=>{"use strict";var ki=he(),On=It(),{ANY:An}=On,Ot=At(),xn=pe(),Bg=c((o,e,t={})=>{if(o===e)return!0;o=new ki(o,t),e=new ki(e,t);let r=!1;e:for(let n of o.set){for(let s of e.set){let i=Gg(n,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),qg=[new On(">=0.0.0-0")],ji=[new On(">=0.0.0")],Gg=c((o,e,t)=>{if(o===e)return!0;if(o.length===1&&o[0].semver===An){if(e.length===1&&e[0].semver===An)return!0;t.includePrerelease?o=qg:o=ji}if(e.length===1&&e[0].semver===An){if(t.includePrerelease)return!0;e=ji}let r=new Set,n,s;for(let m of o)m.operator===">"||m.operator===">="?n=Hi(n,m,t):m.operator==="<"||m.operator==="<="?s=zi(s,m,t):r.add(m.semver);if(r.size>1)return null;let i;if(n&&s){if(i=xn(n.semver,s.semver,t),i>0)return null;if(i===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let m of r){if(n&&!Ot(m,String(n),t)||s&&!Ot(m,String(s),t))return null;for(let O of e)if(!Ot(m,String(O),t))return!1;return!0}let a,l,g,h,u=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;u&&u.prerelease.length===1&&s.operator==="<"&&u.prerelease[0]===0&&(u=!1);for(let m of e){if(h=h||m.operator===">"||m.operator===">=",g=g||m.operator==="<"||m.operator==="<=",n){if(f&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===f.major&&m.semver.minor===f.minor&&m.semver.patch===f.patch&&(f=!1),m.operator===">"||m.operator===">="){if(a=Hi(n,m,t),a===m&&a!==n)return!1}else if(n.operator===">="&&!Ot(n.semver,String(m),t))return!1}if(s){if(u&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===u.major&&m.semver.minor===u.minor&&m.semver.patch===u.patch&&(u=!1),m.operator==="<"||m.operator==="<="){if(l=zi(s,m,t),l===m&&l!==s)return!1}else if(s.operator==="<="&&!Ot(s.semver,String(m),t))return!1}if(!m.operator&&(s||n)&&i!==0)return!1}return!(n&&g&&!s&&i!==0||s&&h&&!n&&i!==0||f||u)},"simpleSubset"),Hi=c((o,e,t)=>{if(!o)return e;let r=xn(o.semver,e.semver,t);return r>0?o:r<0||e.operator===">"&&o.operator===">="?e:o},"higherGT"),zi=c((o,e,t)=>{if(!o)return e;let r=xn(o.semver,e.semver,t);return r<0?o:r>0||e.operator==="<"&&o.operator==="<="?e:o},"lowerLT");Ui.exports=Bg});var qi=T((Ov,Bi)=>{"use strict";var Nn=at(),Vi=wt(),Xg=B(),Wi=Cn(),Jg=Ue(),Kg=fo(),Yg=vo(),Zg=yo(),Qg=Po(),eu=Ro(),tu=Io(),ru=Ao(),nu=xo(),su=pe(),ou=_o(),iu=jo(),au=Tr(),cu=Fo(),lu=Wo(),gu=bt(),uu=Mr(),pu=En(),hu=yn(),du=Pr(),mu=wr(),fu=Tn(),Cu=Qo(),vu=It(),Su=he(),Eu=At(),yu=di(),Tu=fi(),Mu=vi(),Pu=yi(),wu=Mi(),Ru=Ir(),bu=$i(),Iu=Oi(),$u=Di(),Au=_i(),Ou=Fi();Bi.exports={parse:Jg,valid:Kg,clean:Yg,inc:Zg,diff:Qg,major:eu,minor:tu,patch:ru,prerelease:nu,compare:su,rcompare:ou,compareLoose:iu,compareBuild:au,sort:cu,rsort:lu,gt:gu,lt:uu,eq:pu,neq:hu,gte:du,lte:mu,cmp:fu,coerce:Cu,Comparator:vu,Range:Su,satisfies:Eu,toComparators:yu,maxSatisfying:Tu,minSatisfying:Mu,minVersion:Pu,validRange:wu,outside:Ru,gtr:bu,ltr:Iu,intersects:$u,simplifyRange:Au,subset:Ou,SemVer:Xg,re:Nn.re,src:Nn.src,tokens:Nn.t,SEMVER_SPEC_VERSION:Vi.SEMVER_SPEC_VERSION,RELEASE_TYPES:Vi.RELEASE_TYPES,compareIdentifiers:Wi.compareIdentifiers,rcompareIdentifiers:Wi.rcompareIdentifiers}});import{exec as xu,spawn as Nu}from"child_process";import{promisify as Du}from"util";var xt,Gi,Fe,Dn=C(()=>{"use strict";xt=Ta(qi(),1);P();z();Gi=Du(xu),Fe=class{static{c(this,"NPMManager")}logger=p.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||w()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.logger.info(`\u5F00\u59CB\u5B89\u88C5: xiaozhi-client@${e} [${t}]`),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let n=Nu("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((s,i)=>{n.stdout.on("data",a=>{let l=a.toString();console.log(l),this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),n.stderr.on("data",a=>{let l=a.toString();console.log(l),this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),n.on("close",a=>{let l=Date.now()-r;if(a===0)console.log("\u5B89\u88C5\u5B8C\u6210\uFF01"),this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),s();else{let g=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${a}`;console.log(g),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:g,duration:l,timestamp:Date.now()}),i(new Error(g))}})})}async getCurrentVersion(){let{stdout:e}=await Gi("npm list -g xiaozhi-client --depth=0 --json --registry=https://registry.npmmirror.com");return JSON.parse(e).dependencies?.["xiaozhi-client"]?.version||"unknown"}static VERSION_TYPES={STABLE:"stable",RC:"rc",BETA:"beta",ALL:"all"};async getAvailableVersions(e="stable"){try{let{stdout:t}=await Gi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),n=JSON.parse(t).filter(s=>s&&typeof s=="string"&&xt.default.valid(s));return e!=="all"&&(n=n.filter(s=>{let i=xt.default.prerelease(s);return e==="stable"?i===null:e==="rc"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("rc")===!0:e==="beta"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("beta")===!0:!0})),n.sort((s,i)=>xt.default.rcompare(s,i))}catch(t){return this.logger.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25:",t),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],n=!1;try{n=xt.default.gt(r,e)}catch(s){this.logger.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25:",s),n=r!==e}return this.logger.info(`\u7248\u672C\u68C0\u67E5\u5B8C\u6210: \u5F53\u524D\u7248\u672C ${e}, \u6700\u65B0\u7248\u672C ${r}, \u6709\u66F4\u65B0: ${n}`),{currentVersion:e,latestVersion:r,hasUpdate:n}}catch(e){return this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",e),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});import{z as Xi}from"zod";var Lu,$r,Ji=C(()=>{"use strict";P();Dn();z();Lu=Xi.object({version:Xi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),$r=class{static{c(this,"UpdateApiHandler")}npmManager;logger=p.withTag("UpdateApiHandler");eventBus=w();activeInstalls=new Map;constructor(){this.npmManager=new Fe(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Lu.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version:n}=r.data;return Array.from(this.activeInstalls.values()).some(i=>i)?e.json({success:!1,error:{code:"INSTALL_IN_PROGRESS",message:"\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5"}},409):(this.npmManager.installVersion(n).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:n,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},message:"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7"}))}catch(t){return this.logger.error("\u5904\u7406\u5B89\u88C5\u8BF7\u6C42\u5931\u8D25:",t),e.json({success:!1,error:{code:"REQUEST_FAILED",message:t instanceof Error?t.message:"\u8BF7\u6C42\u5904\u7406\u5931\u8D25"}},500)}}}});var Ar,Ki=C(()=>{"use strict";P();Kr();Dn();Ar=class{static{c(this,"VersionApiHandler")}logger;constructor(){this.logger=p.withTag("VersionApiHandler")}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getVersion(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=xe.getVersionInfo();return this.logger.debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25");return e.json(r,500)}}async getVersionSimple(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=xe.getVersion();return this.logger.debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.json(this.createSuccessResponse({version:t}))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25");return e.json(r,500)}}async clearVersionCache(e){try{return this.logger.debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),xe.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let s=await new Fe().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${s.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:s,type:t,total:s.length}))}catch(t){this.logger.error("\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("VERSIONS_FETCH_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async checkLatestVersion(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new Fe().checkForLatestVersion();return this.logger.debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error})):e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate}))}catch(t){this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",t);let r=this.createErrorResponse("LATEST_VERSION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25");return e.json(r,500)}}}});var Or,Yi=C(()=>{"use strict";P();ne();z();Or=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=p.withTag("NotificationService"),this.eventBus=w(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=d.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:c(n=>{t.readyState===1&&t.send(n)},"send")};this.clients.set(e,r),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u518C: ${e}`),this.logger.debug(`\u5F53\u524D\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.sendQueuedMessages(e),this.eventBus.emitEvent("websocket:client:connected",{clientId:e,timestamp:Date.now()})}catch(r){this.logger.error(`\u6CE8\u518C\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,r),this.eventBus.emitEvent("notification:error",{error:r instanceof Error?r:new Error(String(r)),type:"client:register"})}}unregisterClient(e){try{this.clients.has(e)&&(this.clients.delete(e),this.messageQueue.delete(e),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u9500: ${e}`),this.logger.debug(`\u5269\u4F59\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.eventBus.emitEvent("websocket:client:disconnected",{clientId:e,timestamp:Date.now()}))}catch(t){this.logger.error(`\u6CE8\u9500\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,t)}}broadcast(e,t){let r={type:e,data:t,timestamp:Date.now()};this.logger.debug(`\u5E7F\u64AD\u6D88\u606F: ${e}`,{clientCount:this.clients.size});for(let[n,s]of this.clients)this.sendMessageToClient(s,r,n)}sendToClient(e,t,r){let n={type:t,data:r,timestamp:Date.now()},s=this.clients.get(e);s?this.sendMessageToClient(s,n,e):this.queueMessage(e,n)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let n=JSON.stringify(t);e.send(n),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF ${r}: ${t.type}`)}else this.queueMessage(r,t),this.logger.warn(`\u5BA2\u6237\u7AEF ${r} \u8FDE\u63A5\u4E0D\u53EF\u7528\uFF0C\u6D88\u606F\u5DF2\u52A0\u5165\u961F\u5217`)}catch(n){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,n),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:n instanceof Error?n:new Error(String(n)),type:"message:send"})}}queueMessage(e,t){this.messageQueue.has(e)||this.messageQueue.set(e,[]);let r=this.messageQueue.get(e);r.push(t),r.length>this.maxQueueSize&&(r.shift(),this.logger.warn(`\u5BA2\u6237\u7AEF ${e} \u6D88\u606F\u961F\u5217\u5DF2\u6EE1\uFF0C\u79FB\u9664\u6700\u65E7\u6D88\u606F`))}sendQueuedMessages(e){let t=this.messageQueue.get(e);if(!t||t.length===0)return;let r=this.clients.get(e);if(r){this.logger.info(`\u53D1\u9001 ${t.length} \u6761\u6392\u961F\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${e}`);for(let n of t)this.sendMessageToClient(r,n,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let n={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",n)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,n)=>r+n.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var xr,Zi=C(()=>{"use strict";P();z();xr=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=p.withTag("StatusService"),this.eventBus=w()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.updateClientInfo({status:"disconnected"},"heartbeat-timeout")},this.HEARTBEAT_TIMEOUT)}clearHeartbeatTimeout(){this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=void 0)}isClientConnected(){return this.clientInfo.status==="connected"}getLastHeartbeat(){return this.clientInfo.lastHeartbeat}getActiveMCPServers(){return[...this.clientInfo.activeMCPServers]}setActiveMCPServers(e){this.updateClientInfo({activeMCPServers:[...e]},"mcp-servers-update")}setMcpEndpoint(e){this.updateClientInfo({mcpEndpoint:e},"mcp-endpoint-update")}reset(){this.logger.info("\u91CD\u7F6E\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]},this.restartStatus=void 0}destroy(){this.logger.info("\u9500\u6BC1\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.reset()}}});var _n={};re(_n,{WebServer:()=>Ln});import{createServer as _u}from"http";import{serve as ku}from"@hono/node-server";import{Hono as ju}from"hono";import{cors as Hu}from"hono/cors";import{WebSocketServer as zu}from"ws";var Ln,kn=C(()=>{"use strict";P();Ft();_s();ne();Qt();Fs();Vs();Bs();qs();Gs();Xs();Ks();Ys();Zs();Qs();eo();ro();Ji();Ki();Pt();z();Yi();Zi();Ln=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;proxyMCPServer;xiaozhiConnectionManager;mcpServiceManager;createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}constructor(e){try{this.port=e??d.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=p.withTag("WebServer"),this.eventBus=w(),this.configService=new Me,this.statusService=new xr,this.notificationService=new Or,this.configApiHandler=new tr,this.statusApiHandler=new dr(this.statusService),this.serviceApiHandler=new ur(this.statusService),this.toolApiHandler=new fr,this.versionApiHandler=new Ar,this.staticFileHandler=new hr,this.mcpRouteHandler=new ir,this.realtimeNotificationHandler=new lr(this.notificationService,this.statusService),this.heartbeatHandler=new or(this.statusService,this.notificationService),this.app=new ju,this.setupMiddleware(),this.setupRoutes(),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5...");let e=await this.loadConfiguration();this.mcpServiceManager=await oe.getInstance(),this.mcpServerApiHandler=new cr(this.mcpServiceManager,d),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.info(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`),await this.initializeXiaozhiConnection(e.mcpEndpoint,t),this.logger.info("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),e}}async loadConfiguration(){if(!d.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");d.cleanupInvalidServerToolsConfig();let e=d.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.info(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let n=Ls(t,r);this.mcpServiceManager.addServiceConfig(t,n)}await this.mcpServiceManager.startAllServices(),this.logger.info("\u6240\u6709 MCP \u670D\u52A1\u5DF2\u542F\u52A8")}async initializeXiaozhiConnection(e,t){let n=(Array.isArray(e)?e:[e]).filter(s=>s&&!s.includes("<\u8BF7\u586B\u5199"));this.logger.debug(`\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\uFF0C\u7AEF\u70B9\u6570\u91CF: ${n.length}`);try{this.xiaozhiConnectionManager=await ot.getInstance({reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4}),this.mcpServiceManager&&this.xiaozhiConnectionManager&&this.xiaozhiConnectionManager.setServiceManager(this.mcpServiceManager),this.logger.info("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(s){this.logger.error("\u274C \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s);return}if(n.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",n);try{await this.xiaozhiConnectionManager.initialize(n,t),await this.xiaozhiConnectionManager.connect(),this.xiaozhiConnectionManager.on("configChange",s=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${s.type}`,s.data)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${n.length} \u4E2A\u7AEF\u70B9`)}catch(s){this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s),this.logger.warn("\u56DE\u9000\u5230\u5355\u8FDE\u63A5\u6A21\u5F0F");let i=n[0];this.logger.debug(`\u521D\u59CB\u5316\u5355\u4E2A\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5: ${i}`),this.proxyMCPServer=new be(i),this.mcpServiceManager&&this.proxyMCPServer.setServiceManager(this.mcpServiceManager),await this.connectWithRetry(()=>this.proxyMCPServer.connect(),"\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5"),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")}}else try{this.xiaozhiConnectionManager&&(await this.xiaozhiConnectionManager.initialize([],t),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u521D\u59CB\u5316\u4E3A\u7A7A\u7BA1\u7406\u5668\uFF0C\u652F\u6301\u52A8\u6001\u6DFB\u52A0\u7AEF\u70B9"))}catch(s){this.logger.error("\u274C \u7A7A\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s)}}getXiaozhiConnectionStatus(){return this.xiaozhiConnectionManager?{type:"multi-endpoint",manager:{connectedConnections:this.xiaozhiConnectionManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.xiaozhiConnectionManager.getConnectionStatus().length,healthCheckStats:{},reconnectStats:this.xiaozhiConnectionManager.getReconnectStats()},connections:this.xiaozhiConnectionManager.getConnectionStatus()}:this.proxyMCPServer?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async handleEndpointStatus(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).getEndpointStatus(e)}async handleEndpointConnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).connectEndpoint(e)}async handleEndpointDisconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).disconnectEndpoint(e)}async handleEndpointReconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).reconnectEndpoint(e)}async handleEndpointAdd(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return await new Ae(this.xiaozhiConnectionManager,d).addEndpoint(e)}async handleEndpointRemove(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).removeEndpoint(e)}async connectWithRetry(e,t,r=5,n=1e3,s=3e4,i=2){let a=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(g){if(a=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let h=Math.min(n*i**(l-1),s);this.logger.info(`${t} - ${h}ms \u540E\u91CD\u8BD5...`),await this.sleep(h)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",Hu({origin:"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})),this.app?.onError((e,t)=>{this.logger.error("HTTP request error:",e);let r=this.createErrorResponse("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?e.stack:void 0);return t.json(r,500)})}setupRoutes(){this.app?.get("/api/config",t=>this.configApiHandler.getConfig(t)),this.app?.put("/api/config",t=>this.configApiHandler.updateConfig(t)),this.app?.get("/api/config/mcp-endpoint",t=>this.configApiHandler.getMcpEndpoint(t)),this.app?.get("/api/config/mcp-endpoints",t=>this.configApiHandler.getMcpEndpoints(t)),this.app?.get("/api/config/mcp-servers",t=>this.configApiHandler.getMcpServers(t)),this.app?.get("/api/config/connection",t=>this.configApiHandler.getConnectionConfig(t)),this.app?.post("/api/config/reload",t=>this.configApiHandler.reloadConfig(t)),this.app?.get("/api/config/path",t=>this.configApiHandler.getConfigPath(t)),this.app?.get("/api/config/exists",t=>this.configApiHandler.checkConfigExists(t)),this.app?.get("/api/version",t=>this.versionApiHandler.getVersion(t)),this.app?.get("/api/version/simple",t=>this.versionApiHandler.getVersionSimple(t)),this.app?.get("/api/version/available",t=>this.versionApiHandler.getAvailableVersions(t)),this.app?.get("/api/version/latest",t=>this.versionApiHandler.checkLatestVersion(t)),this.app?.post("/api/version/cache/clear",t=>this.versionApiHandler.clearVersionCache(t));let e=new $r;this.app?.post("/api/update",t=>e.performUpdate(t)),this.app?.get("/api/status",t=>this.statusApiHandler.getStatus(t)),this.app?.get("/api/status/client",t=>this.statusApiHandler.getClientStatus(t)),this.app?.get("/api/status/restart",t=>this.statusApiHandler.getRestartStatus(t)),this.app?.get("/api/status/connected",t=>this.statusApiHandler.checkClientConnected(t)),this.app?.get("/api/status/heartbeat",t=>this.statusApiHandler.getLastHeartbeat(t)),this.app?.get("/api/status/mcp-servers",t=>this.statusApiHandler.getActiveMCPServers(t)),this.app?.put("/api/status/client",t=>this.statusApiHandler.updateClientStatus(t)),this.app?.put("/api/status/mcp-servers",t=>this.statusApiHandler.setActiveMCPServers(t)),this.app?.post("/api/status/reset",t=>this.statusApiHandler.resetStatus(t)),this.app?.post("/api/services/restart",t=>this.serviceApiHandler.restartService(t)),this.app?.post("/api/services/stop",t=>this.serviceApiHandler.stopService(t)),this.app?.post("/api/services/start",t=>this.serviceApiHandler.startService(t)),this.app?.get("/api/services/status",t=>this.serviceApiHandler.getServiceStatus(t)),this.app?.get("/api/services/health",t=>this.serviceApiHandler.getServiceHealth(t)),this.app?.post("/api/tools/call",t=>this.toolApiHandler.callTool(t)),this.app?.get("/api/tools/list",t=>this.toolApiHandler.listTools(t)),this.app?.get("/api/tools/custom",t=>this.toolApiHandler.getCustomTools(t)),this.app?.post("/api/tools/custom",t=>this.toolApiHandler.addCustomTool(t)),this.app?.put("/api/tools/custom/:toolName",t=>this.toolApiHandler.updateCustomTool(t)),this.app?.delete("/api/tools/custom/:toolName",t=>this.toolApiHandler.removeCustomTool(t)),this.app?.get("/api/coze/workspaces",t=>He.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>He.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>He.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>He.getCacheStats(t)),this.app?.get("/api/endpoints/:endpoint/status",t=>this.handleEndpointStatus(t)),this.app?.post("/api/endpoints/:endpoint/connect",t=>this.handleEndpointConnect(t)),this.app?.post("/api/endpoints/:endpoint/disconnect",t=>this.handleEndpointDisconnect(t)),this.app?.post("/api/endpoints/:endpoint/reconnect",t=>this.handleEndpointReconnect(t)),this.app?.post("/api/endpoints/add",t=>this.handleEndpointAdd(t)),this.app?.delete("/api/endpoints/:endpoint",t=>this.handleEndpointRemove(t)),this.app?.post("/api/mcp-servers",t=>this.mcpServerApiHandler?.addMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.delete("/api/mcp-servers/:serverName",t=>this.mcpServerApiHandler?.removeMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers/:serverName/status",t=>this.mcpServerApiHandler?.getMCPServerStatus(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers",t=>this.mcpServerApiHandler?.listMCPServers(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.post("/mcp",t=>this.mcpRouteHandler.handlePost(t)),this.app?.get("/mcp",t=>this.mcpRouteHandler.handleGet(t)),this.app?.all("/api/*",async t=>{let r=this.createErrorResponse("API_NOT_FOUND",`API \u7AEF\u70B9\u4E0D\u5B58\u5728: ${t.req.path}`);return t.json(r,404)}),this.app.get("*",t=>this.staticFileHandler.handleStaticFile(t))}setupWebSocket(){this.wss&&this.wss.on("connection",e=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let n=JSON.parse(r.toString());n.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,n,t):await this.realtimeNotificationHandler.handleMessage(e,n,t)}catch(n){this.logger.error("WebSocket message error:",n);let s={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:n instanceof Error?n.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(s))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}let e=ku({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:_u});this.httpServer=e,this.wss=new zu({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://0.0.0.0:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`);try{await this.initializeConnections()}catch(t){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u4F46 Web \u670D\u52A1\u5668\u7EE7\u7EED\u8FD0\u884C:",t)}}stop(){return new Promise(e=>{let t=!1,r=c(()=>{t||(t=!0,e())},"doResolve");if(this.proxyMCPServer?.disconnect(),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let n of this.wss.clients)n.terminate();this.wss.close(()=>{this.httpServer?this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()}):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()),setTimeout(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.statusService.destroy(),this.notificationService.destroy(),Qn(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});var Qi={};re(Qi,{ServiceManagerImpl:()=>jn});var jn,ea=C(()=>{"use strict";Ce();Ye();ft();Ht();jn=class{constructor(e,t,r){this.processManager=e;this.configManager=t;this.logger=r}static{c(this,"ServiceManagerImpl")}async start(e){try{this.validateStartOptions(e),this.processManager.cleanupContainerState();let t=this.getStatus();if(t.running){console.log(`\u68C0\u6D4B\u5230\u670D\u52A1\u5DF2\u5728\u8FD0\u884C (PID: ${t.pid})\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u542F...`);try{await this.processManager.gracefulKillProcess(t.pid),this.processManager.cleanupPidFile(),await new Promise(r=>setTimeout(r,1e3)),console.log("\u73B0\u6709\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u6B63\u5728\u542F\u52A8\u65B0\u670D\u52A1...")}catch(r){console.warn(`\u505C\u6B62\u73B0\u6709\u670D\u52A1\u65F6\u51FA\u73B0\u8B66\u544A: ${r instanceof Error?r.message:String(r)}`)}}switch(this.checkEnvironment(),e.mode){case"mcp-server":await this.startMcpServerMode(e);break;case"stdio":await this.startStdioMode(e);break;case"normal":await this.startNormalMode(e);break;default:await this.startNormalMode(e);break}}catch(t){throw t instanceof _?t:_.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw _.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile()}catch(e){throw e instanceof _?e:new _(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restart(e){try{this.getStatus().running&&(await this.stop(),await new Promise(r=>setTimeout(r,1e3))),await this.start(e)}catch(t){throw new _(`\u91CD\u542F\u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}getStatus(){return this.processManager.getServiceStatus()}validateStartOptions(e){if(e.port!==void 0&&le.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new _(`\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F: ${e.mode}`)}checkEnvironment(){if(!this.configManager.configExists())throw ke.configNotFound();try{if(!this.configManager.getConfig())throw new ke("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof ke?e:new ke(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${e instanceof Error?e.message:String(e)}`)}}async startNormalMode(e){let{spawn:t}=await import("child_process");e.daemon?await this.startWebServerInDaemon(e.ui||!1):await this.startWebServerInForeground(e.ui||!1)}async startMcpServerMode(e){let t=e.port||3e3,{spawn:r}=await import("child_process");if(e.daemon){let n=L.getExecutablePath("cli"),s=r("node",[n,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(s.pid,"daemon"),s.unref(),console.log(`\u2705 MCP Server \u5DF2\u5728\u540E\u53F0\u542F\u52A8 (PID: ${s.pid}, Port: ${t})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),process.exit(0)}else{let{MCPServer:n}=await Promise.resolve().then(()=>(Os(),As)),s=new n(t),i=c(async()=>{await s.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i),await s.start()}}async startStdioMode(e){let{spawn:t}=await import("child_process"),r=L.getMcpServerProxyPath(),n=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir()}});this.processManager.savePidInfo(n.pid,"foreground")}async startWebServerInDaemon(e){let{spawn:t}=await import("child_process"),r=L.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(r))throw new _(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${r}`);let s=[r];e&&s.push("--open-browser");let i=t("node",s,{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(i.pid,"daemon"),i.unref(),console.log(`\u2705 \u540E\u53F0\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${i.pid})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi attach' \u67E5\u770B\u65E5\u5FD7"),process.exit(0)}async startWebServerInForeground(e){let{WebServer:t}=await Promise.resolve().then(()=>(kn(),_n)),r=new t,n=c(async()=>{await r.stop(),this.processManager.cleanupPidFile(),process.exit(0)},"cleanup");if(process.on("SIGINT",n),process.on("SIGTERM",n),this.processManager.savePidInfo(process.pid,"foreground"),await r.start(),e){let i=this.configManager.getConfig()?.webServer?.port||9999;await this.openBrowserUrl(`http://localhost:${i}`)}}async openBrowserUrl(e){try{let{spawn:t}=await import("child_process"),r=se.getCurrentPlatform(),n,s;r==="darwin"?(n="open",s=[e]):r==="win32"?(n="start",s=["",e]):(n="xdg-open",s=[e]),t(n,s,{detached:!0,stdio:"ignore"}),console.log(`\u{1F310} \u5DF2\u5C1D\u8BD5\u6253\u5F00\u6D4F\u89C8\u5668: ${e}`)}catch{console.log(`\u26A0\uFE0F \u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`)}}}});var ta={};re(ta,{TemplateManagerImpl:()=>Hn});import Uu from"fs";import Ve from"path";var Hn,ra=C(()=>{"use strict";Ce();mt();Ye();Ht();Hn=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=L.findTemplatesDir();if(!e)return[];let t=[],r=Uu.readdirSync(e,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name);for(let n of r)try{let s=await this.getTemplateInfo(n);s&&t.push(s)}catch{console.warn(`\u8DF3\u8FC7\u65E0\u6548\u6A21\u677F: ${n}`)}return t}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",L.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(le.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=L.getTemplatePath(e);if(!t)return null;let r=Ve.join(t,"template.json"),n={};if($.exists(r))try{let a=$.readFile(r);n=JSON.parse(a)}catch{console.warn(`\u6A21\u677F\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}`)}let s=this.getTemplateFiles(t),i={name:e,path:t,description:n.description||`${e} \u6A21\u677F`,version:n.version||"1.0.0",author:n.author,files:s};return this.templateCache.set(e,i),i}catch(t){throw t instanceof I?t:new R(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:Ve.basename(t)})}async createProject(e){try{this.validateCreateOptions(e);let t=e.templateName||"default",r=await this.getTemplateInfo(t);if(!r)throw new R(`\u6A21\u677F\u4E0D\u5B58\u5728: ${t}`,"");let n=Ve.resolve(e.targetPath);if($.exists(n))throw R.alreadyExists(n);$.ensureDir(n),await this.copyTemplateFiles(r,n,e),await this.processTemplateVariables(n,e),console.log(`\u2705 \u9879\u76EE\u521B\u5EFA\u6210\u529F: ${n}`)}catch(t){throw t instanceof R||t instanceof I?t:new R(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,e.targetPath)}}async validateTemplate(e){try{let t=await this.getTemplateInfo(e);if(!t)return!1;let r=["package.json"];for(let n of r){let s=Ve.join(t.path,n);if(!$.exists(s))return console.warn(`\u6A21\u677F\u7F3A\u5C11\u5FC5\u8981\u6587\u4EF6: ${n}`),!1}return!0}catch{return!1}}clearCache(){this.templateCache.clear()}getTemplateFiles(e){try{return $.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let n=Ve.relative(e,r);return!n.startsWith(".")&&n!=="template.json"&&!n.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){le.validateRequired(e.targetPath,"targetPath"),le.validateRequired(e.projectName,"projectName"),le.validateProjectName(e.projectName),e.templateName&&le.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{$.copyDirectory(e.path,t,{exclude:["template.json",".git","node_modules"],overwrite:!1,recursive:!0})}catch(n){throw new R(`\u590D\u5236\u6A21\u677F\u6587\u4EF6\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`,e.path)}}async processTemplateVariables(e,t){try{let r={PROJECT_NAME:t.projectName,PROJECT_NAME_LOWER:t.projectName.toLowerCase(),PROJECT_NAME_UPPER:t.projectName.toUpperCase(),...t.variables},n=["package.json","README.md","src/**/*.ts","src/**/*.js","src/**/*.json"];for(let s of n){let i=this.findFilesByPattern(e,s);for(let a of i)await this.replaceVariablesInFile(a,r)}}catch(r){console.warn(`\u5904\u7406\u6A21\u677F\u53D8\u91CF\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}findFilesByPattern(e,t){try{if(!t.includes("*")){let s=Ve.join(e,t);return $.exists(s)?[s]:[]}let r=$.listDirectory(e,{recursive:!0}),n=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(s=>{let i=Ve.relative(e,s);return n.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=$.readFile(e),n=!1;for(let[s,i]of Object.entries(t)){let a=new RegExp(`{{\\s*${s}\\s*}}`,"g");a.test(r)&&(r=r.replace(a,i),n=!0)}n&&$.writeFile(e,r,{overwrite:!0})}catch(r){console.warn(`\u66FF\u6362\u6587\u4EF6\u53D8\u91CF\u5931\u8D25 ${e}: ${r instanceof Error?r.message:String(r)}`)}}}});async function ze(){return zn.create()}var zn,dn=C(()=>{"use strict";P();ne();Xr();mt();Jr();Ye();ft();Ht();Kr();zn=class o{static{c(this,"DIContainer")}instances=new Map;factories=new Map;asyncFactories=new Map;singletons=new Set;register(e,t,r=!1){this.factories.set(e,t),r&&this.singletons.add(e)}registerSingleton(e,t){this.register(e,t,!0)}registerInstance(e,t){this.instances.set(e,t),this.singletons.add(e)}get(e){if(this.singletons.has(e)&&this.instances.has(e))return this.instances.get(e);let t=this.factories.get(e);if(!t)throw new Error(`Service ${e} not registered`);let r=t();return this.singletons.has(e)&&this.instances.set(e,r),r}has(e){return this.factories.has(e)||this.instances.has(e)}clear(){this.instances.clear(),this.factories.clear(),this.singletons.clear()}getRegisteredKeys(){let e=Array.from(this.factories.keys()),t=Array.from(this.instances.keys());return[...new Set([...e,...t])]}static create(){let e=new o;return e.registerSingleton("versionUtils",()=>xe),e.registerSingleton("platformUtils",()=>se),e.registerSingleton("formatUtils",()=>Ke),e.registerSingleton("fileUtils",()=>$),e.registerSingleton("pathUtils",()=>L),e.registerSingleton("validation",()=>le),e.registerSingleton("configManager",()=>d),e.registerSingleton("logger",()=>p),e.registerSingleton("errorHandler",()=>ve),e.registerSingleton("processManager",()=>{let t=(Yr(),fe(as));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(gs(),fe(ls)),r=e.get("processManager"),n=e.get("logger");return new t.DaemonManagerImpl(r,n)}),e.registerSingleton("serviceManager",()=>{let t=(ea(),fe(Qi)),r=e.get("processManager"),n=e.get("configManager"),s=e.get("logger");return new t.ServiceManagerImpl(r,n,s)}),e.registerSingleton("templateManager",()=>{let t=(ra(),fe(ta));return new t.TemplateManagerImpl}),e}};c(ze,"createContainer")});var ee,We=C(()=>{"use strict";ee=class{constructor(e){this.container=e}static{c(this,"BaseCommandHandler")}options;subcommands;getService(e){return this.container.get(e)}handleError(e){this.getService("errorHandler").handle(e)}validateArgs(e,t){if(e.length<t)throw new Error(`\u547D\u4EE4\u9700\u8981\u81F3\u5C11 ${t} \u4E2A\u53C2\u6570\uFF0C\u4F46\u53EA\u63D0\u4F9B\u4E86 ${e.length} \u4E2A`)}}});var na={};re(na,{ServiceCommandHandler:()=>Un});var Un,sa=C(()=>{"use strict";P();We();Un=class extends ee{static{c(this,"ServiceCommandHandler")}name="service";description="\u670D\u52A1\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"start",description:"\u542F\u52A8\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"},{flags:"--debug",description:"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F (\u8F93\u51FADEBUG\u7EA7\u522B\u65E5\u5FD7)"},{flags:"--stdio",description:"\u4EE5 stdio \u6A21\u5F0F\u8FD0\u884C MCP Server (\u7528\u4E8E Cursor \u7B49\u5BA2\u6237\u7AEF)"}],execute:c(async(e,t)=>{await this.handleStart(t)},"execute")},{name:"stop",description:"\u505C\u6B62\u670D\u52A1",execute:c(async(e,t)=>{await this.handleStop()},"execute")},{name:"status",description:"\u68C0\u67E5\u670D\u52A1\u72B6\u6001",execute:c(async(e,t)=>{await this.handleStatus()},"execute")},{name:"restart",description:"\u91CD\u542F\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"}],execute:c(async(e,t)=>{await this.handleRestart(t)},"execute")},{name:"attach",description:"\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7",execute:c(async(e,t)=>{await this.handleAttach()},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u670D\u52A1\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleStart(e){try{e.debug&&Zn("debug");let t=this.getService("serviceManager");e.stdio?await this.startStdioMode():await t.start({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleStop(){try{await this.getService("serviceManager").stop()}catch(e){this.handleError(e)}}async handleStatus(){try{let t=await this.getService("serviceManager").getStatus();t.running?(console.log(`\u2705 \u670D\u52A1\u6B63\u5728\u8FD0\u884C (PID: ${t.pid})`),t.uptime&&console.log(`\u23F1\uFE0F \u8FD0\u884C\u65F6\u95F4: ${t.uptime}`),t.mode&&console.log(`\u{1F527} \u8FD0\u884C\u6A21\u5F0F: ${t.mode}`)):console.log("\u274C \u670D\u52A1\u672A\u8FD0\u884C")}catch(e){this.handleError(e)}}async handleRestart(e){try{await this.getService("serviceManager").restart({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleAttach(){try{await this.getService("daemonManager").attachToLogs()}catch(e){this.handleError(e)}}async startStdioMode(){let{spawn:e}=await import("child_process"),{fileURLToPath:t}=await import("url"),r=await import("path"),n=t(import.meta.url),s=r.dirname(n),i=r.join(s,"mcpServerProxy.js");e("node",[i],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}})}}});var oa={};re(oa,{ConfigCommandHandler:()=>Vn});import Fu from"path";import N from"chalk";import Fn from"ora";var Vn,ia=C(()=>{"use strict";We();Vn=class extends ee{static{c(this,"ConfigCommandHandler")}name="config";description="\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"init",description:"\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6",options:[{flags:"-f, --format <format>",description:"\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F (json, json5, jsonc)",defaultValue:"json"}],execute:c(async(e,t)=>{await this.handleInit(t)},"execute")},{name:"get",description:"\u67E5\u770B\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleGet(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,2),await this.handleSet(e[0],e[1])},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleInit(e){let t=Fn("\u521D\u59CB\u5316\u914D\u7F6E...").start();try{let r=e.format;if(r!=="json"&&r!=="json5"&&r!=="jsonc")throw new Error("\u683C\u5F0F\u5FC5\u987B\u662F json, json5 \u6216 jsonc");let n=this.getService("configManager");if(n.configExists()){t.warn("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728"),console.log(N.yellow("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u5220\u9664\u73B0\u6709\u7684\u914D\u7F6E\u6587\u4EF6"));return}n.initConfig(r),t.succeed("\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u6210\u529F");let s=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),i=`xiaozhi.config.${r}`,a=Fu.join(s,i);console.log(N.green(`\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u521B\u5EFA: ${i}`)),console.log(N.yellow("\u{1F4DD} \u8BF7\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9:")),console.log(N.gray(` \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${a}`)),console.log(N.yellow("\u{1F4A1} \u6216\u8005\u4F7F\u7528\u547D\u4EE4\u8BBE\u7F6E:")),console.log(N.gray(" xiaozhi config set mcpEndpoint <your-endpoint-url>"))}catch(r){t.fail(`\u521D\u59CB\u5316\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleGet(e){let t=Fn("\u8BFB\u53D6\u914D\u7F6E...").start();try{let r=this.getService("configManager");if(!r.configExists()){t.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let n=r.getConfig();switch(e){case"mcpEndpoint":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let s=r.getMcpEndpoints();s.length===0?console.log(N.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):s.length===1?console.log(N.green(`MCP \u7AEF\u70B9: ${s[0]}`)):(console.log(N.green(`MCP \u7AEF\u70B9 (${s.length} \u4E2A):`)),s.forEach((i,a)=>{console.log(N.gray(` ${a+1}. ${i}`))}));break}case"mcpServers":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green("MCP \u670D\u52A1:"));for(let[s,i]of Object.entries(n.mcpServers)){let a=i;"type"in a&&a.type==="sse"?console.log(N.gray(` ${s}: [SSE] ${a.url}`)):console.log(N.gray(` ${s}: ${a.command} ${a.args.join(" ")}`))}break;case"connection":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let s=r.getConnectionConfig();console.log(N.green("\u8FDE\u63A5\u914D\u7F6E:")),console.log(N.gray(` \u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${s.heartbeatInterval}ms`)),console.log(N.gray(` \u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${s.heartbeatTimeout}ms`)),console.log(N.gray(` \u91CD\u8FDE\u95F4\u9694: ${s.reconnectInterval}ms`));break}case"heartbeatInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${r.getHeartbeatInterval()}ms`));break;case"heartbeatTimeout":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${r.getHeartbeatTimeout()}ms`));break;case"reconnectInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u91CD\u8FDE\u95F4\u9694: ${r.getReconnectInterval()}ms`));break;default:t.fail(`\u672A\u77E5\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u7684\u914D\u7F6E\u9879: mcpEndpoint, mcpServers, connection, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(r){t.fail(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e,t){let r=Fn("\u66F4\u65B0\u914D\u7F6E...").start();try{let n=this.getService("configManager");if(!n.configExists()){r.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}switch(e){case"mcpEndpoint":n.updateMcpEndpoint(t),r.succeed(`MCP \u7AEF\u70B9\u5DF2\u8BBE\u7F6E\u4E3A: ${t}`);break;case"heartbeatInterval":{let s=Number.parseInt(t);if(Number.isNaN(s)||s<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");n.updateHeartbeatInterval(s),r.succeed(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${s}ms`);break}case"heartbeatTimeout":{let s=Number.parseInt(t);if(Number.isNaN(s)||s<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u662F\u6B63\u6574\u6570");n.updateHeartbeatTimeout(s),r.succeed(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5DF2\u8BBE\u7F6E\u4E3A: ${s}ms`);break}case"reconnectInterval":{let s=Number.parseInt(t);if(Number.isNaN(s)||s<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");n.updateReconnectInterval(s),r.succeed(`\u91CD\u8FDE\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${s}ms`);break}default:r.fail(`\u4E0D\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: mcpEndpoint, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(n){r.fail(`\u8BBE\u7F6E\u914D\u7F6E\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`),this.handleError(n)}}}});var aa={};re(aa,{ProjectCommandHandler:()=>Wn});import Vu from"path";import H from"chalk";import Wu from"ora";var Wn,ca=C(()=>{"use strict";We();Wn=class extends ee{static{c(this,"ProjectCommandHandler")}name="create";description="\u521B\u5EFA\u9879\u76EE";options=[{flags:"-t, --template <templateName>",description:"\u4F7F\u7528\u6307\u5B9A\u6A21\u677F\u521B\u5EFA\u9879\u76EE"}];constructor(e){super(e)}async execute(e,t){this.validateArgs(e,1);let r=e[0];await this.handleCreate(r,t)}async handleCreate(e,t){let r=Wu("\u521D\u59CB\u5316\u9879\u76EE...").start();try{let n=this.getService("templateManager"),s=this.getService("fileUtils"),i=Vu.join(process.cwd(),e);if(await s.exists(i)){r.fail(`\u76EE\u5F55 "${e}" \u5DF2\u5B58\u5728`),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u9009\u62E9\u4E0D\u540C\u7684\u9879\u76EE\u540D\u79F0\u6216\u5220\u9664\u73B0\u6709\u76EE\u5F55"));return}t.template?await this.createFromTemplate(e,t.template,i,r,n):await this.createBasicProject(e,i,r,n)}catch(n){r.fail(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`),this.handleError(n)}}async createFromTemplate(e,t,r,n,s){n.text="\u68C0\u67E5\u6A21\u677F...";let i=await s.getAvailableTemplates();if(i.length===0){n.fail("\u627E\u4E0D\u5230\u53EF\u7528\u6A21\u677F"),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u786E\u4FDD xiaozhi-client \u6B63\u786E\u5B89\u88C5"));return}let a=t;if(!await s.validateTemplate(a)){n.fail(`\u6A21\u677F "${a}" \u4E0D\u5B58\u5728`);let g=this.findSimilarTemplate(a,i);if(g)if(console.log(H.yellow(`\u{1F4A1} \u4F60\u662F\u60F3\u4F7F\u7528\u6A21\u677F "${g}" \u5417\uFF1F`)),await this.askUserConfirmation(H.cyan("\u786E\u8BA4\u4F7F\u7528\u6B64\u6A21\u677F\uFF1F(y/n): ")))a=g;else{this.showAvailableTemplates(i);return}else{this.showAvailableTemplates(i);return}}n.text=`\u4ECE\u6A21\u677F "${a}" \u521B\u5EFA\u9879\u76EE "${e}"...`,await s.createProject({templateName:a,targetPath:r,projectName:e}),n.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" pnpm install # \u5B89\u88C5\u4F9D\u8D56")),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1"))}async createBasicProject(e,t,r,n){r.text=`\u521B\u5EFA\u57FA\u672C\u9879\u76EE "${e}"...`,await n.createProject({templateName:null,targetPath:t,projectName:e}),r.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u57FA\u672C\u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9\u548C\u670D\u52A1")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1")),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 --template \u9009\u9879\u53EF\u4EE5\u4ECE\u6A21\u677F\u521B\u5EFA\u9879\u76EE"))}showAvailableTemplates(e){console.log(H.yellow("\u53EF\u7528\u7684\u6A21\u677F:"));for(let t of e)console.log(H.gray(` - ${t}`))}findSimilarTemplate(e,t){let r=this.getService("formatUtils"),n=null,s=0;for(let i of t){let a=r.calculateSimilarity(e.toLowerCase(),i.toLowerCase());a>s&&a>.6&&(s=a,n=i)}return n}async askUserConfirmation(e){let r=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{r.question(e,s=>{r.close(),n(s.toLowerCase().trim()==="y"||s.toLowerCase().trim()==="yes")})})}}});var Nr,la=C(()=>{"use strict";P();Yr();ne();Nr=class{static{c(this,"ToolCallService")}logger;processManager;baseUrl;constructor(){this.logger=p.withTag("ToolCallService"),this.processManager=new Ct;try{let e=d.getWebUIPort()??9999;this.baseUrl=`http://localhost:${e}`}catch{this.baseUrl="http://localhost:9999"}}async callTool(e,t,r){await this.validateServiceStatus();try{let n=await fetch(`${this.baseUrl}/api/tools/call`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceName:e,toolName:t,args:r})});if(!n.ok){let i=await n.json();throw new Error(i.error?.message||`HTTP ${n.status}: ${n.statusText}`)}let s=await n.json();if(!s.success)throw new Error(s.error?.message||"\u5DE5\u5177\u8C03\u7528\u5931\u8D25");return s.data}catch(n){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`,n instanceof Error?n.message:String(n)),n}}parseJsonArgs(e){try{return JSON.parse(e)}catch(t){throw new Error(`\u53C2\u6570\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u4F7F\u7528\u6709\u6548\u7684 JSON \u683C\u5F0F\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}async validateServiceStatus(){if(!this.processManager.getServiceStatus().running)throw new Error("xiaozhi \u670D\u52A1\u672A\u542F\u52A8\u3002\u8BF7\u5148\u8FD0\u884C 'xiaozhi start' \u6216 'xiaozhi start -d' \u542F\u52A8\u670D\u52A1\u3002");try{let t=await fetch(`${this.baseUrl}/api/status`,{method:"GET",signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Web \u670D\u52A1\u5668\u54CD\u5E94\u9519\u8BEF: ${t.status}`)}catch(t){throw t instanceof Error&&t.name==="AbortError"?new Error("\u8FDE\u63A5 xiaozhi \u670D\u52A1\u8D85\u65F6\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5E38\u8FD0\u884C\u3002"):new Error(`\u65E0\u6CD5\u8FDE\u63A5\u5230 xiaozhi \u670D\u52A1\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}formatOutput(e){return JSON.stringify(e)}async getServiceStatus(){try{let e=this.processManager.getServiceStatus();if(!e.running)return"\u670D\u52A1\u672A\u542F\u52A8";try{let t=await fetch(`${this.baseUrl}/api/tools/list`,{method:"GET",signal:AbortSignal.timeout(3e3)});if(t.ok){let r=await t.json();if(r.success)return`\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${e.pid}, ${r.data.totalTools} \u4E2A\u5DE5\u5177\u53EF\u7528)`}return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46 MCP \u670D\u52A1\u53EF\u80FD\u672A\u5B8C\u5168\u521D\u59CB\u5316`}catch{return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46\u65E0\u6CD5\u8FDE\u63A5\u5230 Web API`}}catch(e){return`\u670D\u52A1\u72B6\u6001\u68C0\u67E5\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}}});var Lr={};re(Lr,{getDisplayWidth:()=>qn,listMcpServers:()=>Bu,listServerTools:()=>qu,setToolEnabled:()=>Gu,truncateToWidth:()=>Dr});import y from"chalk";import ga from"cli-table3";import Bn from"ora";function qn(o){let e=0;for(let t of o)/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(t)?e+=2:e+=1;return e}function Dr(o,e){if(qn(o)<=e)return o;if(e<=3)return"";let t="",r=0,n=!1;for(let s of o){let i=/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(s)?2:1;if(r+i>e-3){if(!n)return"";t+="...";break}t+=s,r+=i,n=!0}return t}async function Bu(o={}){let e=Bn("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{let t=d.getMcpServers(),r=Object.keys(t),n=d.getCustomMCPTools(),s=n.length>0,i=r.length+(s?1:0);if(i===0){e.warn("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\u6216 customMCP \u5DE5\u5177"),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi config' \u547D\u4EE4\u914D\u7F6E MCP \u670D\u52A1\u6216\u5728 xiaozhi.config.json \u4E2D\u914D\u7F6E customMCP \u5DE5\u5177"));return}if(e.succeed(`\u627E\u5230 ${i} \u4E2A MCP \u670D\u52A1${s?" (\u5305\u62EC customMCP)":""}`),o.tools){console.log(),console.log(y.bold("MCP \u670D\u52A1\u5DE5\u5177\u5217\u8868:")),console.log();let a=8,l=[];for(let h of r){let u=d.getServerToolsConfig(h),f=Object.keys(u);l.push(...f)}if(s){let h=n.map(u=>u.name);l.push(...h)}for(let h of l){let u=qn(h);u>a&&(a=u)}a=Math.max(10,Math.min(a+2,30));let g=new ga({head:[y.bold("MCP"),y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[15,a,8,40],wordWrap:!0,style:{head:[],border:[]}});if(s)for(let h of n){let u=Dr(h.description||"",32);g.push(["customMCP",h.name,y.green("\u542F\u7528"),u])}for(let h of r){let u=d.getServerToolsConfig(h),f=Object.keys(u);if(f.length===0)g.push([y.gray(h),y.gray("-"),y.gray("-"),y.gray("\u6682\u672A\u8BC6\u522B\u5230\u76F8\u5173\u5DE5\u5177")]);else{g.length>0&&g.push([{colSpan:4,content:""}]);for(let m of f){let O=u[m],ie=O.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),te=Dr(O.description||"",32);g.push([h,m,ie,te])}}}console.log(g.toString())}else{console.log(),console.log(y.bold("MCP \u670D\u52A1\u5217\u8868:")),console.log(),s&&(console.log(`${y.cyan("\u2022")} ${y.bold("customMCP")}`),console.log(` \u7C7B\u578B: ${y.gray("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")}`),console.log(` \u914D\u7F6E: ${y.gray("xiaozhi.config.json")}`),console.log(` \u5DE5\u5177: ${y.green(n.length)} \u542F\u7528 / ${y.yellow(n.length)} \u603B\u8BA1`),console.log());for(let a of r){let l=t[a],g=d.getServerToolsConfig(a),h=Object.keys(g).length,u=Object.values(g).filter(f=>f.enable!==!1).length;console.log(`${y.cyan("\u2022")} ${y.bold(a)}`),"url"in l?("type"in l&&l.type==="sse"?console.log(` \u7C7B\u578B: ${y.gray("SSE")}`):console.log(` \u7C7B\u578B: ${y.gray("Streamable HTTP")}`),console.log(` URL: ${y.gray(l.url)}`)):console.log(` \u547D\u4EE4: ${y.gray(l.command)} ${y.gray(l.args.join(" "))}`),h>0?console.log(` \u5DE5\u5177: ${y.green(u)} \u542F\u7528 / ${y.yellow(h)} \u603B\u8BA1`):console.log(` \u5DE5\u5177: ${y.gray("\u672A\u626B\u63CF (\u8BF7\u5148\u542F\u52A8\u670D\u52A1)")}`),console.log()}}console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp list --tools' \u67E5\u770B\u6240\u6709\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> list' \u67E5\u770B\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> <\u5DE5\u5177\u540D> enable/disable' \u542F\u7528/\u7981\u7528\u5DE5\u5177"))}catch(t){e.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function qu(o){let e=Bn(`\u83B7\u53D6 ${o} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!d.getMcpServers()[o]){e.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let r=d.getServerToolsConfig(o),n=Object.keys(r);if(n.length===0){e.warn(`\u670D\u52A1 '${o}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u542F\u52A8\u670D\u52A1\u4EE5\u626B\u63CF\u5DE5\u5177\u5217\u8868"));return}e.succeed(`\u670D\u52A1 '${o}' \u5171\u6709 ${n.length} \u4E2A\u5DE5\u5177`),console.log(),console.log(y.bold(`${o} \u670D\u52A1\u5DE5\u5177\u5217\u8868:`)),console.log();let s=new ga({head:[y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(let i of n){let a=r[i],l=a.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),g=Dr(a.description||"",40);s.push([i,l,g])}console.log(s.toString()),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> enable' \u542F\u7528\u5DE5\u5177`)),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> disable' \u7981\u7528\u5DE5\u5177`))}catch(t){e.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function Gu(o,e,t){let r=t?"\u542F\u7528":"\u7981\u7528",n=Bn(`${r}\u5DE5\u5177 ${o}/${e}...`).start();try{if(!d.getMcpServers()[o]){n.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let i=d.getServerToolsConfig(o);if(!i[e]){n.fail(`\u5DE5\u5177 '${e}' \u5728\u670D\u52A1 '${o}' \u4E2D\u4E0D\u5B58\u5728`),console.log(y.yellow(`\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp ${o} list' \u67E5\u770B\u8BE5\u670D\u52A1\u7684\u6240\u6709\u5DE5\u5177`));return}d.setToolEnabled(o,e,t,i[e].description),n.succeed(`\u6210\u529F${r}\u5DE5\u5177 ${y.cyan(o)}/${y.cyan(e)}`),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A: \u5DE5\u5177\u72B6\u6001\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u670D\u52A1\u65F6\u751F\u6548"))}catch(s){n.fail(`${r}\u5DE5\u5177\u5931\u8D25`),console.error(y.red(`\u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)),process.exit(1)}}var _r=C(()=>{"use strict";ne();c(qn,"getDisplayWidth");c(Dr,"truncateToWidth");c(Bu,"listMcpServers");c(qu,"listServerTools");c(Gu,"setToolEnabled")});var ua={};re(ua,{McpCommandHandler:()=>Gn});import Be from"chalk";var Gn,pa=C(()=>{"use strict";la();We();Gn=class extends ee{static{c(this,"McpCommandHandler")}name="mcp";description="MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406";subcommands=[{name:"list",description:"\u5217\u51FA MCP \u670D\u52A1",options:[{flags:"--tools",description:"\u663E\u793A\u6240\u6709\u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868"}],execute:c(async(e,t)=>{await this.handleList(t)},"execute")},{name:"server",description:"\u7BA1\u7406\u6307\u5B9A\u7684 MCP \u670D\u52A1",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleServer(e[0])},"execute")},{name:"tool",description:"\u542F\u7528\u6216\u7981\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",execute:c(async(e,t)=>{this.validateArgs(e,3);let[r,n,s]=e;s!=="enable"&&s!=="disable"&&(console.error(Be.red("\u9519\u8BEF: \u64CD\u4F5C\u5FC5\u987B\u662F 'enable' \u6216 'disable'")),process.exit(1));let i=s==="enable";await this.handleTool(r,n,i)},"execute")},{name:"call",description:"\u8C03\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",options:[{flags:"--args <json>",description:"\u5DE5\u5177\u53C2\u6570 (JSON \u683C\u5F0F)",defaultValue:"{}"}],execute:c(async(e,t)=>{this.validateArgs(e,2);let[r,n]=e;await this.handleCall(r,n,t.args)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(e){try{let{listMcpServers:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleServer(e){try{let{listServerTools:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleTool(e,t,r){try{let{setToolEnabled:n}=await Promise.resolve().then(()=>(_r(),Lr));await n(e,t,r)}catch(n){this.handleError(n)}}async handleCall(e,t,r){try{let n=new Nr,s=n.parseJsonArgs(r),i=await n.callTool(e,t,s);console.log(n.formatOutput(i))}catch(n){console.log(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`),console.error(Be.red("\u9519\u8BEF:"),n.message),n.message.includes("\u670D\u52A1\u672A\u542F\u52A8")?(console.log(),console.log(Be.yellow("\u{1F4A1} \u8BF7\u5148\u542F\u52A8\u670D\u52A1:")),console.log(Be.gray(" xiaozhi start # \u524D\u53F0\u542F\u52A8")),console.log(Be.gray(" xiaozhi start -d # \u540E\u53F0\u542F\u52A8"))):n.message.includes("\u53C2\u6570\u683C\u5F0F\u9519\u8BEF")&&(console.log(),console.log(Be.yellow("\u{1F4A1} \u6B63\u786E\u683C\u5F0F\u793A\u4F8B:")),console.log(Be.gray(` xiaozhi mcp call ${e} ${t} --args '{"param": "value"}'`))),process.exit(1)}}}});var ha={};re(ha,{EndpointCommandHandler:()=>Xn});import ct from"chalk";import kr from"ora";var Xn,da=C(()=>{"use strict";We();Xn=class extends ee{static{c(this,"EndpointCommandHandler")}name="endpoint";description="\u7BA1\u7406 MCP \u7AEF\u70B9";subcommands=[{name:"list",description:"\u5217\u51FA\u6240\u6709 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{await this.handleList()},"execute")},{name:"add",description:"\u6DFB\u52A0\u65B0\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleAdd(e[0])},"execute")},{name:"remove",description:"\u79FB\u9664\u6307\u5B9A\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleRemove(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E MCP \u7AEF\u70B9\uFF08\u53EF\u4EE5\u662F\u5355\u4E2A\u6216\u591A\u4E2A\uFF09",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleSet(e)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u7AEF\u70B9\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(){let e=kr("\u8BFB\u53D6\u7AEF\u70B9\u914D\u7F6E...").start();try{let r=this.getService("configManager").getMcpEndpoints();e.succeed("\u7AEF\u70B9\u5217\u8868"),r.length===0?console.log(ct.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):(console.log(ct.green(`\u5171 ${r.length} \u4E2A\u7AEF\u70B9:`)),r.forEach((n,s)=>{console.log(ct.gray(` ${s+1}. ${n}`))}))}catch(t){e.fail(`\u8BFB\u53D6\u7AEF\u70B9\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async handleAdd(e){let t=kr("\u6DFB\u52A0\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.addMcpEndpoint(e),t.succeed(`\u6210\u529F\u6DFB\u52A0\u7AEF\u70B9: ${e}`);let n=r.getMcpEndpoints();console.log(ct.gray(`\u5F53\u524D\u5171 ${n.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u6DFB\u52A0\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleRemove(e){let t=kr("\u79FB\u9664\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.removeMcpEndpoint(e),t.succeed(`\u6210\u529F\u79FB\u9664\u7AEF\u70B9: ${e}`);let n=r.getMcpEndpoints();console.log(ct.gray(`\u5F53\u524D\u5269\u4F59 ${n.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e){let t=kr("\u8BBE\u7F6E\u7AEF\u70B9...").start();try{let r=this.getService("configManager");if(e.length===1)r.updateMcpEndpoint(e[0]),t.succeed(`\u6210\u529F\u8BBE\u7F6E\u7AEF\u70B9: ${e[0]}`);else{r.updateMcpEndpoint(e),t.succeed(`\u6210\u529F\u8BBE\u7F6E ${e.length} \u4E2A\u7AEF\u70B9`);for(let[n,s]of e.entries())console.log(ct.gray(` ${n+1}. ${s}`))}}catch(r){t.fail(`\u8BBE\u7F6E\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}}});var ma={};re(ma,{UICommandHandler:()=>Jn});import qe from"chalk";import Xu from"ora";var Jn,fa=C(()=>{"use strict";We();Jn=class extends ee{static{c(this,"UICommandHandler")}name="ui";description="\u542F\u52A8\u914D\u7F6E\u7BA1\u7406\u7F51\u9875";constructor(e){super(e)}async execute(e,t){await this.handleUI()}async handleUI(){let e=Xu("\u542F\u52A8 UI \u670D\u52A1...").start();try{let t=this.getService("configManager");if(!t.configExists()){e.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(qe.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let{WebServer:r}=await Promise.resolve().then(()=>(kn(),_n));await new r().start(),e.succeed("UI \u670D\u52A1\u5DF2\u542F\u52A8");let s=t.getWebUIPort();console.log(qe.green("\u2705 \u914D\u7F6E\u7BA1\u7406\u7F51\u9875\u5DF2\u542F\u52A8\uFF0C\u53EF\u901A\u8FC7\u4EE5\u4E0B\u5730\u5740\u8BBF\u95EE:")),console.log(qe.green(` \u672C\u5730\u8BBF\u95EE: http://localhost:${s}`)),console.log(qe.green(` \u7F51\u7EDC\u8BBF\u95EE: http://<\u4F60\u7684IP\u5730\u5740>:${s}`)),console.log(qe.yellow("\u{1F4A1} \u63D0\u793A: \u6309 Ctrl+C \u505C\u6B62\u670D\u52A1")),await this.openBrowser(`http://localhost:${s}`)}catch(t){e.fail(`\u542F\u52A8 UI \u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async openBrowser(e){try{let{spawn:t}=await import("child_process"),r;process.platform==="darwin"?r=t("open",[e],{detached:!0,stdio:"ignore"}):process.platform==="win32"?r=t("cmd",["/c","start",e],{detached:!0,stdio:"ignore"}):r=t("xdg-open",[e],{detached:!0,stdio:"ignore"}),r.on("error",()=>{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}),r.unref()}catch{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}}}});dn();import Oe from"chalk";import{Command as Ju}from"commander";Xr();var jr=class{constructor(e){this.container=e}static{c(this,"CommandHandlerFactory")}createHandlers(){return[this.createHandler("service"),this.createHandler("config"),this.createHandler("project"),this.createHandler("mcp"),this.createHandler("endpoint"),this.createHandler("ui")]}createHandler(e){switch(e){case"service":return this.createServiceCommandHandler();case"config":return this.createConfigCommandHandler();case"project":return this.createProjectCommandHandler();case"mcp":return this.createMcpCommandHandler();case"endpoint":return this.createEndpointCommandHandler();case"ui":return this.createUICommandHandler();default:throw new Error(`\u672A\u77E5\u7684\u547D\u4EE4\u5904\u7406\u5668\u7C7B\u578B: ${e}`)}}createServiceCommandHandler(){let{ServiceCommandHandler:e}=(sa(),fe(na));return new e(this.container)}createConfigCommandHandler(){let{ConfigCommandHandler:e}=(ia(),fe(oa));return new e(this.container)}createProjectCommandHandler(){let{ProjectCommandHandler:e}=(ca(),fe(aa));return new e(this.container)}createMcpCommandHandler(){let{McpCommandHandler:e}=(pa(),fe(ua));return new e(this.container)}createEndpointCommandHandler(){let{EndpointCommandHandler:e}=(da(),fe(ha));return new e(this.container)}createUICommandHandler(){let{UICommandHandler:e}=(fa(),fe(ma));return new e(this.container)}};var Hr=class{constructor(e){this.container=e;this.handlerFactory=new jr(e)}static{c(this,"CommandRegistry")}handlers=[];handlerFactory;async registerCommands(e){try{this.registerVersionCommand(e),this.registerHelpCommand(e);let t=this.handlerFactory.createHandlers();for(let r of t)this.registerHandler(r),this.registerCommand(e,r);this.registerLegacyServiceCommands(e,t)}catch(t){ve.handle(t)}}registerHandler(e){this.handlers.push(e)}registerCommand(e,t){if(t.subcommands&&t.subcommands.length>0){let r=e.command(t.name).description(t.description);for(let n of t.subcommands){let s=n.name;n.name==="get"?s="get <key>":n.name==="set"?s="set <key> <value>":n.name==="call"&&(s="call <serviceName> <toolName>");let i=r.command(s).description(n.description);if(n.options)for(let a of n.options)i.option(a.flags,a.description,a.defaultValue);i.action(async(...a)=>{try{let g=a[a.length-1].opts();await n.execute(a.slice(0,-1),g)}catch(l){ve.handle(l)}})}r.action(async(...n)=>{try{let i=n[n.length-1].opts();await t.execute(n.slice(0,-1),i)}catch(s){ve.handle(s)}})}else{let r=t.name;t.name==="create"&&(r="create <projectName>");let n=e.command(r).description(t.description);if(t.options)for(let s of t.options)n.option(s.flags,s.description,s.defaultValue);n.action(async(...s)=>{try{let a=s[s.length-1].opts();await t.execute(s.slice(0,-1),a)}catch(i){ve.handle(i)}})}}registerVersionCommand(e){let t=this.container.get("versionUtils");e.version(t.getVersion(),"-v, --version","\u663E\u793A\u7248\u672C\u4FE1\u606F"),e.option("--info","\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F"),e.option("--version-info","\u663E\u793A\u8BE6\u7EC6\u7248\u672C\u4FE1\u606F")}registerHelpCommand(e){e.helpOption("-h, --help","\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").addHelpText("after",`
|
|
96
|
+
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&pr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var dr,eo=C(()=>{"use strict";P();dr=class{static{c(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=p.withTag("StatusApiHandler"),this.statusService=e}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return this.logger.debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getClientStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return this.logger.debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getRestartStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return this.logger.debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async checkClientConnected(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.json(this.createSuccessResponse({connected:t}))}catch(t){this.logger.error("\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_CONNECTION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25");return e.json(r,500)}}async getLastHeartbeat(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return this.logger.debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.json(this.createSuccessResponse({lastHeartbeat:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25:",t);let r=this.createErrorResponse("HEARTBEAT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25");return e.json(r,500)}}async getActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return this.logger.debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,500)}}async updateClientStatus(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object"){let r=this.createErrorResponse("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return e.json(r,400)}return this.statusService.updateClientInfo(t,"http-api"),this.logger.info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,400)}}async setActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await e.req.json();if(!Array.isArray(t)){let r=this.createErrorResponse("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");return e.json(r,400)}return this.statusService.setActiveMCPServers(t),this.logger.info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_UPDATE_ERROR",t instanceof Error?t.message:"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,400)}}async resetStatus(e){try{return this.logger.info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),this.logger.info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u7F6E\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_RESET_ERROR",t instanceof Error?t.message:"\u91CD\u7F6E\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}}});var it,to=C(()=>{"use strict";it=(n=>(n.MCP="mcp",n.COZE="coze",n.HTTP="http",n.FUNCTION="function",n))(it||{})});import _c from"ajv";import mr from"dayjs";var fr,ro=C(()=>{"use strict";P();ne();Gt();Qt();to();fr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=p.withTag("ToolApiHandler"),this.ajv=new _c({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:n,args:s}=t;if(!r||!n){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}if(this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${n}\uFF0C\u53C2\u6570:`,JSON.stringify(s)),!oe.isInitialized()){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}let i=await oe.getInstance();await this.validateServiceAndTool(i,r,n),r==="customMCP"&&await this.validateCustomMCPArguments(i,n,s||{});let a;if(r==="customMCP")a=await i.callTool(n,s||{});else{let l=`${r}__${n}`;a=await i.callTool(l,s||{})}return e.json(this.createSuccessResponse(a,"\u5DE5\u5177\u8C03\u7528\u6210\u529F"))}catch(t){this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),n="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?n="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?n="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?n="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?n="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?n="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?n="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(n="TIMEOUT_ERROR");let s=this.createErrorResponse(n,r);return e.json(s,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!d.configExists()){let s=this.createErrorResponse("CONFIG_NOT_FOUND","\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");return e.json(s,404)}let t=[],r="";try{t=d.getCustomMCPTools(),r=d.getConfigPath()}catch(s){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",s);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!d.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let s=this.createErrorResponse("INVALID_TOOL_CONFIG","\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49");return e.json(s,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let n={list:r,total:r.length};return e.json(this.createSuccessResponse(n,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`))}catch(t){this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getDisabledTools(){try{let e=d.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),n=await new Ie().getAllCachedTools(),s=d.getConfig(),i=new Set(Object.keys(s.mcpServers||{})),a=[];for(let l of n){if(t.has(l.name))continue;let g=l.name.split("__")[0];if(!i.has(g)){this.logger.debug(`\u5DE5\u5177 ${l.name} \u5BF9\u5E94\u7684 MCP \u670D\u52A1 ${g} \u5DF2\u5220\u9664\uFF0C\u8DF3\u8FC7\u663E\u793A`);continue}let h={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:g,toolName:l.name.split("__").slice(1).join("__")}}};a.push(h)}return this.logger.debug(`\u4ECE ${n.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${a.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),a}catch(e){return this.logger.error("\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\u5931\u8D25:",e),[]}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let n=e.getCustomMCPTools().map(s=>s.name);throw n.length===0?new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 customMCP \u5DE5\u5177\u3002\u8BF7\u68C0\u67E5 xiaozhi.config.json \u4E2D\u7684 customMCP \u914D\u7F6E\u3002`):new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u53EF\u7528\u7684 customMCP \u5DE5\u5177: ${n.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let s=e.getCustomMCPTools().find(i=>i.name===r);s&&!s.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),s&&!s.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(n){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,n),new Error(`customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49\u3002`)}return}}async validateCustomMCPArguments(e,t,r){try{let s=e.getCustomMCPTools().find(l=>l.name===t);if(!s)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!s.inputSchema){this.logger.warn(`customMCP \u5DE5\u5177 '${t}' \u6CA1\u6709\u5B9A\u4E49 inputSchema\uFF0C\u8DF3\u8FC7\u53C2\u6570\u9A8C\u8BC1`);return}let i=this.ajv.compile(s.inputSchema);if(!i(r)){let h=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(u=>{let f=u.instancePath||u.schemaPath||"",m=u.message||"\u672A\u77E5\u9519\u8BEF";if(u.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${u.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(u.keyword==="type"){let O=u.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${f} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${O}`}if(u.keyword==="enum"){let O=u.params?.allowedValues||[];return`\u53C2\u6570 ${f} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${O.join(", ")}`}return`\u53C2\u6570 ${f} ${m}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,h),new Error(h)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(n){throw n instanceof Error&&n.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?n:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,n),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${n instanceof Error?n.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{this.logger.info("\u5904\u7406\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42");let t=await e.req.json();return this.isNewFormatRequest(t)?await this.handleNewFormatAddTool(e,t):await this.handleLegacyFormatAddTool(e,t)}catch(t){this.logger.error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:n}=this.handleAddToolError(t);return e.json(n,r)}}isNewFormatRequest(e){return e&&typeof e=="object"&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:n}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(it).includes(r)){let s=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(it).join(", ")}`);return e.json(s,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,n);case"coze":return await this.handleAddCozeTool(e,n);case"http":case"function":{let s=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`);return e.json(s,501)}default:{let s=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(s,400)}}}async handleLegacyFormatAddTool(e,t){this.logger.info("\u5904\u7406\u65E7\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF08\u5411\u540E\u517C\u5BB9\uFF09");let{workflow:r,customName:n,customDescription:s,parameterConfig:i}=t,a=this.performPreChecks(r,n,s);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,n,s,i);return d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:n,customName:s,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${n}`),!r||!n){let j=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(j,400)}if(!oe.isInitialized()){let j=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(j,503)}let a=await oe.getInstance();try{await this.validateServiceAndTool(a,r,n)}catch(j){let Dt=j instanceof Error?j.message:String(j),me=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Dt);return e.json(me,404)}let g=await new Ie().getAllCachedTools(),h=`${r}__${n}`,u=g.find(j=>j.name===h);if(!u){let j=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${n}`);return e.json(j,404)}let f=s||h,m=d.getCustomMCPTools();if(new Set(m.map(j=>j.name)).has(f)){let j=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${f}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(j,409)}let ie={name:f,description:i||u.description||`MCP \u5DE5\u5177: ${r}/${n}`,inputSchema:u.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:n}},stats:{usageCount:0,lastUsedTime:mr().format("YYYY-MM-DD HH:mm:ss")}};d.addCustomMCPTool(ie),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${n}`);let te=d.getServerToolsConfig(r);te?.toolName&&(te[n].enable=!0,d.updateServerToolsConfig(r,te),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${n}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${f}`);let Nt={tool:ie,toolName:f,toolType:"mcp",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(Nt,`MCP \u5DE5\u5177 "${f}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:n,customDescription:s,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,n,s);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,n,s,i);d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(g,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t){let s=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(s,400)}this.logger.info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();if(!r||typeof r!="object"){let s=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(s,400)}if(this.isNewFormatRequest(r))return await this.handleNewFormatUpdateTool(e,t,r);let n=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(n,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:n}=this.handleUpdateToolError(t);return e.json(n,r)}}async handleNewFormatUpdateTool(e,t,r){let{type:n,data:s}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${n}`),!Object.values(it).includes(n)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${n}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(it).join(", ")}`);return e.json(i,400)}switch(n){case"coze":return await this.handleUpdateCozeTool(e,t,s);case"mcp":case"http":case"function":{let i=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${n} \u6682\u4E0D\u652F\u6301\u66F4\u65B0\u64CD\u4F5C\uFF0C\u76EE\u524D\u4EC5\u652F\u6301 Coze \u7C7B\u578B`);return e.json(i,501)}default:{let i=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${n}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:n,customName:s,customDescription:i,parameterConfig:a}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=d.getCustomMCPTools().find(m=>m.name===t);if(!g){let m=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(m,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let m=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(m,400)}!n.workflow_id&&g.handler?.config?.workflow_id&&(n.workflow_id=g.handler.config.workflow_id),!n.workflow_id&&n.app_id&&this.logger.warn(`\u5DE5\u4F5C\u6D41 ${t} \u7F3A\u5C11 workflow_id\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u67D0\u4E9B\u529F\u80FD`),this.validateWorkflowUpdateData(n);let h=this.generateInputSchema(n,a),u={...g,description:i||g.description,inputSchema:h};d.updateCustomMCPTool(t,u),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let f={tool:u,toolName:t,toolType:"coze",updatedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(f,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`))}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`)}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("UPDATE_CUSTOM_TOOL_ERROR",`\u66F4\u65B0\u5DE5\u5177\u914D\u7F6E\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t){let s=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(s,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let n=d.getCustomMCPTools().find(s=>s.name===t);if(n&&n.handler.type==="mcp"){let s=n.handler.config;if(s.serviceName&&s.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`);let i=d.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,d.updateServerToolsConfig(s.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return d.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:n}=this.handleRemoveToolError(t);return e.json(n,r)}}convertWorkflowToTool(e,t,r,n){this.validateWorkflowData(e);let s=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(s),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,n),g=this.createHttpHandler(e),h={name:i,description:a,inputSchema:l,handler:g};return this.validateGeneratedTool(h),h}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[n,s]of Object.entries(t))r=r.replace(new RegExp(n,"g"),s);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");this.validateRequiredFields(e),this.validateFieldFormats(e),this.validateFieldLengths(e),this.validateBusinessLogic(e)}validateWorkflowUpdateData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32")}if(e.workflow_name){if(typeof e.workflow_name!="string"||e.workflow_name.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26")}if(e.app_id){if(typeof e.app_id!="string"||e.app_id.trim()==="")throw new Error("\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.app_id.length>50)throw new Error("\u5E94\u7528ID\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}validateRequiredFields(e){let t=[{field:"workflow_id",name:"\u5DE5\u4F5C\u6D41ID"},{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0"},{field:"app_id",name:"\u5E94\u7528ID"}];for(let{field:r,name:n}of t){let s=e[r];if(!s||typeof s!="string"||s.trim()==="")throw new Error(`${n}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.icon_url?.trim())try{new URL(e.icon_url)}catch{throw new Error("\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw new Error("\u521B\u5EFA\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233");if(e.updated_at&&(!Number.isInteger(e.updated_at)||e.updated_at<=0))throw new Error("\u66F4\u65B0\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233")}validateFieldLengths(e){let t=[{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0",max:100},{field:"description",name:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0",max:500},{field:"app_id",name:"\u5E94\u7528ID",max:50}];for(let{field:r,name:n,max:s}of t){let i=e[r];if(i&&i.length>s)throw new Error(`${n}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${s}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw new Error("\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw new Error("\u521B\u5EFA\u8005\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32")}if(e.created_at&&e.updated_at&&e.updated_at<e.created_at)throw new Error("\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4");let t=["admin","root","system","config","password","token"],r=e.workflow_name.toLowerCase();for(let n of t)if(r.includes(n))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${n}`)}resolveToolNameConflict(e){let t=d.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),n=e,s=1;for(;r.has(n);)if(n=`${e}_${s}`,s++,s>999)throw new Error(`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return n}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=d.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!d.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),this.validateProxyHandler(e.handler)}validateToolStructure(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");let t=["name","description","inputSchema","handler"];for(let r of t)if(!(r in e)||e[r]==null)throw new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\u8BA4\u8BC1\u7C7B\u578B\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E4B\u4E00: ${t.join(", ")}`);if(e.type==="bearer"){if(!e.token||typeof e.token!="string")throw new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let n=r.slice(2,-2).trim();if(!n||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(n))throw new Error(`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684required\u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4")}generateInputSchema(e,t){return t&&t.parameters.length>0?this.generateInputSchemaFromConfig(t):{type:"object",properties:{input:{type:"string",description:"\u8F93\u5165\u5185\u5BB9"}},required:["input"],additionalProperties:!1}}generateInputSchemaFromConfig(e){let t={},r=[];for(let n of e.parameters)t[n.fieldName]={type:n.type,description:n.description},n.required&&r.push(n.fieldName);return{type:"object",properties:t,required:r.length>0?r:void 0,additionalProperties:!1}}handleAddToolError(e){let t=e instanceof Error?e.message:"\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{statusCode:400,errorResponse:this.createErrorResponse("MISSING_REQUIRED_FIELD",t)}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",t)}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{statusCode:503,errorResponse:this.createErrorResponse("SERVICE_NOT_INITIALIZED",t)}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{statusCode:409,errorResponse:this.createErrorResponse("TOOL_NAME_CONFLICT",`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`)}:this.isValidationError(t)?{statusCode:400,errorResponse:this.createErrorResponse("VALIDATION_ERROR",this.formatValidationError(t))}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\uFF1A1) \u76F8\u5173\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1B2) \u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38\uFF1B3) \u914D\u7F6E\u6587\u4EF6\u6743\u9650\u662F\u5426\u6B63\u786E`)}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",t)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("ADD_CUSTOM_TOOL_ERROR",`\u6DFB\u52A0\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}handleRemoveToolError(e){let t=e instanceof Error?e.message:"\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E\uFF0C\u6216\u5237\u65B0\u9875\u9762\u67E5\u770B\u6700\u65B0\u7684\u5DE5\u5177\u5217\u8868`)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:{statusCode:500,errorResponse:this.createErrorResponse("REMOVE_CUSTOM_TOOL_ERROR",`\u5220\u9664\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}isValidationError(e){return["\u4E0D\u80FD\u4E3A\u7A7A","\u5FC5\u987B\u662F","\u683C\u5F0F\u65E0\u6548","\u8FC7\u957F","\u8FC7\u77ED","\u9A8C\u8BC1\u5931\u8D25","\u65E0\u6548","\u4E0D\u7B26\u5408","\u8D85\u8FC7","\u5C11\u4E8E","\u654F\u611F\u8BCD","\u65F6\u95F4","URL"].some(r=>e.includes(r))}formatValidationError(e){let t={\u5DE5\u4F5C\u6D41ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41ID",\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41\u540D\u79F0",\u5E94\u7528ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5E94\u7528ID",\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548:"\u5DE5\u4F5C\u6D41ID\u5E94\u4E3A\u6570\u5B57\u683C\u5F0F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u914D\u7F6E",\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548:"\u5E94\u7528ID\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26",\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u540D\u79F0",\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7500\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u63CF\u8FF0",\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u56FE\u6807URL\u5730\u5740",\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4:"\u5DE5\u4F5C\u6D41\u7684\u65F6\u95F4\u4FE1\u606F\u6709\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u6570\u636E",\u654F\u611F\u8BCD:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u5305\u542B\u654F\u611F\u8BCD\u6C47\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5"};for(let[r,n]of Object.entries(t))if(e.includes(r))return n;return e}performPreChecks(e,t,r){let n=this.checkBasicParameters(e,t,r);if(n)return n;let s=this.checkSystemStatus();if(s)return s;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570")};if(typeof e!="object")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B")};if(!e.workflow_id||typeof e.workflow_id!="string"||!e.workflow_id.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(!e.workflow_name||typeof e.workflow_name!="string"||!e.workflow_name.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(t!==void 0){if(typeof t!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(t.trim()==="")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32")};if(t.length>50)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}if(r!==void 0){if(typeof r!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(r.length>200)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26")}}return null}checkSystemStatus(){try{let e=d.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=d.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,n=1024*1024;if(r>n)return{statusCode:413,errorResponse:this.createErrorResponse("PAYLOAD_TOO_LARGE","\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4")}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}}});var wt=T((tC,no)=>{"use strict";var kc="2.0.0",jc=Number.MAX_SAFE_INTEGER||9007199254740991,Hc=16,zc=250,Uc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];no.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Hc,MAX_SAFE_BUILD_LENGTH:zc,MAX_SAFE_INTEGER:jc,RELEASE_TYPES:Uc,SEMVER_SPEC_VERSION:kc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Rt=T((rC,so)=>{"use strict";var Fc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...o)=>console.error("SEMVER",...o):()=>{};so.exports=Fc});var at=T((we,oo)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:mn,MAX_SAFE_BUILD_LENGTH:Vc,MAX_LENGTH:Wc}=wt(),Bc=Rt();we=oo.exports={};var qc=we.re=[],Gc=we.safeRe=[],v=we.src=[],Xc=we.safeSrc=[],S=we.t={},Jc=0,fn="[a-zA-Z0-9-]",Kc=[["\\s",1],["\\d",Wc],[fn,Vc]],Yc=c(o=>{for(let[e,t]of Kc)o=o.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return o},"makeSafeRegex"),M=c((o,e,t)=>{let r=Yc(e),n=Jc++;Bc(o,n,e),S[o]=n,v[n]=e,Xc[n]=r,qc[n]=new RegExp(e,t?"g":void 0),Gc[n]=new RegExp(r,t?"g":void 0)},"createToken");M("NUMERICIDENTIFIER","0|[1-9]\\d*");M("NUMERICIDENTIFIERLOOSE","\\d+");M("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${fn}*`);M("MAINVERSION",`(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})`);M("MAINVERSIONLOOSE",`(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASEIDENTIFIER",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIER]})`);M("PRERELEASEIDENTIFIERLOOSE",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASE",`(?:-(${v[S.PRERELEASEIDENTIFIER]}(?:\\.${v[S.PRERELEASEIDENTIFIER]})*))`);M("PRERELEASELOOSE",`(?:-?(${v[S.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${v[S.PRERELEASEIDENTIFIERLOOSE]})*))`);M("BUILDIDENTIFIER",`${fn}+`);M("BUILD",`(?:\\+(${v[S.BUILDIDENTIFIER]}(?:\\.${v[S.BUILDIDENTIFIER]})*))`);M("FULLPLAIN",`v?${v[S.MAINVERSION]}${v[S.PRERELEASE]}?${v[S.BUILD]}?`);M("FULL",`^${v[S.FULLPLAIN]}$`);M("LOOSEPLAIN",`[v=\\s]*${v[S.MAINVERSIONLOOSE]}${v[S.PRERELEASELOOSE]}?${v[S.BUILD]}?`);M("LOOSE",`^${v[S.LOOSEPLAIN]}$`);M("GTLT","((?:<|>)?=?)");M("XRANGEIDENTIFIERLOOSE",`${v[S.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);M("XRANGEIDENTIFIER",`${v[S.NUMERICIDENTIFIER]}|x|X|\\*`);M("XRANGEPLAIN",`[v=\\s]*(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:${v[S.PRERELEASE]})?${v[S.BUILD]}?)?)?`);M("XRANGEPLAINLOOSE",`[v=\\s]*(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:${v[S.PRERELEASELOOSE]})?${v[S.BUILD]}?)?)?`);M("XRANGE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAIN]}$`);M("XRANGELOOSE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAINLOOSE]}$`);M("COERCEPLAIN",`(^|[^\\d])(\\d{1,${mn}})(?:\\.(\\d{1,${mn}}))?(?:\\.(\\d{1,${mn}}))?`);M("COERCE",`${v[S.COERCEPLAIN]}(?:$|[^\\d])`);M("COERCEFULL",v[S.COERCEPLAIN]+`(?:${v[S.PRERELEASE]})?(?:${v[S.BUILD]})?(?:$|[^\\d])`);M("COERCERTL",v[S.COERCE],!0);M("COERCERTLFULL",v[S.COERCEFULL],!0);M("LONETILDE","(?:~>?)");M("TILDETRIM",`(\\s*)${v[S.LONETILDE]}\\s+`,!0);we.tildeTrimReplace="$1~";M("TILDE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAIN]}$`);M("TILDELOOSE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAINLOOSE]}$`);M("LONECARET","(?:\\^)");M("CARETTRIM",`(\\s*)${v[S.LONECARET]}\\s+`,!0);we.caretTrimReplace="$1^";M("CARET",`^${v[S.LONECARET]}${v[S.XRANGEPLAIN]}$`);M("CARETLOOSE",`^${v[S.LONECARET]}${v[S.XRANGEPLAINLOOSE]}$`);M("COMPARATORLOOSE",`^${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]})$|^$`);M("COMPARATOR",`^${v[S.GTLT]}\\s*(${v[S.FULLPLAIN]})$|^$`);M("COMPARATORTRIM",`(\\s*)${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]}|${v[S.XRANGEPLAIN]})`,!0);we.comparatorTrimReplace="$1$2$3";M("HYPHENRANGE",`^\\s*(${v[S.XRANGEPLAIN]})\\s+-\\s+(${v[S.XRANGEPLAIN]})\\s*$`);M("HYPHENRANGELOOSE",`^\\s*(${v[S.XRANGEPLAINLOOSE]})\\s+-\\s+(${v[S.XRANGEPLAINLOOSE]})\\s*$`);M("STAR","(<|>)?=?\\s*\\*");M("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");M("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Cr=T((sC,io)=>{"use strict";var Zc=Object.freeze({loose:!0}),Qc=Object.freeze({}),el=c(o=>o?typeof o!="object"?Zc:o:Qc,"parseOptions");io.exports=el});var Cn=T((iC,lo)=>{"use strict";var ao=/^[0-9]+$/,co=c((o,e)=>{if(typeof o=="number"&&typeof e=="number")return o===e?0:o<e?-1:1;let t=ao.test(o),r=ao.test(e);return t&&r&&(o=+o,e=+e),o===e?0:t&&!r?-1:r&&!t?1:o<e?-1:1},"compareIdentifiers"),tl=c((o,e)=>co(e,o),"rcompareIdentifiers");lo.exports={compareIdentifiers:co,rcompareIdentifiers:tl}});var B=T((cC,uo)=>{"use strict";var vr=Rt(),{MAX_LENGTH:go,MAX_SAFE_INTEGER:Sr}=wt(),{safeRe:Er,t:yr}=at(),rl=Cr(),{compareIdentifiers:vn}=Cn(),Sn=class o{static{c(this,"SemVer")}constructor(e,t){if(t=rl(t),e instanceof o){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>go)throw new TypeError(`version is longer than ${go} characters`);vr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Er[yr.LOOSE]:Er[yr.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>Sr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Sr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Sr||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<Sr)return s}return n}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(vr("SemVer.compare",this.version,this.options,e),!(e instanceof o)){if(typeof e=="string"&&e===this.version)return 0;e=new o(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof o||(e=new o(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof o||(e=new o(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],n=e.prerelease[t];if(vr("prerelease compare",t,r,n),r===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(r===void 0)return-1;if(r===n)continue;return vn(r,n)}while(++t)}compareBuild(e){e instanceof o||(e=new o(e,this.options));let t=0;do{let r=this.build[t],n=e.build[t];if(vr("build compare",t,r,n),r===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(r===void 0)return-1;if(r===n)continue;return vn(r,n)}while(++t)}inc(e,t,r){if(e.startsWith("pre")){if(!t&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(t){let n=`-${t}`.match(this.options.loose?Er[yr.PRERELEASELOOSE]:Er[yr.PRERELEASE]);if(!n||n[1]!==t)throw new Error(`invalid identifier: ${t}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t,r),this.inc("pre",t,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",t,r),this.inc("pre",t,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let n=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[n];else{let s=this.prerelease.length;for(;--s>=0;)typeof this.prerelease[s]=="number"&&(this.prerelease[s]++,s=-2);if(s===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(n)}}if(t){let s=[t,n];r===!1&&(s=[t]),vn(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=s):this.prerelease=s}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};uo.exports=Sn});var Ue=T((gC,ho)=>{"use strict";var po=B(),nl=c((o,e,t=!1)=>{if(o instanceof po)return o;try{return new po(o,e)}catch(r){if(!t)return null;throw r}},"parse");ho.exports=nl});var fo=T((pC,mo)=>{"use strict";var sl=Ue(),ol=c((o,e)=>{let t=sl(o,e);return t?t.version:null},"valid");mo.exports=ol});var vo=T((dC,Co)=>{"use strict";var il=Ue(),al=c((o,e)=>{let t=il(o.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Co.exports=al});var yo=T((fC,Eo)=>{"use strict";var So=B(),cl=c((o,e,t,r,n)=>{typeof t=="string"&&(n=r,r=t,t=void 0);try{return new So(o instanceof So?o.version:o,t).inc(e,r,n).version}catch{return null}},"inc");Eo.exports=cl});var Po=T((vC,Mo)=>{"use strict";var To=Ue(),ll=c((o,e)=>{let t=To(o,null,!0),r=To(e,null,!0),n=t.compare(r);if(n===0)return null;let s=n>0,i=s?t:r,a=s?r:t,l=!!i.prerelease.length;if(!!a.prerelease.length&&!l){if(!a.patch&&!a.minor)return"major";if(a.compareMain(i)===0)return a.minor&&!a.patch?"minor":"patch"}let h=l?"pre":"";return t.major!==r.major?h+"major":t.minor!==r.minor?h+"minor":t.patch!==r.patch?h+"patch":"prerelease"},"diff");Mo.exports=ll});var Ro=T((EC,wo)=>{"use strict";var gl=B(),ul=c((o,e)=>new gl(o,e).major,"major");wo.exports=ul});var Io=T((TC,bo)=>{"use strict";var pl=B(),hl=c((o,e)=>new pl(o,e).minor,"minor");bo.exports=hl});var Ao=T((PC,$o)=>{"use strict";var dl=B(),ml=c((o,e)=>new dl(o,e).patch,"patch");$o.exports=ml});var xo=T((RC,Oo)=>{"use strict";var fl=Ue(),Cl=c((o,e)=>{let t=fl(o,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Oo.exports=Cl});var pe=T((IC,Do)=>{"use strict";var No=B(),vl=c((o,e,t)=>new No(o,t).compare(new No(e,t)),"compare");Do.exports=vl});var _o=T((AC,Lo)=>{"use strict";var Sl=pe(),El=c((o,e,t)=>Sl(e,o,t),"rcompare");Lo.exports=El});var jo=T((xC,ko)=>{"use strict";var yl=pe(),Tl=c((o,e)=>yl(o,e,!0),"compareLoose");ko.exports=Tl});var Tr=T((DC,zo)=>{"use strict";var Ho=B(),Ml=c((o,e,t)=>{let r=new Ho(o,t),n=new Ho(e,t);return r.compare(n)||r.compareBuild(n)},"compareBuild");zo.exports=Ml});var Fo=T((_C,Uo)=>{"use strict";var Pl=Tr(),wl=c((o,e)=>o.sort((t,r)=>Pl(t,r,e)),"sort");Uo.exports=wl});var Wo=T((jC,Vo)=>{"use strict";var Rl=Tr(),bl=c((o,e)=>o.sort((t,r)=>Rl(r,t,e)),"rsort");Vo.exports=bl});var bt=T((zC,Bo)=>{"use strict";var Il=pe(),$l=c((o,e,t)=>Il(o,e,t)>0,"gt");Bo.exports=$l});var Mr=T((FC,qo)=>{"use strict";var Al=pe(),Ol=c((o,e,t)=>Al(o,e,t)<0,"lt");qo.exports=Ol});var En=T((WC,Go)=>{"use strict";var xl=pe(),Nl=c((o,e,t)=>xl(o,e,t)===0,"eq");Go.exports=Nl});var yn=T((qC,Xo)=>{"use strict";var Dl=pe(),Ll=c((o,e,t)=>Dl(o,e,t)!==0,"neq");Xo.exports=Ll});var Pr=T((XC,Jo)=>{"use strict";var _l=pe(),kl=c((o,e,t)=>_l(o,e,t)>=0,"gte");Jo.exports=kl});var wr=T((KC,Ko)=>{"use strict";var jl=pe(),Hl=c((o,e,t)=>jl(o,e,t)<=0,"lte");Ko.exports=Hl});var Tn=T((ZC,Yo)=>{"use strict";var zl=En(),Ul=yn(),Fl=bt(),Vl=Pr(),Wl=Mr(),Bl=wr(),ql=c((o,e,t,r)=>{switch(e){case"===":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o===t;case"!==":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o!==t;case"":case"=":case"==":return zl(o,t,r);case"!=":return Ul(o,t,r);case">":return Fl(o,t,r);case">=":return Vl(o,t,r);case"<":return Wl(o,t,r);case"<=":return Bl(o,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Yo.exports=ql});var Qo=T((ev,Zo)=>{"use strict";var Gl=B(),Xl=Ue(),{safeRe:Rr,t:br}=at(),Jl=c((o,e)=>{if(o instanceof Gl)return o;if(typeof o=="number"&&(o=String(o)),typeof o!="string")return null;e=e||{};let t=null;if(!e.rtl)t=o.match(e.includePrerelease?Rr[br.COERCEFULL]:Rr[br.COERCE]);else{let l=e.includePrerelease?Rr[br.COERCERTLFULL]:Rr[br.COERCERTL],g;for(;(g=l.exec(o))&&(!t||t.index+t[0].length!==o.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],n=t[3]||"0",s=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Xl(`${r}.${n}.${s}${i}${a}`,e)},"coerce");Zo.exports=Jl});var ti=T((rv,ei)=>{"use strict";var Mn=class{static{c(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let n=this.map.keys().next().value;this.delete(n)}this.map.set(e,t)}return this}};ei.exports=Mn});var he=T((sv,oi)=>{"use strict";var Kl=/\s+/g,Pn=class o{static{c(this,"Range")}constructor(e,t){if(t=Zl(t),e instanceof o)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new o(e.raw,t);if(e instanceof wn)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e.trim().replace(Kl," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(n=>!ni(n[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&og(n[0])){this.set=[n];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let t=this.set[e];for(let r=0;r<t.length;r++)r>0&&(this.formatted+=" "),this.formatted+=t[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let r=((this.options.includePrerelease&&ng)|(this.options.loose&&sg))+":"+e,n=ri.get(r);if(n)return n;let s=this.options.loose,i=s?J[q.HYPHENRANGELOOSE]:J[q.HYPHENRANGE];e=e.replace(i,mg(this.options.includePrerelease)),A("hyphen replace",e),e=e.replace(J[q.COMPARATORTRIM],eg),A("comparator trim",e),e=e.replace(J[q.TILDETRIM],tg),A("tilde trim",e),e=e.replace(J[q.CARETTRIM],rg),A("caret trim",e);let a=e.split(" ").map(u=>ig(u,this.options)).join(" ").split(/\s+/).map(u=>dg(u,this.options));s&&(a=a.filter(u=>(A("loose invalid filter",u,this.options),!!u.match(J[q.COMPARATORLOOSE])))),A("range list",a);let l=new Map,g=a.map(u=>new wn(u,this.options));for(let u of g){if(ni(u))return[u];l.set(u.value,u)}l.size>1&&l.has("")&&l.delete("");let h=[...l.values()];return ri.set(r,h),h}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Range is required");return this.set.some(r=>si(r,t)&&e.set.some(n=>si(n,t)&&r.every(s=>n.every(i=>s.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Ql(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(fg(this.set[t],e,this.options))return!0;return!1}};oi.exports=Pn;var Yl=ti(),ri=new Yl,Zl=Cr(),wn=It(),A=Rt(),Ql=B(),{safeRe:J,t:q,comparatorTrimReplace:eg,tildeTrimReplace:tg,caretTrimReplace:rg}=at(),{FLAG_INCLUDE_PRERELEASE:ng,FLAG_LOOSE:sg}=wt(),ni=c(o=>o.value==="<0.0.0-0","isNullSet"),og=c(o=>o.value==="","isAny"),si=c((o,e)=>{let t=!0,r=o.slice(),n=r.pop();for(;t&&r.length;)t=r.every(s=>n.intersects(s,e)),n=r.pop();return t},"isSatisfiable"),ig=c((o,e)=>(o=o.replace(J[q.BUILD],""),A("comp",o,e),o=lg(o,e),A("caret",o),o=ag(o,e),A("tildes",o),o=ug(o,e),A("xrange",o),o=hg(o,e),A("stars",o),o),"parseComparator"),K=c(o=>!o||o.toLowerCase()==="x"||o==="*","isX"),ag=c((o,e)=>o.trim().split(/\s+/).map(t=>cg(t,e)).join(" "),"replaceTildes"),cg=c((o,e)=>{let t=e.loose?J[q.TILDELOOSE]:J[q.TILDE];return o.replace(t,(r,n,s,i,a)=>{A("tilde",o,r,n,s,i,a);let l;return K(n)?l="":K(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:K(i)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(A("replaceTilde pr",a),l=`>=${n}.${s}.${i}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${i} <${n}.${+s+1}.0-0`,A("tilde return",l),l})},"replaceTilde"),lg=c((o,e)=>o.trim().split(/\s+/).map(t=>gg(t,e)).join(" "),"replaceCarets"),gg=c((o,e)=>{A("caret",o,e);let t=e.loose?J[q.CARETLOOSE]:J[q.CARET],r=e.includePrerelease?"-0":"";return o.replace(t,(n,s,i,a,l)=>{A("caret",o,n,s,i,a,l);let g;return K(s)?g="":K(i)?g=`>=${s}.0.0${r} <${+s+1}.0.0-0`:K(a)?s==="0"?g=`>=${s}.${i}.0${r} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.0${r} <${+s+1}.0.0-0`:l?(A("replaceCaret pr",l),s==="0"?i==="0"?g=`>=${s}.${i}.${a}-${l} <${s}.${i}.${+a+1}-0`:g=`>=${s}.${i}.${a}-${l} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.${a}-${l} <${+s+1}.0.0-0`):(A("no pr"),s==="0"?i==="0"?g=`>=${s}.${i}.${a}${r} <${s}.${i}.${+a+1}-0`:g=`>=${s}.${i}.${a}${r} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.${a} <${+s+1}.0.0-0`),A("caret return",g),g})},"replaceCaret"),ug=c((o,e)=>(A("replaceXRanges",o,e),o.split(/\s+/).map(t=>pg(t,e)).join(" ")),"replaceXRanges"),pg=c((o,e)=>{o=o.trim();let t=e.loose?J[q.XRANGELOOSE]:J[q.XRANGE];return o.replace(t,(r,n,s,i,a,l)=>{A("xRange",o,r,n,s,i,a,l);let g=K(s),h=g||K(i),u=h||K(a),f=u;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",g?n===">"||n==="<"?r="<0.0.0-0":r="*":n&&f?(h&&(i=0),a=0,n===">"?(n=">=",h?(s=+s+1,i=0,a=0):(i=+i+1,a=0)):n==="<="&&(n="<",h?s=+s+1:i=+i+1),n==="<"&&(l="-0"),r=`${n+s}.${i}.${a}${l}`):h?r=`>=${s}.0.0${l} <${+s+1}.0.0-0`:u&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),A("xRange return",r),r})},"replaceXRange"),hg=c((o,e)=>(A("replaceStars",o,e),o.trim().replace(J[q.STAR],"")),"replaceStars"),dg=c((o,e)=>(A("replaceGTE0",o,e),o.trim().replace(J[e.includePrerelease?q.GTE0PRE:q.GTE0],"")),"replaceGTE0"),mg=c(o=>(e,t,r,n,s,i,a,l,g,h,u,f)=>(K(r)?t="":K(n)?t=`>=${r}.0.0${o?"-0":""}`:K(s)?t=`>=${r}.${n}.0${o?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${o?"-0":""}`,K(g)?l="":K(h)?l=`<${+g+1}.0.0-0`:K(u)?l=`<${g}.${+h+1}.0-0`:f?l=`<=${g}.${h}.${u}-${f}`:o?l=`<${g}.${h}.${+u+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),fg=c((o,e,t)=>{for(let r=0;r<o.length;r++)if(!o[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<o.length;r++)if(A(o[r].semver),o[r].semver!==wn.ANY&&o[r].semver.prerelease.length>0){let n=o[r].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0},"testSet")});var It=T((iv,ui)=>{"use strict";var $t=Symbol("SemVer ANY"),In=class o{static{c(this,"Comparator")}static get ANY(){return $t}constructor(e,t){if(t=ii(t),e instanceof o){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),bn("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===$t?this.value="":this.value=this.operator+this.semver.version,bn("comp",this)}parse(e){let t=this.options.loose?ai[ci.COMPARATORLOOSE]:ai[ci.COMPARATOR],r=e.match(t);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new li(r[2],this.options.loose):this.semver=$t}toString(){return this.value}test(e){if(bn("Comparator.test",e,this.options.loose),this.semver===$t||e===$t)return!0;if(typeof e=="string")try{e=new li(e,this.options)}catch{return!1}return Rn(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new gi(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new gi(this.value,t).test(e.semver):(t=ii(t),t.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!t.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||Rn(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Rn(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};ui.exports=In;var ii=Cr(),{safeRe:ai,t:ci}=at(),Rn=Tn(),bn=Rt(),li=B(),gi=he()});var At=T((cv,pi)=>{"use strict";var Cg=he(),vg=c((o,e,t)=>{try{e=new Cg(e,t)}catch{return!1}return e.test(o)},"satisfies");pi.exports=vg});var di=T((gv,hi)=>{"use strict";var Sg=he(),Eg=c((o,e)=>new Sg(o,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");hi.exports=Eg});var fi=T((pv,mi)=>{"use strict";var yg=B(),Tg=he(),Mg=c((o,e,t)=>{let r=null,n=null,s=null;try{s=new Tg(e,t)}catch{return null}return o.forEach(i=>{s.test(i)&&(!r||n.compare(i)===-1)&&(r=i,n=new yg(r,t))}),r},"maxSatisfying");mi.exports=Mg});var vi=T((dv,Ci)=>{"use strict";var Pg=B(),wg=he(),Rg=c((o,e,t)=>{let r=null,n=null,s=null;try{s=new wg(e,t)}catch{return null}return o.forEach(i=>{s.test(i)&&(!r||n.compare(i)===1)&&(r=i,n=new Pg(r,t))}),r},"minSatisfying");Ci.exports=Rg});var yi=T((fv,Ei)=>{"use strict";var $n=B(),bg=he(),Si=bt(),Ig=c((o,e)=>{o=new bg(o,e);let t=new $n("0.0.0");if(o.test(t)||(t=new $n("0.0.0-0"),o.test(t)))return t;t=null;for(let r=0;r<o.set.length;++r){let n=o.set[r],s=null;n.forEach(i=>{let a=new $n(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||Si(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Si(t,s))&&(t=s)}return t&&o.test(t)?t:null},"minVersion");Ei.exports=Ig});var Mi=T((vv,Ti)=>{"use strict";var $g=he(),Ag=c((o,e)=>{try{return new $g(o,e).range||"*"}catch{return null}},"validRange");Ti.exports=Ag});var Ir=T((Ev,bi)=>{"use strict";var Og=B(),Ri=It(),{ANY:xg}=Ri,Ng=he(),Dg=At(),Pi=bt(),wi=Mr(),Lg=wr(),_g=Pr(),kg=c((o,e,t,r)=>{o=new Og(o,r),e=new Ng(e,r);let n,s,i,a,l;switch(t){case">":n=Pi,s=Lg,i=wi,a=">",l=">=";break;case"<":n=wi,s=_g,i=Pi,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Dg(o,e,r))return!1;for(let g=0;g<e.set.length;++g){let h=e.set[g],u=null,f=null;if(h.forEach(m=>{m.semver===xg&&(m=new Ri(">=0.0.0")),u=u||m,f=f||m,n(m.semver,u.semver,r)?u=m:i(m.semver,f.semver,r)&&(f=m)}),u.operator===a||u.operator===l||(!f.operator||f.operator===a)&&s(o,f.semver))return!1;if(f.operator===l&&i(o,f.semver))return!1}return!0},"outside");bi.exports=kg});var $i=T((Tv,Ii)=>{"use strict";var jg=Ir(),Hg=c((o,e,t)=>jg(o,e,">",t),"gtr");Ii.exports=Hg});var Oi=T((Pv,Ai)=>{"use strict";var zg=Ir(),Ug=c((o,e,t)=>zg(o,e,"<",t),"ltr");Ai.exports=Ug});var Di=T((Rv,Ni)=>{"use strict";var xi=he(),Fg=c((o,e,t)=>(o=new xi(o,t),e=new xi(e,t),o.intersects(e,t)),"intersects");Ni.exports=Fg});var _i=T((Iv,Li)=>{"use strict";var Vg=At(),Wg=pe();Li.exports=(o,e,t)=>{let r=[],n=null,s=null,i=o.sort((h,u)=>Wg(h,u,t));for(let h of i)Vg(h,e,t)?(s=h,n||(n=h)):(s&&r.push([n,s]),s=null,n=null);n&&r.push([n,null]);let a=[];for(let[h,u]of r)h===u?a.push(h):!u&&h===i[0]?a.push("*"):u?h===i[0]?a.push(`<=${u}`):a.push(`${h} - ${u}`):a.push(`>=${h}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Fi=T(($v,Ui)=>{"use strict";var ki=he(),On=It(),{ANY:An}=On,Ot=At(),xn=pe(),Bg=c((o,e,t={})=>{if(o===e)return!0;o=new ki(o,t),e=new ki(e,t);let r=!1;e:for(let n of o.set){for(let s of e.set){let i=Gg(n,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),qg=[new On(">=0.0.0-0")],ji=[new On(">=0.0.0")],Gg=c((o,e,t)=>{if(o===e)return!0;if(o.length===1&&o[0].semver===An){if(e.length===1&&e[0].semver===An)return!0;t.includePrerelease?o=qg:o=ji}if(e.length===1&&e[0].semver===An){if(t.includePrerelease)return!0;e=ji}let r=new Set,n,s;for(let m of o)m.operator===">"||m.operator===">="?n=Hi(n,m,t):m.operator==="<"||m.operator==="<="?s=zi(s,m,t):r.add(m.semver);if(r.size>1)return null;let i;if(n&&s){if(i=xn(n.semver,s.semver,t),i>0)return null;if(i===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let m of r){if(n&&!Ot(m,String(n),t)||s&&!Ot(m,String(s),t))return null;for(let O of e)if(!Ot(m,String(O),t))return!1;return!0}let a,l,g,h,u=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;u&&u.prerelease.length===1&&s.operator==="<"&&u.prerelease[0]===0&&(u=!1);for(let m of e){if(h=h||m.operator===">"||m.operator===">=",g=g||m.operator==="<"||m.operator==="<=",n){if(f&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===f.major&&m.semver.minor===f.minor&&m.semver.patch===f.patch&&(f=!1),m.operator===">"||m.operator===">="){if(a=Hi(n,m,t),a===m&&a!==n)return!1}else if(n.operator===">="&&!Ot(n.semver,String(m),t))return!1}if(s){if(u&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===u.major&&m.semver.minor===u.minor&&m.semver.patch===u.patch&&(u=!1),m.operator==="<"||m.operator==="<="){if(l=zi(s,m,t),l===m&&l!==s)return!1}else if(s.operator==="<="&&!Ot(s.semver,String(m),t))return!1}if(!m.operator&&(s||n)&&i!==0)return!1}return!(n&&g&&!s&&i!==0||s&&h&&!n&&i!==0||f||u)},"simpleSubset"),Hi=c((o,e,t)=>{if(!o)return e;let r=xn(o.semver,e.semver,t);return r>0?o:r<0||e.operator===">"&&o.operator===">="?e:o},"higherGT"),zi=c((o,e,t)=>{if(!o)return e;let r=xn(o.semver,e.semver,t);return r<0?o:r>0||e.operator==="<"&&o.operator==="<="?e:o},"lowerLT");Ui.exports=Bg});var qi=T((Ov,Bi)=>{"use strict";var Nn=at(),Vi=wt(),Xg=B(),Wi=Cn(),Jg=Ue(),Kg=fo(),Yg=vo(),Zg=yo(),Qg=Po(),eu=Ro(),tu=Io(),ru=Ao(),nu=xo(),su=pe(),ou=_o(),iu=jo(),au=Tr(),cu=Fo(),lu=Wo(),gu=bt(),uu=Mr(),pu=En(),hu=yn(),du=Pr(),mu=wr(),fu=Tn(),Cu=Qo(),vu=It(),Su=he(),Eu=At(),yu=di(),Tu=fi(),Mu=vi(),Pu=yi(),wu=Mi(),Ru=Ir(),bu=$i(),Iu=Oi(),$u=Di(),Au=_i(),Ou=Fi();Bi.exports={parse:Jg,valid:Kg,clean:Yg,inc:Zg,diff:Qg,major:eu,minor:tu,patch:ru,prerelease:nu,compare:su,rcompare:ou,compareLoose:iu,compareBuild:au,sort:cu,rsort:lu,gt:gu,lt:uu,eq:pu,neq:hu,gte:du,lte:mu,cmp:fu,coerce:Cu,Comparator:vu,Range:Su,satisfies:Eu,toComparators:yu,maxSatisfying:Tu,minSatisfying:Mu,minVersion:Pu,validRange:wu,outside:Ru,gtr:bu,ltr:Iu,intersects:$u,simplifyRange:Au,subset:Ou,SemVer:Xg,re:Nn.re,src:Nn.src,tokens:Nn.t,SEMVER_SPEC_VERSION:Vi.SEMVER_SPEC_VERSION,RELEASE_TYPES:Vi.RELEASE_TYPES,compareIdentifiers:Wi.compareIdentifiers,rcompareIdentifiers:Wi.rcompareIdentifiers}});import{exec as xu,spawn as Nu}from"child_process";import{promisify as Du}from"util";var xt,Gi,Fe,Dn=C(()=>{"use strict";xt=Ta(qi(),1);P();z();Gi=Du(xu),Fe=class{static{c(this,"NPMManager")}logger=p.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||w()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.logger.info(`\u5F00\u59CB\u5B89\u88C5: xiaozhi-client@${e} [${t}]`),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let n=Nu("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((s,i)=>{n.stdout.on("data",a=>{let l=a.toString();console.log(l),this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),n.stderr.on("data",a=>{let l=a.toString();console.log(l),this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),n.on("close",a=>{let l=Date.now()-r;if(a===0)console.log("\u5B89\u88C5\u5B8C\u6210\uFF01"),this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),s();else{let g=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${a}`;console.log(g),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:g,duration:l,timestamp:Date.now()}),i(new Error(g))}})})}async getCurrentVersion(){let{stdout:e}=await Gi("npm list -g xiaozhi-client --depth=0 --json --registry=https://registry.npmmirror.com");return JSON.parse(e).dependencies?.["xiaozhi-client"]?.version||"unknown"}static VERSION_TYPES={STABLE:"stable",RC:"rc",BETA:"beta",ALL:"all"};async getAvailableVersions(e="stable"){try{let{stdout:t}=await Gi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),n=JSON.parse(t).filter(s=>s&&typeof s=="string"&&xt.default.valid(s));return e!=="all"&&(n=n.filter(s=>{let i=xt.default.prerelease(s);return e==="stable"?i===null:e==="rc"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("rc")===!0:e==="beta"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("beta")===!0:!0})),n.sort((s,i)=>xt.default.rcompare(s,i))}catch(t){return this.logger.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25:",t),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],n=!1;try{n=xt.default.gt(r,e)}catch(s){this.logger.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25:",s),n=r!==e}return this.logger.info(`\u7248\u672C\u68C0\u67E5\u5B8C\u6210: \u5F53\u524D\u7248\u672C ${e}, \u6700\u65B0\u7248\u672C ${r}, \u6709\u66F4\u65B0: ${n}`),{currentVersion:e,latestVersion:r,hasUpdate:n}}catch(e){return this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",e),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});import{z as Xi}from"zod";var Lu,$r,Ji=C(()=>{"use strict";P();z();Dn();Lu=Xi.object({version:Xi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),$r=class{static{c(this,"UpdateApiHandler")}npmManager;logger=p.withTag("UpdateApiHandler");eventBus=w();activeInstalls=new Map;constructor(){this.npmManager=new Fe(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Lu.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version:n}=r.data;return Array.from(this.activeInstalls.values()).some(i=>i)?e.json({success:!1,error:{code:"INSTALL_IN_PROGRESS",message:"\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5"}},409):(this.npmManager.installVersion(n).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:n,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},message:"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7"}))}catch(t){return this.logger.error("\u5904\u7406\u5B89\u88C5\u8BF7\u6C42\u5931\u8D25:",t),e.json({success:!1,error:{code:"REQUEST_FAILED",message:t instanceof Error?t.message:"\u8BF7\u6C42\u5904\u7406\u5931\u8D25"}},500)}}}});var Ar,Ki=C(()=>{"use strict";P();Kr();Dn();Ar=class{static{c(this,"VersionApiHandler")}logger;constructor(){this.logger=p.withTag("VersionApiHandler")}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getVersion(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=xe.getVersionInfo();return this.logger.debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25");return e.json(r,500)}}async getVersionSimple(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=xe.getVersion();return this.logger.debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.json(this.createSuccessResponse({version:t}))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25");return e.json(r,500)}}async clearVersionCache(e){try{return this.logger.debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),xe.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let s=await new Fe().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${s.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:s,type:t,total:s.length}))}catch(t){this.logger.error("\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("VERSIONS_FETCH_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async checkLatestVersion(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new Fe().checkForLatestVersion();return this.logger.debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error})):e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate}))}catch(t){this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",t);let r=this.createErrorResponse("LATEST_VERSION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25");return e.json(r,500)}}}});var Or,Yi=C(()=>{"use strict";P();ne();z();Or=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=p.withTag("NotificationService"),this.eventBus=w(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=d.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:c(n=>{t.readyState===1&&t.send(n)},"send")};this.clients.set(e,r),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u518C: ${e}`),this.logger.debug(`\u5F53\u524D\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.sendQueuedMessages(e),this.eventBus.emitEvent("websocket:client:connected",{clientId:e,timestamp:Date.now()})}catch(r){this.logger.error(`\u6CE8\u518C\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,r),this.eventBus.emitEvent("notification:error",{error:r instanceof Error?r:new Error(String(r)),type:"client:register"})}}unregisterClient(e){try{this.clients.has(e)&&(this.clients.delete(e),this.messageQueue.delete(e),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u9500: ${e}`),this.logger.debug(`\u5269\u4F59\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.eventBus.emitEvent("websocket:client:disconnected",{clientId:e,timestamp:Date.now()}))}catch(t){this.logger.error(`\u6CE8\u9500\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,t)}}broadcast(e,t){let r={type:e,data:t,timestamp:Date.now()};this.logger.debug(`\u5E7F\u64AD\u6D88\u606F: ${e}`,{clientCount:this.clients.size});for(let[n,s]of this.clients)this.sendMessageToClient(s,r,n)}sendToClient(e,t,r){let n={type:t,data:r,timestamp:Date.now()},s=this.clients.get(e);s?this.sendMessageToClient(s,n,e):this.queueMessage(e,n)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let n=JSON.stringify(t);e.send(n),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF ${r}: ${t.type}`)}else this.queueMessage(r,t),this.logger.warn(`\u5BA2\u6237\u7AEF ${r} \u8FDE\u63A5\u4E0D\u53EF\u7528\uFF0C\u6D88\u606F\u5DF2\u52A0\u5165\u961F\u5217`)}catch(n){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,n),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:n instanceof Error?n:new Error(String(n)),type:"message:send"})}}queueMessage(e,t){this.messageQueue.has(e)||this.messageQueue.set(e,[]);let r=this.messageQueue.get(e);r.push(t),r.length>this.maxQueueSize&&(r.shift(),this.logger.warn(`\u5BA2\u6237\u7AEF ${e} \u6D88\u606F\u961F\u5217\u5DF2\u6EE1\uFF0C\u79FB\u9664\u6700\u65E7\u6D88\u606F`))}sendQueuedMessages(e){let t=this.messageQueue.get(e);if(!t||t.length===0)return;let r=this.clients.get(e);if(r){this.logger.info(`\u53D1\u9001 ${t.length} \u6761\u6392\u961F\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${e}`);for(let n of t)this.sendMessageToClient(r,n,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let n={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",n)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,n)=>r+n.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var xr,Zi=C(()=>{"use strict";P();z();xr=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=p.withTag("StatusService"),this.eventBus=w()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.updateClientInfo({status:"disconnected"},"heartbeat-timeout")},this.HEARTBEAT_TIMEOUT)}clearHeartbeatTimeout(){this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=void 0)}isClientConnected(){return this.clientInfo.status==="connected"}getLastHeartbeat(){return this.clientInfo.lastHeartbeat}getActiveMCPServers(){return[...this.clientInfo.activeMCPServers]}setActiveMCPServers(e){this.updateClientInfo({activeMCPServers:[...e]},"mcp-servers-update")}setMcpEndpoint(e){this.updateClientInfo({mcpEndpoint:e},"mcp-endpoint-update")}reset(){this.logger.info("\u91CD\u7F6E\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]},this.restartStatus=void 0}destroy(){this.logger.info("\u9500\u6BC1\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.reset()}}});var _n={};re(_n,{WebServer:()=>Ln});import{createServer as _u}from"http";import{serve as ku}from"@hono/node-server";import{Hono as ju}from"hono";import{cors as Hu}from"hono/cors";import{WebSocketServer as zu}from"ws";var Ln,kn=C(()=>{"use strict";P();Ft();_s();ne();Qt();Fs();Vs();Bs();qs();Gs();Xs();Ks();Ys();Zs();Qs();eo();ro();Ji();Ki();Pt();z();Yi();Zi();Ln=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;proxyMCPServer;xiaozhiConnectionManager;mcpServiceManager;createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}constructor(e){try{this.port=e??d.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=p.withTag("WebServer"),this.eventBus=w(),this.configService=new Me,this.statusService=new xr,this.notificationService=new Or,this.configApiHandler=new tr,this.statusApiHandler=new dr(this.statusService),this.serviceApiHandler=new ur(this.statusService),this.toolApiHandler=new fr,this.versionApiHandler=new Ar,this.staticFileHandler=new hr,this.mcpRouteHandler=new ir,this.realtimeNotificationHandler=new lr(this.notificationService,this.statusService),this.heartbeatHandler=new or(this.statusService,this.notificationService),this.app=new ju,this.setupMiddleware(),this.setupRoutes(),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5...");let e=await this.loadConfiguration();this.mcpServiceManager=await oe.getInstance(),this.mcpServerApiHandler=new cr(this.mcpServiceManager,d),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.info(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`),await this.initializeXiaozhiConnection(e.mcpEndpoint,t),this.logger.info("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),e}}async loadConfiguration(){if(!d.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");d.cleanupInvalidServerToolsConfig();let e=d.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.info(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let n=Ls(t,r);this.mcpServiceManager.addServiceConfig(t,n)}await this.mcpServiceManager.startAllServices(),this.logger.info("\u6240\u6709 MCP \u670D\u52A1\u5DF2\u542F\u52A8")}async initializeXiaozhiConnection(e,t){let n=(Array.isArray(e)?e:[e]).filter(s=>s&&!s.includes("<\u8BF7\u586B\u5199"));this.logger.debug(`\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\uFF0C\u7AEF\u70B9\u6570\u91CF: ${n.length}`);try{this.xiaozhiConnectionManager=await ot.getInstance({reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4}),this.mcpServiceManager&&this.xiaozhiConnectionManager&&this.xiaozhiConnectionManager.setServiceManager(this.mcpServiceManager),this.logger.info("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(s){this.logger.error("\u274C \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s);return}if(n.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",n);try{await this.xiaozhiConnectionManager.initialize(n,t),await this.xiaozhiConnectionManager.connect(),this.xiaozhiConnectionManager.on("configChange",s=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${s.type}`,s.data)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${n.length} \u4E2A\u7AEF\u70B9`)}catch(s){this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s),this.logger.warn("\u56DE\u9000\u5230\u5355\u8FDE\u63A5\u6A21\u5F0F");let i=n[0];this.logger.debug(`\u521D\u59CB\u5316\u5355\u4E2A\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5: ${i}`),this.proxyMCPServer=new be(i),this.mcpServiceManager&&this.proxyMCPServer.setServiceManager(this.mcpServiceManager),await this.connectWithRetry(()=>this.proxyMCPServer.connect(),"\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5"),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")}}else try{this.xiaozhiConnectionManager&&(await this.xiaozhiConnectionManager.initialize([],t),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u521D\u59CB\u5316\u4E3A\u7A7A\u7BA1\u7406\u5668\uFF0C\u652F\u6301\u52A8\u6001\u6DFB\u52A0\u7AEF\u70B9"))}catch(s){this.logger.error("\u274C \u7A7A\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s)}}getXiaozhiConnectionStatus(){return this.xiaozhiConnectionManager?{type:"multi-endpoint",manager:{connectedConnections:this.xiaozhiConnectionManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.xiaozhiConnectionManager.getConnectionStatus().length,healthCheckStats:{},reconnectStats:this.xiaozhiConnectionManager.getReconnectStats()},connections:this.xiaozhiConnectionManager.getConnectionStatus()}:this.proxyMCPServer?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async handleEndpointStatus(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).getEndpointStatus(e)}async handleEndpointConnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).connectEndpoint(e)}async handleEndpointDisconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).disconnectEndpoint(e)}async handleEndpointReconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).reconnectEndpoint(e)}async handleEndpointAdd(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return await new Ae(this.xiaozhiConnectionManager,d).addEndpoint(e)}async handleEndpointRemove(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Ae(this.xiaozhiConnectionManager,d).removeEndpoint(e)}async connectWithRetry(e,t,r=5,n=1e3,s=3e4,i=2){let a=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(g){if(a=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let h=Math.min(n*i**(l-1),s);this.logger.info(`${t} - ${h}ms \u540E\u91CD\u8BD5...`),await this.sleep(h)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",Hu({origin:"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})),this.app?.onError((e,t)=>{this.logger.error("HTTP request error:",e);let r=this.createErrorResponse("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?e.stack:void 0);return t.json(r,500)})}setupRoutes(){this.app?.get("/api/config",t=>this.configApiHandler.getConfig(t)),this.app?.put("/api/config",t=>this.configApiHandler.updateConfig(t)),this.app?.get("/api/config/mcp-endpoint",t=>this.configApiHandler.getMcpEndpoint(t)),this.app?.get("/api/config/mcp-endpoints",t=>this.configApiHandler.getMcpEndpoints(t)),this.app?.get("/api/config/mcp-servers",t=>this.configApiHandler.getMcpServers(t)),this.app?.get("/api/config/connection",t=>this.configApiHandler.getConnectionConfig(t)),this.app?.post("/api/config/reload",t=>this.configApiHandler.reloadConfig(t)),this.app?.get("/api/config/path",t=>this.configApiHandler.getConfigPath(t)),this.app?.get("/api/config/exists",t=>this.configApiHandler.checkConfigExists(t)),this.app?.get("/api/version",t=>this.versionApiHandler.getVersion(t)),this.app?.get("/api/version/simple",t=>this.versionApiHandler.getVersionSimple(t)),this.app?.get("/api/version/available",t=>this.versionApiHandler.getAvailableVersions(t)),this.app?.get("/api/version/latest",t=>this.versionApiHandler.checkLatestVersion(t)),this.app?.post("/api/version/cache/clear",t=>this.versionApiHandler.clearVersionCache(t));let e=new $r;this.app?.post("/api/update",t=>e.performUpdate(t)),this.app?.get("/api/status",t=>this.statusApiHandler.getStatus(t)),this.app?.get("/api/status/client",t=>this.statusApiHandler.getClientStatus(t)),this.app?.get("/api/status/restart",t=>this.statusApiHandler.getRestartStatus(t)),this.app?.get("/api/status/connected",t=>this.statusApiHandler.checkClientConnected(t)),this.app?.get("/api/status/heartbeat",t=>this.statusApiHandler.getLastHeartbeat(t)),this.app?.get("/api/status/mcp-servers",t=>this.statusApiHandler.getActiveMCPServers(t)),this.app?.put("/api/status/client",t=>this.statusApiHandler.updateClientStatus(t)),this.app?.put("/api/status/mcp-servers",t=>this.statusApiHandler.setActiveMCPServers(t)),this.app?.post("/api/status/reset",t=>this.statusApiHandler.resetStatus(t)),this.app?.post("/api/services/restart",t=>this.serviceApiHandler.restartService(t)),this.app?.post("/api/services/stop",t=>this.serviceApiHandler.stopService(t)),this.app?.post("/api/services/start",t=>this.serviceApiHandler.startService(t)),this.app?.get("/api/services/status",t=>this.serviceApiHandler.getServiceStatus(t)),this.app?.get("/api/services/health",t=>this.serviceApiHandler.getServiceHealth(t)),this.app?.post("/api/tools/call",t=>this.toolApiHandler.callTool(t)),this.app?.get("/api/tools/list",t=>this.toolApiHandler.listTools(t)),this.app?.get("/api/tools/custom",t=>this.toolApiHandler.getCustomTools(t)),this.app?.post("/api/tools/custom",t=>this.toolApiHandler.addCustomTool(t)),this.app?.put("/api/tools/custom/:toolName",t=>this.toolApiHandler.updateCustomTool(t)),this.app?.delete("/api/tools/custom/:toolName",t=>this.toolApiHandler.removeCustomTool(t)),this.app?.get("/api/coze/workspaces",t=>He.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>He.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>He.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>He.getCacheStats(t)),this.app?.get("/api/endpoints/:endpoint/status",t=>this.handleEndpointStatus(t)),this.app?.post("/api/endpoints/:endpoint/connect",t=>this.handleEndpointConnect(t)),this.app?.post("/api/endpoints/:endpoint/disconnect",t=>this.handleEndpointDisconnect(t)),this.app?.post("/api/endpoints/:endpoint/reconnect",t=>this.handleEndpointReconnect(t)),this.app?.post("/api/endpoints/add",t=>this.handleEndpointAdd(t)),this.app?.delete("/api/endpoints/:endpoint",t=>this.handleEndpointRemove(t)),this.app?.post("/api/mcp-servers",t=>this.mcpServerApiHandler?.addMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.delete("/api/mcp-servers/:serverName",t=>this.mcpServerApiHandler?.removeMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers/:serverName/status",t=>this.mcpServerApiHandler?.getMCPServerStatus(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers",t=>this.mcpServerApiHandler?.listMCPServers(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.post("/mcp",t=>this.mcpRouteHandler.handlePost(t)),this.app?.get("/mcp",t=>this.mcpRouteHandler.handleGet(t)),this.app?.all("/api/*",async t=>{let r=this.createErrorResponse("API_NOT_FOUND",`API \u7AEF\u70B9\u4E0D\u5B58\u5728: ${t.req.path}`);return t.json(r,404)}),this.app.get("*",t=>this.staticFileHandler.handleStaticFile(t))}setupWebSocket(){this.wss&&this.wss.on("connection",e=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let n=JSON.parse(r.toString());n.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,n,t):await this.realtimeNotificationHandler.handleMessage(e,n,t)}catch(n){this.logger.error("WebSocket message error:",n);let s={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:n instanceof Error?n.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(s))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}let e=ku({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:_u});this.httpServer=e,this.wss=new zu({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://0.0.0.0:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`);try{await this.initializeConnections()}catch(t){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u4F46 Web \u670D\u52A1\u5668\u7EE7\u7EED\u8FD0\u884C:",t)}}stop(){return new Promise(e=>{let t=!1,r=c(()=>{t||(t=!0,e())},"doResolve");if(this.proxyMCPServer?.disconnect(),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let n of this.wss.clients)n.terminate();this.wss.close(()=>{this.httpServer?this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()}):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()),setTimeout(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.statusService.destroy(),this.notificationService.destroy(),Qn(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});var Qi={};re(Qi,{ServiceManagerImpl:()=>jn});var jn,ea=C(()=>{"use strict";Ce();Ye();ft();Ht();jn=class{constructor(e,t,r){this.processManager=e;this.configManager=t;this.logger=r}static{c(this,"ServiceManagerImpl")}async start(e){try{this.validateStartOptions(e),this.processManager.cleanupContainerState();let t=this.getStatus();if(t.running){console.log(`\u68C0\u6D4B\u5230\u670D\u52A1\u5DF2\u5728\u8FD0\u884C (PID: ${t.pid})\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u542F...`);try{await this.processManager.gracefulKillProcess(t.pid),this.processManager.cleanupPidFile(),await new Promise(r=>setTimeout(r,1e3)),console.log("\u73B0\u6709\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u6B63\u5728\u542F\u52A8\u65B0\u670D\u52A1...")}catch(r){console.warn(`\u505C\u6B62\u73B0\u6709\u670D\u52A1\u65F6\u51FA\u73B0\u8B66\u544A: ${r instanceof Error?r.message:String(r)}`)}}switch(this.checkEnvironment(),e.mode){case"mcp-server":await this.startMcpServerMode(e);break;case"stdio":await this.startStdioMode(e);break;case"normal":await this.startNormalMode(e);break;default:await this.startNormalMode(e);break}}catch(t){throw t instanceof _?t:_.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw _.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile()}catch(e){throw e instanceof _?e:new _(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restart(e){try{this.getStatus().running&&(await this.stop(),await new Promise(r=>setTimeout(r,1e3))),await this.start(e)}catch(t){throw new _(`\u91CD\u542F\u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}getStatus(){return this.processManager.getServiceStatus()}validateStartOptions(e){if(e.port!==void 0&&le.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new _(`\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F: ${e.mode}`)}checkEnvironment(){if(!this.configManager.configExists())throw ke.configNotFound();try{if(!this.configManager.getConfig())throw new ke("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof ke?e:new ke(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${e instanceof Error?e.message:String(e)}`)}}async startNormalMode(e){let{spawn:t}=await import("child_process");e.daemon?await this.startWebServerInDaemon(e.ui||!1):await this.startWebServerInForeground(e.ui||!1)}async startMcpServerMode(e){let t=e.port||3e3,{spawn:r}=await import("child_process");if(e.daemon){let n=L.getExecutablePath("cli"),s=r("node",[n,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(s.pid,"daemon"),s.unref(),console.log(`\u2705 MCP Server \u5DF2\u5728\u540E\u53F0\u542F\u52A8 (PID: ${s.pid}, Port: ${t})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),process.exit(0)}else{let{MCPServer:n}=await Promise.resolve().then(()=>(Os(),As)),s=new n(t),i=c(async()=>{await s.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i),await s.start()}}async startStdioMode(e){let{spawn:t}=await import("child_process"),r=L.getMcpServerProxyPath(),n=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir()}});this.processManager.savePidInfo(n.pid,"foreground")}async startWebServerInDaemon(e){let{spawn:t}=await import("child_process"),r=L.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(r))throw new _(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${r}`);let s=[r];e&&s.push("--open-browser");let i=t("node",s,{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(i.pid,"daemon"),i.unref(),console.log(`\u2705 \u540E\u53F0\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${i.pid})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi attach' \u67E5\u770B\u65E5\u5FD7"),process.exit(0)}async startWebServerInForeground(e){let{WebServer:t}=await Promise.resolve().then(()=>(kn(),_n)),r=new t,n=c(async()=>{await r.stop(),this.processManager.cleanupPidFile(),process.exit(0)},"cleanup");if(process.on("SIGINT",n),process.on("SIGTERM",n),this.processManager.savePidInfo(process.pid,"foreground"),await r.start(),e){let i=this.configManager.getConfig()?.webServer?.port||9999;await this.openBrowserUrl(`http://localhost:${i}`)}}async openBrowserUrl(e){try{let{spawn:t}=await import("child_process"),r=se.getCurrentPlatform(),n,s;r==="darwin"?(n="open",s=[e]):r==="win32"?(n="start",s=["",e]):(n="xdg-open",s=[e]),t(n,s,{detached:!0,stdio:"ignore"}),console.log(`\u{1F310} \u5DF2\u5C1D\u8BD5\u6253\u5F00\u6D4F\u89C8\u5668: ${e}`)}catch{console.log(`\u26A0\uFE0F \u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`)}}}});var ta={};re(ta,{TemplateManagerImpl:()=>Hn});import Uu from"fs";import Ve from"path";var Hn,ra=C(()=>{"use strict";Ce();mt();Ye();Ht();Hn=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=L.findTemplatesDir();if(!e)return[];let t=[],r=Uu.readdirSync(e,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name);for(let n of r)try{let s=await this.getTemplateInfo(n);s&&t.push(s)}catch{console.warn(`\u8DF3\u8FC7\u65E0\u6548\u6A21\u677F: ${n}`)}return t}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",L.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(le.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=L.getTemplatePath(e);if(!t)return null;let r=Ve.join(t,"template.json"),n={};if($.exists(r))try{let a=$.readFile(r);n=JSON.parse(a)}catch{console.warn(`\u6A21\u677F\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}`)}let s=this.getTemplateFiles(t),i={name:e,path:t,description:n.description||`${e} \u6A21\u677F`,version:n.version||"1.0.0",author:n.author,files:s};return this.templateCache.set(e,i),i}catch(t){throw t instanceof I?t:new R(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:Ve.basename(t)})}async createProject(e){try{this.validateCreateOptions(e);let t=e.templateName||"default",r=await this.getTemplateInfo(t);if(!r)throw new R(`\u6A21\u677F\u4E0D\u5B58\u5728: ${t}`,"");let n=Ve.resolve(e.targetPath);if($.exists(n))throw R.alreadyExists(n);$.ensureDir(n),await this.copyTemplateFiles(r,n,e),await this.processTemplateVariables(n,e),console.log(`\u2705 \u9879\u76EE\u521B\u5EFA\u6210\u529F: ${n}`)}catch(t){throw t instanceof R||t instanceof I?t:new R(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,e.targetPath)}}async validateTemplate(e){try{let t=await this.getTemplateInfo(e);if(!t)return!1;let r=["package.json"];for(let n of r){let s=Ve.join(t.path,n);if(!$.exists(s))return console.warn(`\u6A21\u677F\u7F3A\u5C11\u5FC5\u8981\u6587\u4EF6: ${n}`),!1}return!0}catch{return!1}}clearCache(){this.templateCache.clear()}getTemplateFiles(e){try{return $.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let n=Ve.relative(e,r);return!n.startsWith(".")&&n!=="template.json"&&!n.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){le.validateRequired(e.targetPath,"targetPath"),le.validateRequired(e.projectName,"projectName"),le.validateProjectName(e.projectName),e.templateName&&le.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{$.copyDirectory(e.path,t,{exclude:["template.json",".git","node_modules"],overwrite:!1,recursive:!0})}catch(n){throw new R(`\u590D\u5236\u6A21\u677F\u6587\u4EF6\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`,e.path)}}async processTemplateVariables(e,t){try{let r={PROJECT_NAME:t.projectName,PROJECT_NAME_LOWER:t.projectName.toLowerCase(),PROJECT_NAME_UPPER:t.projectName.toUpperCase(),...t.variables},n=["package.json","README.md","src/**/*.ts","src/**/*.js","src/**/*.json"];for(let s of n){let i=this.findFilesByPattern(e,s);for(let a of i)await this.replaceVariablesInFile(a,r)}}catch(r){console.warn(`\u5904\u7406\u6A21\u677F\u53D8\u91CF\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}findFilesByPattern(e,t){try{if(!t.includes("*")){let s=Ve.join(e,t);return $.exists(s)?[s]:[]}let r=$.listDirectory(e,{recursive:!0}),n=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(s=>{let i=Ve.relative(e,s);return n.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=$.readFile(e),n=!1;for(let[s,i]of Object.entries(t)){let a=new RegExp(`{{\\s*${s}\\s*}}`,"g");a.test(r)&&(r=r.replace(a,i),n=!0)}n&&$.writeFile(e,r,{overwrite:!0})}catch(r){console.warn(`\u66FF\u6362\u6587\u4EF6\u53D8\u91CF\u5931\u8D25 ${e}: ${r instanceof Error?r.message:String(r)}`)}}}});async function ze(){return zn.create()}var zn,dn=C(()=>{"use strict";P();ne();Xr();mt();Jr();Ye();ft();Ht();Kr();zn=class o{static{c(this,"DIContainer")}instances=new Map;factories=new Map;asyncFactories=new Map;singletons=new Set;register(e,t,r=!1){this.factories.set(e,t),r&&this.singletons.add(e)}registerSingleton(e,t){this.register(e,t,!0)}registerInstance(e,t){this.instances.set(e,t),this.singletons.add(e)}get(e){if(this.singletons.has(e)&&this.instances.has(e))return this.instances.get(e);let t=this.factories.get(e);if(!t)throw new Error(`Service ${e} not registered`);let r=t();return this.singletons.has(e)&&this.instances.set(e,r),r}has(e){return this.factories.has(e)||this.instances.has(e)}clear(){this.instances.clear(),this.factories.clear(),this.singletons.clear()}getRegisteredKeys(){let e=Array.from(this.factories.keys()),t=Array.from(this.instances.keys());return[...new Set([...e,...t])]}static create(){let e=new o;return e.registerSingleton("versionUtils",()=>xe),e.registerSingleton("platformUtils",()=>se),e.registerSingleton("formatUtils",()=>Ke),e.registerSingleton("fileUtils",()=>$),e.registerSingleton("pathUtils",()=>L),e.registerSingleton("validation",()=>le),e.registerSingleton("configManager",()=>d),e.registerSingleton("logger",()=>p),e.registerSingleton("errorHandler",()=>ve),e.registerSingleton("processManager",()=>{let t=(Yr(),fe(as));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(gs(),fe(ls)),r=e.get("processManager"),n=e.get("logger");return new t.DaemonManagerImpl(r,n)}),e.registerSingleton("serviceManager",()=>{let t=(ea(),fe(Qi)),r=e.get("processManager"),n=e.get("configManager"),s=e.get("logger");return new t.ServiceManagerImpl(r,n,s)}),e.registerSingleton("templateManager",()=>{let t=(ra(),fe(ta));return new t.TemplateManagerImpl}),e}};c(ze,"createContainer")});var ee,We=C(()=>{"use strict";ee=class{constructor(e){this.container=e}static{c(this,"BaseCommandHandler")}options;subcommands;getService(e){return this.container.get(e)}handleError(e){this.getService("errorHandler").handle(e)}validateArgs(e,t){if(e.length<t)throw new Error(`\u547D\u4EE4\u9700\u8981\u81F3\u5C11 ${t} \u4E2A\u53C2\u6570\uFF0C\u4F46\u53EA\u63D0\u4F9B\u4E86 ${e.length} \u4E2A`)}}});var na={};re(na,{ServiceCommandHandler:()=>Un});var Un,sa=C(()=>{"use strict";P();We();Un=class extends ee{static{c(this,"ServiceCommandHandler")}name="service";description="\u670D\u52A1\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"start",description:"\u542F\u52A8\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"},{flags:"--debug",description:"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F (\u8F93\u51FADEBUG\u7EA7\u522B\u65E5\u5FD7)"},{flags:"--stdio",description:"\u4EE5 stdio \u6A21\u5F0F\u8FD0\u884C MCP Server (\u7528\u4E8E Cursor \u7B49\u5BA2\u6237\u7AEF)"}],execute:c(async(e,t)=>{await this.handleStart(t)},"execute")},{name:"stop",description:"\u505C\u6B62\u670D\u52A1",execute:c(async(e,t)=>{await this.handleStop()},"execute")},{name:"status",description:"\u68C0\u67E5\u670D\u52A1\u72B6\u6001",execute:c(async(e,t)=>{await this.handleStatus()},"execute")},{name:"restart",description:"\u91CD\u542F\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"}],execute:c(async(e,t)=>{await this.handleRestart(t)},"execute")},{name:"attach",description:"\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7",execute:c(async(e,t)=>{await this.handleAttach()},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u670D\u52A1\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleStart(e){try{e.debug&&Zn("debug");let t=this.getService("serviceManager");e.stdio?await this.startStdioMode():await t.start({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleStop(){try{await this.getService("serviceManager").stop()}catch(e){this.handleError(e)}}async handleStatus(){try{let t=await this.getService("serviceManager").getStatus();t.running?(console.log(`\u2705 \u670D\u52A1\u6B63\u5728\u8FD0\u884C (PID: ${t.pid})`),t.uptime&&console.log(`\u23F1\uFE0F \u8FD0\u884C\u65F6\u95F4: ${t.uptime}`),t.mode&&console.log(`\u{1F527} \u8FD0\u884C\u6A21\u5F0F: ${t.mode}`)):console.log("\u274C \u670D\u52A1\u672A\u8FD0\u884C")}catch(e){this.handleError(e)}}async handleRestart(e){try{await this.getService("serviceManager").restart({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleAttach(){try{await this.getService("daemonManager").attachToLogs()}catch(e){this.handleError(e)}}async startStdioMode(){let{spawn:e}=await import("child_process"),{fileURLToPath:t}=await import("url"),r=await import("path"),n=t(import.meta.url),s=r.dirname(n),i=r.join(s,"mcpServerProxy.js");e("node",[i],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}})}}});var oa={};re(oa,{ConfigCommandHandler:()=>Vn});import Fu from"path";import N from"chalk";import Fn from"ora";var Vn,ia=C(()=>{"use strict";We();Vn=class extends ee{static{c(this,"ConfigCommandHandler")}name="config";description="\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"init",description:"\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6",options:[{flags:"-f, --format <format>",description:"\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F (json, json5, jsonc)",defaultValue:"json"}],execute:c(async(e,t)=>{await this.handleInit(t)},"execute")},{name:"get",description:"\u67E5\u770B\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleGet(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,2),await this.handleSet(e[0],e[1])},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleInit(e){let t=Fn("\u521D\u59CB\u5316\u914D\u7F6E...").start();try{let r=e.format;if(r!=="json"&&r!=="json5"&&r!=="jsonc")throw new Error("\u683C\u5F0F\u5FC5\u987B\u662F json, json5 \u6216 jsonc");let n=this.getService("configManager");if(n.configExists()){t.warn("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728"),console.log(N.yellow("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u5220\u9664\u73B0\u6709\u7684\u914D\u7F6E\u6587\u4EF6"));return}n.initConfig(r),t.succeed("\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u6210\u529F");let s=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),i=`xiaozhi.config.${r}`,a=Fu.join(s,i);console.log(N.green(`\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u521B\u5EFA: ${i}`)),console.log(N.yellow("\u{1F4DD} \u8BF7\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9:")),console.log(N.gray(` \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${a}`)),console.log(N.yellow("\u{1F4A1} \u6216\u8005\u4F7F\u7528\u547D\u4EE4\u8BBE\u7F6E:")),console.log(N.gray(" xiaozhi config set mcpEndpoint <your-endpoint-url>"))}catch(r){t.fail(`\u521D\u59CB\u5316\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleGet(e){let t=Fn("\u8BFB\u53D6\u914D\u7F6E...").start();try{let r=this.getService("configManager");if(!r.configExists()){t.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let n=r.getConfig();switch(e){case"mcpEndpoint":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let s=r.getMcpEndpoints();s.length===0?console.log(N.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):s.length===1?console.log(N.green(`MCP \u7AEF\u70B9: ${s[0]}`)):(console.log(N.green(`MCP \u7AEF\u70B9 (${s.length} \u4E2A):`)),s.forEach((i,a)=>{console.log(N.gray(` ${a+1}. ${i}`))}));break}case"mcpServers":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green("MCP \u670D\u52A1:"));for(let[s,i]of Object.entries(n.mcpServers)){let a=i;"type"in a&&a.type==="sse"?console.log(N.gray(` ${s}: [SSE] ${a.url}`)):console.log(N.gray(` ${s}: ${a.command} ${a.args.join(" ")}`))}break;case"connection":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let s=r.getConnectionConfig();console.log(N.green("\u8FDE\u63A5\u914D\u7F6E:")),console.log(N.gray(` \u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${s.heartbeatInterval}ms`)),console.log(N.gray(` \u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${s.heartbeatTimeout}ms`)),console.log(N.gray(` \u91CD\u8FDE\u95F4\u9694: ${s.reconnectInterval}ms`));break}case"heartbeatInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${r.getHeartbeatInterval()}ms`));break;case"heartbeatTimeout":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${r.getHeartbeatTimeout()}ms`));break;case"reconnectInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u91CD\u8FDE\u95F4\u9694: ${r.getReconnectInterval()}ms`));break;default:t.fail(`\u672A\u77E5\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u7684\u914D\u7F6E\u9879: mcpEndpoint, mcpServers, connection, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(r){t.fail(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e,t){let r=Fn("\u66F4\u65B0\u914D\u7F6E...").start();try{let n=this.getService("configManager");if(!n.configExists()){r.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}switch(e){case"mcpEndpoint":n.updateMcpEndpoint(t),r.succeed(`MCP \u7AEF\u70B9\u5DF2\u8BBE\u7F6E\u4E3A: ${t}`);break;case"heartbeatInterval":{let s=Number.parseInt(t);if(Number.isNaN(s)||s<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");n.updateHeartbeatInterval(s),r.succeed(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${s}ms`);break}case"heartbeatTimeout":{let s=Number.parseInt(t);if(Number.isNaN(s)||s<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u662F\u6B63\u6574\u6570");n.updateHeartbeatTimeout(s),r.succeed(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5DF2\u8BBE\u7F6E\u4E3A: ${s}ms`);break}case"reconnectInterval":{let s=Number.parseInt(t);if(Number.isNaN(s)||s<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");n.updateReconnectInterval(s),r.succeed(`\u91CD\u8FDE\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${s}ms`);break}default:r.fail(`\u4E0D\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: mcpEndpoint, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(n){r.fail(`\u8BBE\u7F6E\u914D\u7F6E\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`),this.handleError(n)}}}});var aa={};re(aa,{ProjectCommandHandler:()=>Wn});import Vu from"path";import H from"chalk";import Wu from"ora";var Wn,ca=C(()=>{"use strict";We();Wn=class extends ee{static{c(this,"ProjectCommandHandler")}name="create";description="\u521B\u5EFA\u9879\u76EE";options=[{flags:"-t, --template <templateName>",description:"\u4F7F\u7528\u6307\u5B9A\u6A21\u677F\u521B\u5EFA\u9879\u76EE"}];constructor(e){super(e)}async execute(e,t){this.validateArgs(e,1);let r=e[0];await this.handleCreate(r,t)}async handleCreate(e,t){let r=Wu("\u521D\u59CB\u5316\u9879\u76EE...").start();try{let n=this.getService("templateManager"),s=this.getService("fileUtils"),i=Vu.join(process.cwd(),e);if(await s.exists(i)){r.fail(`\u76EE\u5F55 "${e}" \u5DF2\u5B58\u5728`),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u9009\u62E9\u4E0D\u540C\u7684\u9879\u76EE\u540D\u79F0\u6216\u5220\u9664\u73B0\u6709\u76EE\u5F55"));return}t.template?await this.createFromTemplate(e,t.template,i,r,n):await this.createBasicProject(e,i,r,n)}catch(n){r.fail(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`),this.handleError(n)}}async createFromTemplate(e,t,r,n,s){n.text="\u68C0\u67E5\u6A21\u677F...";let i=await s.getAvailableTemplates();if(i.length===0){n.fail("\u627E\u4E0D\u5230\u53EF\u7528\u6A21\u677F"),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u786E\u4FDD xiaozhi-client \u6B63\u786E\u5B89\u88C5"));return}let a=t;if(!await s.validateTemplate(a)){n.fail(`\u6A21\u677F "${a}" \u4E0D\u5B58\u5728`);let g=this.findSimilarTemplate(a,i);if(g)if(console.log(H.yellow(`\u{1F4A1} \u4F60\u662F\u60F3\u4F7F\u7528\u6A21\u677F "${g}" \u5417\uFF1F`)),await this.askUserConfirmation(H.cyan("\u786E\u8BA4\u4F7F\u7528\u6B64\u6A21\u677F\uFF1F(y/n): ")))a=g;else{this.showAvailableTemplates(i);return}else{this.showAvailableTemplates(i);return}}n.text=`\u4ECE\u6A21\u677F "${a}" \u521B\u5EFA\u9879\u76EE "${e}"...`,await s.createProject({templateName:a,targetPath:r,projectName:e}),n.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" pnpm install # \u5B89\u88C5\u4F9D\u8D56")),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1"))}async createBasicProject(e,t,r,n){r.text=`\u521B\u5EFA\u57FA\u672C\u9879\u76EE "${e}"...`,await n.createProject({templateName:null,targetPath:t,projectName:e}),r.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u57FA\u672C\u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9\u548C\u670D\u52A1")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1")),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 --template \u9009\u9879\u53EF\u4EE5\u4ECE\u6A21\u677F\u521B\u5EFA\u9879\u76EE"))}showAvailableTemplates(e){console.log(H.yellow("\u53EF\u7528\u7684\u6A21\u677F:"));for(let t of e)console.log(H.gray(` - ${t}`))}findSimilarTemplate(e,t){let r=this.getService("formatUtils"),n=null,s=0;for(let i of t){let a=r.calculateSimilarity(e.toLowerCase(),i.toLowerCase());a>s&&a>.6&&(s=a,n=i)}return n}async askUserConfirmation(e){let r=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{r.question(e,s=>{r.close(),n(s.toLowerCase().trim()==="y"||s.toLowerCase().trim()==="yes")})})}}});var Nr,la=C(()=>{"use strict";P();Yr();ne();Nr=class{static{c(this,"ToolCallService")}logger;processManager;baseUrl;constructor(){this.logger=p.withTag("ToolCallService"),this.processManager=new Ct;try{let e=d.getWebUIPort()??9999;this.baseUrl=`http://localhost:${e}`}catch{this.baseUrl="http://localhost:9999"}}async callTool(e,t,r){await this.validateServiceStatus();try{let n=await fetch(`${this.baseUrl}/api/tools/call`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceName:e,toolName:t,args:r})});if(!n.ok){let i=await n.json();throw new Error(i.error?.message||`HTTP ${n.status}: ${n.statusText}`)}let s=await n.json();if(!s.success)throw new Error(s.error?.message||"\u5DE5\u5177\u8C03\u7528\u5931\u8D25");return s.data}catch(n){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`,n instanceof Error?n.message:String(n)),n}}parseJsonArgs(e){try{return JSON.parse(e)}catch(t){throw new Error(`\u53C2\u6570\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u4F7F\u7528\u6709\u6548\u7684 JSON \u683C\u5F0F\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}async validateServiceStatus(){if(!this.processManager.getServiceStatus().running)throw new Error("xiaozhi \u670D\u52A1\u672A\u542F\u52A8\u3002\u8BF7\u5148\u8FD0\u884C 'xiaozhi start' \u6216 'xiaozhi start -d' \u542F\u52A8\u670D\u52A1\u3002");try{let t=await fetch(`${this.baseUrl}/api/status`,{method:"GET",signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Web \u670D\u52A1\u5668\u54CD\u5E94\u9519\u8BEF: ${t.status}`)}catch(t){throw t instanceof Error&&t.name==="AbortError"?new Error("\u8FDE\u63A5 xiaozhi \u670D\u52A1\u8D85\u65F6\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5E38\u8FD0\u884C\u3002"):new Error(`\u65E0\u6CD5\u8FDE\u63A5\u5230 xiaozhi \u670D\u52A1\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}formatOutput(e){return JSON.stringify(e)}async getServiceStatus(){try{let e=this.processManager.getServiceStatus();if(!e.running)return"\u670D\u52A1\u672A\u542F\u52A8";try{let t=await fetch(`${this.baseUrl}/api/tools/list`,{method:"GET",signal:AbortSignal.timeout(3e3)});if(t.ok){let r=await t.json();if(r.success)return`\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${e.pid}, ${r.data.totalTools} \u4E2A\u5DE5\u5177\u53EF\u7528)`}return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46 MCP \u670D\u52A1\u53EF\u80FD\u672A\u5B8C\u5168\u521D\u59CB\u5316`}catch{return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46\u65E0\u6CD5\u8FDE\u63A5\u5230 Web API`}}catch(e){return`\u670D\u52A1\u72B6\u6001\u68C0\u67E5\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}}});var Lr={};re(Lr,{getDisplayWidth:()=>qn,listMcpServers:()=>Bu,listServerTools:()=>qu,setToolEnabled:()=>Gu,truncateToWidth:()=>Dr});import y from"chalk";import ga from"cli-table3";import Bn from"ora";function qn(o){let e=0;for(let t of o)/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(t)?e+=2:e+=1;return e}function Dr(o,e){if(qn(o)<=e)return o;if(e<=3)return"";let t="",r=0,n=!1;for(let s of o){let i=/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(s)?2:1;if(r+i>e-3){if(!n)return"";t+="...";break}t+=s,r+=i,n=!0}return t}async function Bu(o={}){let e=Bn("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{let t=d.getMcpServers(),r=Object.keys(t),n=d.getCustomMCPTools(),s=n.length>0,i=r.length+(s?1:0);if(i===0){e.warn("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\u6216 customMCP \u5DE5\u5177"),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi config' \u547D\u4EE4\u914D\u7F6E MCP \u670D\u52A1\u6216\u5728 xiaozhi.config.json \u4E2D\u914D\u7F6E customMCP \u5DE5\u5177"));return}if(e.succeed(`\u627E\u5230 ${i} \u4E2A MCP \u670D\u52A1${s?" (\u5305\u62EC customMCP)":""}`),o.tools){console.log(),console.log(y.bold("MCP \u670D\u52A1\u5DE5\u5177\u5217\u8868:")),console.log();let a=8,l=[];for(let h of r){let u=d.getServerToolsConfig(h),f=Object.keys(u);l.push(...f)}if(s){let h=n.map(u=>u.name);l.push(...h)}for(let h of l){let u=qn(h);u>a&&(a=u)}a=Math.max(10,Math.min(a+2,30));let g=new ga({head:[y.bold("MCP"),y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[15,a,8,40],wordWrap:!0,style:{head:[],border:[]}});if(s)for(let h of n){let u=Dr(h.description||"",32);g.push(["customMCP",h.name,y.green("\u542F\u7528"),u])}for(let h of r){let u=d.getServerToolsConfig(h),f=Object.keys(u);if(f.length===0)g.push([y.gray(h),y.gray("-"),y.gray("-"),y.gray("\u6682\u672A\u8BC6\u522B\u5230\u76F8\u5173\u5DE5\u5177")]);else{g.length>0&&g.push([{colSpan:4,content:""}]);for(let m of f){let O=u[m],ie=O.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),te=Dr(O.description||"",32);g.push([h,m,ie,te])}}}console.log(g.toString())}else{console.log(),console.log(y.bold("MCP \u670D\u52A1\u5217\u8868:")),console.log(),s&&(console.log(`${y.cyan("\u2022")} ${y.bold("customMCP")}`),console.log(` \u7C7B\u578B: ${y.gray("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")}`),console.log(` \u914D\u7F6E: ${y.gray("xiaozhi.config.json")}`),console.log(` \u5DE5\u5177: ${y.green(n.length)} \u542F\u7528 / ${y.yellow(n.length)} \u603B\u8BA1`),console.log());for(let a of r){let l=t[a],g=d.getServerToolsConfig(a),h=Object.keys(g).length,u=Object.values(g).filter(f=>f.enable!==!1).length;console.log(`${y.cyan("\u2022")} ${y.bold(a)}`),"url"in l?("type"in l&&l.type==="sse"?console.log(` \u7C7B\u578B: ${y.gray("SSE")}`):console.log(` \u7C7B\u578B: ${y.gray("Streamable HTTP")}`),console.log(` URL: ${y.gray(l.url)}`)):console.log(` \u547D\u4EE4: ${y.gray(l.command)} ${y.gray(l.args.join(" "))}`),h>0?console.log(` \u5DE5\u5177: ${y.green(u)} \u542F\u7528 / ${y.yellow(h)} \u603B\u8BA1`):console.log(` \u5DE5\u5177: ${y.gray("\u672A\u626B\u63CF (\u8BF7\u5148\u542F\u52A8\u670D\u52A1)")}`),console.log()}}console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp list --tools' \u67E5\u770B\u6240\u6709\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> list' \u67E5\u770B\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> <\u5DE5\u5177\u540D> enable/disable' \u542F\u7528/\u7981\u7528\u5DE5\u5177"))}catch(t){e.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function qu(o){let e=Bn(`\u83B7\u53D6 ${o} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!d.getMcpServers()[o]){e.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let r=d.getServerToolsConfig(o),n=Object.keys(r);if(n.length===0){e.warn(`\u670D\u52A1 '${o}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u542F\u52A8\u670D\u52A1\u4EE5\u626B\u63CF\u5DE5\u5177\u5217\u8868"));return}e.succeed(`\u670D\u52A1 '${o}' \u5171\u6709 ${n.length} \u4E2A\u5DE5\u5177`),console.log(),console.log(y.bold(`${o} \u670D\u52A1\u5DE5\u5177\u5217\u8868:`)),console.log();let s=new ga({head:[y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(let i of n){let a=r[i],l=a.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),g=Dr(a.description||"",40);s.push([i,l,g])}console.log(s.toString()),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> enable' \u542F\u7528\u5DE5\u5177`)),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> disable' \u7981\u7528\u5DE5\u5177`))}catch(t){e.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function Gu(o,e,t){let r=t?"\u542F\u7528":"\u7981\u7528",n=Bn(`${r}\u5DE5\u5177 ${o}/${e}...`).start();try{if(!d.getMcpServers()[o]){n.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let i=d.getServerToolsConfig(o);if(!i[e]){n.fail(`\u5DE5\u5177 '${e}' \u5728\u670D\u52A1 '${o}' \u4E2D\u4E0D\u5B58\u5728`),console.log(y.yellow(`\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp ${o} list' \u67E5\u770B\u8BE5\u670D\u52A1\u7684\u6240\u6709\u5DE5\u5177`));return}d.setToolEnabled(o,e,t,i[e].description),n.succeed(`\u6210\u529F${r}\u5DE5\u5177 ${y.cyan(o)}/${y.cyan(e)}`),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A: \u5DE5\u5177\u72B6\u6001\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u670D\u52A1\u65F6\u751F\u6548"))}catch(s){n.fail(`${r}\u5DE5\u5177\u5931\u8D25`),console.error(y.red(`\u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)),process.exit(1)}}var _r=C(()=>{"use strict";ne();c(qn,"getDisplayWidth");c(Dr,"truncateToWidth");c(Bu,"listMcpServers");c(qu,"listServerTools");c(Gu,"setToolEnabled")});var ua={};re(ua,{McpCommandHandler:()=>Gn});import Be from"chalk";var Gn,pa=C(()=>{"use strict";la();We();Gn=class extends ee{static{c(this,"McpCommandHandler")}name="mcp";description="MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406";subcommands=[{name:"list",description:"\u5217\u51FA MCP \u670D\u52A1",options:[{flags:"--tools",description:"\u663E\u793A\u6240\u6709\u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868"}],execute:c(async(e,t)=>{await this.handleList(t)},"execute")},{name:"server",description:"\u7BA1\u7406\u6307\u5B9A\u7684 MCP \u670D\u52A1",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleServer(e[0])},"execute")},{name:"tool",description:"\u542F\u7528\u6216\u7981\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",execute:c(async(e,t)=>{this.validateArgs(e,3);let[r,n,s]=e;s!=="enable"&&s!=="disable"&&(console.error(Be.red("\u9519\u8BEF: \u64CD\u4F5C\u5FC5\u987B\u662F 'enable' \u6216 'disable'")),process.exit(1));let i=s==="enable";await this.handleTool(r,n,i)},"execute")},{name:"call",description:"\u8C03\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",options:[{flags:"--args <json>",description:"\u5DE5\u5177\u53C2\u6570 (JSON \u683C\u5F0F)",defaultValue:"{}"}],execute:c(async(e,t)=>{this.validateArgs(e,2);let[r,n]=e;await this.handleCall(r,n,t.args)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(e){try{let{listMcpServers:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleServer(e){try{let{listServerTools:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleTool(e,t,r){try{let{setToolEnabled:n}=await Promise.resolve().then(()=>(_r(),Lr));await n(e,t,r)}catch(n){this.handleError(n)}}async handleCall(e,t,r){try{let n=new Nr,s=n.parseJsonArgs(r),i=await n.callTool(e,t,s);console.log(n.formatOutput(i))}catch(n){console.log(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`),console.error(Be.red("\u9519\u8BEF:"),n.message),n.message.includes("\u670D\u52A1\u672A\u542F\u52A8")?(console.log(),console.log(Be.yellow("\u{1F4A1} \u8BF7\u5148\u542F\u52A8\u670D\u52A1:")),console.log(Be.gray(" xiaozhi start # \u524D\u53F0\u542F\u52A8")),console.log(Be.gray(" xiaozhi start -d # \u540E\u53F0\u542F\u52A8"))):n.message.includes("\u53C2\u6570\u683C\u5F0F\u9519\u8BEF")&&(console.log(),console.log(Be.yellow("\u{1F4A1} \u6B63\u786E\u683C\u5F0F\u793A\u4F8B:")),console.log(Be.gray(` xiaozhi mcp call ${e} ${t} --args '{"param": "value"}'`))),process.exit(1)}}}});var ha={};re(ha,{EndpointCommandHandler:()=>Xn});import ct from"chalk";import kr from"ora";var Xn,da=C(()=>{"use strict";We();Xn=class extends ee{static{c(this,"EndpointCommandHandler")}name="endpoint";description="\u7BA1\u7406 MCP \u7AEF\u70B9";subcommands=[{name:"list",description:"\u5217\u51FA\u6240\u6709 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{await this.handleList()},"execute")},{name:"add",description:"\u6DFB\u52A0\u65B0\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleAdd(e[0])},"execute")},{name:"remove",description:"\u79FB\u9664\u6307\u5B9A\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleRemove(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E MCP \u7AEF\u70B9\uFF08\u53EF\u4EE5\u662F\u5355\u4E2A\u6216\u591A\u4E2A\uFF09",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleSet(e)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u7AEF\u70B9\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(){let e=kr("\u8BFB\u53D6\u7AEF\u70B9\u914D\u7F6E...").start();try{let r=this.getService("configManager").getMcpEndpoints();e.succeed("\u7AEF\u70B9\u5217\u8868"),r.length===0?console.log(ct.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):(console.log(ct.green(`\u5171 ${r.length} \u4E2A\u7AEF\u70B9:`)),r.forEach((n,s)=>{console.log(ct.gray(` ${s+1}. ${n}`))}))}catch(t){e.fail(`\u8BFB\u53D6\u7AEF\u70B9\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async handleAdd(e){let t=kr("\u6DFB\u52A0\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.addMcpEndpoint(e),t.succeed(`\u6210\u529F\u6DFB\u52A0\u7AEF\u70B9: ${e}`);let n=r.getMcpEndpoints();console.log(ct.gray(`\u5F53\u524D\u5171 ${n.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u6DFB\u52A0\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleRemove(e){let t=kr("\u79FB\u9664\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.removeMcpEndpoint(e),t.succeed(`\u6210\u529F\u79FB\u9664\u7AEF\u70B9: ${e}`);let n=r.getMcpEndpoints();console.log(ct.gray(`\u5F53\u524D\u5269\u4F59 ${n.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e){let t=kr("\u8BBE\u7F6E\u7AEF\u70B9...").start();try{let r=this.getService("configManager");if(e.length===1)r.updateMcpEndpoint(e[0]),t.succeed(`\u6210\u529F\u8BBE\u7F6E\u7AEF\u70B9: ${e[0]}`);else{r.updateMcpEndpoint(e),t.succeed(`\u6210\u529F\u8BBE\u7F6E ${e.length} \u4E2A\u7AEF\u70B9`);for(let[n,s]of e.entries())console.log(ct.gray(` ${n+1}. ${s}`))}}catch(r){t.fail(`\u8BBE\u7F6E\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}}});var ma={};re(ma,{UICommandHandler:()=>Jn});import qe from"chalk";import Xu from"ora";var Jn,fa=C(()=>{"use strict";We();Jn=class extends ee{static{c(this,"UICommandHandler")}name="ui";description="\u542F\u52A8\u914D\u7F6E\u7BA1\u7406\u7F51\u9875";constructor(e){super(e)}async execute(e,t){await this.handleUI()}async handleUI(){let e=Xu("\u542F\u52A8 UI \u670D\u52A1...").start();try{let t=this.getService("configManager");if(!t.configExists()){e.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(qe.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let{WebServer:r}=await Promise.resolve().then(()=>(kn(),_n));await new r().start(),e.succeed("UI \u670D\u52A1\u5DF2\u542F\u52A8");let s=t.getWebUIPort();console.log(qe.green("\u2705 \u914D\u7F6E\u7BA1\u7406\u7F51\u9875\u5DF2\u542F\u52A8\uFF0C\u53EF\u901A\u8FC7\u4EE5\u4E0B\u5730\u5740\u8BBF\u95EE:")),console.log(qe.green(` \u672C\u5730\u8BBF\u95EE: http://localhost:${s}`)),console.log(qe.green(` \u7F51\u7EDC\u8BBF\u95EE: http://<\u4F60\u7684IP\u5730\u5740>:${s}`)),console.log(qe.yellow("\u{1F4A1} \u63D0\u793A: \u6309 Ctrl+C \u505C\u6B62\u670D\u52A1")),await this.openBrowser(`http://localhost:${s}`)}catch(t){e.fail(`\u542F\u52A8 UI \u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async openBrowser(e){try{let{spawn:t}=await import("child_process"),r;process.platform==="darwin"?r=t("open",[e],{detached:!0,stdio:"ignore"}):process.platform==="win32"?r=t("cmd",["/c","start",e],{detached:!0,stdio:"ignore"}):r=t("xdg-open",[e],{detached:!0,stdio:"ignore"}),r.on("error",()=>{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}),r.unref()}catch{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}}}});dn();import Oe from"chalk";import{Command as Ju}from"commander";Xr();var jr=class{constructor(e){this.container=e}static{c(this,"CommandHandlerFactory")}createHandlers(){return[this.createHandler("service"),this.createHandler("config"),this.createHandler("project"),this.createHandler("mcp"),this.createHandler("endpoint"),this.createHandler("ui")]}createHandler(e){switch(e){case"service":return this.createServiceCommandHandler();case"config":return this.createConfigCommandHandler();case"project":return this.createProjectCommandHandler();case"mcp":return this.createMcpCommandHandler();case"endpoint":return this.createEndpointCommandHandler();case"ui":return this.createUICommandHandler();default:throw new Error(`\u672A\u77E5\u7684\u547D\u4EE4\u5904\u7406\u5668\u7C7B\u578B: ${e}`)}}createServiceCommandHandler(){let{ServiceCommandHandler:e}=(sa(),fe(na));return new e(this.container)}createConfigCommandHandler(){let{ConfigCommandHandler:e}=(ia(),fe(oa));return new e(this.container)}createProjectCommandHandler(){let{ProjectCommandHandler:e}=(ca(),fe(aa));return new e(this.container)}createMcpCommandHandler(){let{McpCommandHandler:e}=(pa(),fe(ua));return new e(this.container)}createEndpointCommandHandler(){let{EndpointCommandHandler:e}=(da(),fe(ha));return new e(this.container)}createUICommandHandler(){let{UICommandHandler:e}=(fa(),fe(ma));return new e(this.container)}};var Hr=class{constructor(e){this.container=e;this.handlerFactory=new jr(e)}static{c(this,"CommandRegistry")}handlers=[];handlerFactory;async registerCommands(e){try{this.registerVersionCommand(e),this.registerHelpCommand(e);let t=this.handlerFactory.createHandlers();for(let r of t)this.registerHandler(r),this.registerCommand(e,r);this.registerLegacyServiceCommands(e,t)}catch(t){ve.handle(t)}}registerHandler(e){this.handlers.push(e)}registerCommand(e,t){if(t.subcommands&&t.subcommands.length>0){let r=e.command(t.name).description(t.description);for(let n of t.subcommands){let s=n.name;n.name==="get"?s="get <key>":n.name==="set"?s="set <key> <value>":n.name==="call"&&(s="call <serviceName> <toolName>");let i=r.command(s).description(n.description);if(n.options)for(let a of n.options)i.option(a.flags,a.description,a.defaultValue);i.action(async(...a)=>{try{let g=a[a.length-1].opts();await n.execute(a.slice(0,-1),g)}catch(l){ve.handle(l)}})}r.action(async(...n)=>{try{let i=n[n.length-1].opts();await t.execute(n.slice(0,-1),i)}catch(s){ve.handle(s)}})}else{let r=t.name;t.name==="create"&&(r="create <projectName>");let n=e.command(r).description(t.description);if(t.options)for(let s of t.options)n.option(s.flags,s.description,s.defaultValue);n.action(async(...s)=>{try{let a=s[s.length-1].opts();await t.execute(s.slice(0,-1),a)}catch(i){ve.handle(i)}})}}registerVersionCommand(e){let t=this.container.get("versionUtils");e.version(t.getVersion(),"-v, --version","\u663E\u793A\u7248\u672C\u4FE1\u606F"),e.option("--info","\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F"),e.option("--version-info","\u663E\u793A\u8BE6\u7EC6\u7248\u672C\u4FE1\u606F")}registerHelpCommand(e){e.helpOption("-h, --help","\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").addHelpText("after",`
|
|
97
97
|
\u793A\u4F8B:
|
|
98
98
|
xiaozhi init # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6
|
|
99
99
|
xiaozhi start # \u542F\u52A8\u670D\u52A1
|