xiaozhi-client 1.9.3 → 1.9.4-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/README.md +2 -2
- package/dist/WebServerLauncher.js +2 -100
- package/dist/backend/WebServerLauncher.js +100 -0
- package/dist/backend/WebServerLauncher.js.map +1 -0
- package/dist/backend/cli.js +129 -0
- package/dist/backend/cli.js.map +1 -0
- package/dist/{package.json → backend/package.json} +21 -9
- package/dist/cli.js +2 -129
- package/dist/docs/404/index.html +19 -0
- package/dist/docs/404.html +19 -0
- package/dist/docs/_next/static/JZ0ESgtaHnsqkxSabOqqU/_buildManifest.js +1 -0
- package/dist/docs/_next/static/JZ0ESgtaHnsqkxSabOqqU/_ssgManifest.js +1 -0
- package/dist/docs/_next/static/chunks/112-c9cbd8401d35f825.js +4 -0
- package/dist/docs/_next/static/chunks/2a9bc5d7-4c434acf20ba934a.js +1 -0
- package/dist/docs/_next/static/chunks/782-c26ca6c69e488d48.js +1 -0
- package/dist/docs/_next/static/chunks/799-fe0d35806fd12012.js +1 -0
- package/dist/docs/_next/static/chunks/9b1cb2c3-cc9ed703e6aef1a2.js +1 -0
- package/dist/docs/_next/static/chunks/app/[[...mdxPath]]/page-48f5c8f3210e0a8a.js +1 -0
- package/dist/docs/_next/static/chunks/app/_not-found/page-2e38866a1cbb77e4.js +1 -0
- package/dist/docs/_next/static/chunks/app/layout-e8f420537fd59e8d.js +1 -0
- package/dist/docs/_next/static/chunks/framework-b73126dabbf07067.js +1 -0
- package/dist/docs/_next/static/chunks/main-75dc65850b89d90d.js +1 -0
- package/dist/docs/_next/static/chunks/main-app-3303134270964ce6.js +1 -0
- package/dist/docs/_next/static/chunks/pages/_app-e698a68d07c8993d.js +1 -0
- package/dist/docs/_next/static/chunks/pages/_error-189a41ab5833da03.js +1 -0
- package/dist/docs/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/docs/_next/static/chunks/webpack-10e2bf7d852ddb6e.js +1 -0
- package/dist/docs/_next/static/css/2d82b615fcca1590.css +1 -0
- package/dist/docs/_next/static/css/b03484a3c350cf6e.css +1 -0
- package/dist/docs/_next/static/css/b289318ef4b60b0a.css +1 -0
- package/dist/docs/changelog/index.html +585 -0
- package/dist/docs/changelog/index.txt +1079 -0
- package/dist/docs/images/coze-workflow/get-parameter.png +0 -0
- package/dist/docs/index.html +22 -0
- package/dist/docs/index.txt +41 -0
- package/dist/docs/quickstart/index.html +64 -0
- package/dist/docs/quickstart/index.txt +185 -0
- package/dist/docs/reference/command/index.html +20 -0
- package/dist/docs/reference/command/index.txt +42 -0
- package/dist/docs/usage/as-mcp/index.html +36 -0
- package/dist/docs/usage/as-mcp/index.txt +101 -0
- package/dist/docs/usage/coze-workflow/index.html +35 -0
- package/dist/docs/usage/coze-workflow/index.txt +120 -0
- package/dist/docs/usage/docker/index.html +40 -0
- package/dist/docs/usage/docker/index.txt +154 -0
- package/dist/docs/usage/modelscope/index.html +32 -0
- package/dist/docs/usage/modelscope/index.txt +109 -0
- package/dist/docs/usage/multi-endpoint/index.html +32 -0
- package/dist/docs/usage/multi-endpoint/index.txt +118 -0
- package/dist/frontend/assets/form-utils-h64o2Nyg.js.map +1 -0
- package/{apps/frontend/dist → dist/frontend}/assets/index-88NfCOo9.js.map +1 -1
- package/dist/frontend/assets/radix-ui-BA32w1ww.js.map +1 -0
- package/dist/frontend/assets/react-vendor-DrjkXih1.js.map +1 -0
- package/dist/frontend/assets/utils-CiPelQLP.js.map +1 -0
- package/dist/frontend/assets/vendor-DK9yaMt3.js.map +1 -0
- package/dist/shared-types/index.js +36 -0
- package/dist/shared-types/index.js.map +1 -0
- package/package.json +21 -9
- package/apps/frontend/README.md +0 -169
- package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js.map +0 -1
- package/apps/frontend/dist/assets/radix-ui-BA32w1ww.js.map +0 -1
- package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js.map +0 -1
- package/apps/frontend/dist/assets/utils-CiPelQLP.js.map +0 -1
- package/apps/frontend/dist/assets/vendor-DK9yaMt3.js.map +0 -1
- package/dist/WebServerLauncher.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/docs/arch/cache.mdx +0 -885
- package/docs/changelog.mdx +0 -645
- package/docs/development/architecture.mdx +0 -71
- package/docs/development/docker-build.mdx +0 -256
- package/docs/development/todo__release-guide.md +0 -563
- package/docs/development/todo__setting-manager.md +0 -122
- package/docs/docs.json +0 -55
- package/docs/getting-started/install.mdx +0 -191
- package/docs/getting-started/intro.mdx +0 -11
- package/docs/getting-started/quickstart.mdx +0 -108
- package/docs/mcp-tool-calling.md +0 -363
- package/docs/python-dependencies.md +0 -216
- package/docs/reference/command.mdx +0 -15
- package/docs/usage/add-mcp-server.mdx +0 -6
- package/docs/usage/as-a-mcp-server.mdx +0 -76
- package/docs/usage/coze-workflow.mdx +0 -73
- package/docs/usage/docker.mdx +0 -99
- package/docs/usage/modelscope.mdx +0 -74
- package/docs/usage/use-multi-xiaozhi-mcp-endpoints.mdx +0 -77
- package/docs/usage/web-control.mdx +0 -6
- /package/dist/{WebServerLauncher.d.ts → backend/WebServerLauncher.d.ts} +0 -0
- /package/dist/{cli.d.ts → backend/cli.d.ts} +0 -0
- /package/dist/{templates → backend/templates}/default/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/default/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/default/package.json +0 -0
- /package/dist/{templates → backend/templates}/default/xiaozhi.config.json +0 -0
- /package/dist/{templates → backend/templates}/hello-world/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/hello-world/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/hello-world/package.json +0 -0
- /package/dist/{templates → backend/templates}/hello-world/xiaozhi.config.json +0 -0
- /package/dist/{templates → backend/templates}/json5/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/json5/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/json5/package.json +0 -0
- /package/dist/{templates → backend/templates}/json5/xiaozhi.config.json5 +0 -0
- /package/dist/{templates → backend/templates}/jsonc/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/jsonc/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/jsonc/package.json +0 -0
- /package/dist/{templates → backend/templates}/jsonc/xiaozhi.config.jsonc +0 -0
- /package/dist/{templates → backend/templates}/modelscope/xiaozhi.config.json +0 -0
- /package/{docs/images/coze-workflow/get-parameter.png → dist/docs/_next/static/media/get-parameter.62eee93d.png} +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-1.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-2.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-3.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-4.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-5.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cursor/step-1.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cursor/step-2.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cursor/step-3.png +0 -0
- /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-1.png +0 -0
- /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-2.png +0 -0
- /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-3.png +0 -0
- /package/{docs → dist/docs}/images/integrate-to-cherry-studio.png +0 -0
- /package/{docs → dist/docs}/images/integrate-to-cursor.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-1.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-2.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-3.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-4.png +0 -0
- /package/{docs → dist/docs}/images/preview.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-1.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-2.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-3.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-4.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-5.png +0 -0
- /package/{docs → dist/docs}/images/web-ui-preview.png +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/form-utils-h64o2Nyg.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/index-88NfCOo9.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/index-P6Zq3MZF.css +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/radix-ui-BA32w1ww.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/react-vendor-DrjkXih1.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/utils-CiPelQLP.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/vendor-DK9yaMt3.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/index.html +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,129 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
var ic=Object.create;var Ye=Object.defineProperty;var ac=Object.getOwnPropertyDescriptor;var cc=Object.getOwnPropertyNames;var lc=Object.getPrototypeOf,gc=Object.prototype.hasOwnProperty;var a=(n,e)=>Ye(n,"name",{value:e,configurable:!0});var m=(n,e)=>()=>(n&&(e=n(n=0)),e);var S=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),X=(n,e)=>{for(var t in e)Ye(n,t,{get:e[t],enumerable:!0})},bt=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of cc(e))!gc.call(n,o)&&o!==t&&Ye(n,o,{get:()=>e[o],enumerable:!(r=ac(e,o))||r.enumerable});return n},De=(n,e,t)=>(bt(n,e,"default"),t&&bt(t,e,"default")),pc=(n,e,t)=>(t=n!=null?ic(lc(n)):{},bt(e||!n||!n.__esModule?Ye(t,"default",{value:n,enumerable:!0}):t,n)),me=n=>bt(Ye({},"__esModule",{value:!0}),n);var _r,Le,Qe,w,kr,_e,Re=m(()=>{"use strict";_r={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},Le={FILE_NAMES:["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"],DEFAULT_FILE:"xiaozhi.config.default.json",DIR_ENV_VAR:"XIAOZHI_CONFIG_DIR"},Qe={WORK_DIR:".xiaozhi",TEMPLATES_DIR:"templates",LOGS_DIR:"logs"},w={GENERAL_ERROR:"GENERAL_ERROR",CONFIG_ERROR:"CONFIG_ERROR",SERVICE_ERROR:"SERVICE_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",FILE_ERROR:"FILE_ERROR",PROCESS_ERROR:"PROCESS_ERROR",NETWORK_ERROR:"NETWORK_ERROR",PERMISSION_ERROR:"PERMISSION_ERROR"},kr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3},_e={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var uc,dc,It,wn=m(()=>{"use strict";Re();uc={[w.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[w.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[w.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[w.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[w.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[w.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[w.PERMISSION_ERROR]:"\u5C1D\u8BD5\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"},dc={config_not_found:['\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6',"\u68C0\u67E5\u5F53\u524D\u76EE\u5F55\u662F\u5426\u4E3A\u9879\u76EE\u6839\u76EE\u5F55","\u8BBE\u7F6E XIAOZHI_CONFIG_DIR \u73AF\u5883\u53D8\u91CF\u6307\u5B9A\u914D\u7F6E\u76EE\u5F55"],service_port_occupied:["\u68C0\u67E5\u7AEF\u53E3\u662F\u5426\u88AB\u5176\u4ED6\u7A0B\u5E8F\u5360\u7528",'\u4F7F\u7528 "lsof -i :\u7AEF\u53E3\u53F7" \u67E5\u770B\u7AEF\u53E3\u4F7F\u7528\u60C5\u51B5',"\u66F4\u6539\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u7AEF\u53E3\u8BBE\u7F6E"],permission_denied:["\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u6743\u9650","\u4F7F\u7528 sudo \u6216\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C","\u786E\u4FDD\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u6743\u9650"],service_start_failed:["\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u662F\u5426\u6B63\u786E","\u67E5\u770B\u65E5\u5FD7\u6587\u4EF6\u83B7\u53D6\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F","\u786E\u4FDD\u6240\u6709\u4F9D\u8D56\u670D\u52A1\u6B63\u5E38\u8FD0\u884C"]},It=class{static{a(this,"ERROR_MESSAGES")}static getHelpMessage(e){return uc[e]}static getSolutions(e){return dc[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[w.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[w.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[w.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[w.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[w.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[w.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[w.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[w.NETWORK_ERROR,w.FILE_ERROR,w.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[w.VALIDATION_ERROR]:"low",[w.FILE_ERROR]:"medium",[w.CONFIG_ERROR]:"medium",[w.NETWORK_ERROR]:"medium",[w.SERVICE_ERROR]:"high",[w.PROCESS_ERROR]:"high",[w.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});var W,we,D,P,T,he,ce=m(()=>{"use strict";Re();W=class n extends Error{constructor(t,r,o=1,s){super(t);this.code=r;this.exitCode=o;this.suggestions=s;this.name="CLIError",Error.captureStackTrace&&Error.captureStackTrace(this,n)}static{a(this,"CLIError")}static withSuggestions(t,r,o){return new n(t,r,1,o)}},we=class n extends W{static{a(this,"ConfigError")}constructor(e,t){super(e,w.CONFIG_ERROR,1,t),this.name="ConfigError"}static configNotFound(){return new n("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728",['\u8BF7\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6'])}static invalidFormat(e){return new n(`\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F: ${e}`,["\u652F\u6301\u7684\u683C\u5F0F: json, json5, jsonc"])}},D=class n extends W{static{a(this,"ServiceError")}constructor(e,t){super(e,w.SERVICE_ERROR,1,t),this.name="ServiceError"}static alreadyRunning(e){return new n(`\u670D\u52A1\u5DF2\u7ECF\u5728\u8FD0\u884C (PID: ${e})`,['\u8BF7\u5148\u8FD0\u884C "xiaozhi stop" \u505C\u6B62\u73B0\u6709\u670D\u52A1','\u6216\u8005\u4F7F\u7528 "xiaozhi restart" \u91CD\u542F\u670D\u52A1'])}static autoRestarting(e){return new n(`\u68C0\u6D4B\u5230\u670D\u52A1\u5DF2\u5728\u8FD0\u884C (PID: ${e})\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u542F...`,["\u5982\u679C\u4E0D\u5E0C\u671B\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u4F7F\u7528 xiaozhi stop \u624B\u52A8\u505C\u6B62\u670D\u52A1"])}static notRunning(){return new n("\u670D\u52A1\u672A\u8FD0\u884C",['\u8BF7\u8FD0\u884C "xiaozhi start" \u542F\u52A8\u670D\u52A1'])}static startFailed(e){return new n(`\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${e}`,["\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u662F\u5426\u6B63\u786E","\u786E\u4FDD\u7AEF\u53E3\u672A\u88AB\u5360\u7528","\u67E5\u770B\u65E5\u5FD7\u6587\u4EF6\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F"])}},P=class n extends W{static{a(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,w.VALIDATION_ERROR,1),this.name="ValidationError"}static invalidPort(e){return new n(`\u7AEF\u53E3\u53F7\u5FC5\u987B\u5728 1-65535 \u8303\u56F4\u5185\uFF0C\u5F53\u524D\u503C: ${e}`,"port")}static requiredField(e){return new n("\u5FC5\u586B\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A",e)}},T=class n extends W{static{a(this,"FileError")}constructor(e,t,r){let o=t?`${e}: ${t}`:e;super(o,w.FILE_ERROR,1,r),this.name="FileError"}static notFound(e){return new n("\u6587\u4EF6\u4E0D\u5B58\u5728",e,["\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u662F\u5426\u6B63\u786E"])}static permissionDenied(e){return new n("\u6743\u9650\u4E0D\u8DB3",e,["\u68C0\u67E5\u6587\u4EF6\u6743\u9650\u6216\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"])}static alreadyExists(e){return new n("\u6587\u4EF6\u5DF2\u5B58\u5728",e,["\u4F7F\u7528\u4E0D\u540C\u7684\u6587\u4EF6\u540D\u6216\u5220\u9664\u73B0\u6709\u6587\u4EF6"])}},he=class n extends W{static{a(this,"ProcessError")}constructor(e,t,r){let o=t?`${e} (PID: ${t})`:e;super(o,w.PROCESS_ERROR,1,r),this.name="ProcessError"}static killFailed(e){return new n("\u65E0\u6CD5\u7EC8\u6B62\u8FDB\u7A0B",e,["\u8FDB\u7A0B\u53EF\u80FD\u5DF2\u7ECF\u505C\u6B62\u6216\u6743\u9650\u4E0D\u8DB3"])}static notFound(e){return new n("\u8FDB\u7A0B\u4E0D\u5B58\u5728",e)}}});import"chalk";var le,jr=m(()=>{"use strict";wn();ce();le=class n{static{a(this,"ErrorHandler")}static handle(e){e instanceof W?n.handleCLIError(e):n.handleUnknownError(e),process.exit(1)}static handleCLIError(e){if(process.env.DEBUG,e.suggestions&&e.suggestions.length>0)for(let r of e.suggestions);let t=It.getHelpMessage(e.code)}static handleUnknownError(e){process.env.DEBUG||process.env.NODE_ENV}static async handleAsync(e,t){try{return await e()}catch(r){throw r instanceof W?r:r instanceof Error?new W(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new W(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof W?r:r instanceof Error?new W(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new W(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static warn(e,t){if(t&&t.length>0)for(let r of t);}static info(e){}static success(e){}}});import H from"fs";import K from"path";var b,Ze=m(()=>{"use strict";ce();b=class n{static{a(this,"FileUtils")}static exists(e){try{return H.existsSync(e)}catch{return!1}}static ensureDir(e){try{H.existsSync(e)||H.mkdirSync(e,{recursive:!0})}catch{throw new T("\u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55",e)}}static readFile(e,t="utf8"){try{if(!n.exists(e))throw T.notFound(e);return H.readFileSync(e,t)}catch(r){throw r instanceof T?r:new T("\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6",e)}}static writeFile(e,t,r){try{if(!r?.overwrite&&n.exists(e))throw T.alreadyExists(e);let o=K.dirname(e);n.ensureDir(o),H.writeFileSync(e,t,"utf8")}catch(o){throw o instanceof T?o:new T("\u65E0\u6CD5\u5199\u5165\u6587\u4EF6",e)}}static copyFile(e,t,r){try{if(!n.exists(e))throw T.notFound(e);if(!r?.overwrite&&n.exists(t))throw T.alreadyExists(t);let o=K.dirname(t);n.ensureDir(o),H.copyFileSync(e,t)}catch(o){throw o instanceof T?o:new T("\u65E0\u6CD5\u590D\u5236\u6587\u4EF6",e)}}static deleteFile(e){try{n.exists(e)&&H.unlinkSync(e)}catch{throw new T("\u65E0\u6CD5\u5220\u9664\u6587\u4EF6",e)}}static copyDirectory(e,t,r={}){try{if(!n.exists(e))throw T.notFound(e);n.ensureDir(t);let o=H.readdirSync(e);for(let s of o){if(r.exclude?.includes(s))continue;let i=K.join(e,s),c=K.join(t,s);H.statSync(i).isDirectory()?r.recursive!==!1&&n.copyDirectory(i,c,r):n.copyFile(i,c,{overwrite:r.overwrite})}}catch(o){throw o instanceof T?o:new T("\u65E0\u6CD5\u590D\u5236\u76EE\u5F55",e)}}static deleteDirectory(e,t={}){try{n.exists(e)&&H.rmSync(e,{recursive:t.recursive??!0,force:!0})}catch{throw new T("\u65E0\u6CD5\u5220\u9664\u76EE\u5F55",e)}}static getFileInfo(e){try{if(!n.exists(e))throw T.notFound(e);let t=H.statSync(e);return{size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory(),mtime:t.mtime,ctime:t.ctime}}catch(t){throw t instanceof T?t:new T("\u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u4FE1\u606F",e)}}static listDirectory(e,t={}){try{if(!n.exists(e))throw T.notFound(e);let r=H.readdirSync(e),o=[];for(let s of r){if(!t.includeHidden&&s.startsWith("."))continue;let i=K.join(e,s);if(o.push(i),t.recursive&&H.statSync(i).isDirectory()){let c=n.listDirectory(i,t);o=o.concat(c)}}return o}catch(r){throw r instanceof T?r:new T("\u65E0\u6CD5\u5217\u51FA\u76EE\u5F55\u5185\u5BB9",e)}}static createTempFile(e="xiaozhi-",t=".tmp"){let r=process.env.TMPDIR||process.env.TEMP||"/tmp",o=Date.now(),s=Math.random().toString(36).substring(2),i=`${e}${o}-${s}${t}`;return K.join(r,i)}static checkPermissions(e,t=H.constants.R_OK|H.constants.W_OK){try{return H.accessSync(e,t),!0}catch{return!1}}static getExtension(e){return K.extname(e).toLowerCase()}static getBaseName(e){return K.basename(e,K.extname(e))}static normalizePath(e){return K.normalize(e)}static resolvePath(e,t){return t?K.resolve(t,e):K.resolve(e)}}});var ke,Hr=m(()=>{"use strict";ke=class{static{a(this,"FormatUtils")}static formatUptime(e){let t=Math.floor(e/1e3),r=Math.floor(t/60),o=Math.floor(r/60),s=Math.floor(o/24);return s>0?`${s}\u5929 ${o%24}\u5C0F\u65F6 ${r%60}\u5206\u949F`:o>0?`${o}\u5C0F\u65F6 ${r%60}\u5206\u949F`:r>0?`${r}\u5206\u949F ${t%60}\u79D2`:`${t}\u79D2`}static formatFileSize(e){let t=["B","KB","MB","GB","TB"],r=e,o=0;for(;r>=1024&&o<t.length-1;)r/=1024,o++;return`${r.toFixed(o===0?0:1)} ${t[o]}`}static formatTimestamp(e,t="full"){let r=new Date(e);switch(t){case"date":return r.toLocaleDateString("zh-CN");case"time":return r.toLocaleTimeString("zh-CN");default:return r.toLocaleString("zh-CN")}}static formatPid(e){return`PID: ${e}`}static formatPort(e){return`\u7AEF\u53E3: ${e}`}static formatUrl(e,t,r,o){let s=`${e}://${t}:${r}`;return o?`${s}${o}`:s}static formatConfigPair(e,t){return typeof t=="object"?`${e}: ${JSON.stringify(t,null,2)}`:`${e}: ${t}`}static formatError(e,t=!1){let r=`\u9519\u8BEF: ${e.message}`;return t&&e.stack&&(r+=`
|
|
3
|
-
\u5806\u6808\u4FE1\u606F:
|
|
4
|
-
${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join(`
|
|
5
|
-
`)}static formatTable(e){if(e.length===0)return"";let t=Object.keys(e[0]),r=t.map(c=>Math.max(c.length,...e.map(l=>String(l[c]).length))),o=t.map((c,l)=>c.padEnd(r[l])).join(" | "),s=r.map(c=>"-".repeat(c)).join("-|-"),i=e.map(c=>t.map((l,g)=>String(c[l]).padEnd(r[g])).join(" | "));return[o,s,...i].join(`
|
|
6
|
-
`)}static formatProgressBar(e,t,r=20){let o=Math.min(e/t,1),s=Math.floor(o*r),i=r-s,c="\u2588".repeat(s)+"\u2591".repeat(i),l=Math.floor(o*100);return`[${c}] ${l}% (${e}/${t})`}static formatCommandArgs(e,t){let r=t.map(o=>o.includes(" ")?`"${o}"`:o);return`${e} ${r.join(" ")}`}static truncateText(e,t,r="..."){return e.length<=t?e:e.substring(0,t-r.length)+r}static formatJson(e,t=2){try{return JSON.stringify(e,null,t)}catch{return String(e)}}static formatBoolean(e,t="\u662F",r="\u5426"){return e?t:r}}});import{realpathSync as mc}from"fs";import{tmpdir as hc}from"os";import N from"path";import{fileURLToPath as Pn}from"url";var A,Ee=m(()=>{"use strict";Re();Ze();A=class n{static{a(this,"PathUtils")}static getPidFile(){let e=process.env[Le.DIR_ENV_VAR]||process.cwd();return N.join(e,`.${_r.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return N.join(t,_r.LOG_FILE)}static getConfigDir(){return process.env[Le.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=n.getConfigDir();return N.join(e,Qe.WORK_DIR)}static getTemplatesDir(){let e=Pn(import.meta.url),t=N.dirname(e);return[N.join(t,Qe.TEMPLATES_DIR),N.join(t,"..","..","..",Qe.TEMPLATES_DIR),N.join(t,"..","..","..","..",Qe.TEMPLATES_DIR)]}static findTemplatesDir(){let e=n.getTemplatesDir();for(let t of e)if(b.exists(t))return t;return null}static getTemplatePath(e){let t=n.findTemplatesDir();if(!t)return null;let r=N.join(t,e);return b.exists(r)?r:null}static getScriptDir(){let e=Pn(import.meta.url);return N.dirname(e)}static getProjectRoot(){let e=n.getScriptDir();return N.join(e,"..","..","..")}static getDistDir(){let e=n.getProjectRoot();return N.join(e,"dist")}static getRelativePath(e){let t=n.getProjectRoot();return N.relative(t,e)}static resolveConfigPath(e){let t=n.getConfigDir();if(e)return N.join(t,`xiaozhi.config.${e}`);for(let r of Le.FILE_NAMES){let o=N.join(t,r);if(b.exists(o))return o}return N.join(t,Le.FILE_NAMES[2])}static getDefaultConfigPath(){let e=n.getProjectRoot();return N.join(e,Le.DEFAULT_FILE)}static validatePath(e){return!N.normalize(e).includes("..")}static ensurePathWithin(e,t){let r=N.resolve(t,e),o=N.resolve(t);if(!r.startsWith(o))throw new Error(`\u8DEF\u5F84 ${e} \u8D85\u51FA\u4E86\u5141\u8BB8\u7684\u8303\u56F4`);return r}static getExecutablePath(e){let t=process.argv[1];if(!t)return N.join(process.cwd(),`${e}.js`);let r;try{r=mc(t)}catch{r=t}let o=N.dirname(r);return N.join(o,`${e}.js`)}static getWebServerLauncherPath(){return n.getExecutablePath("WebServerLauncher")}static createSafePath(...e){let t=N.join(...e),r=N.normalize(t);if(r.includes("..")||r.includes("~"))throw new Error(`\u4E0D\u5B89\u5168\u7684\u8DEF\u5F84: ${r}`);return r}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||hc()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import{execSync as bn}from"child_process";var ne,Nt=m(()=>{"use strict";Re();ce();ne=class n{static{a(this,"PlatformUtils")}static getCurrentPlatform(){return process.platform}static isWindows(){return process.platform==="win32"}static isMacOS(){return process.platform==="darwin"}static isLinux(){return process.platform==="linux"}static isUnixLike(){return!n.isWindows()}static isXiaozhiProcess(e){try{if(process.env.XIAOZHI_CONTAINER==="true"||process.env.NODE_ENV==="test")return process.kill(e,0),!0;try{let t="";return n.isWindows()?t=bn(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:kr.PROCESS_STOP}).toLowerCase():t=bn(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:kr.PROCESS_STOP}).toLowerCase(),t.includes("node")||t.includes("xiaozhi")}catch{return process.kill(e,0),!0}}catch{return!1}}static async killProcess(e,t="SIGTERM"){try{process.kill(e,t);let r=0,o=30;for(;r<o;){await new Promise(s=>setTimeout(s,100));try{process.kill(e,0),r++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(s=>setTimeout(s,500))}catch{}}catch(r){throw new he(`\u65E0\u6CD5\u7EC8\u6B62\u8FDB\u7A0B: ${r instanceof Error?r.message:String(r)}`,e)}}static processExists(e){try{return process.kill(e,0),!0}catch{return!1}}static getSystemInfo(){return{platform:n.getCurrentPlatform(),arch:process.arch,nodeVersion:process.version,isContainer:process.env.XIAOZHI_CONTAINER==="true"}}static getEnvVar(e,t){return process.env[e]||t}static setEnvVar(e,t){process.env[e]=t}static isContainerEnvironment(){return process.env.XIAOZHI_CONTAINER==="true"}static isTestEnvironment(){return process.env.NODE_ENV==="test"}static isDevelopmentEnvironment(){return process.env.NODE_ENV==="development"}static getTailCommand(e){return n.isWindows()?{command:"powershell",args:["-Command",`Get-Content -Path "${e}" -Wait`]}:{command:"tail",args:["-f",e]}}}});var Y,At=m(()=>{"use strict";ce();Y=class n{static{a(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw P.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new P(`\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F: ${e}\uFF0C\u652F\u6301\u7684\u683C\u5F0F: ${t.join(", ")}`,"format");return e}static validateRequired(e,t){if(e==null||e==="")throw P.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new P(`\u957F\u5EA6\u4E0D\u80FD\u5C11\u4E8E ${r.min} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D\u957F\u5EA6: ${e.length}`,t);if(r.max!==void 0&&e.length>r.max)throw new P(`\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7 ${r.max} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D\u957F\u5EA6: ${e.length}`,t)}static validateUrl(e,t="url"){try{new URL(e)}catch{throw new P(`\u65E0\u6548\u7684 URL \u683C\u5F0F: ${e}`,t)}}static validateWebSocketUrl(e,t="websocket_url"){n.validateUrl(e,t);let r=new URL(e);if(!["ws:","wss:"].includes(r.protocol))throw new P(`WebSocket URL \u5FC5\u987B\u4F7F\u7528 ws:// \u6216 wss:// \u534F\u8BAE\uFF0C\u5F53\u524D\u534F\u8BAE: ${r.protocol}`,t)}static validateHttpUrl(e,t="http_url"){n.validateUrl(e,t);let r=new URL(e);if(!["http:","https:"].includes(r.protocol))throw new P(`HTTP URL \u5FC5\u987B\u4F7F\u7528 http:// \u6216 https:// \u534F\u8BAE\uFF0C\u5F53\u524D\u534F\u8BAE: ${r.protocol}`,t)}static validateProjectName(e){n.validateRequired(e,"projectName"),n.validateStringLength(e,"projectName",{min:1,max:100});let t=/[<>:"/\\|?*]/,r=e.split("").some(o=>o.charCodeAt(0)<32);if(t.test(e)||r)throw new P('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new P("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4EE5\u70B9\u5F00\u5934","projectName")}static validateTemplateName(e){if(n.validateRequired(e,"templateName"),n.validateStringLength(e,"templateName",{min:1,max:50}),!/^[a-zA-Z0-9_-]+$/.test(e))throw new P("\u6A21\u677F\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u8FDE\u5B57\u7B26\u548C\u4E0B\u5212\u7EBF","templateName")}static validateEnvVarName(e){if(n.validateRequired(e,"envVarName"),!/^[A-Z_][A-Z0-9_]*$/.test(e))throw new P("\u73AF\u5883\u53D8\u91CF\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF\uFF0C\u4E14\u4E0D\u80FD\u4EE5\u6570\u5B57\u5F00\u5934","envVarName")}static validateJson(e,t="json"){try{return JSON.parse(e)}catch(r){throw new P(`\u65E0\u6548\u7684 JSON \u683C\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}static validateNumberRange(e,t,r={}){if(r.min!==void 0&&e<r.min)throw new P(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new P(`\u503C\u4E0D\u80FD\u5927\u4E8E ${r.max}\uFF0C\u5F53\u524D\u503C: ${e}`,t)}static validateArrayLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new P(`\u6570\u7EC4\u957F\u5EA6\u4E0D\u80FD\u5C11\u4E8E ${r.min}\uFF0C\u5F53\u524D\u957F\u5EA6: ${e.length}`,t);if(r.max!==void 0&&e.length>r.max)throw new P(`\u6570\u7EC4\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7 ${r.max}\uFF0C\u5F53\u524D\u957F\u5EA6: ${e.length}`,t)}static validateObjectProperties(e,t,r="object"){for(let o of t)if(!(o in e))throw new P(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${o}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new P(`\u65E0\u6548\u7684\u503C: ${e}\uFF0C\u6709\u6548\u503C: ${t.join(", ")}`,r);return e}static validateRegex(e,t="regex"){try{return new RegExp(e)}catch(r){throw new P(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import xt from"fs";import ge from"path";import{fileURLToPath as In}from"url";var Se,zr=m(()=>{"use strict";ce();Se=class n{static{a(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(n.cachedVersion)return n.cachedVersion;try{let e=In(import.meta.url),t=ge.dirname(e),r=[ge.join(t,"package.json"),ge.join(t,"..","package.json"),ge.join(t,"..","..","..","package.json"),ge.join(t,"..","..","..","..","package.json")];for(let o of r)if(xt.existsSync(o)){let s=JSON.parse(xt.readFileSync(o,"utf8"));if(s.version)return n.cachedVersion=s.version,s.version}return n.cachedVersion="unknown","unknown"}catch{return n.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=In(import.meta.url),t=ge.dirname(e),r=[ge.join(t,"package.json"),ge.join(t,"..","package.json"),ge.join(t,"..","..","..","package.json"),ge.join(t,"..","..","..","..","package.json")];for(let o of r)if(xt.existsSync(o)){let s=JSON.parse(xt.readFileSync(o,"utf8"));return{version:s.version||"unknown",name:s.name,description:s.description,author:s.author}}return{version:"unknown"}}catch{throw new T("\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C\u4FE1\u606F","package.json")}}static compareVersions(e,t){let r=e.split(".").map(Number),o=t.split(".").map(Number),s=Math.max(r.length,o.length);for(let i=0;i<s;i++){let c=r[i]||0,l=o[i]||0;if(c>l)return 1;if(c<l)return-1}return 0}static isValidVersion(e){return/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(e)}static clearCache(){n.cachedVersion=null}}});import*as B from"fs";import*as Q from"path";import et from"chalk";import je from"pino";import{z as fc}from"zod";function vc(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),o=String(n.getHours()).padStart(2,"0"),s=String(n.getMinutes()).padStart(2,"0"),i=String(n.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${o}:${s}:${i}`}function Ec(){return tt||(tt=new Fr(Nn)),tt}function An(n){Nn=n,tt&&tt.setLevel(n)}var Cc,Fr,tt,Nn,p,M=m(()=>{"use strict";Cc=fc.enum(["fatal","error","warn","info","debug","trace"]);a(vc,"formatDateTime");Fr=class{static{a(this,"Logger")}logFilePath=null;pinoInstance;isDaemonMode;logLevel;maxLogFileSize=10*1024*1024;maxLogFiles=5;constructor(e="info"){this.isDaemonMode=process.env.XIAOZHI_DAEMON==="true",this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}validateLogLevel(e){let t=e.toLowerCase(),r=Cc.safeParse(t);return r.success?r.data:"info"}createPinoInstance(){let e=[];if(!this.isDaemonMode){let t=this.createOptimizedConsoleStream();e.push({level:this.logLevel,stream:t})}return this.logFilePath&&e.push({level:this.logLevel,stream:je.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:je.destination({dest:"/dev/null"})}),je({level:this.logLevel,timestamp:je.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((t,r)=>({level:r}),"level")},base:null,serializers:{err:je.stdSerializers?.err||(t=>t)}},je.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:et.gray}],[30,{name:"INFO",color:et.blue}],[40,{name:"WARN",color:et.yellow}],[50,{name:"ERROR",color:et.red}],[60,{name:"FATAL",color:et.red}]]);return{write:a(t=>{try{let r=JSON.parse(t),o=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${o}
|
|
7
|
-
`)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"&&process.stderr.write(e)}catch{}}formatConsoleMessageOptimized(e,t){let r=vc(new Date),o=t.get(e.level)||{name:"UNKNOWN",color:a(c=>c,"color")},s=o.color(`[${o.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let c=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${c}`}return`[${r}] ${s} ${i}`}initLogFile(e){this.logFilePath=Q.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),B.existsSync(this.logFilePath)||B.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(o=>o instanceof Error?this.pinoInstance.level==="debug"?o.message:{message:o.message,stack:o.stack,name:o.name,cause:o.cause}:o);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}enhanceErrorObject(e){let t={...e};for(let[r,o]of Object.entries(t))o instanceof Error&&(t[r]={message:o.message,stack:o.stack,name:o.name,cause:o.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!B.existsSync(this.logFilePath)))try{B.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=Q.dirname(this.logFilePath),t=Q.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let s=Q.join(e,`${t}.${o}.log`),i=Q.join(e,`${t}.${o+1}.log`);B.existsSync(s)&&(o===this.maxLogFiles-1?B.unlinkSync(s):B.renameSync(s,i))}let r=Q.join(e,`${t}.1.log`);B.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=Q.dirname(this.logFilePath),t=Q.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=Q.join(e,`${t}.${r}.log`);B.existsSync(o)&&B.unlinkSync(o)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}withTag(e){return this}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},tt=null,Nn="info";a(Ec,"getLogger");a(An,"setGlobalLogLevel");p=Ec()});import{EventEmitter as Sc}from"events";function R(){return He||(He=new Ur),He}function xn(){He&&(He.destroy(),He=null)}var Ur,He,z=m(()=>{"use strict";M();Ur=class extends Sc{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=p.withTag("EventBus"),this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=a(o=>{try{t(o)}catch(s){throw this.emit("error",s),s}finally{this.offEvent(e,r)}},"onceListener");return this.on(e,r)}offEvent(e,t){return this.logger.debug(`\u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.off(e,t)}updateEventStats(e){let t=this.eventStats.get(e)||{count:0,lastEmitted:new Date};t.count++,t.lastEmitted=new Date,this.eventStats.set(e,t)}getEventStats(){let e={};for(let[t,r]of this.eventStats)e[t]={...r};return e}getListenerStats(){let e={};for(let t of this.eventNames())e[t]=this.listenerCount(t);return e}clearEventStats(){this.eventStats.clear(),this.logger.info("\u4E8B\u4EF6\u7EDF\u8BA1\u5DF2\u6E05\u7406")}getStatus(){return{totalEvents:this.eventStats.size,totalListeners:Object.values(this.getListenerStats()).reduce((e,t)=>e+t,0),eventStats:this.getEventStats(),listenerStats:this.getListenerStats()}}destroy(){this.removeAllListeners(),this.eventStats.clear(),this.logger.info("EventBus \u5DF2\u9500\u6BC1")}},He=null;a(R,"getEventBus");a(xn,"destroyEventBus")});var Z,ze=m(()=>{"use strict";(t=>{function n(r){if(!r||typeof r!="object")return r;let o=JSON.parse(JSON.stringify(r));if(!("type"in o))return o;let s=o.type;if(s==="sse"||s==="streamable-http")return o;let i;return s==="streamableHttp"||s==="streamable_http"?i="streamable-http":s==="s_se"||s==="s-se"?i="sse":i=e(s),(i==="sse"||i==="streamable-http")&&(o.type=i),o}t.normalizeTypeField=n,a(n,"normalizeTypeField");function e(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}a(e,"convertToKebabCase")})(Z||={})});function yc(n){if(!n||typeof n!="object")throw new Error("\u670D\u52A1\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u6709\u6548\u7684\u5BF9\u8C61");if("command"in n&&typeof n.command=="string")return"stdio";if("type"in n&&n.type==="sse")return"sse";if("type"in n&&n.type==="streamable-http"||"url"in n&&typeof n.url=="string")return"streamable-http";throw new Error("\u65E0\u6CD5\u8BC6\u522B\u7684 MCP \u670D\u52A1\u914D\u7F6E\u7C7B\u578B\u3002\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5\uFF08stdio\uFF09\u3001type: 'sse' \u5B57\u6BB5\uFF08sse\uFF09\u6216 url \u5B57\u6BB5\uFF08streamable-http\uFF09")}function Vr(n,e){if(!e||typeof e!="object"||Array.isArray(e))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61`};try{let t=yc(e),r=e;switch(t){case"stdio":if(!r.command||typeof r.command!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 command \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(!Array.isArray(r.args))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 args \u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4`};if(r.env&&(typeof r.env!="object"||Array.isArray(r.env)))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 env \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"sse":if(r.type!=="sse")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 type \u5B57\u6BB5\u5FC5\u987B\u662F "sse"`};if(!r.url||typeof r.url!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(r.headers&&(typeof r.headers!="object"||Array.isArray(r.headers)))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 headers \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"streamable-http":if(!r.url||typeof r.url!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(r.type&&r.type!=="streamable-http")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 type \u5B57\u6BB5\u5982\u679C\u5B58\u5728\uFF0C\u5FC5\u987B\u662F "streamable-http"`};if(r.headers&&(typeof r.headers!="object"||Array.isArray(r.headers)))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 headers \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;default:return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u7C7B\u578B\u65E0\u6CD5\u8BC6\u522B`}}return{valid:!0}}catch(t){return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u65E0\u6548: ${t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF"}`}}}function Fe(n){return`${n.slice(0,30)}...${n.slice(-10)}`}var $t=m(()=>{"use strict";a(yc,"getMcpServerCommunicationType");a(Vr,"validateMcpServerConfig");a(Fe,"sliceEndpoint")});import{copyFileSync as Tc,existsSync as Ot,readFileSync as Mc,writeFileSync as Rc}from"fs";import{dirname as wc,resolve as Pe}from"path";import{fileURLToPath as Pc}from"url";import*as Dt from"comment-json";import $n from"dayjs";import Wr from"json5";import*as Dn from"json5-writer";var On,Br,qr,h,ee=m(()=>{"use strict";z();ze();$t();M();On=wc(Pc(import.meta.url)),Br={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},qr=class n{static{a(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=R();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[Pe(On,"templates","default","xiaozhi.config.json"),Pe(On,"..","templates","default","xiaozhi.config.json"),Pe(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>Ot(t))||e[0]}getConfigFilePath(){let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),t=["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"];for(let r of t){let o=Pe(e,r);if(Ot(o))return o}return Pe(e,"xiaozhi.config.json")}getConfigFileFormat(e){return e.endsWith(".json5")?"json5":e.endsWith(".jsonc")?"jsonc":"json"}static getInstance(){return n.instance||(n.instance=new n),n.instance}configExists(){let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),t=["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"];for(let r of t){let o=Pe(e,r);if(Ot(o))return!0}return!1}initConfig(e="json"){if(!Ot(this.defaultConfigPath))throw new Error(`\u9ED8\u8BA4\u914D\u7F6E\u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728: ${this.defaultConfigPath}`);if(this.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u521D\u59CB\u5316");let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=`xiaozhi.config.${e}`,o=Pe(t,r);Tc(this.defaultConfigPath,o),this.config=null,this.json5Writer=null}loadConfig(){if(!this.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C xiaozhi init \u521D\u59CB\u5316\u914D\u7F6E");try{let e=this.getConfigFilePath();this.currentConfigPath=e;let t=this.getConfigFileFormat(e),o=Mc(e,"utf8").replace(/^\uFEFF/,""),s;switch(t){case"json5":s=Wr.parse(o),this.json5Writer=Dn.load(o);break;case"jsonc":s=Dt.parse(o);break;default:s=JSON.parse(o);break}return this.validateConfig(s),s}catch(e){throw e instanceof SyntaxError?new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF: ${e.message}`):e}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A\u6839\u5BF9\u8C61\u65E0\u6548");let t=e;if(t.mcpEndpoint===void 0||t.mcpEndpoint===null)throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5B57\u6BB5\u65E0\u6548");if(typeof t.mcpEndpoint!="string")if(Array.isArray(t.mcpEndpoint)){for(let r of t.mcpEndpoint)if(typeof r!="string"||r.trim()==="")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6216\u5B57\u7B26\u4E32\u6570\u7EC4");if(!t.mcpServers||typeof t.mcpServers!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers \u5B57\u6BB5\u65E0\u6548");for(let[r,o]of Object.entries(t.mcpServers)){if(!o||typeof o!="object")throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers.${r} \u65E0\u6548`);let s=Z.normalizeTypeField(o),i=Vr(r,s);if(!i.valid)throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A${i.error}`)}}getConfig(){return this.config=this.loadConfig(),JSON.parse(JSON.stringify(this.config))}getMutableConfig(){return this.config||(this.config=this.loadConfig()),this.config}getMcpEndpoint(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?e.mcpEndpoint[0]||"":e.mcpEndpoint}getMcpEndpoints(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?[...e.mcpEndpoint]:e.mcpEndpoint?[e.mcpEndpoint]:[]}getMcpServers(){return this.getConfig().mcpServers}getMcpServerConfig(){return this.getConfig().mcpServerConfig||{}}getServerToolsConfig(e){return this.getMcpServerConfig()[e]?.tools||{}}isToolEnabled(e,t){return this.getServerToolsConfig(e)[t]?.enable!==!1}updateMcpEndpoint(e){if(Array.isArray(e)){for(let r of e)if(!r||typeof r!="string")throw new Error("MCP \u7AEF\u70B9\u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}let t=this.getMutableConfig();t.mcpEndpoint=e,this.saveConfig(t)}addMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.includes(e))throw new Error(`MCP \u7AEF\u70B9 ${e} \u5DF2\u5B58\u5728`);let o=[...r,e];t.mcpEndpoint=o,this.saveConfig(t)}removeMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.indexOf(e)===-1)throw new Error(`MCP \u7AEF\u70B9 ${e} \u4E0D\u5B58\u5728`);let s=r.filter(i=>i!==e);t.mcpEndpoint=s,this.saveConfig(t)}updateMcpServer(e,t){if(!e||typeof e!="string")throw new Error("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let r=Vr(e,t);if(!r.valid)throw new Error(r.error||"\u670D\u52A1\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let o=this.getMutableConfig();o.mcpServers[e]=t,this.saveConfig(o)}removeMcpServer(e){if(!e||typeof e!="string")throw new Error("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig();if(!t.mcpServers[e])throw new Error(`\u670D\u52A1 ${e} \u4E0D\u5B58\u5728`);if(delete t.mcpServers[e],t.mcpServerConfig?.[e]&&delete t.mcpServerConfig[e],t.customMCP?.tools){let r=t.customMCP.tools.filter(o=>o.handler?.type==="mcp"&&o.handler.config?.serviceName===e);for(let o of r){let s=t.customMCP.tools.findIndex(i=>i.name===o.name);s!==-1&&t.customMCP.tools.splice(s,1)}t.customMCP.tools.length===0&&(t.customMCP=void 0)}this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),p.info(`\u6210\u529F\u79FB\u9664 MCP \u670D\u52A1 ${e} \u53CA\u5176\u76F8\u5173\u914D\u7F6E`)}updateServerToolsConfig(e,t){let r=this.getMutableConfig();r.mcpServerConfig||(r.mcpServerConfig={}),Object.keys(t).length===0?delete r.mcpServerConfig[e]:r.mcpServerConfig[e]={tools:t},this.saveConfig(r),this.eventBus.emitEvent("config:updated",{type:"serverTools",serviceName:e,timestamp:new Date})}removeServerToolsConfig(e){let r={...this.getConfig()};r.mcpServerConfig&&(delete r.mcpServerConfig[e],this.saveConfig(r))}cleanupInvalidServerToolsConfig(){let e=this.getMutableConfig();if(!e.mcpServerConfig)return;let t=Object.keys(e.mcpServers),o=Object.keys(e.mcpServerConfig).filter(s=>!t.includes(s));if(o.length>0){for(let s of o)delete e.mcpServerConfig[s];this.saveConfig(e),p.info(`\u5DF2\u6E05\u7406 ${o.length} \u4E2A\u65E0\u6548\u7684\u670D\u52A1\u5DE5\u5177\u914D\u7F6E: ${o.join(", ")}`)}}setToolEnabled(e,t,r,o){let s=this.getMutableConfig();s.mcpServerConfig||(s.mcpServerConfig={}),s.mcpServerConfig[e]||(s.mcpServerConfig[e]={tools:{}}),s.mcpServerConfig[e].tools[t]={...s.mcpServerConfig[e].tools[t],enable:r,...o&&{description:o}},this.saveConfig(s)}saveConfig(e){try{this.validateConfig(e);let t;this.currentConfigPath?t=this.currentConfigPath:(t=this.getConfigFilePath(),this.currentConfigPath=t);let r=this.getConfigFileFormat(t),o;switch(r){case"json5":try{this.json5Writer?(this.json5Writer.write(e),o=this.json5Writer.toSource()):o=Wr.stringify(e,null,2)}catch{o=Wr.stringify(e,null,2)}break;case"jsonc":try{o=Dt.stringify(e,null,2)}catch{o=JSON.stringify(e,null,2)}break;default:o=JSON.stringify(e,null,2);break}Rc(t,o,"utf8"),this.config=e,this.notifyConfigUpdate(e)}catch(t){throw new Error(`\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}reloadConfig(){this.config=null,this.currentConfigPath=null,this.json5Writer=null}getConfigPath(){return this.getConfigFilePath()}getDefaultConfigPath(){return this.defaultConfigPath}getConnectionConfig(){let t=this.getConfig().connection||{};return{heartbeatInterval:t.heartbeatInterval??Br.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??Br.heartbeatTimeout,reconnectInterval:t.reconnectInterval??Br.reconnectInterval}}getHeartbeatInterval(){return this.getConnectionConfig().heartbeatInterval}getHeartbeatTimeout(){return this.getConnectionConfig().heartbeatTimeout}getReconnectInterval(){return this.getConnectionConfig().reconnectInterval}updateConnectionConfig(e){let t=this.getMutableConfig();t.connection||(t.connection={}),Object.assign(t.connection,e),this.saveConfig(t)}async updateToolUsageStats(e,t,r){try{if(typeof t=="string"&&r){let o=e,s=t,i=r;await Promise.all([this._updateMCPServerToolStats(o,s,i),this.updateCustomMCPToolStats(o,s,i)]),p.debug(`\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${o}/${s}`)}else{let o=e,s=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(o,i,s),p.debug(`CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${o}`)}}catch(o){if(typeof t=="string"&&r){let s=e,i=t;p.error(`\u66F4\u65B0\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${s}/${i}): ${o instanceof Error?o.message:String(o)}`)}else{let s=e;p.error(`\u66F4\u65B0 CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${s}): ${o instanceof Error?o.message:String(o)}`)}}}async updateMCPServerToolStats(e,t,r,o=!0){await this._updateMCPServerToolStats(e,t,r,o)}setHeartbeatInterval(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatInterval:e})}setHeartbeatTimeout(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatTimeout:e})}setReconnectInterval(e){if(e<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({reconnectInterval:e})}getModelScopeConfig(){return this.getConfig().modelscope||{}}getModelScopeApiKey(){return this.getModelScopeConfig().apiKey||process.env.MODELSCOPE_API_TOKEN}updateModelScopeConfig(e){let t=this.getMutableConfig();t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e),this.saveConfig(t)}setModelScopeApiKey(e){if(!e||typeof e!="string")throw new Error("API Key \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");this.updateModelScopeConfig({apiKey:e})}getCustomMCPConfig(){return this.getConfig().customMCP||null}getCustomMCPTools(){let e=this.getCustomMCPConfig();return!e||!e.tools?[]:e.tools}validateCustomMCPTools(e){if(!Array.isArray(e))return!1;for(let t of e){if(!t.name||typeof t.name!="string")return p.warn(`CustomMCP \u5DE5\u5177\u7F3A\u5C11\u6709\u6548\u7684 name \u5B57\u6BB5: ${JSON.stringify(t)}`),!1;if(!t.description||typeof t.description!="string")return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 description \u5B57\u6BB5`),!1;if(!t.inputSchema||typeof t.inputSchema!="object")return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 inputSchema \u5B57\u6BB5`),!1;if(!t.handler||typeof t.handler!="object")return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 handler \u5B57\u6BB5`),!1;if(!["proxy","function","http","script","chain","mcp"].includes(t.handler.type))return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7684 handler.type \u5FC5\u987B\u662F 'proxy', 'function', 'http', 'script', 'chain' \u6216 'mcp'`),!1;if(!this.validateHandlerConfig(t.name,t.handler))return!1}return!0}validateHandlerConfig(e,t){switch(t.type){case"proxy":return this.validateProxyHandler(e,t);case"http":return this.validateHttpHandler(e,t);case"function":return this.validateFunctionHandler(e,t);case"script":return this.validateScriptHandler(e,t);case"chain":return this.validateChainHandler(e,t);case"mcp":return this.validateMCPHandler(e,t);default:return p.warn(`CustomMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u4E86\u672A\u77E5\u7684\u5904\u7406\u5668\u7C7B\u578B`),!1}}validateProxyHandler(e,t){return t.platform?["coze","openai","anthropic","custom"].includes(t.platform)?!t.config||typeof t.config!="object"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):t.platform==="coze"&&!t.config.workflow_id&&!t.config.bot_id?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 Coze \u5904\u7406\u5668\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id`),!1):!0:(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u5E73\u53F0: ${t.platform}`),!1):(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u7F3A\u5C11 platform \u5B57\u6BB5`),!1)}validateHttpHandler(e,t){if(!t.url||typeof t.url!="string")return p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 url \u5B57\u6BB5`),!1;try{new URL(t.url)}catch{return p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668 url \u683C\u5F0F\u65E0\u6548: ${t.url}`),!1}return t.method&&!["GET","POST","PUT","DELETE","PATCH"].includes(t.method)?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${t.method}`),!1):!0}validateFunctionHandler(e,t){return!t.module||typeof t.module!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 function \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 module \u5B57\u6BB5`),!1):!t.function||typeof t.function!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 function \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 function \u5B57\u6BB5`),!1):!0}validateScriptHandler(e,t){return!t.script||typeof t.script!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 script \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 script \u5B57\u6BB5`),!1):t.interpreter&&!["node","python","bash"].includes(t.interpreter)?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 script \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u89E3\u91CA\u5668: ${t.interpreter}`),!1):!0}validateChainHandler(e,t){return!t.tools||!Array.isArray(t.tools)||t.tools.length===0?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 tools \u6570\u7EC4`),!1):["sequential","parallel"].includes(t.mode)?["stop","continue","retry"].includes(t.error_handling)?!0:(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u9519\u8BEF\u5904\u7406\u7B56\u7565: ${t.error_handling}`),!1):(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u6267\u884C\u6A21\u5F0F: ${t.mode}`),!1)}validateMCPHandler(e,t){return!t.config||typeof t.config!="object"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):!t.config.serviceName||typeof t.config.serviceName!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 serviceName`),!1):!t.config.toolName||typeof t.config.toolName!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 toolName`),!1):!0}hasValidCustomMCPTools(){try{let e=this.getCustomMCPTools();return e.length===0?!1:this.validateCustomMCPTools(e)}catch(e){return p.error("\u68C0\u67E5 customMCP \u5DE5\u5177\u914D\u7F6E\u65F6\u51FA\u9519:",e),!1}}addCustomMCPTool(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools.find(o=>o.name===e.name))throw new Error(`\u5DE5\u5177 "${e.name}" \u5DF2\u5B58\u5728`);if(!this.validateCustomMCPTools([e]))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.unshift(e),this.saveConfig(t),p.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e.name}`)}async addCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(e.length===0)return;let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]});let r=new Set(t.customMCP.tools.map(s=>s.name)),o=e.filter(s=>!r.has(s.name));if(o.length>0){if(!this.validateCustomMCPTools(o))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.push(...o),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),p.debug(`\u6210\u529F\u6279\u91CF\u6DFB\u52A0 ${o.length} \u4E2A\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${o.map(s=>s.name).join(", ")}`)}}removeCustomMCPTool(e){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(!t.customMCP||!t.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let r=t.customMCP.tools.findIndex(o=>o.name===e);if(r===-1)throw new Error(`\u5DE5\u5177 "${e}" \u4E0D\u5B58\u5728`);t.customMCP.tools.splice(r,1),this.saveConfig(t),p.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e}`)}updateCustomMCPTool(e,t){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="object")throw new Error("\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let r=this.getMutableConfig();if(!r.customMCP||!r.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let o=r.customMCP.tools.findIndex(s=>s.name===e);if(o===-1)throw new Error(`\u5DE5\u5177 "${e}" \u4E0D\u5B58\u5728`);if(!this.validateCustomMCPTools([t]))throw new Error("\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");r.customMCP.tools[o]=t,this.saveConfig(r),p.debug(`\u6210\u529F\u66F4\u65B0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e}`)}updateCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(!this.validateCustomMCPTools(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools=e,this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),p.debug(`\u6210\u529F\u66F4\u65B0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\uFF0C\u5171 ${e.length} \u4E2A\u5DE5\u5177`)}getWebUIConfig(){return this.getConfig().webUI||{}}getWebUIPort(){return this.getWebUIConfig().port??9999}notifyConfigUpdate(e){try{let t=global.__webServer;t&&typeof t.broadcastConfigUpdate=="function"&&t.broadcastConfigUpdate(e)}catch{}}updateWebUIConfig(e){let t=this.getMutableConfig();t.webUI||(t.webUI={}),Object.assign(t.webUI,e),this.saveConfig(t)}setWebUIPort(e){if(!Number.isInteger(e)||e<=0||e>65535)throw new Error("\u7AEF\u53E3\u53F7\u5FC5\u987B\u662F 1-65535 \u4E4B\u95F4\u7684\u6574\u6570");this.updateWebUIConfig({port:e})}updatePlatformConfig(e,t){let r=this.getMutableConfig();r.platforms||(r.platforms={}),r.platforms[e]=t,this.saveConfig(r)}getCozePlatformConfig(){let t=this.getConfig().platforms?.coze;return!t||!t.token?null:{token:t.token}}getCozeToken(){return this.getCozePlatformConfig()?.token||null}setCozePlatformConfig(e){if(!e.token||typeof e.token!="string"||e.token.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.updatePlatformConfig("coze",{token:e.token.trim()})}isCozeConfigValid(){let e=this.getCozePlatformConfig();return e!==null&&typeof e.token=="string"&&e.token.trim()!==""}async _updateMCPServerToolStats(e,t,r,o=!0){let s=this.getMutableConfig();s.mcpServerConfig||(s.mcpServerConfig={}),s.mcpServerConfig[e]||(s.mcpServerConfig[e]={tools:{}}),s.mcpServerConfig[e].tools[t]||(s.mcpServerConfig[e].tools[t]={enable:!0});let i=s.mcpServerConfig[e].tools[t],c=i.usageCount||0,l=i.lastUsedTime;o&&(i.usageCount=c+1),(!l||new Date(r)>new Date(l))&&(i.lastUsedTime=$n(r).format("YYYY-MM-DD HH:mm:ss")),this.saveConfig(s)}async updateCustomMCPToolStats(e,t,r){try{let o,s,i=!0,c;if(typeof r=="string"){let x=e;o=`${x}__${t}`,s=r,c=`${x}/${t}`}else o=e,s=t,i=r||!0,c=o;let l=this.getCustomMCPTools(),g=l.findIndex(x=>x.name===o);if(g===-1)return;let u=[...l],d=u[g];d.stats||(d.stats={});let C=d.stats.usageCount||0,f=d.stats.lastUsedTime;i&&(d.stats.usageCount=C+1),(!f||new Date(s)>new Date(f))&&(d.stats.lastUsedTime=$n(s).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(u)}catch(o){if(typeof r=="string"){let s=e,i=t;p.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${s}/${i}): ${o instanceof Error?o.message:String(o)}`)}else{let s=e;p.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${s}): ${o instanceof Error?o.message:String(o)}`)}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return p.debug(`\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u66F4\u65B0\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8DF3\u8FC7\u672C\u6B21\u66F4\u65B0`),!1;let t=new Promise(o=>{});this.statsUpdateLocks.set(e,t);let r=setTimeout(()=>{this.releaseStatsUpdateLock(e)},this.STATS_UPDATE_TIMEOUT);return this.statsUpdateLockTimeouts.set(e,r),!0}releaseStatsUpdateLock(e){this.statsUpdateLocks.delete(e);let t=this.statsUpdateLockTimeouts.get(e);t&&(clearTimeout(t),this.statsUpdateLockTimeouts.delete(e)),p.debug(`\u5DF2\u91CA\u653E\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u66F4\u65B0\u9501`)}async updateToolUsageStatsWithLock(e,t=!0){let r=`custommcp_${e}`;if(await this.acquireStatsUpdateLock(r))try{await this.updateToolUsageStats(e,t),p.debug(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(o){throw p.error(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,o),o}finally{this.releaseStatsUpdateLock(r)}}async updateMCPServerToolStatsWithLock(e,t,r,o=!0){let s=`mcpserver_${e}_${t}`;if(await this.acquireStatsUpdateLock(s))try{await this.updateMCPServerToolStats(e,t,r,o),p.debug(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(i){throw p.error(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,i),i}finally{this.releaseStatsUpdateLock(s)}}clearAllStatsUpdateLocks(){let e=this.statsUpdateLocks.size;this.statsUpdateLocks.clear();for(let t of this.statsUpdateLockTimeouts.values())clearTimeout(t);this.statsUpdateLockTimeouts.clear(),e>0&&p.info(`\u5DF2\u6E05\u7406 ${e} \u4E2A\u7EDF\u8BA1\u66F4\u65B0\u9501`)}getStatsUpdateLocks(){return Array.from(this.statsUpdateLocks.keys())}getToolCallLogConfig(){return this.getConfig().toolCallLog||{}}updateToolCallLogConfig(e){let t=this.getMutableConfig();t.toolCallLog||(t.toolCallLog={}),Object.assign(t.toolCallLog,e),this.saveConfig(t)}getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}},h=qr.getInstance()});var Ln={};X(Ln,{ProcessManagerImpl:()=>rt});var rt,Gr=m(()=>{"use strict";ce();Ze();Hr();Ee();Nt();rt=class{static{a(this,"ProcessManagerImpl")}getPidFilePath(){return A.getPidFile()}readPidFile(){try{let e=this.getPidFilePath();if(!b.exists(e))return null;let t=b.readFile(e).trim(),[r,o,s]=t.split("|"),i=Number.parseInt(r),c=Number.parseInt(o);return Number.isNaN(i)||Number.isNaN(c)?(this.cleanupPidFile(),null):{pid:i,startTime:c,mode:s||"foreground"}}catch{return this.cleanupPidFile(),null}}writePidFile(e,t){try{let r=`${e}|${Date.now()}|${t}`,o=this.getPidFilePath();b.writeFile(o,r,{overwrite:!0})}catch{throw new T("\u65E0\u6CD5\u5199\u5165 PID \u6587\u4EF6",this.getPidFilePath())}}isXiaozhiProcess(e){return ne.isXiaozhiProcess(e)}getServiceStatus(){try{let e=this.readPidFile();if(!e)return{running:!1};if(!this.isXiaozhiProcess(e.pid))return this.cleanupPidFile(),{running:!1};let t=ke.formatUptime(Date.now()-e.startTime);return{running:!0,pid:e.pid,uptime:t,mode:e.mode}}catch{return{running:!1}}}savePidInfo(e,t){this.writePidFile(e,t)}async killProcess(e){try{await ne.killProcess(e)}catch(t){throw new he(`\u65E0\u6CD5\u7EC8\u6B62\u8FDB\u7A0B: ${t instanceof Error?t.message:String(t)}`,e)}}async gracefulKillProcess(e){try{process.kill(e,"SIGTERM");let t=0,r=30;for(;t<r;){await new Promise(o=>setTimeout(o,100));try{process.kill(e,0),t++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(o=>setTimeout(o,500))}catch{}}catch(t){throw new he(`\u65E0\u6CD5\u505C\u6B62\u8FDB\u7A0B: ${t instanceof Error?t.message:String(t)}`,e)}}cleanupPidFile(){try{let e=this.getPidFilePath();b.exists(e)&&b.deleteFile(e)}catch{}}processExists(e){return ne.processExists(e)}cleanupContainerState(){if(ne.isContainerEnvironment())try{this.cleanupPidFile()}catch{}}getProcessInfo(e){let t=this.processExists(e),r=t?this.isXiaozhiProcess(e):!1;return{exists:t,isXiaozhi:r}}validatePidFile(){try{return this.readPidFile()!==null}catch{return!1}}}});var kn={};X(kn,{DaemonManagerImpl:()=>Jr});import{spawn as _n}from"child_process";import Lt from"fs";var Jr,jn=m(()=>{"use strict";ce();Ee();Nt();Jr=class{constructor(e,t){this.processManager=e;this.logger=t}static{a(this,"DaemonManagerImpl")}currentDaemon=null;async startDaemon(e,t={}){try{let r=this.processManager.getServiceStatus();if(r.running)throw D.alreadyRunning(r.pid);let o=await this.spawnDaemonProcess(e,t);this.currentDaemon=o,this.processManager.savePidInfo(o.pid,"daemon"),await this.setupLogging(o,t.logFileName||"xiaozhi.log"),this.setupEventHandlers(o),o.unref(),this.logger.info(`\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8 (PID: ${o.pid})`)}catch(r){throw new D(`\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}async stopDaemon(){try{let e=this.processManager.getServiceStatus();if(!e.running)throw D.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile(),this.currentDaemon=null,this.logger.info("\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62")}catch(e){throw new D(`\u505C\u6B62\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restartDaemon(e,t={}){try{this.processManager.getServiceStatus().running&&(await this.stopDaemon(),await new Promise(o=>setTimeout(o,1e3))),await this.startDaemon(e,t)}catch(r){throw new D(`\u91CD\u542F\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}getDaemonStatus(){return this.processManager.getServiceStatus()}async attachToLogs(e="xiaozhi.log"){try{let t=A.getLogFile();if(!Lt.existsSync(t))throw new D("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:o}=ne.getTailCommand(t),s=_n(r,o,{stdio:"inherit"});process.on("SIGINT",()=>{s.kill(),process.exit(0)}),s.on("exit",()=>{process.exit(0)}),s.on("error",i=>{throw new D(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${i.message}`)})}catch(t){throw new D(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}async spawnDaemonProcess(e,t){let o=[A.getWebServerLauncherPath()];t.openBrowser&&o.push("--open-browser");let s={...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir(),XIAOZHI_DAEMON:"true",...t.env},i=_n("node",o,{detached:!0,stdio:["ignore","pipe","pipe"],env:s,cwd:t.cwd||process.cwd()});if(!i.pid)throw new he("\u65E0\u6CD5\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B",0);return i}async setupLogging(e,t){try{let r=A.getLogFile(),s=(await import("path")).dirname(r);Lt.existsSync(s)||Lt.mkdirSync(s,{recursive:!0});let i=Lt.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let c=new Date().toISOString();i.write(`
|
|
8
|
-
[${c}] \u5B88\u62A4\u8FDB\u7A0B\u542F\u52A8 (PID: ${e.pid})
|
|
9
|
-
`)}catch(r){this.logger.warn(`\u8BBE\u7F6E\u65E5\u5FD7\u91CD\u5B9A\u5411\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}setupEventHandlers(e){e.on("exit",(t,r)=>{t!==0&&t!==null?this.logger.error(`\u5B88\u62A4\u8FDB\u7A0B\u5F02\u5E38\u9000\u51FA (\u4EE3\u7801: ${t}, \u4FE1\u53F7: ${r})`):this.logger.info("\u5B88\u62A4\u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA"),this.processManager.cleanupPidFile(),this.currentDaemon=null}),e.on("error",t=>{this.logger.error(`\u5B88\u62A4\u8FDB\u7A0B\u9519\u8BEF: ${t.message}`),this.processManager.cleanupPidFile(),this.currentDaemon=null}),e.on("disconnect",()=>{this.logger.info("\u5B88\u62A4\u8FDB\u7A0B\u65AD\u5F00\u8FDE\u63A5")})}async checkHealth(){try{let e=this.getDaemonStatus();if(!e.running||!e.pid)return!1;let t=this.processManager.getProcessInfo(e.pid);return t.exists&&t.isXiaozhi}catch{return!1}}getCurrentDaemon(){return this.currentDaemon}cleanup(){if(this.currentDaemon){try{this.currentDaemon.kill("SIGTERM")}catch(e){this.logger.warn(`\u6E05\u7406\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}this.currentDaemon=null}}}});function bc(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function ye(n){return bc(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var be,O,se=m(()=>{"use strict";be=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(be||{});a(bc,"isValidToolJSONSchema");a(ye,"ensureToolJSONSchema");O=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{a(this,"ToolCallError")}}});function _t(n,e){try{let r=new URL(n).pathname;return r.endsWith("/sse")?"sse":r.endsWith("/mcp")?"streamable-http":(e?.serviceName,"streamable-http")}catch{return e?.serviceName,"streamable-http"}}function Hn(n){if(n.type)return Z.normalizeTypeField(n);if(n.command)return{...n,type:"stdio"};if(n.url!==void 0&&n.url!==null){let e=_t(n.url,{serviceName:n.name});return{...n,type:e}}throw new Error(`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${n.name} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`)}function kt(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new O(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new O(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(t.validateArguments&&r.arguments!==void 0&&r.arguments!==null&&(typeof r.arguments!="object"||Array.isArray(r.arguments)))throw new O(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!t.allowEmptyArguments&&r.arguments!==void 0&&r.arguments!==null){let o=r.arguments;if(Object.keys(o).length===0)throw new O(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new O(-32602,o)}return{name:r.name,arguments:r.arguments}}var ot=m(()=>{"use strict";ze();se();a(_t,"inferTransportTypeFromUrl");a(Hn,"inferTransportTypeFromConfig");a(kt,"validateToolCallParams")});import nt from"ws";var st,jt=m(()=>{"use strict";se();ot();$t();se();st=class{static{a(this,"EndpointConnection")}endpointUrl;ws=null;connectionStatus=!1;serverInitialized=!1;serviceManager=null;connectionState="disconnected";lastError=null;connectionTimeout=null;toolCallTimeout=3e4;reconnectDelay=2e3;constructor(e,t){this.endpointUrl=e,t!==void 0&&(this.reconnectDelay=t)}setServiceManager(e){this.serviceManager=e}getTools(){if(!this.serviceManager)return[];try{return this.serviceManager.getAllTools().map(t=>({name:t.name,description:t.description,inputSchema:ye(t.inputSchema)}))}catch{return[]}}async connect(){if(!this.serviceManager)throw new Error("MCPServiceManager \u672A\u8BBE\u7F6E\u3002\u8BF7\u5728\u8FDE\u63A5\u524D\u5148\u8BBE\u7F6E\u670D\u52A1\u7BA1\u7406\u5668\u3002");if(this.connectionState==="connecting")throw new Error("\u8FDE\u63A5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5B8C\u6210");return this.cleanupConnection(),this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error("\u8FDE\u63A5\u8D85\u65F6 (10000ms)");this.handleConnectionError(r),t(r)},1e4),this.ws=new nt(this.endpointUrl),this.ws.on("open",()=>{this.handleConnectionSuccess(),e()}),this.ws.on("message",r=>{try{let o=JSON.parse(r.toString());this.handleMessage(o)}catch{}}),this.ws.on("close",(r,o)=>{this.handleConnectionClose(r,o.toString())}),this.ws.on("error",r=>{this.handleConnectionError(r),t(r)})})}handleConnectionSuccess(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!0,this.connectionState="connected"}handleConnectionError(e){this.lastError=e.message,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection()}handleConnectionClose(e,t){this.connectionStatus=!1,this.serverInitialized=!1,this.connectionState="disconnected"}cleanupConnection(){if(this.ws){this.ws.removeAllListeners();try{this.ws.readyState===nt.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===nt.CONNECTING&&this.ws.terminate()}catch{}this.ws=null}this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!1,this.serverInitialized=!1,this.connectionState="disconnected"}handleMessage(e){if(e.method)switch(e.method){case"initialize":case"notifications/initialized":this.sendResponse(e.id,{protocolVersion:"2024-11-05",capabilities:{tools:{listChanged:!0},logging:{}},serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"}}),this.serverInitialized=!0;break;case"tools/list":{let t=this.getTools();this.sendResponse(e.id,{tools:t});break}case"tools/call":{this.handleToolCall(e).catch(t=>{});break}case"ping":this.sendResponse(e.id,{});break;default:}}sendResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===nt.OPEN){let r={jsonrpc:"2.0",id:e,result:t};try{this.ws.send(JSON.stringify(r))}catch{}}}getStatus(){let e=this.serviceManager?this.serviceManager.getAllTools().length:0;return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:e,connectionState:this.connectionState,lastError:this.lastError}}isConnected(){return this.connectionStatus}disconnect(){this.cleanupConnection()}async reconnect(){if(!this.serviceManager)throw new Error("MCPServiceManager \u672A\u8BBE\u7F6E\u3002\u8BF7\u5728\u91CD\u8FDE\u524D\u5148\u8BBE\u7F6E\u670D\u52A1\u7BA1\u7406\u5668\u3002");this.disconnect(),await new Promise(e=>setTimeout(e,this.reconnectDelay)),await this.connect()}async handleToolCall(e){if(e.id===void 0||e.id===null)throw new O(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=Date.now();try{let o=kt(e.params);if(!this.serviceManager)throw new O(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E");let s=await this.executeToolWithTimeout(o.name,o.arguments||{},this.toolCallTimeout);this.sendResponse(t,{content:s.content||[{type:"text",text:JSON.stringify(s)}],isError:s.isError||!1})}catch(o){this.handleToolCallError(o,t,Date.now()-r)}}async executeToolWithTimeout(e,t,r=3e4){return new Promise((o,s)=>{let i=setTimeout(()=>{s(new O(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),s(new O(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E"));return}this.serviceManager.callTool(e,t).then(c=>{clearTimeout(i),o(c)}).catch(c=>{clearTimeout(i);let l=c instanceof Error?c.message:String(c);l.includes("\u672A\u627E\u5230\u5DE5\u5177")?s(new O(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?s(new O(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?s(new O(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?s(new O(-32001,l)):s(new O(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let o;if(e instanceof O)o={code:e.code,message:e.message,data:e.data};else{let s=e instanceof Error?e.message:"\u672A\u77E5\u9519\u8BEF";o={code:-32e3,message:s,data:{originalError:String(e)||"null"}}}this.sendErrorResponse(t,o)}sendErrorResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===nt.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r))}}}});import{EventEmitter as Ic}from"events";import{z as Kr}from"zod";var Nc,Ac,it,Yr=m(()=>{"use strict";se();z();$t();jt();Nc={connectionTimeout:1e4,reconnectDelay:2e3},Ac=Kr.object({connectionTimeout:Kr.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),reconnectDelay:Kr.number().min(500,"reconnectDelay \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 500 \u7684\u6570\u5B57").optional()}).strict(),it=class extends Ic{static{a(this,"EndpointManager")}connections=new Map;connectionStates=new Map;mcpServiceManager=null;configManager;eventBus;isInitialized=!1;isConnecting=!1;options;constructor(e,t){super(),this.configManager=e,this.eventBus=R(),this.options={...Nc,...t}}async initialize(e,t){if(!this.isInitialized)try{this.validateInitializeParams(e,t),await this.cleanup();for(let r of e)await this.createConnection(r,t);this.isInitialized=!0}catch(r){throw await this.cleanup(),r}}async connect(){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");if(!this.isConnecting){this.isConnecting=!0;try{let e=[];for(let[o,s]of this.connections)e.push(this.connectSingleEndpoint(o,s));if((await Promise.allSettled(e)).filter(o=>o.status==="fulfilled").length===0)throw new Error("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25")}finally{this.isConnecting=!1}}}async disconnect(){let e=[];for(let[t,r]of this.connections)e.push(this.disconnectSingleEndpoint(t,r));await Promise.allSettled(e)}async addEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");if(!this.connections.has(e)){if(this.checkConfigDuplicate(e))throw new Error(`\u63A5\u5165\u70B9 ${Fe(e)} \u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D`);try{this.configManager.addMcpEndpoint(e);try{let t=this.getCurrentTools();await this.createConnection(e,t);let r=this.connections.get(e);if(!r)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);await this.connectSingleEndpoint(e,r)}catch(t){try{this.configManager.removeMcpEndpoint(e)}catch{}throw this.connections.delete(e),this.connectionStates.delete(e),t}}catch(t){throw t}}}async removeEndpoint(e){if(this.connections.has(e))try{let t=this.connections.get(e);if(!t)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);this.configManager.removeMcpEndpoint(e);try{await this.disconnectSingleEndpoint(e,t),this.connections.delete(e),this.connectionStates.delete(e)}catch(r){try{this.configManager.addMcpEndpoint(e)}catch{}throw r}}catch(t){throw t}}getEndpoints(){let e=Array.from(this.connections.keys()),t=Array.from(this.connectionStates.keys());return Array.from(new Set([...e,...t]))}async disconnectEndpoint(e){let t=this.connections.get(e);if(t)try{await this.disconnectSingleEndpoint(e,t)}catch(r){throw r}}async clearEndpoints(){let e=Array.from(this.connections.keys()).map(t=>this.removeEndpoint(t));await Promise.allSettled(e)}getConnectionStatus(){return Array.from(this.connectionStates.values())}isAnyConnected(){for(let e of this.connectionStates.values())if(e.connected)return!0;return!1}isEndpointConnected(e){return this.connectionStates.get(e)?.connected??!1}getEndpointStatus(e){return this.connectionStates.get(e)}setServiceManager(e){this.mcpServiceManager=e}emitEndpointStatusChanged(e,t,r,o,s,i="connection-manager"){this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:t,operation:r,success:o,message:s,timestamp:Date.now(),source:i})}async connectExistingEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${Fe(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);this.connectionStates.get(e)?.connected||await this.connectSingleEndpoint(e,t)}async reconnectAll(){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");let e=[],t=[];for(let[s,i]of this.connections){let c=this.reconnectSingleEndpoint(s,i).then(()=>{t.push({endpoint:s,success:!0})}).catch(l=>{t.push({endpoint:s,success:!1,error:l instanceof Error?l.message:String(l)})});e.push(c)}await Promise.allSettled(e);let r=t.filter(s=>s.success).length,o=t.filter(s=>!s.success).length;if(o>0){let s=t.filter(i=>!i.success);for(let i of s);}return{successCount:r,failureCount:o,results:t}}async reconnectEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${Fe(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);await this.reconnectSingleEndpoint(e,t)}async sleep(e){return new Promise(t=>setTimeout(t,e))}validateEndpoints(e){let t=[],r=[];for(let o of e){if(!o||typeof o!="string"){r.push(o);continue}if(!o.startsWith("ws://")&&!o.startsWith("wss://")){r.push(o);continue}try{new URL(o),t.push(o)}catch{r.push(o)}}return{valid:t,invalid:r}}validateOptions(e){let t=Ac.safeParse(e);return t.success?{valid:!0,errors:[]}:{valid:!1,errors:t.error.errors.map(o=>o.message)}}async updateEndpoints(e,t=[]){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let{valid:r,invalid:o}=this.validateEndpoints(e);if(o.length>0,r.length===0)throw new Error("\u6CA1\u6709\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9");let s=Array.from(this.connections.keys()),i=r.filter(g=>!s.includes(g)),c=s.filter(g=>!r.includes(g)),l=s.filter(g=>r.includes(g));try{for(let u of c)await this.removeEndpoint(u);for(let u of i)await this.addEndpoint(u);let g={type:i.length>0&&c.length>0?"endpoints_updated":i.length>0?"endpoints_added":"endpoints_removed",data:{added:i.length>0?i:void 0,removed:c.length>0?c:void 0,updated:i.length>0&&c.length>0?r:void 0},timestamp:new Date};this.emit("configChange",g)}catch(g){throw g}}updateOptions(e){let{valid:t,errors:r}=this.validateOptions(e);if(!t)throw new Error(`\u65E0\u6548\u7684\u8FDE\u63A5\u9009\u9879: ${r.join(", ")}`);let o={...this.options};this.options={...this.options,...e};let s={type:"options_updated",data:{oldOptions:o,newOptions:e},timestamp:new Date};this.emit("configChange",s)}getCurrentConfig(){return{endpoints:Array.from(this.connections.keys()),options:{...this.options}}}async reloadConfig(e){try{e.options&&this.updateOptions(e.options),e.endpoints&&await this.updateEndpoints(e.endpoints,e.tools||[])}catch(t){throw t}}async prewarmConnections(e=[]){let r=(e.length>0?e:Array.from(this.connections.keys())).map(async o=>{try{let s=this.connections.get(o)}catch{}});await Promise.all(r)}async cleanup(){try{await this.disconnect(),this.connections.clear(),this.connectionStates.clear(),this.isInitialized=!1,this.isConnecting=!1}catch(e){throw e}}checkConfigDuplicate(e){try{return this.configManager.getMcpEndpoints().includes(e)}catch{return!0}}validateInitializeParams(e,t){if(!Array.isArray(e))throw new Error("\u5C0F\u667A\u63A5\u5165\u70B9\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4");if(!Array.isArray(t))throw new Error("\u5DE5\u5177\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4");for(let r of e){if(!r||typeof r!="string")throw new Error(`\u65E0\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\u5730\u5740: ${r}`);if(!r.startsWith("ws://")&&!r.startsWith("wss://"))throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u5730\u5740\u5FC5\u987B\u662F WebSocket URL: ${r}`)}}async createConnection(e,t){try{let r=new st(e,this.options.reconnectDelay);this.mcpServiceManager&&r.setServiceManager(this.mcpServiceManager),this.connections.set(e,r),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1})}catch(r){throw r}}async connectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(!r)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u72B6\u6001\u4E0D\u5B58\u5728: ${Fe(e)}`);try{r.connected=!1,r.initialized=!1,await t.connect(),r.connected=!0,r.initialized=!0,r.lastConnected=new Date,r.lastError=void 0,this.emitEndpointStatusChanged(e,!0,"connect",!0,"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F","connection-manager")}catch(o){throw r.connected=!1,r.initialized=!1,r.lastError=o instanceof Error?o.message:String(o),this.emitEndpointStatusChanged(e,!1,"connect",!1,o instanceof Error?o.message:"\u8FDE\u63A5\u5931\u8D25","connection-manager"),o}}async disconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(r)try{t.disconnect(),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!0,"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F","connection-manager")}catch(o){r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!1,o instanceof Error?o.message:"\u65AD\u5F00\u5931\u8D25","connection-manager")}}async reconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(!r)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u72B6\u6001\u4E0D\u5B58\u5728: ${Fe(e)}`);try{await t.reconnect(),r.connected=!0,r.initialized=!0,r.lastConnected=new Date,r.lastError=void 0,this.emitEndpointStatusChanged(e,!0,"reconnect",!0,"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F","connection-manager")}catch(o){throw r.connected=!1,r.initialized=!1,r.lastError=o instanceof Error?o.message:String(o),this.emitEndpointStatusChanged(e,!1,"reconnect",!1,o instanceof Error?o.message:"\u91CD\u8FDE\u5931\u8D25","connection-manager"),o}}getCurrentTools(){if(!this.mcpServiceManager)return[];try{return this.mcpServiceManager.getAllTools().map(t=>({name:t.name,description:t.description,inputSchema:ye(t.inputSchema)}))}catch{return[]}}}});var zn=m(()=>{"use strict";jt();Yr();Yr();jt()});import{isAbsolute as xc,resolve as $c}from"path";function Vn(n,e){at.debug(`\u8F6C\u6362\u914D\u7F6E: ${n}`,e);try{if(!n||typeof n!="string")throw new L("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new L("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",n);let t=Z.normalizeTypeField(e),r=Oc(n,t);return kc(r),at.debug(`\u914D\u7F6E\u8F6C\u6362\u6210\u529F: ${n} -> ${r.type}`),r}catch(t){throw at.error(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${n}`,t),t instanceof L?t:new L(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,n)}}function Oc(n,e){if(_c(e))return Dc(n,e);if("type"in e)switch(e.type){case"sse":return Fn(n,e);case"streamable-http":return Un(n,e);default:throw new L(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${e.type}`,n)}if("url"in e){if(e.url===void 0||e.url===null)throw new L("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",n);if(_t(e.url||"")==="sse"){let o={...e,type:"sse"};return Fn(n,o)}let r={...e,type:"streamable-http"};return Un(n,r)}throw new L("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",n)}function Dc(n,e){if(!e.command)throw new L("\u672C\u5730\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5",n);let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=(e.args||[]).map(o=>{if(Lc(o)){let s=$c(t,o);return at.debug(`\u89E3\u6790\u76F8\u5BF9\u8DEF\u5F84: ${o} -> ${s}`),s}return o});return{name:n,type:"stdio",command:e.command,args:r,env:e.env,timeout:3e4}}function Fn(n,e){if(e.url===void 0||e.url===null)throw new L("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.type==="sse"?"sse":_t(e.url||""),r=e.url?Qr(e.url):!1,o={name:n,type:t,url:e.url,timeout:3e4,headers:e.headers};return r&&(o.modelScopeAuth=!0),at.info(`[ConfigAdapter] \u670D\u52A1 ${n} URL: ${e.url}\uFF0C\u63A8\u65AD\u7C7B\u578B: ${t}${r?" (ModelScope)":""}`),o}function Un(n,e){if(e.url===void 0||e.url===null)throw new L("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.url||"";return{name:n,type:"streamable-http",url:t,timeout:3e4,headers:e.headers}}function Lc(n){return xc(n)?!1:!!(n.startsWith("./")||n.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(n))}function _c(n){return"command"in n&&typeof n.command=="string"}function Qr(n){return n.includes("modelscope.net")||n.includes("modelscope.cn")}function kc(n){if(!n.name||typeof n.name!="string")throw new L("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(n.type&&!Object.values(be).includes(n.type))throw new L(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`);if(!n.type)throw new L("\u4F20\u8F93\u7C7B\u578B\u672A\u6307\u5B9A\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6216\u542F\u7528\u81EA\u52A8\u63A8\u65AD");switch(n.type){case"stdio":if(!n.command)throw new L("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(n.url===void 0||n.url===null)throw new L("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(n.url===void 0||n.url===null)throw new L("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new L(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}var at,L,Zr=m(()=>{"use strict";se();ot();M();ze();at=p.withTag("ConfigAdapter"),L=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{a(this,"ConfigValidationError")}};a(Vn,"convertLegacyToNew");a(Oc,"convertByConfigType");a(Dc,"convertLocalConfig");a(Fn,"convertSSEConfig");a(Un,"convertStreamableHTTPConfig");a(Lc,"isRelativePath");a(_c,"isLocalConfig");a(Qr,"isModelScopeURL");a(kc,"validateNewConfig")});var ct,eo=m(()=>{"use strict";ct={zh:{COZE_BASE_URL:"https://api.coze.cn",COZE_BASE_WS_URL:"wss://ws.coze.cn"},en:{COZE_BASE_URL:"https://api.coze.com",COZE_BASE_WS_URL:"wss://ws.coze.com"}}});function Ht(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=ct[e]||ct.zh;return new fe.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var to=m(()=>{"use strict";zt();eo();a(Ht,"createCozeClient")});import jc from"node-cache";var Te,Wn=m(()=>{"use strict";to();Te=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Ht(this.token),this.cache=new jc({stdTTL:300})}async getWorkspaces(){let e="workspaces",t=this.cache.get(e);if(t)return t;let{workspaces:r=[]}=await this.client.workspaces.list();return this.cache.set(e,r,1800),r}async getWorkflows(e){let{workspace_id:t,page_num:r=1,page_size:o=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let s=`workflows:${t}:${r}:${o}`,i=this.cache.get(s);if(i)return i;let l=(await this.client.get("/v1/workflows",{workspace_id:t,page_num:r,page_size:o,workflow_mode:"workflow"})).data;return this.cache.set(s,l),l}callWorkflow(e,t){return this.client.workflows.runs.create({workflow_id:e,parameters:t})}clearCache(e){if(!e){this.cache.flushAll();return}let r=this.cache.keys().filter(o=>o.startsWith(e));this.cache.del(r)}getCacheStats(){let e=this.cache.getStats(),t=this.cache.keys(),r=e.hits+e.misses,o=r>0?e.hits/r:0;return{size:e.keys,keys:t,hits:e.hits,misses:e.misses,hitRate:o,ksize:e.ksize,vsize:e.vsize}}}});var fe={};X(fe,{CozeApiService:()=>Te,config:()=>ct,createCozeClient:()=>Ht});import*as Bm from"@coze/api";var zt=m(()=>{"use strict";eo();De(fe,Bm);to();Wn()});import{createHash as Hc}from"crypto";function pe(n,e){let t=Hc("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function ro(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function lt(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>6e4||e-t>n.ttl||n.status==="failed")}var Ft,oo=m(()=>{"use strict";a(pe,"generateCacheKey");a(ro,"isCacheExpired");a(lt,"shouldCleanupCache");Ft={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function Bn(n,e){return{content:[{type:"text",text:e?zc(e,n):qn(n)}],isError:!1,taskId:n,status:"timeout",message:"\u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D",nextAction:"\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210"}}function zc(n,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
|
|
10
|
-
|
|
11
|
-
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
12
|
-
- \u4EFB\u52A1ID: ${e}
|
|
13
|
-
- \u5DE5\u5177\u7C7B\u578B: \u6263\u5B50\u5DE5\u4F5C\u6D41
|
|
14
|
-
- \u72B6\u6001: \u5904\u7406\u4E2D
|
|
15
|
-
- \u5EFA\u8BAE: \u8BF7\u7B49\u5F8530-60\u79D2\u540E\u91CD\u8BD5\u67E5\u8BE2
|
|
16
|
-
|
|
17
|
-
\u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
|
|
18
|
-
1. \u4F7F\u7528\u76F8\u540C\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
|
|
19
|
-
2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
|
|
20
|
-
3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:qn(e)};return t[n]||t.default}function qn(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
|
|
21
|
-
|
|
22
|
-
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
23
|
-
- \u4EFB\u52A1ID: ${n}
|
|
24
|
-
- \u72B6\u6001: \u5904\u7406\u4E2D
|
|
25
|
-
- \u5EFA\u8BAE: \u8BF7\u7B49\u5F8530\u79D2\u540E\u91CD\u8BD5\u67E5\u8BE2
|
|
26
|
-
|
|
27
|
-
\u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
|
|
28
|
-
1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
|
|
29
|
-
2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
|
|
30
|
-
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var gt,no=m(()=>{"use strict";gt=class n extends Error{static{a(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};a(Bn,"createTimeoutResponse");a(zc,"getToolSpecificTimeoutMessage");a(qn,"getDefaultTimeoutMessage")});function Gn(n){return n.type==="proxy"}var pt,so=m(()=>{"use strict";zt();ve();se();M();ee();oo();no();z();a(Gn,"isProxyHandler");pt=class{static{a(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=Ft.TIMEOUT;CACHE_TTL=Ft.CACHE_TTL;constructor(e,t){this.logger=p,this.cacheManager=e||new Ce,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=h.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new Te(e)}setupEventListeners(){R().onEvent("config:updated",async t=>{if(t.type==="customMCP"){this.logger.info("[CustomMCP] \u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316...");try{this.reinitialize()}catch(r){this.logger.error("[CustomMCP] \u914D\u7F6E\u66F4\u65B0\u5904\u7406\u5931\u8D25:",r)}}})}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||h.getCustomMCPTools();this.tools.clear();for(let r of t)if(Gn(r.handler)&&r.handler.platform==="coze")this.tools.set(r.name,r),this.logger.debug(`[CustomMCP] \u5DF2\u52A0\u8F7D Coze \u5DE5\u5177: ${r.name} (workflow_id: ${r.handler.config.workflow_id})`);else{let o=Gn(r.handler)?`/${r.handler.platform}`:"";this.logger.warn(`[CustomMCP] \u8DF3\u8FC7\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r.name} (${r.handler.type}${o})`)}this.logger.debug(`[CustomMCP] \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A Coze \u5DE5\u5177`)}catch(t){throw this.logger.error("[CustomMCP] \u521D\u59CB\u5316\u5931\u8D25:",t),t}}getTools(){return Array.from(this.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:ye(e.inputSchema)}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}getToolInfo(e){return this.tools.get(e)}reinitialize(){this.logger.debug("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668..."),this.initialize()}async callTool(e,t,r){let o=this.tools.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let s=await this.getCompletedResult(e,t);if(s)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),s;try{let i=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e)]);return await this.cacheResult(e,t,i),i}catch(i){if(i instanceof gt){let c=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${c}`),Bn(c,e)}throw i}}async createTimeoutPromise(e){return new Promise((t,r)=>{setTimeout(()=>{r(new gt(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},this.TIMEOUT)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(!o.customMCPResults||!o.customMCPResults[r])return null;let s=o.customMCPResults[r];return s.status==="completed"&&!s.consumed&&!ro(s.timestamp,s.ttl)?s.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}processWorkflowResponse(e,t){try{let r=t.data||t;return typeof r=="string"?{content:[{type:"text",text:r}],isError:!1}:{content:[{type:"text",text:JSON.stringify(r,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406\u5DE5\u4F5C\u6D41\u54CD\u5E94\u5931\u8D25: ${e}`,r),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async callCozeWorkflow(e,t){let o=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:o.workflow_id});try{let s=this.getCozeApiService();if(!o.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let i=await s.callWorkflow(o.workflow_id,t);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`),this.processWorkflowResponse(e.name,i)}catch(s){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(o.customMCPResults?.[r]){o.customMCPResults[r].consumed=!0;let s=o.customMCPResults[r];lt(s)&&delete o.customMCPResults[r],await this.saveCache(o),this.logger.debug(`[CustomMCP] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}`)}}catch(r){this.logger.warn(`[CustomMCP] \u6E05\u7406\u7F13\u5B58\u5931\u8D25: ${r}`)}}async generateTaskId(e,t){return pe(e,t)}generateCacheKey(e,t){return pe(e,t)}async loadExtendedCache(){try{return await this.cacheManager.loadExistingCache()}catch{return{version:"1.0.0",mcpServers:{},metadata:{lastGlobalUpdate:new Date().toISOString(),totalWrites:0,createdAt:new Date().toISOString()},customMCPResults:{}}}}async updateCacheWithResult(e,t){try{let r=await this.loadExtendedCache();r.customMCPResults||(r.customMCPResults={}),r.customMCPResults[e]=t,await this.saveCache(r)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u7F13\u5B58\u5931\u8D25: ${r}`)}}async cacheResult(e,t,r){try{let o=this.generateCacheKey(e,t),s={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(o,s),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(o){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${o}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.tools.clear(),this.cacheManager.cleanup()}}});import*as Ve from"fs";import*as Ie from"path";import Ut from"pino";var Ue,io=m(()=>{"use strict";Ee();M();Ue=class{static{a(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e.maxRecords??100,e.logFilePath)this.logFilePath=Ie.resolve(Ie.normalize(e.logFilePath));else{let r=t||A.getTempDir();this.logFilePath=Ie.join(Ie.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),p.debug(`ToolCallLogger \u521D\u59CB\u5316: maxRecords=${this.maxRecords}, path=${this.logFilePath}`)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:a(r=>{try{let o=JSON.parse(r),s=this.formatConsoleMessage(o);p.info(`[\u5DE5\u5177\u8C03\u7528] ${s}`)}catch{p.info(`[\u5DE5\u5177\u8C03\u7528] ${r.trim()}`)}},"write")}});try{t.push({level:"info",stream:Ut.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){p.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6:",r)}return Ut({level:"info",timestamp:Ut.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((r,o)=>({level:o}),"level")},base:null},Ut.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,o=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${o}`}async cleanupOldRecords(){try{if(!Ve.existsSync(this.logFilePath))return;let t=Ve.readFileSync(this.logFilePath,"utf8").trim().split(`
|
|
31
|
-
`).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,o=t.slice(r),s=o.join(`
|
|
32
|
-
`)+(o.length>0?`
|
|
33
|
-
`:"");Ve.writeFileSync(this.logFilePath,s,"utf8"),p.debug(`\u5DF2\u6E05\u7406 ${r} \u6761\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\uFF0C\u4FDD\u7559\u6700\u65B0 ${this.maxRecords} \u6761`)}catch(e){p.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25:",e)}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){p.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t)}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}}});var We,ao=m(()=>{"use strict";ve();M();We=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=p}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case"initialize":return await this.handleInitialize(e.params,e.id);case"notifications/initialized":return await this.handleInitializedNotification(e.params);case"tools/list":return await this.handleToolsList(e.id);case"tools/call":return await this.handleToolCall(e.params,e.id);case"resources/list":return await this.handleResourcesList(e.id);case"prompts/list":return await this.handlePromptsList(e.id);case"ping":return await this.handlePing(e.id);default:if(t)return this.logger.warn(`\u6536\u5230\u672A\u77E5\u7684\u901A\u77E5\u6D88\u606F: ${e.method}`,e),null;throw new Error(`\u672A\u77E5\u7684\u65B9\u6CD5: ${e.method}`)}}catch(t){return this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t),e.id===void 0?null:this.createErrorResponse(t,e.id)}}async handleInitialize(e,t){this.logger.debug("\u5904\u7406 initialize \u8BF7\u6C42",e);let r=["2024-11-05","2025-06-18"],o=e.protocolVersion,s=r.includes(o)?o:"2024-11-05";return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${o}, \u670D\u52A1\u5668\u54CD\u5E94=${s}`),{jsonrpc:"2.0",result:{serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"},capabilities:{tools:{},logging:{}},protocolVersion:s},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.debug("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.debug("\u5904\u7406 tools/list \u8BF7\u6C42");try{return{jsonrpc:"2.0",result:{tools:this.serviceManager.getAllTools().map(o=>({name:o.name,description:o.description,inputSchema:o.inputSchema}))},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=kt(e),o=await this.serviceManager.callTool(r.name,r.arguments||{});return{jsonrpc:"2.0",result:{content:o.content,isError:o.isError||!1},id:t!==void 0?t:1}}catch(r){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,r),r}}async handlePing(e){return this.logger.debug("\u5904\u7406 ping \u8BF7\u6C42"),{jsonrpc:"2.0",result:{status:"ok",timestamp:new Date().toISOString()},id:e!==void 0?e:1}}async handleResourcesList(e){this.logger.debug("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.debug("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u63D0\u793A\u6A21\u677F`),{jsonrpc:"2.0",result:{prompts:t},id:e!==void 0?e:1}}createErrorResponse(e,t){let r=-32603;return e.message.includes("\u672A\u627E\u5230\u5DE5\u5177")||e.message.includes("\u672A\u77E5\u7684\u65B9\u6CD5")?r=-32601:(e.message.includes("\u53C2\u6570")||e.message.includes("\u4E0D\u80FD\u4E3A\u7A7A"))&&(r=-32602),{jsonrpc:"2.0",error:{code:r,message:e.message,data:{stack:e.stack}},id:t!==void 0?t:1}}getServiceManager(){return this.serviceManager}}});var Vt=m(()=>{"use strict"});var Jn=m(()=>{"use strict";Vt()});import Rh,{WebSocketServer as wh}from"ws";var Xn=m(()=>{"use strict";Vt()});var go=m(()=>{"use strict";Vt();Jn();Xn()});import{EventEmitter as Vc}from"events";var ut,Kn=m(()=>{"use strict";ve();ve();Zr();ee();so();z();io();ao();go();ut=class extends Vc{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=R();toolCallLogger;retryTimers=new Map;failedServices=new Set;transportAdapters=new Map;messageHandler;isRunning=!1;config;constructor(e){super(),e&&this.isUnifiedServerConfig(e)?(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info",...e},this.configs=e.configs||{}):(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info"},this.configs=e||{});let r=process.env.NODE_ENV==="test"||process.env.VITEST==="true"?`/tmp/xiaozhi-test-${Date.now()}-${Math.random().toString(36).substring(2,11)}/xiaozhi.cache.json`:void 0;this.cacheManager=new Ce(r),this.customMCPHandler=new pt(this.cacheManager,this);let o=h.getToolCallLogConfig(),s=h.getConfigDir();this.toolCallLogger=new Ue(o,s),this.setupEventListeners(),this.messageHandler=new We(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",async e=>{await this.handleServiceConnected(e)}),this.eventBus.onEvent("mcp:service:disconnected",async e=>{await this.handleServiceDisconnected(e)}),this.eventBus.onEvent("mcp:service:connection:failed",async e=>{await this.handleServiceConnectionFailed(e)})}async handleServiceConnected(e){try{this.services.get(e.serviceName)&&await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceDisconnected(e){try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch{}}async startAllServices(){try{this.customMCPHandler.initialize()}catch{}let e=Object.entries(this.configs);if(e.length===0)return;let t=e.map(async([c])=>{try{return await this.startService(c),{serviceName:c,success:!0,error:null}}catch(l){return{serviceName:c,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),o=0,s=0,i=[];for(let c of r)c.status==="fulfilled"?c.value.success?o++:(s++,i.push(c.value.serviceName)):s++;i.length>0&&e.length,i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r=new dt(t);await r.connect(),this.services.set(e,r),await this.refreshToolsCache();let o=r.getTools()}catch(r){throw this.services.delete(e),r}}async stopService(e){let t=this.services.get(e);if(t)try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache()}catch(r){throw r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),o=this.configs[e];o&&this.cacheManager.writeCacheEntry(e,r,o).then(()=>{}).catch(s=>{});for(let s of r){let i=`${e}__${s.name}`;this.tools.set(i,{serviceName:e,originalName:s.name,tool:s})}}await this.syncToolsConfigToFile()}getAllTools(){let e=[];for(let[r,o]of this.services)try{if(o.isConnected()){let s=o.getTools();for(let i of s)try{if(!h.isToolEnabled(r,i.name))continue;let l=`${r}__${i.name}`;e.push({name:l,description:i.description||"",inputSchema:i.inputSchema,serviceName:r,originalName:i.name})}catch{}}}catch{}let t=[];try{t=this.customMCPHandler.getTools()}catch{t=[]}for(let r of t)try{e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name})}catch{}return e}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t){let r=Date.now(),o="unknown",s=e;try{let i;if(this.customMCPHandler.hasTool(e)){let c=this.customMCPHandler.getToolInfo(e);c&&(o=this.getLogServerName(c),s=this.getOriginalToolName(e,c)),c?.handler?.type==="mcp"?(i=await this.callMCPTool(e,c.handler.config,t),this.updateToolStatsSafe(e,c.handler.config.serviceName,c.handler.config.toolName,!0)):(i=await this.customMCPHandler.callTool(e,t),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let c=this.tools.get(e);if(!c)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);o=c.serviceName,s=c.originalName;let l=this.services.get(c.serviceName);if(!l)throw new Error(`\u670D\u52A1 ${c.serviceName} \u4E0D\u53EF\u7528`);if(!l.isConnected())throw new Error(`\u670D\u52A1 ${c.serviceName} \u672A\u8FDE\u63A5`);i=await l.callTool(c.originalName,t||{}),this.updateToolStatsSafe(e,c.serviceName,c.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:s,serverName:o,arguments:t,result:i,success:i.isError!==!0,duration:Date.now()-r}),i}catch(i){if(this.toolCallLogger.recordToolCall({toolName:s,serverName:o,arguments:t,result:null,success:!1,duration:Date.now()-r,error:i instanceof Error?i.message:String(i)}),this.customMCPHandler.hasTool(e)){let c=this.customMCPHandler.getToolInfo(e);c?.handler?.type==="mcp"?this.updateToolStatsSafe(e,c.handler.config.serviceName,c.handler.config.toolName,!1):this.updateToolStatsSafe(e,"customMCP",e,!1)}else{let c=this.tools.get(e);c&&this.updateToolStatsSafe(e,c.serviceName,c.originalName,!1)}throw i}}async updateToolStats(e,t,r,o){try{let s=new Date().toISOString();o?(await this.updateCustomMCPToolStats(e,s),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,s)):(await this.updateCustomMCPToolLastUsedTime(e,s),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,s))}catch(s){throw s}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch{let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F"}}async updateCustomMCPToolStats(e,t){try{await h.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await h.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await h.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await h.updateMCPServerToolStatsWithLock(e,t,r,!1)}catch(o){throw o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:s}=t,i=this.services.get(o);if(!i)throw new Error(`\u670D\u52A1 ${o} \u4E0D\u53EF\u7528`);if(!i.isConnected())throw new Error(`\u670D\u52A1 ${o} \u672A\u8FDE\u63A5`);try{return await i.callTool(s,r||{})}catch(c){throw c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect()}catch{}try{this.customMCPHandler.cleanup()}catch{}try{h.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=h.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch{return{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{this.customMCPHandler.initialize()}catch(e){throw e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch{return!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch{return[]}}isModelScopeService(e){return e.url?Qr(e.url):!1}handleModelScopeAuth(e,t){if(e.headers?.Authorization)return;let o=h.getModelScopeApiKey();if(o){t.apiKey=o;return}let s=e.url||"\u672A\u77E5",i=e.name||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${i}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${s}\u8BF7\u9009\u62E9\u4EE5\u4E0B\u4EFB\u4E00\u65B9\u5F0F\u914D\u7F6E\u8BA4\u8BC1\uFF1A1. \u5728\u670D\u52A1\u914D\u7F6E\u4E2D\u6DFB\u52A0 headers.Authorization2. \u6216\u8005\u5728\u5168\u5C40\u914D\u7F6E\u4E2D\u8BBE\u7F6E modelscope.apiKey3. \u6216\u8005\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF MODELSCOPE_API_TOKEN\u83B7\u53D6 ModelScope API Key: https://modelscope.cn/my?myInfo=true`)}enhanceServiceConfig(e){let t={...e};try{return this.isModelScopeService(e)&&this.handleModelScopeAuth(e,t),t}catch(r){throw r}}addServiceConfig(e,t){let r,o;if(typeof e=="string"&&t)o=e,r=t;else if(typeof e=="object")o=e.name,r=e;else throw new Error("Invalid arguments for addServiceConfig");let s=this.enhanceServiceConfig(r);this.configs[o]=s}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(t);this.configs[e]=r}removeServiceConfig(e){delete this.configs[e]}async syncToolsConfigToFile(){try{let e=h.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let o=r.getTools();if(o.length===0)continue;let s=e[t]?.tools||{},i={};for(let d of o){let C=s[d.name];C?i[d.name]={...C,description:d.description||C.description||""}:i[d.name]={description:d.description||"",enable:!0}}let c=o.map(d=>d.name),g=Object.keys(s).filter(d=>!c.includes(d));if(g.length>0,this.hasToolsConfigChanged(s,i)){h.updateServerToolsConfig(t,i);let d=Object.keys(i).filter(f=>!s[f]),C=Object.keys(i).filter(f=>{let x=s[f],Oe=i[f];return x&&x.description!==Oe.description});d.length>0,C.length>0,g.length>0}}}catch{}}hasToolsConfigChanged(e,t){let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!0;let s=o.filter(c=>!r.includes(c)),i=r.filter(c=>!o.includes(c));if(s.length>0||i.length>0)return!0;for(let c of r){let l=e[c],g=t[c];if(l.description!==g.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e));let o=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,o)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e);try{await this.refreshCustomMCPHandlerPublic()}catch{}}catch{let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);this.scheduleServiceRetry(e,o)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,o)=>r+o.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e)),this.failedServices.delete(e)}stopAllServiceRetries(){for(let[e,t]of this.retryTimers)clearTimeout(t);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);try{await t.initialize(),this.transportAdapters.set(e,t),this.emit("transportRegistered",{name:e,adapter:t})}catch(r){throw r}}async startTransports(){let e=[],t=[];for(let[r,o]of this.transportAdapters)try{await o.start(),e.push(r)}catch{t.push(r)}if(e.length===0&&t.length>0){let r=`\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5931\u8D25\uFF0C\u5931\u8D25\u7684\u9002\u914D\u5668: ${t.join(", ")}`;throw new Error(r)}t.length>0}async stopTransports(){try{for(let[e,t]of this.transportAdapters)try{await t.stop()}catch{}}catch(e){throw e}}getTransportAdapters(){return new Map(this.transportAdapters)}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");try{await this.startAllServices(),await this.startTransports(),this.isRunning=!0,this.emit("started")}catch(e){throw e}}async stop(){if(this.isRunning)try{await this.stopTransports(),await this.stopAllServices(),this.isRunning=!1,this.emit("stopped")}catch(e){throw e}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});for(let[t,r]of this.transportAdapters)e.push({id:r.getConnectionId(),name:t,state:r.getState()});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,transportCount:this.getTransportAdapters().size,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames()}catch{e=0,t=[]}let r=this.tools.size+e,s=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:s};for(let[c,l]of this.services){let g=l.getStatus();i.services[c]={connected:g.connected,clientName:`xiaozhi-${c}-client`}}return e>0&&(i.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),i}isServerRunning(){return this.isRunning}isUnifiedServerConfig(e){return e!==null&&typeof e=="object"&&"configs"in e}async routeMessage(e){let t=await this.messageHandler.handleMessage(e);return t===null?null:{jsonrpc:"2.0",method:"response",params:t,id:t.id}}async initialize(){await this.start()}getToolRegistry(){return this}getConnectionManager(){return this}}});import{SSEClientTransport as Wc}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Bc}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as qc}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as Gc}from"eventsource";function Jc(n){switch(n.type){case"stdio":return Xc(n);case"sse":return Kc(n);case"streamable-http":return Yc(n);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function Xc(n){if(!n.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new Bc({command:n.command,args:n.args||[],env:n.env})}function Kc(n){if(!n.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Qc(n);return new Wc(e,t)}function Yc(n){if(!n.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Zc(n);return new qc(e,t)}function Qc(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Zc(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function el(n){if(!n.name||typeof n.name!="string")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(n.type&&!Object.values(be).includes(n.type))throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`);if(!n.type)throw new Error("\u4F20\u8F93\u7C7B\u578B\u672A\u8BBE\u7F6E\uFF0C\u8FD9\u5E94\u8BE5\u5728 inferTransportType \u4E2D\u5904\u7406");switch(n.type){case"stdio":if(!n.command)throw new Error("stdio \u7C7B\u578B\u9700\u8981 command \u5B57\u6BB5");break;case"sse":if(n.url===void 0||n.url===null)throw new Error(`${n.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;case"streamable-http":if(n.url===void 0||n.url===null)throw new Error(`${n.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function tl(){return["stdio","sse","streamable-http"]}var po,uo=m(()=>{"use strict";se();typeof global<"u"&&!global.EventSource&&(global.EventSource=Gc);a(Jc,"createTransport");a(Xc,"createStdioTransport");a(Kc,"createSSETransport");a(Yc,"createStreamableHTTPTransport");a(Qc,"createSSEOptions");a(Zc,"createStreamableHTTPOptions");a(el,"validateConfig");a(tl,"getSupportedTypes");po={create:Jc,validateConfig:el,getSupportedTypes:tl}});import{Client as rl}from"@modelcontextprotocol/sdk/client/index.js";var dt,Yn=m(()=>{"use strict";z();uo();se();ot();dt=class{static{a(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";connectionTimeout=null;initialized=!1;eventBus=R();constructor(e){this.config=Hn(e),this.validateConfig()}validateConfig(){po.validateConfig(this.config)}async connect(){if(this.connectionState==="connecting")throw new Error("\u8FDE\u63A5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5B8C\u6210");return this.cleanupConnection(),this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.config.timeout||1e4}ms)`);this.handleConnectionError(r),t(r)},this.config.timeout||1e4);try{this.client=new rl({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{}}),this.transport=po.create(this.config),this.client.connect(this.transport).then(async()=>{this.handleConnectionSuccess(),await this.refreshTools(),this.eventBus.emitEvent("mcp:service:connected",{serviceName:this.config.name,tools:this.getTools(),connectionTime:new Date}),e()}).catch(r=>{this.handleConnectionError(r),t(r)})}catch(r){this.handleConnectionError(r),t(r)}})}handleConnectionSuccess(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionState="connected",this.initialized=!0}handleConnectionError(e){this.connectionState="disconnected",this.initialized=!1,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection(),this.eventBus.emitEvent("mcp:service:connection:failed",{serviceName:this.config.name,error:e,attempt:0})}cleanupConnection(){if(this.client){try{this.client.close().catch(()=>{})}catch{}this.client=null}this.transport=null,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.initialized=!1}async refreshTools(){if(!this.client)throw new Error("\u5BA2\u6237\u7AEF\u672A\u521D\u59CB\u5316");try{let t=(await this.client.listTools()).tools||[];this.tools.clear();for(let r of t)this.tools.set(r.name,r)}catch(e){throw e}}async disconnect(){this.cleanupConnection(),this.connectionState="disconnected",this.eventBus.emitEvent("mcp:service:disconnected",{serviceName:this.config.name,reason:"\u624B\u52A8\u65AD\u5F00",disconnectionTime:new Date})}getTools(){return Array.from(this.tools.values())}async callTool(e,t){if(!this.client)throw new Error(`\u670D\u52A1 ${this.config.name} \u672A\u8FDE\u63A5`);if(!this.tools.has(e))throw new Error(`\u5DE5\u5177 ${e} \u5728\u670D\u52A1 ${this.config.name} \u4E2D\u4E0D\u5B58\u5728`);try{return await this.client.callTool({name:e,arguments:t||{}})}catch(r){throw r}}getConfig(){return this.config}getStatus(){return{name:this.config.name,connected:this.connectionState==="connected",initialized:this.initialized,transportType:this.config.type||"streamable-http",toolCount:this.tools.size,connectionState:this.connectionState}}isConnected(){return this.connectionState==="connected"&&this.initialized}}});var Qn=m(()=>{"use strict"});import{Hono as ol}from"hono";var Zn,mo=m(()=>{"use strict";Zn=a(()=>new ol,"createApp")});var ho=m(()=>{"use strict";oo();Qn();no();mo()});import{createHash as nl}from"crypto";import{existsSync as mt,mkdirSync as sl,readFileSync as es,renameSync as il,writeFileSync as ts}from"fs";import{dirname as al,resolve as rs}from"path";import cl from"dayjs";var Ce,os=m(()=>{"use strict";M();ho();Ce=class{static{a(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION="1.0.0";CACHE_ENTRY_VERSION="1.0.0";cleanupInterval;CLEANUP_INTERVAL=6e4;constructor(e){this.logger=p,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return cl().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return rs(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return rs(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!mt(this.cachePath)){let e=al(this.cachePath);mt(e)||(sl(e,{recursive:!0}),this.logger.debug(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55: ${e}`)),this.logger.debug("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u521D\u59CB\u7F13\u5B58\u6587\u4EF6");let t=await this.createInitialCache();await this.saveCache(t),this.logger.info(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u6587\u4EF6: ${this.cachePath}`)}}catch(e){this.logger.warn(`[CacheManager] \u521B\u5EFA\u7F13\u5B58\u6587\u4EF6\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async createInitialCache(){let e=this.formatTimestamp();return{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:e,totalWrites:0,createdAt:e}}}async writeCacheEntry(e,t,r){try{this.logger.debug(`[CacheManager] \u5F00\u59CB\u5199\u5165\u7F13\u5B58: ${e}`),await this.ensureCacheFile();let o=await this.loadExistingCache(),s=this.generateConfigHash(r),i={tools:t.map(c=>({name:c.name,description:c.description||"",inputSchema:c.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:s,version:this.CACHE_ENTRY_VERSION};o.mcpServers[e]=i,o.metadata.lastGlobalUpdate=this.formatTimestamp(),o.metadata.totalWrites+=1,await this.saveCache(o),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(o){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)}}async loadExistingCache(){try{if(!mt(this.cachePath))return await this.createInitialCache();let e=es(this.cachePath,"utf8"),t=JSON.parse(e);return this.validateCacheStructure(t)?t:(this.logger.warn("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u7ED3\u6784\u65E0\u6548\uFF0C\u91CD\u65B0\u521B\u5EFA"),await this.createInitialCache())}catch(e){return this.logger.warn(`[CacheManager] \u52A0\u8F7D\u7F13\u5B58\u5931\u8D25\uFF0C\u521B\u5EFA\u65B0\u7F13\u5B58: ${e instanceof Error?e.message:String(e)}`),await this.createInitialCache()}}async saveCache(e){let t=JSON.stringify(e,null,2);await this.atomicWrite(this.cachePath,t)}async atomicWrite(e,t){let r=`${e}.tmp`;try{ts(r,t,"utf8"),il(r,e)}catch(o){try{mt(r)&&ts(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return nl("sha256").update(JSON.stringify(e)).digest("hex")}catch(t){return this.logger.warn(`[CacheManager] \u751F\u6210\u914D\u7F6E\u54C8\u5E0C\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),""}}validateCacheStructure(e){try{if(!e||typeof e!="object")return!1;let t=e,r=t.metadata;return typeof t.version=="string"&&typeof t.mcpServers=="object"&&t.mcpServers!==null&&t.metadata!==null&&t.metadata!==void 0&&typeof r=="object"&&r!==null&&typeof r.lastGlobalUpdate=="string"&&typeof r.totalWrites=="number"&&typeof r.createdAt=="string"}catch{return!1}}async getStats(){try{let e=await this.loadExistingCache();return{totalWrites:e.metadata.totalWrites,lastUpdate:e.metadata.lastGlobalUpdate,serverCount:Object.keys(e.mcpServers).length,cacheFileSize:mt(this.cachePath)?es(this.cachePath,"utf8").length:0}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),null}}getFilePath(){return this.cachePath}async getAllCachedTools(){try{let e=await this.loadExistingCache(),t=[];for(let[r,o]of Object.entries(e.mcpServers))for(let s of o.tools)t.push({...s,name:`${r}__${s.name}`});return this.logger.debug(`[CacheManager] \u83B7\u53D6\u5230\u6240\u6709\u7F13\u5B58\u5DE5\u5177\uFF0C\u5171 ${t.length} \u4E2A`),t}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),[]}}async writeCustomMCPResult(e,t,r,o="completed",s,i=3e5){try{let c=await this.loadExtendedCache(),l=pe(e,t),g={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:s,retryCount:0};c.customMCPResults||(c.customMCPResults={}),c.customMCPResults[l]=g,await this.saveExtendedCache(c),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${o}`)}catch(c){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=pe(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return null;let s=r.customMCPResults[o],i=Date.now(),c=new Date(s.timestamp).getTime();return i-c>s.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):s}catch(r){return this.logger.warn(`[CacheManager] \u8BFB\u53D6CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),null}}async updateCustomMCPStatus(e,t,r,o,s){try{let i=await this.loadExtendedCache(),c=pe(e,t);if(!i.customMCPResults||!i.customMCPResults[c])return!1;let l=i.customMCPResults[c],g=l.status;return l.status=r,l.timestamp=new Date().toISOString(),o&&(l.result=o),s&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${s}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(i),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${g} -> ${r}`),!0}catch(i){return this.logger.warn(`[CacheManager] \u66F4\u65B0CustomMCP\u7F13\u5B58\u72B6\u6001\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`),!1}}async markCustomMCPAsConsumed(e,t){try{let r=await this.loadExtendedCache(),o=pe(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return!1;let s=r.customMCPResults[o];return s.consumed||(s.consumed=!0,s.timestamp=new Date().toISOString(),await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${e}`)),!0}catch(r){return this.logger.warn(`[CacheManager] \u6807\u8BB0CustomMCP\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async deleteCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=pe(e,t);return!r.customMCPResults||!r.customMCPResults[o]?!1:(delete r.customMCPResults[o],await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u5220\u9664\u7F13\u5B58\u6761\u76EE: ${e}`),!0)}catch(r){return this.logger.warn(`[CacheManager] \u5220\u9664CustomMCP\u7F13\u5B58\u6761\u76EE\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async cleanupCustomMCPResults(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[o,s]of t)lt(s)&&(delete e.customMCPResults[o],r++);return r>0&&(await this.saveExtendedCache(e),this.logger.info(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58: ${r}/${t.length}`)),{cleaned:r,total:t.length}}catch(e){return this.logger.warn(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{cleaned:0,total:0}}}async getCustomMCPStatistics(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0};let t=Object.values(e.customMCPResults),r=t.length,o=t.filter(u=>u.status==="pending").length,s=t.filter(u=>u.status==="completed").length,i=t.filter(u=>u.status==="failed").length,c=t.filter(u=>u.consumed).length,l=s>0?c/s*100:0,g=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:s,failedTasks:i,consumedEntries:c,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:g}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6CustomMCP\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0}}}async loadExtendedCache(){try{return await this.loadExistingCache()}catch(e){return this.logger.warn(`[CacheManager] \u52A0\u8F7D\u6269\u5C55\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:this.formatTimestamp(),totalWrites:0,createdAt:this.formatTimestamp()},customMCPResults:{}}}}async saveExtendedCache(e){await this.saveCache(e)}startCleanupTimer(){this.cleanupInterval=setInterval(()=>{this.cleanupCustomMCPResults().catch(e=>{this.logger.warn(`[CacheManager] \u81EA\u52A8\u6E05\u7406\u5931\u8D25: ${e}`)})},this.CLEANUP_INTERVAL),this.logger.debug(`[CacheManager] \u542F\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${this.CLEANUP_INTERVAL}ms`)}stopCleanupTimer(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=void 0,this.logger.debug("[CacheManager] \u505C\u6B62\u6E05\u7406\u5B9A\u65F6\u5668"))}cleanup(){this.stopCleanupTimer(),this.logger.debug("[CacheManager] \u6E05\u7406\u8D44\u6E90\u5B8C\u6210")}}});var ve=m(()=>{"use strict";Kn();Yn();se();ot();uo();ao();os();go()});var ns=m(()=>{"use strict";ve();M();ze()});var ss=m(()=>{"use strict";Zr();ns()});var fo,is=m(()=>{"use strict";M();fo=a(async(n,e)=>{n.set("logger",p),await e()},"loggerMiddleware")});import{cors as ll}from"hono/cors";var Co,as=m(()=>{"use strict";Co=ll({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var k,ie,vo,Eo,So=m(()=>{"use strict";M();k=a((n,e,t)=>({error:{code:n,message:e,details:t}}),"createErrorResponse"),ie=a((n,e)=>({success:!0,data:n,message:e}),"createSuccessResponse"),vo=a((n,e)=>{let t;try{let o=e.get("logger");o?t=o:t=p}catch{t=p}process.env.NODE_ENV,t.error("HTTP request error:",n);let r=k("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?n.stack:void 0);return e.json(r,500)},"errorHandlerMiddleware"),Eo=a(n=>{if(n.req.path.startsWith("/api/")){let t=k("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method});return n.json(t,404)}let e=k("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method});return n.json(e,404)},"notFoundHandlerMiddleware")});var Be,ht,yo=m(()=>{"use strict";Be=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},ht=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var To,cs=m(()=>{"use strict";M();yo();To=a(async(n,e)=>{if(!n.get("mcpServiceManager"))try{let t=n.get("logger")||p;t.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let r=n.get("webServer");if(!r)throw new ht("WebServer \u672A\u6CE8\u5165\u5230 Context");let o=r.getMCPServiceManager();n.set("mcpServiceManager",o),t.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){let r=n.get("logger")||p;if(t instanceof Be)r.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof ht?(r.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(r.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware")});var Mo,ls=m(()=>{"use strict";Mo=a(()=>async(n,e)=>{let t=n.get("webServer");if(!t)throw new Error("WebServer \u5B9E\u4F8B\u672A\u6CE8\u5165\u5230\u4E0A\u4E0B\u6587\u4E2D\uFF0C\u8BF7\u786E\u4FDD webServerMiddleware \u5DF2\u6B63\u786E\u914D\u7F6E");if(!t.getEndpointManager)throw new Error("WebServer \u5B9E\u4F8B\u7F3A\u5C11 getEndpointManager \u65B9\u6CD5");try{let r=t.getEndpointManager();n.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))n.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware")});var Wt,Ro=m(()=>{"use strict";M();z();Wt=class{static{a(this,"MCPEndpointApiHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=p.withTag("MCPEndpointApiHandler"),this.endpointManager=e,this.configManager=t,this.eventBus=R()}createErrorResponse(e,t,r,o){return{error:{code:e,message:t,details:r?{endpoint:r,...o}:o}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(s){this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",s);let i=this.createErrorResponse(t,s instanceof Error?s.message:"JSON\u89E3\u6790\u5931\u8D25");return{ok:!1,response:e.json(i,500)}}let o=r.endpoint;if(!o||typeof o!="string"){let s=this.createErrorResponse("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",o);return{ok:!1,response:e.json(s,400)}}return{ok:!0,endpoint:o}}async getEndpointStatus(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_STATUS_READ_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.debug(`\u5904\u7406\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(i=>i.endpoint===r);if(!s){let i=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(i,404)}return this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.json(this.createSuccessResponse(s))}catch(o){this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",o);let s=this.createErrorResponse("ENDPOINT_STATUS_READ_ERROR",o instanceof Error?o.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",r);return e.json(s,500)}}async connectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_CONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u8FDE\u63A5\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(g=>g.endpoint===r);if(!s){let g=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",r);return e.json(g,404)}if(s.connected){let g=this.createErrorResponse("ENDPOINT_ALREADY_CONNECTED","\u7AEF\u70B9\u5DF2\u8FDE\u63A5",r);return e.json(g,409)}await this.endpointManager.connectExistingEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(g=>g.endpoint===r);if(!c){let g=this.createErrorResponse("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",r);return e.json(g,500)}this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!0,operation:"connect",success:!0,message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${r}`);let l=this.createSuccessResponse(c);return e.json(l)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",o);let s=this.createErrorResponse("ENDPOINT_CONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",r);return e.json(s,500)}}async disconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_DISCONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u65AD\u5F00\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(u=>u.endpoint===r);if(!s){let u=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(u,404)}if(!s.connected){let u=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(u,409)}await this.endpointManager.disconnectEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(u=>u.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"disconnect",success:!0,message:"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F: ${r}`);let l={endpoint:r,connected:!1,initialized:!0},g=this.createSuccessResponse(c||l);return e.json(g)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",o);let s=this.createErrorResponse("ENDPOINT_DISCONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",r);return e.json(s,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;try{if(this.endpointManager.getConnectionStatus().find(g=>g.endpoint===r)){let g=this.createErrorResponse("ENDPOINT_ALREADY_EXISTS","\u63A5\u5165\u70B9\u5DF2\u5B58\u5728",r);return e.json(g,409)}await this.endpointManager.addEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(g=>g.endpoint===r);if(!c){let g=this.createErrorResponse("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u72B6\u6001",r);return e.json(g,500)}this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"add",success:!0,message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F: ${r}`);let l=this.createSuccessResponse(c);return e.json(l)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25:",o);let s="ENDPOINT_ADD_ERROR",i=500;o instanceof Error&&(o.message.includes("\u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D")?(s="ENDPOINT_ALREADY_IN_CONFIG",i=409):o.message.includes("\u5DF2\u5B58\u5728")?(s="ENDPOINT_ALREADY_EXISTS",i=409):o.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(s="INVALID_ENDPOINT",i=400));let c=this.createErrorResponse(s,o instanceof Error?o.message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25",void 0);return e.json(c,i)}}async removeEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_REMOVE_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u79FB\u9664\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);if(!s){let c=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(c,404)}s.connected&&await this.endpointManager.disconnectEndpoint(r),await this.endpointManager.removeEndpoint(r),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F: ${r}`);let i=this.createSuccessResponse({endpoint:r,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F"});return e.json(i)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25:",o);let s="ENDPOINT_REMOVE_ERROR",i=500;o instanceof Error&&(o.message.includes("\u4E0D\u5B58\u5728")?(s="ENDPOINT_NOT_FOUND",i=404):o.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(s="INVALID_ENDPOINT",i=400));let c=this.createErrorResponse(s,o instanceof Error?o.message:"\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25",r);return e.json(c,i)}}}});var wo,gs=m(()=>{"use strict";Ro();ee();wo=a(()=>{let n=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?n=new Wt(o,h):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var Po=m(()=>{"use strict";is();as();So();cs();ls();gs();mo()});var ue,ft=m(()=>{"use strict";M();ee();z();ue=class{static{a(this,"ConfigService")}logger;eventBus;constructor(){this.logger=p.withTag("ConfigService"),this.eventBus=R()}async getConfig(){try{let e=h.getConfig();return this.logger.debug("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e}catch(e){throw this.logger.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",e),this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"getConfig"}),e}}async updateConfig(e,t="unknown"){try{this.logger.info(`\u5F00\u59CB\u66F4\u65B0\u914D\u7F6E\uFF0C\u6765\u6E90: ${t}`),this.validateConfig(e),e.mcpEndpoint!==h.getMcpEndpoint()&&h.updateMcpEndpoint(e.mcpEndpoint);let r=h.getMcpServers();for(let[o,s]of Object.entries(e.mcpServers))JSON.stringify(r[o])!==JSON.stringify(s)&&h.updateMcpServer(o,s);for(let o of Object.keys(r))o in e.mcpServers||(h.removeMcpServer(o),h.removeServerToolsConfig(o));if(e.connection&&h.updateConnectionConfig(e.connection),e.modelscope&&h.updateModelScopeConfig(e.modelscope),e.webUI&&h.updateWebUIConfig(e.webUI),e.mcpServerConfig)for(let[o,s]of Object.entries(e.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))h.setToolEnabled(o,i,c.enable);if(e?.platforms)for(let[o,s]of Object.entries(e.platforms))h.updatePlatformConfig(o,s);this.logger.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date})}catch(r){throw this.logger.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r),this.eventBus.emitEvent("config:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateConfig"}),r}}getMcpEndpoint(){try{return h.getMcpEndpoint()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",e),e}}getMcpEndpoints(){try{return h.getMcpEndpoints()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",e),e}}getMcpServers(){try{return h.getMcpServers()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",e),e}}getConnectionConfig(){try{return h.getConnectionConfig()}catch(e){throw this.logger.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",e),e}}getWebUIPort(){try{return h.getWebUIPort()||9999}catch(e){return this.logger.error("\u83B7\u53D6 Web UI \u7AEF\u53E3\u5931\u8D25:",e),9999}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.mcpEndpoint&&e.mcpEndpoint!=="")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B mcpEndpoint");if(!e.mcpServers||typeof e.mcpServers!="object")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 mcpServers")}configExists(){return h.configExists()}async reloadConfig(){try{this.logger.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E"),h.reloadConfig();let e=await this.getConfig();return this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date}),e}catch(e){throw this.logger.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",e),this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"reloadConfig"}),e}}getConfigPath(){return h.getConfigPath()}}});var Bt,ps=m(()=>{"use strict";Bt=class{static{a(this,"AbstractApiHandler")}getLogger(e){let t=e.get("logger");if(!t)throw new Error("Logger not found in context. Ensure loggerMiddleware is registered.");return t}}});var qt,us=m(()=>{"use strict";Po();ft();ps();qt=class extends Bt{static{a(this,"ConfigApiHandler")}configService;constructor(){super(),this.configService=new ue}async getConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=await this.configService.getConfig();return t.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(ie(r))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r);let o=k("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async updateConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let r=await e.req.json();if(!r||typeof r!="object"){let o=k("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u914D\u7F6E\u5BF9\u8C61");return e.json(o,400)}return await this.configService.updateConfig(r,"http-api"),t.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(ie(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(r){t.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r);let o=k("CONFIG_UPDATE_ERROR",r instanceof Error?r.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25");return e.json(o,400)}}async getMcpEndpoint(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let r=this.configService.getMcpEndpoint();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(ie({endpoint:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",r);let o=k("MCP_ENDPOINT_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25");return e.json(o,500)}}async getMcpEndpoints(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let r=this.configService.getMcpEndpoints();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(ie({endpoints:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",r);let o=k("MCP_ENDPOINTS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25");return e.json(o,500)}}async getMcpServers(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let r=this.configService.getMcpServers();return t.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(ie({servers:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",r);let o=k("MCP_SERVERS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async getConnectionConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let r=this.configService.getConnectionConfig();return t.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(ie({connection:r}))}catch(r){t.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",r);let o=k("CONNECTION_CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async reloadConfig(e){let t=this.getLogger(e);try{t.info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42");let r=await this.configService.reloadConfig();return t.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(ie(r,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(r){t.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",r);let o=k("CONFIG_RELOAD_ERROR",r instanceof Error?r.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async getConfigPath(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let r=this.configService.getConfigPath();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(ie({path:r}))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",r);let o=k("CONFIG_PATH_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25");return e.json(o,500)}}async checkConfigExists(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let r=this.configService.configExists();return t.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${r}`),e.json(ie({exists:r}))}catch(r){t.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",r);let o=k("CONFIG_EXISTS_CHECK_ERROR",r instanceof Error?r.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25");return e.json(o,500)}}}});function qe(n){if(!(n instanceof Error&&"code"in n))return!1;let e=n.code;return typeof e=="string"&&["AUTH_FAILED","RATE_LIMITED","TIMEOUT","API_ERROR","NETWORK_ERROR"].includes(e)}function Gt(n,e){return{success:!0,data:n,message:e}}function j(n,e,t){return{success:!1,message:n,error:e?{code:e,details:t}:void 0}}function Jt(){let n=h.getCozeToken();if(!n)throw new Error("\u6263\u5B50 API Token \u672A\u914D\u7F6E\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E platforms.coze.token");return new Te(n)}var Xt,ds=m(()=>{"use strict";zt();M();ee();a(qe,"isErrorWithCode");a(Gt,"createSuccessResponse");a(j,"createErrorResponse");a(Jt,"getCozeApiService");Xt=class{static{a(this,"CozeApiHandler")}async getWorkspaces(e){try{if(p.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!h.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=Jt();p.info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return p.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(Gt({workspaces:r}))}catch(t){return p.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),qe(t)&&t.code==="AUTH_FAILED"?e.json(j("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):qe(t)&&t.code==="RATE_LIMITED"?e.json(j("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):qe(t)&&t.code==="TIMEOUT"?e.json(j("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(j(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async getWorkflows(e){try{if(p.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!h.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),o=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return p.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(j("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(j("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(o<1||o>100)return e.json(j("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let s={workspace_id:t,page_num:r,page_size:o},i=Jt();p.info(`\u5F00\u59CB\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868\uFF0C\u9875\u7801: ${r}\uFF0C\u6BCF\u9875: ${o}`);let c=await i.getWorkflows(s);p.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=h.getCustomMCPTools(),g=c.items.map(u=>{let d=l.find(C=>C.handler.type==="proxy"&&C.handler.platform==="coze"&&C.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!d,toolName:d?.name||null}});return p.info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${g.filter(u=>u.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.json(Gt({items:g,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length}))}catch(t){return p.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),qe(t)&&t.code==="AUTH_FAILED"?e.json(j("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):qe(t)&&t.code==="RATE_LIMITED"?e.json(j("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):qe(t)&&t.code==="TIMEOUT"?e.json(j("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(j(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async clearCache(e){try{if(p.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!h.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("pattern"),r=Jt(),o=r.getCacheStats();p.info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let s=r.getCacheStats();return p.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${s.size} \u9879`),e.json(Gt({cleared:o.size-s.size,remaining:s.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return p.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(j(t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async getCacheStats(e){try{if(p.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!h.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=Jt().getCacheStats();return e.json(Gt(r))}catch(t){return p.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(j(t instanceof Error?t.message:"\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}}});var Kt,ms=m(()=>{"use strict";M();ft();Kt=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;configService;constructor(e,t){this.logger=p.withTag("HeartbeatHandler"),this.statusService=e,this.notificationService=t,this.configService=new ue}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let o={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(o,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(o){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,o),this.sendError(e,"CLIENT_STATUS_ERROR",o instanceof Error?o.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25")}}async sendLatestConfig(e,t){try{let o={type:"configUpdate",data:await this.configService.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(o)),this.logger.debug(`\u6700\u65B0\u914D\u7F6E\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u6700\u65B0\u914D\u7F6E\u5931\u8D25: ${t}`,r)}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>35e3&&(this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.statusService.updateClientInfo({status:"disconnected"},"heartbeat-timeout"))}startHeartbeatMonitoring(){return this.logger.debug("\u542F\u52A8\u5FC3\u8DF3\u76D1\u63A7"),setInterval(()=>{this.checkHeartbeatTimeout(),this.cleanupDisconnectedClients()},1e4)}cleanupDisconnectedClients(){try{this.notificationService.cleanupDisconnectedClients()}catch(e){this.logger.error("\u6E05\u7406\u65AD\u5F00\u8FDE\u63A5\u7684\u5BA2\u6237\u7AEF\u5931\u8D25:",e)}}stopHeartbeatMonitoring(e){this.logger.info("\u505C\u6B62\u5FC3\u8DF3\u76D1\u63A7"),clearInterval(e)}getHeartbeatStats(){return{lastHeartbeat:this.statusService.getLastHeartbeat(),isConnected:this.statusService.isClientConnected(),clientStats:this.notificationService.getClientStats()}}handleClientConnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u65AD\u5F00: ${e}`),this.statusService.updateClientInfo({status:"disconnected"},`websocket-disconnect-${e}`)}sendHeartbeatResponse(e,t){try{let r={type:"heartbeatResponse",data:{timestamp:Date.now(),status:"ok"}};e.send(JSON.stringify(r)),this.logger.debug(`\u5FC3\u8DF3\u54CD\u5E94\u5DF2\u53D1\u9001: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u5FC3\u8DF3\u54CD\u5E94\u5931\u8D25: ${t}`,r)}}validateHeartbeatMessage(e){return e&&typeof e=="object"&&e.type==="clientStatus"&&e.data&&typeof e.data=="object"}}});import{randomUUID as gl}from"crypto";var Yt,hs=m(()=>{"use strict";ve();M();Yt=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=p.withTag("MCPRouteHandler"),this.config={maxClients:e.maxClients??100,connectionTimeout:e.connectionTimeout??3e5,heartbeatInterval:e.heartbeatInterval??3e4,maxMessageSize:e.maxMessageSize??1024*1024,enableMetrics:e.enableMetrics??!0},this.metrics={totalConnections:0,activeConnections:0,totalMessages:0,errorCount:0,averageResponseTime:0,uptime:0},this.startTime=new Date,this.startCleanupTask(),this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval})}startCleanupTask(){this.cleanupInterval=setInterval(()=>{this.cleanupStaleConnections(),this.updateMetrics()},6e4)}stopCleanupTask(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null)}cleanupStaleConnections(){let e=new Date,t=[];for(let[r,o]of this.clients.entries())(e.getTime()-o.lastActivity.getTime()>this.config.connectionTimeout||!o.isAlive)&&t.push(r);for(let r of t)this.logger.info(`\u6E05\u7406\u8FC7\u671F\u8FDE\u63A5: ${r}`),this.handleClientDisconnect(r,"cleanup");t.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${t.length} \u4E2A\u8FC7\u671F\u8FDE\u63A5`)}updateMetrics(){this.config.enableMetrics&&(this.metrics.activeConnections=this.clients.size,this.metrics.uptime=Date.now()-this.startTime.getTime(),this.logger.debug("\u8FDE\u63A5\u7EDF\u8BA1",{activeConnections:this.metrics.activeConnections,totalConnections:this.metrics.totalConnections,totalMessages:this.metrics.totalMessages,errorCount:this.metrics.errorCount}))}getMCPServiceManager(e){let t=e.get("mcpServiceManager");if(t)return t;let r=e.get("webServer");if(!r)throw new Error("WebServer \u672A\u5728 Context \u4E2D\u627E\u5230\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u95F4\u4EF6\u914D\u7F6E");let o=r.getMCPServiceManager();return this.logger.debug("MCPServiceManager \u4ECE WebServer \u83B7\u53D6\uFF08Context \u4E2D\u672A\u627E\u5230\uFF09"),o}async initializeMessageHandler(e){if(!this.mcpMessageHandler)try{let t=this.getMCPServiceManager(e);this.mcpMessageHandler=new We(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let o=e.req.query("sessionId");if(o)return await this.handleSSEMessage(e,o);let s=e.req.header("content-length");if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Request too large: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header("content-type")?.includes("application/json"))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Content-Type must be application/json");let c=e.req.header("mcp-protocol-version")||e.req.header("MCP-Protocol-Version")||e.req.header("Mcp-Protocol-Version"),l=["2024-11-05","2025-06-18"];c&&!l.includes(c)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${c}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${l.join(", ")}`);let g;try{let C=await e.req.text();if(C.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);g=JSON.parse(C),r=g.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(g))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",r);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let u=await this.mcpMessageHandler.handleMessage(g);this.metrics.totalMessages++;let d=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+d)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:g.method,messageId:r,responseTime:d,isNotification:u===null}),u===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":d.toString()}}):e.json(u,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":d.toString()})}catch(o){this.metrics.errorCount++;let s=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:o instanceof Error?o.message:String(o),messageId:r,responseTime:s,stack:o instanceof Error?o.stack:void 0});let i=o instanceof Error?o.message:String(o);return this.createErrorResponse(-32603,`Internal error: ${i}`,r)}}async handleSSEMessage(e,t){let r=Date.now(),o=null;try{this.logger.debug(`\u5904\u7406 SSE \u6D88\u606F (\u4F1A\u8BDD: ${t})`);let s=this.clients.get(t);if(!s)return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Invalid or missing sessionId",null);s.lastActivity=new Date;let i=e.req.header("content-length");if(i&&Number.parseInt(i)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`);let c;try{let u=await e.req.text();if(u.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);c=JSON.parse(u),o=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",o);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let l=await this.mcpMessageHandler.handleMessage(c);if(s.messageCount++,this.metrics.totalMessages++,l!==null&&s.writer&&s.isAlive)try{await this.sendSSEEvent(s.writer,"message",JSON.stringify(l))}catch(u){this.logger.warn(`SSE \u5199\u5165\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${t}`,u),s.isAlive=!1}let g=Date.now()-r;return this.logger.debug(`SSE \u6D88\u606F\u5904\u7406\u5B8C\u6210 (\u4F1A\u8BDD: ${t})`,{method:c.method,messageId:o,responseTime:g,messageCount:s.messageCount,isNotification:l===null}),new Response(null,{status:202,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":g.toString()}})}catch(s){this.metrics.errorCount++;let i=Date.now()-r;this.logger.error(`\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519 (\u4F1A\u8BDD: ${t}):`,{error:s instanceof Error?s.message:String(s),messageId:o,responseTime:i,stack:s instanceof Error?s.stack:void 0});let c=s instanceof Error?s.message:String(s);return this.createErrorResponse(-32603,`Internal error: ${c}`,o)}}async handleGet(e){try{if(this.logger.debug("\u5904\u7406 MCP GET \u8BF7\u6C42\uFF08SSE \u8FDE\u63A5\uFF09"),this.clients.size>=this.config.maxClients)return this.metrics.errorCount++,e.json({jsonrpc:"2.0",error:{code:-32e3,message:"Server busy: Maximum client connections reached",data:{maxClients:this.config.maxClients}},id:null},503);let t=Date.now().toString(),r=gl(),o=new Date,s=e.req.header("user-agent"),i=e.req.header("x-forwarded-for")||e.req.header("x-real-ip")||"unknown";this.logger.info(`SSE \u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t} (\u4F1A\u8BDD: ${r})`,{userAgent:s,remoteAddress:i});let{readable:c,writable:l}=new TransformStream,g=l.getWriter(),u=new AbortController,d={id:t,sessionId:r,response:new Response(c),connectedAt:o,lastActivity:o,writer:g,abortController:u,isAlive:!0,messageCount:0,userAgent:s,remoteAddress:i};this.clients.set(r,d),this.metrics.totalConnections++,this.metrics.activeConnections=this.clients.size;try{await this.sendSSEEvent(g,"connected",JSON.stringify({sessionId:r,endpoint:`/mcp?sessionId=${r}`,timestamp:o.toISOString(),protocolVersion:"2024-11-05"}))}catch(x){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,x),d.isAlive=!1}this.startHeartbeat(d);let C=new Response(c,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no","MCP-Protocol-Version":"2024-11-05","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type, MCP-Protocol-Version"}}),f=a(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",f),u.signal.addEventListener("abort",f),C}catch(t){return this.metrics.errorCount++,this.logger.error("\u5904\u7406 MCP GET \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),e.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:null},500)}}startHeartbeat(e){e.heartbeatInterval&&clearInterval(e.heartbeatInterval),e.heartbeatInterval=setInterval(async()=>{if(!e.isAlive||!e.writer){this.stopHeartbeat(e);return}try{await this.sendSSEEvent(e.writer,"heartbeat",JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId})),this.logger.debug(`\u5FC3\u8DF3\u53D1\u9001\u6210\u529F: ${e.sessionId}`)}catch(t){this.logger.warn(`\u5FC3\u8DF3\u53D1\u9001\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${e.sessionId}`,t),e.isAlive=!1,this.stopHeartbeat(e)}},this.config.heartbeatInterval)}stopHeartbeat(e){e.heartbeatInterval&&(clearInterval(e.heartbeatInterval),e.heartbeatInterval=void 0)}async sendSSEEvent(e,t,r){try{let o=`event: ${t}
|
|
34
|
-
data: ${r}
|
|
35
|
-
|
|
36
|
-
`;await e.write(new TextEncoder().encode(o))}catch(o){throw this.logger.error("\u53D1\u9001 SSE \u4E8B\u4EF6\u5931\u8D25:",o),o}}handleClientDisconnect(e,t){let r=this.clients.get(e);if(!r)return;let o=Date.now()-r.connectedAt.getTime();this.logger.debug(`SSE \u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${r.id} (\u4F1A\u8BDD: ${e})`,{reason:t,duration:o,messageCount:r.messageCount,userAgent:r.userAgent,remoteAddress:r.remoteAddress}),this.stopHeartbeat(r),r.abortController&&r.abortController.abort();try{r.writer&&r.writer.close()}catch(s){this.logger.debug("\u5173\u95ED SSE writer \u65F6\u51FA\u9519:",s)}this.clients.delete(e),this.metrics.activeConnections=this.clients.size}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let o=r??`error-${Date.now()}`,s={jsonrpc:"2.0",error:{code:e,message:t},id:o};return new Response(JSON.stringify(s),{status:400,headers:{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05"}})}getStatus(){return{connectedClients:this.clients.size,maxClients:this.config.maxClients,isInitialized:this.mcpMessageHandler!==null,metrics:this.config.enableMetrics?this.metrics:void 0,config:{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval,maxMessageSize:this.config.maxMessageSize}}}getDetailedStatus(){let e=Array.from(this.clients.values()).map(t=>({id:t.id,sessionId:t.sessionId,connectedAt:t.connectedAt.toISOString(),lastActivity:t.lastActivity.toISOString(),messageCount:t.messageCount,isAlive:t.isAlive,userAgent:t.userAgent,remoteAddress:t.remoteAddress}));return{...this.getStatus(),clients:e,startTime:this.startTime.toISOString()}}async broadcastMessage(e,t){let r;try{r=JSON.stringify(t)}catch(s){throw this.logger.error("\u5E7F\u64AD\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25:",{error:s instanceof Error?s.message:String(s),data:t}),new Error(`\u5E7F\u64AD\u6D88\u606F\u65E0\u6CD5\u5E8F\u5217\u5316: ${s instanceof Error?s.message:String(s)}`)}let o=[];for(let[s,i]of this.clients.entries()){if(!i.isAlive||!i.writer){o.push(s);continue}try{await this.sendSSEEvent(i.writer,e,r)}catch(c){this.logger.warn(`\u5E7F\u64AD\u6D88\u606F\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${s}`,c),i.isAlive=!1,o.push(s)}}for(let s of o)this.handleClientDisconnect(s,"broadcast-failed")}destroy(){this.logger.info("\u6B63\u5728\u9500\u6BC1 MCPRouteHandler"),this.stopCleanupTask();for(let[e]of this.clients.entries())this.handleClientDisconnect(e,"server-shutdown");this.mcpMessageHandler=null,this.logger.info("MCPRouteHandler \u9500\u6BC1\u5B8C\u6210")}}});var $,Qt,bo,Io,No,YC,fs=m(()=>{"use strict";$=class n extends Error{static{a(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",o="system",s={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=o,this.timestamp=new Date().toISOString(),this.details={...s,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,code:this.code,message:this.message,severity:this.severity,category:this.category,details:this.details,timestamp:this.timestamp}}static configError(e,t,r={}){return new n(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new n(e,t,"high","connection",r)}static operationError(e,t,r={}){return new n(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new n(e,t,"high","system",r)}static validationError(e,t,r={}){return new n(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new n(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},Qt=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof $)}handle(e,t){return $.fromError(e,"INTERNAL_ERROR","system")}},bo=class{static{a(this,"ConfigErrorHandler")}canHandle(e){return e.message.includes("\u914D\u7F6E")||e.message.includes("config")||e.message.includes("JSON")||e.message.includes("\u89E3\u6790")}handle(e,t){return $.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Io=class{static{a(this,"ConnectionErrorHandler")}canHandle(e){return e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")||e.message.includes("timeout")||e.message.includes("ECONNREFUSED")||e.message.includes("ENOTFOUND")}handle(e,t){return $.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},No=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new bo),this.registerHandler(new Io),this.registerHandler(new Qt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof $)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new Qt().handle(e,t)}},YC=new No});var Zt,ae,Cs=m(()=>{"use strict";M();fs();z();ze();Zt=class{static{a(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=p.withTag("MCPServerApiHandler"),this.mcpServiceManager=e,this.configManager=t}createErrorResponse(e,t,r,o){return{error:{code:e,message:t,details:r?{serverName:r,...o}:o}}}handleError(e,t,r){if(e instanceof $)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let s;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?s=$.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?s=$.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?s=$.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?s=$.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):s=$.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:s,operation:t,context:r}),s}let o=$.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:o,operation:t,context:r}),o}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createMCPServiceConfig(e,t){if("command"in t)return{name:e,type:"stdio",command:t.command,args:t.args||[],env:t.env||{}};if("type"in t&&t.type==="sse")return{name:e,type:"sse",url:t.url};if("url"in t)return{name:e,type:"streamable-http",url:t.url};throw new Error(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u683C\u5F0F: ${JSON.stringify(t)}`)}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let u=r,d=await this.addMCPServersBatch(u),C=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:d.addedCount,failedCount:d.failedCount,duration:C}),e.json(this.createSuccessResponse(d,d.message),201)}let o=r,{name:s,config:i}=o,c=await this.addMCPServerSingle(s,i),l=Date.now()-t;this.logger.info("addMCPServer",{serverName:s,toolsCount:c.tools?.length||0,duration:l,status:c.status});let g=this.createSuccessResponse(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F");return e.json(g,201)}catch(o){let s=this.handleError(o,"addMCPServer",{requestData:r}),i=this.createErrorResponse(s.code,s.message,void 0,{error:s.details}),c=500;return s.category==="validation"?c=400:s.category==="configuration"?s.code==="SERVER_ALREADY_EXISTS"?c=409:c=400:s.category==="connection"&&(c=500),e.json(i,c)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=Z.normalizeTypeField(t);try{let o=ae.validateServiceName(e);if(!o.isValid){let g=$.validationError("INVALID_SERVICE_NAME",o.errors.join(", "),{serverName:e,errors:o.errors});throw this.logger.error("addMCPServerSingle",{validationError:g,serverName:e,phase:"name_validation"}),g}if(ae.checkServiceExists(e,this.configManager)){let g=$.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:g,serverName:e,phase:"existence_check"}),g}let s=ae.validateConfig(r);if(!s.isValid){let g=$.configError("INVALID_CONFIG",s.errors.join(", "),{serverName:e,config:r,errors:s.errors});throw this.logger.error("addMCPServerSingle",{configError:g,serverName:e,phase:"config_validation"}),g}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let i=this.createMCPServiceConfig(e,r);this.mcpServiceManager.addServiceConfig(i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),l=this.getServiceTools(e);return R().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(g=>g.name),timestamp:new Date}),{...c,tools:l.map(g=>g.name)}}catch(o){let s=this.handleError(o,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:s,serverName:e}),s}}getServiceStatus(e){let r=this.configManager.getConfig().mcpServers[e];if(!r)return{name:e,status:"disconnected",connected:!1,tools:[],config:{}};try{let i=this.mcpServiceManager.services.get(e);if(i?.isConnected?.()){let c=i.getTools().map(g=>g.name),l={name:e,status:"connected",connected:!0,tools:c,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(s){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,s)}let o={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,o),o}checkAndEmitStatusChange(e,t){let r=this.getPreviousStatus(e);if(r&&r.status!==t.status&&(this.logger.info(`\u670D\u52A1 ${e} \u72B6\u6001\u53D8\u5316: ${r.status} -> ${t.status}`),R().emitEvent("mcp:server:status_changed",{serverName:e,oldStatus:r.status,newStatus:t.status,timestamp:new Date,reason:t.status==="connected"?"connection_established":"connection_lost"}),r.tools!==t.tools)){let o=t.tools.filter(i=>!r.tools.includes(i)),s=r.tools.filter(i=>!t.tools.includes(i));(o.length>0||s.length>0)&&R().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:o,removedTools:s,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){let t=this;return t.statusCache||(t.statusCache=new Map),t.statusCache.get(e)||null}updateStatusCache(e,t){let r=this;r.statusCache||(r.statusCache=new Map),r.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName"),r=ae.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!ae.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let o=this.getServiceTools(t).map(i=>i.name);try{await this.mcpServiceManager.stopService(t)}catch(i){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,i)}this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),R().emitEvent("mcp:server:removed",{serverName:t,affectedTools:o,timestamp:new Date});let s=this.createSuccessResponse({name:t,operation:"removed",affectedTools:o},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F");return e.json(s,200)}catch(t){if(this.logger.error("\u79FB\u9664 MCP \u670D\u52A1\u5931\u8D25:",t),t instanceof Error){if(t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")){let o=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(o,404)}if(t.message.includes("\u914D\u7F6E\u66F4\u65B0")){let o=this.createErrorResponse("CONFIG_UPDATE_FAILED",t.message);return e.json(o,500)}}let r=this.createErrorResponse("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName"),r=ae.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!ae.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let o=this.getServiceStatus(t),s=this.createSuccessResponse(o,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F");return e.json(s,200)}catch(t){if(this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")){let o=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(o,404)}let r=this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},o=[];for(let[c,l]of Object.entries(r)){let g=this.getServiceStatus(c);o.push(g)}let s={servers:o,total:o.length},i=this.createSuccessResponse(s,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F");return e.json(i,200)}catch(t){this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t);let r=this.createErrorResponse("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async addMCPServersBatch(e){let{mcpServers:t}=e,r=Object.keys(t);if(this.logger.info("addMCPServersBatch",{serverCount:r.length,serverNames:r}),r.length===0)throw $.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let o=[],s=[],i=this.validateBatchServers(t);if(!i.isValid)throw $.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,d]of Object.entries(t)){let C=Z.normalizeTypeField(d);try{let f=await this.addMCPServerSingle(u,C);o.push({name:u,success:!0,config:C,tools:f.tools,status:f.status}),s.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:f.tools?.length||0})}catch(f){let x=this.handleError(f,"addMCPServersBatch",{serverName:u,serverConfig:C});o.push({name:u,success:!1,error:x.message,config:C}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:x.message})}}let c=s.length,l=r.length-c;if(c===0)throw $.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");R().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:c,failedCount:l,successfullyAddedServers:s,results:o,timestamp:new Date});let g={success:c>0,message:c===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:o,addedCount:c,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:c,failedCount:l}),g}catch(c){throw s.length>0&&await this.rollbackBatchAdd(s),c instanceof $?c:$.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`)}}validateBatchServers(e){let t=[];if(!e||typeof e!="object")return t.push("mcpServers \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};let r=Object.keys(e);if(r.length===0)return t.push("mcpServers \u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A"),{isValid:!1,errors:t};if(r.length>50)return t.push("\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7 50 \u4E2A"),{isValid:!1,errors:t};for(let[o,s]of Object.entries(e)){let i=ae.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(ae.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=Z.normalizeTypeField(s),l=ae.validateConfig(c);l.isValid||t.push(`\u670D\u52A1 "${o}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let o of e)try{try{await this.mcpServiceManager.stopService(o)}catch(s){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${o} \u5931\u8D25:`,s)}this.mcpServiceManager.removeServiceConfig(o),this.configManager.removeMcpServer(o),t.push(o),R().emitEvent("mcp:server:rollback",{serverName:o,timestamp:new Date})}catch(s){let i=this.handleError(s,"rollbackBatchAdd",{serverName:o});r.push(o),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${o} \u5931\u8D25:`,i.message)}r.length>0?this.logger.warn("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u90E8\u5206\u5931\u8D25",{totalServers:e.length,rollbackedCount:t.length,failedCount:r.length,failedServers:r}):this.logger.info("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u6210\u529F",{totalServers:e.length,rollbackedCount:t.length})}};(r=>{function n(o){let s=[];if(!o||typeof o!="object")return s.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:s};if("command"in o)(!o.command||typeof o.command!="string")&&s.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),o.args&&!Array.isArray(o.args)&&s.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),o.env&&typeof o.env!="object"&&s.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in o){(!o.url||typeof o.url!="string")&&s.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(o.url)}catch{s.push("URL \u683C\u5F0F\u65E0\u6548")}}else s.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:s.length===0,errors:s}}r.validateConfig=n,a(n,"validateConfig");function e(o){let s=[];return!o||typeof o!="string"?(s.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:s}):((o.length<1||o.length>50)&&s.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(o)||s.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:s.length===0,errors:s})}r.validateServiceName=e,a(e,"validateServiceName");function t(o,s){let i=s.getConfig();return i.mcpServers&&o in i.mcpServers}r.checkServiceExists=t,a(t,"checkServiceExists")})(ae||={})});var er,vs=m(()=>{"use strict";M();ft();z();er=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;configService;statusService;eventBus;constructor(e,t){this.logger=p.withTag("RealtimeNotificationHandler"),this.notificationService=e,this.configService=new ue,this.statusService=t,this.eventBus=R()}async handleMessage(e,t,r){try{switch(this.logger.debug(`\u5904\u7406 WebSocket \u6D88\u606F: ${t.type}`,{clientId:r}),this.eventBus.emitEvent("websocket:message:received",{type:t.type,data:t.data,clientId:r}),t.type){case"getConfig":await this.handleGetConfig(e,r);break;case"updateConfig":await this.handleUpdateConfig(e,t.data,r);break;case"getStatus":await this.handleGetStatus(e,r);break;case"restartService":await this.handleRestartService(e,r);break;default:this.logger.warn(`\u672A\u77E5\u7684 WebSocket \u6D88\u606F\u7C7B\u578B: ${t.type}`,{clientId:r}),this.sendError(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`)}}catch(o){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,o),this.sendError(e,"MESSAGE_PROCESSING_ERROR",o instanceof Error?o.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25")}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=await this.configService.getConfig();this.logger.debug("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t}),e.send(JSON.stringify({type:"config",data:r}))}catch(r){this.logger.error("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25")}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{await this.configService.updateConfig(t,`websocket-${r}`),this.logger.debug("WebSocket: updateConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:r})}catch(o){this.logger.error("WebSocket: updateConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",o),this.sendError(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25")}}async handleRestartService(e,t){this.logDeprecationWarning("WebSocket restartService","POST /api/services/restart");try{this.logger.info("WebSocket: \u6536\u5230\u670D\u52A1\u91CD\u542F\u8BF7\u6C42",{clientId:t}),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:`websocket-${t}`,delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting")}catch(r){this.logger.error("WebSocket: \u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",r),this.sendError(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25")}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}async sendInitialData(e,t){try{this.logger.debug("\u53D1\u9001\u521D\u59CB\u6570\u636E\u7ED9\u5BA2\u6237\u7AEF",{clientId:t});let r=await this.configService.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let o=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:o.client})),o.restart&&e.send(JSON.stringify({type:"restartStatus",data:o.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),this.sendError(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25")}}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{spawn as tr}from"child_process";var rr,Es=m(()=>{"use strict";Ao();M();z();rr=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=p.withTag("ServiceApiHandler"),this.statusService=e,this.eventBus=R()}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async restartService(e){try{return this.logger.info("\u5904\u7406\u670D\u52A1\u91CD\u542F\u8BF7\u6C42"),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:"http-api",delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting"),setTimeout(async()=>{try{await this.executeRestart(),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},5e3)}catch(t){this.logger.error("\u670D\u52A1\u91CD\u542F\u5931\u8D25:",t),this.statusService.updateRestartStatus("failed",t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF")}},500),e.json(this.createSuccessResponse(null,"\u91CD\u542F\u8BF7\u6C42\u5DF2\u63A5\u6536"))}catch(t){this.logger.error("\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25");return e.json(r,500)}}async executeRestart(){this.logger.info("\u6B63\u5728\u91CD\u542F MCP \u670D\u52A1...");try{let r=await(await Ne()).get("serviceManager").getStatus();if(!r.running){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),tr("xiaozhi",["start","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u542F\u52A8\u547D\u4EE4\u5DF2\u53D1\u9001");return}let o=r.mode==="daemon",s=["restart"];o&&s.push("--daemon"),tr("xiaozhi",s,{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u91CD\u542F\u547D\u4EE4\u5DF2\u53D1\u9001")}catch(e){throw this.logger.error("\u91CD\u542F\u670D\u52A1\u5931\u8D25:",e),e}}async stopService(e){try{return this.logger.info("\u5904\u7406\u670D\u52A1\u505C\u6B62\u8BF7\u6C42"),tr("xiaozhi",["stop"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u505C\u6B62\u547D\u4EE4\u5DF2\u53D1\u9001"),e.json(this.createSuccessResponse(null,"\u505C\u6B62\u8BF7\u6C42\u5DF2\u63A5\u6536"))}catch(t){this.logger.error("\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25:",t);let r=this.createErrorResponse("STOP_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25");return e.json(r,500)}}async startService(e){try{return this.logger.info("\u5904\u7406\u670D\u52A1\u542F\u52A8\u8BF7\u6C42"),tr("xiaozhi",["start","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u542F\u52A8\u547D\u4EE4\u5DF2\u53D1\u9001"),e.json(this.createSuccessResponse(null,"\u542F\u52A8\u8BF7\u6C42\u5DF2\u63A5\u6536"))}catch(t){this.logger.error("\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25:",t);let r=this.createErrorResponse("START_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25");return e.json(r,500)}}async getServiceStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u8BF7\u6C42");let o=await(await Ne()).get("serviceManager").getStatus();return this.logger.debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(o))}catch(t){this.logger.error("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("SERVICE_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getServiceHealth(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u8BF7\u6C42");let t={status:"healthy",timestamp:Date.now(),uptime:process.uptime(),memory:process.memoryUsage(),version:process.version};return this.logger.debug("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("SERVICE_HEALTH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}}});import{existsSync as or}from"fs";import{readFile as pl}from"fs/promises";import{dirname as ul,join as J}from"path";import{fileURLToPath as dl}from"url";var nr,Ss=m(()=>{"use strict";M();nr=class{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=p.withTag("StaticFileHandler"),this.initializeWebPath()}initializeWebPath(){try{let e=ul(dl(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[J(e,"..","..","apps","frontend","dist"),J(e,"..","apps","frontend","dist"),J(e,"..","..","apps","frontend"),J(e,"..","apps","frontend"),J(e,"..","..","web","dist"),J(e,"..","web","dist"),J(e,"..","..","web"),J(e,"..","web"),J(e,"..","..","..","apps","frontend","dist"),J(e,"..","..","..","apps","frontend"),J(e,"..","..","..","web","dist"),J(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=or(r);return this.logger.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?this.logger.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(this.logger.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),this.logger.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){this.logger.error("\u521D\u59CB\u5316\u9759\u6001\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",e)}}async handleStaticFile(e){let t=new URL(e.req.url).pathname;try{if(this.logger.debug(`\u5904\u7406\u9759\u6001\u6587\u4EF6\u8BF7\u6C42: ${t}`),!this.webPath)return this.createErrorPage(e,"\u627E\u4E0D\u5230\u524D\u7AEF\u8D44\u6E90\u6587\u4EF6");let r=t;if(r==="/"&&(r="/index.html"),r.includes(".."))return this.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",403);let o=J(this.webPath,r);if(!or(o)){let i=J(this.webPath,"index.html");return or(i)?(this.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,"text/html")):(this.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",404))}let s=this.getContentType(o);return this.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${s}`),this.serveFile(e,o,s)}catch(r){return this.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",500)}}async serveFile(e,t,r){try{let o=await pl(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(o.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(o),200,{"Content-Type":r})}catch(o){throw this.logger.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,o),o}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:"text/html",htm:"text/html",js:"application/javascript",mjs:"application/javascript",css:"text/css",json:"application/json",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",ico:"image/x-icon",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf",eot:"application/vnd.ms-fontobject",pdf:"application/pdf",txt:"text/plain",xml:"application/xml",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip"}[t||""]||"application/octet-stream"}createErrorPage(e,t){let r=`
|
|
37
|
-
<!DOCTYPE html>
|
|
38
|
-
<html>
|
|
39
|
-
<head>
|
|
40
|
-
<title>\u5C0F\u667A\u914D\u7F6E\u7BA1\u7406</title>
|
|
41
|
-
<meta charset="utf-8">
|
|
42
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
43
|
-
<style>
|
|
44
|
-
body {
|
|
45
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
46
|
-
max-width: 800px;
|
|
47
|
-
margin: 50px auto;
|
|
48
|
-
padding: 20px;
|
|
49
|
-
line-height: 1.6;
|
|
50
|
-
color: #333;
|
|
51
|
-
}
|
|
52
|
-
.error {
|
|
53
|
-
color: #e53e3e;
|
|
54
|
-
background: #fed7d7;
|
|
55
|
-
padding: 20px;
|
|
56
|
-
border-radius: 8px;
|
|
57
|
-
border-left: 4px solid #e53e3e;
|
|
58
|
-
}
|
|
59
|
-
.info {
|
|
60
|
-
background: #e6f3ff;
|
|
61
|
-
padding: 20px;
|
|
62
|
-
border-radius: 8px;
|
|
63
|
-
border-left: 4px solid #0066cc;
|
|
64
|
-
margin-top: 20px;
|
|
65
|
-
}
|
|
66
|
-
pre {
|
|
67
|
-
background: #f5f5f5;
|
|
68
|
-
padding: 10px;
|
|
69
|
-
border-radius: 4px;
|
|
70
|
-
overflow-x: auto;
|
|
71
|
-
}
|
|
72
|
-
h1 {
|
|
73
|
-
color: #2d3748;
|
|
74
|
-
margin-bottom: 20px;
|
|
75
|
-
}
|
|
76
|
-
</style>
|
|
77
|
-
</head>
|
|
78
|
-
<body>
|
|
79
|
-
<h1>\u5C0F\u667A\u914D\u7F6E\u7BA1\u7406</h1>
|
|
80
|
-
<div class="error">
|
|
81
|
-
<p><strong>\u9519\u8BEF\uFF1A</strong>${t}</p>
|
|
82
|
-
</div>
|
|
83
|
-
<div class="info">
|
|
84
|
-
<p><strong>\u89E3\u51B3\u65B9\u6848\uFF1A</strong></p>
|
|
85
|
-
<p>\u8BF7\u5148\u6784\u5EFA\u524D\u7AEF\u9879\u76EE\uFF1A</p>
|
|
86
|
-
<pre>cd apps/frontend && pnpm install && pnpm build</pre>
|
|
87
|
-
<p><em>\u5982\u679C\u4E0A\u9762\u7684\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF0C\u53EF\u4EE5\u5C1D\u8BD5\u65E7\u8DEF\u5F84\uFF1A</em></p>
|
|
88
|
-
<pre>cd web && pnpm install && pnpm build</pre>
|
|
89
|
-
<p>\u7136\u540E\u91CD\u65B0\u542F\u52A8\u670D\u52A1\u5668\u3002</p>
|
|
90
|
-
</div>
|
|
91
|
-
</body>
|
|
92
|
-
</html>
|
|
93
|
-
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&or(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var sr,ys=m(()=>{"use strict";M();sr=class{static{a(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 Ge,Ts=m(()=>{"use strict";Ge=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(Ge||{})});import ml from"ajv";import ir from"dayjs";var ar,Ms=m(()=>{"use strict";ve();M();ee();Ts();ar=class{static{a(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=p.withTag("ToolApiHandler"),this.ajv=new ml({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}}}ensureValidStatusCode(e){return e>=100&&e<600?e:500}createHonoResponse(e,t,r){return e.json(t,r)}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:o,args:s}=t;if(!r||!o){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${o}\uFF0C\u53C2\u6570:`,JSON.stringify(s));let i=e.get("mcpServiceManager");if(!i){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)}await this.validateServiceAndTool(i,r,o),r==="customMCP"&&await this.validateCustomMCPArguments(i,o,s||{});let c;if(r==="customMCP")c=await i.callTool(o,s||{});else{let l=`${r}__${o}`;c=await i.callTool(l,s||{})}return e.json(this.createSuccessResponse(c,"\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),o="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?o="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?o="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?o="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?o="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?o="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(o="TIMEOUT_ERROR");let s=this.createErrorResponse(o,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"),!h.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=h.getCustomMCPTools(),r=h.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(!h.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=h.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=h.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let o={list:r,total:r.length};return e.json(this.createSuccessResponse(o,`\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=h.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),o=await new Ce().getAllCachedTools(),s=h.getConfig(),i=new Set(Object.keys(s.mcpServers||{})),c=[];for(let l of o){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 u={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:g,toolName:l.name.split("__").slice(1).join("__")}}};c.push(u)}return this.logger.debug(`\u4ECE ${o.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${c.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),c}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 o=e.getCustomMCPTools().map(s=>s.name);throw o.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: ${o.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(o){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,o),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 u=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(d=>{let C=d.instancePath||d.schemaPath||"",f=d.message||"\u672A\u77E5\u9519\u8BEF";if(d.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${d.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(d.keyword==="type"){let x=d.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${C} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${x}`}if(d.keyword==="enum"){let x=d.params?.allowedValues||[];return`\u53C2\u6570 ${C} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${x.join(", ")}`}return`\u53C2\u6570 ${C} ${f}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,u),new Error(u)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(o){throw o instanceof Error&&o.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,o),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${o instanceof Error?o.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:o}=this.handleAddToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}isNewFormatRequest(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:o}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(Ge).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(Ge).join(", ")}`);return e.json(s,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,o);case"coze":return await this.handleAddCozeTool(e,o);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:o,customDescription:s,parameterConfig:i}=t,c=this.performPreChecks(r,o,s);if(c)return this.createHonoResponse(e,c.errorResponse,this.ensureValidStatusCode(c.statusCode));let l=this.convertWorkflowToTool(r,o,s,i);return h.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:o,customName:s,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${o}`),!r||!o){let V=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(V,400)}let c=e.get("mcpServiceManager");if(!c){let V=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(V,503)}try{await this.validateServiceAndTool(c,r,o)}catch(V){let nc=V instanceof Error?V.message:String(V),sc=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",nc);return e.json(sc,404)}let g=await new Ce().getAllCachedTools(),u=`${r}__${o}`,d=g.find(V=>V.name===u);if(!d){let V=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`);return e.json(V,404)}let C=s||u,f=h.getCustomMCPTools();if(new Set(f.map(V=>V.name)).has(C)){let V=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${C}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(V,409)}let Oe={name:C,description:i||d.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:d.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:ir().format("YYYY-MM-DD HH:mm:ss")}};h.addCustomMCPTool(Oe),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`);let Ke=h.getServerToolsConfig(r);Ke?.toolName&&(Ke[o].enable=!0,h.updateServerToolsConfig(r,Ke),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${C}`);let oc={tool:Oe,toolName:C,toolType:"mcp",addedAt:ir().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(oc,`MCP \u5DE5\u5177 "${C}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:s,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let c=this.performPreChecks(r,o,s);if(c)return this.createHonoResponse(e,c.errorResponse,this.ensureValidStatusCode(c.statusCode));let l=this.convertWorkflowToTool(r,o,s,i);h.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:ir().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 o=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(o,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleUpdateToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:s}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!Object.values(Ge).includes(o)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(Ge).join(", ")}`);return e.json(i,400)}switch(o){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 ${o} \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: ${o}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:o,customName:s,customDescription:i,parameterConfig:c}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=h.getCustomMCPTools().find(f=>f.name===t);if(!g){let f=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(f,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let f=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(f,400)}!o.workflow_id&&g.handler?.config?.workflow_id&&(o.workflow_id=g.handler.config.workflow_id),!o.workflow_id&&o.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(o);let u=this.generateInputSchema(o,c),d={...g,description:i||g.description,inputSchema:u};h.updateCustomMCPTool(t,d),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let C={tool:d,toolName:t,toolType:"coze",updatedAt:ir().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(C,`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 o=h.getCustomMCPTools().find(s=>s.name===t);if(o&&o.handler.type==="mcp"){let s=o.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=h.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,h.updateServerToolsConfig(s.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return h.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:o}=this.handleRemoveToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}convertWorkflowToTool(e,t,r,o){this.validateWorkflowData(e);let s=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(s),c=this.generateToolDescription(e,r),l=this.generateInputSchema(e,o),g=this.createHttpHandler(e),u={name:i,description:c,inputSchema:l,handler:g};return this.validateGeneratedTool(u),u}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[o,s]of Object.entries(t))r=r.replace(new RegExp(o,"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:o}of t){let s=e[r];if(!s||typeof s!="string"||s.trim()==="")throw new Error(`${o}\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:o,max:s}of t){let i=e[r];if(i&&i.length>s)throw new Error(`${o}\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 o of t)if(r.includes(o))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${o}`)}resolveToolNameConflict(e){let t=h.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),o=e,s=1;for(;r.has(o);)if(o=`${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 o}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=h.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),!h.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),e.handler&&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 o=r.slice(2,-2).trim();if(!o||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(o))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 o of e.parameters)t[o.fieldName]={type:o.type,description:o.description},o.required&&r.push(o.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,o]of Object.entries(t))if(e.includes(r))return o;return e}performPreChecks(e,t,r){let o=this.checkBasicParameters(e,t,r);if(o)return o;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(!Array.isArray(e)){let o=e;if(!o.workflow_id||typeof o.workflow_id!="string"||!o.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(!o.workflow_name||typeof o.workflow_name!="string"||!o.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=h.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=h.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,o=1024*1024;if(r>o)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}}});import*as lr from"fs";var cr,Rs=m(()=>{"use strict";Re();Ee();M();io();cr=class{static{a(this,"ToolCallLogService")}logger;configDir;constructor(e){this.logger=p.withTag("ToolCallLogService"),this.configDir=e||A.getConfigDir()}getLogFilePath(){return new Ue({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!lr.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=lr.readFileSync(e,"utf8").trim().split(`
|
|
94
|
-
`).filter(s=>s.trim()!==""),o=[];for(let s of r)try{let i=JSON.parse(s);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp||this.logger.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233, \u5DF2\u4FDD\u6301\u4E3A undefined:",s),o.push(i)}catch{this.logger.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C:",s)}return o.sort((s,i)=>(i.timestamp||0)-(s.timestamp||0)),o}catch(t){throw this.logger.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25:",t),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(o=>o.toolName.toLowerCase().includes(t.toolName.toLowerCase()))),t.serverName&&(r=r.filter(o=>o.serverName?.toLowerCase().includes(t.serverName.toLowerCase()))),t.success!==void 0&&(r=r.filter(o=>o.success===t.success)),t.startDate||t.endDate){let o=t.startDate?new Date(t.startDate).getTime():0,s=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let c=i.timestamp||0;return c>=o&&c<=s})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),o=r.length,s=Math.min(e.limit||_e.DEFAULT_LIMIT,_e.MAX_LIMIT),i=e.offset||0,c=r.slice(i,i+s),l=i+s<o;return this.logger.debug(`\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7: ${c.length}/${o} \u6761\u8BB0\u5F55`),{records:c,total:o,hasMore:l}}}});import{z as Me}from"zod";var hl,gr,ws=m(()=>{"use strict";Re();M();Rs();hl=Me.object({limit:Me.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=_e.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${_e.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Me.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:Me.string().optional(),serverName:Me.string().optional(),success:Me.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Me.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:Me.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(n=>!n.startDate||!n.endDate?!0:new Date(n.startDate)<=new Date(n.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),gr=class{static{a(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new cr}createSuccessResponse(e){let t={success:!0,data:e};return Response.json(t)}createErrorResponse(e,t,r){let o={success:!1,error:{code:e,message:t,details:r}};return Response.json(o,{status:this.getHttpStatusCode(e)})}getHttpStatusCode(e){switch(e){case"INVALID_QUERY_PARAMETERS":return 400;case"LOG_FILE_NOT_FOUND":return 404;case"LOG_FILE_READ_ERROR":return 500;default:return 500}}parseAndValidateQueryParams(e){let t=e.req.query(),r=hl.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.map(o=>({field:o.path.join("."),message:o.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return this.createErrorResponse("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error);let r=await this.toolCallLogService.getToolCallLogs(t.data);return p.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){p.error("\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF";return r.includes("\u4E0D\u5B58\u5728")?this.createErrorResponse("LOG_FILE_NOT_FOUND",r):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?this.createErrorResponse("LOG_FILE_READ_ERROR",r):this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r})}}}});var Ct=S((Kv,Ps)=>{"use strict";var fl="2.0.0",Cl=Number.MAX_SAFE_INTEGER||9007199254740991,vl=16,El=250,Sl=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Ps.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:vl,MAX_SAFE_BUILD_LENGTH:El,MAX_SAFE_INTEGER:Cl,RELEASE_TYPES:Sl,SEMVER_SPEC_VERSION:fl,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var vt=S((Yv,bs)=>{"use strict";var yl=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};bs.exports=yl});var Je=S((de,Is)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:xo,MAX_SAFE_BUILD_LENGTH:Tl,MAX_LENGTH:Ml}=Ct(),Rl=vt();de=Is.exports={};var wl=de.re=[],Pl=de.safeRe=[],v=de.src=[],bl=de.safeSrc=[],E=de.t={},Il=0,$o="[a-zA-Z0-9-]",Nl=[["\\s",1],["\\d",Ml],[$o,Tl]],Al=a(n=>{for(let[e,t]of Nl)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),y=a((n,e,t)=>{let r=Al(e),o=Il++;Rl(n,o,e),E[n]=o,v[o]=e,bl[o]=r,wl[o]=new RegExp(e,t?"g":void 0),Pl[o]=new RegExp(r,t?"g":void 0)},"createToken");y("NUMERICIDENTIFIER","0|[1-9]\\d*");y("NUMERICIDENTIFIERLOOSE","\\d+");y("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${$o}*`);y("MAINVERSION",`(${v[E.NUMERICIDENTIFIER]})\\.(${v[E.NUMERICIDENTIFIER]})\\.(${v[E.NUMERICIDENTIFIER]})`);y("MAINVERSIONLOOSE",`(${v[E.NUMERICIDENTIFIERLOOSE]})\\.(${v[E.NUMERICIDENTIFIERLOOSE]})\\.(${v[E.NUMERICIDENTIFIERLOOSE]})`);y("PRERELEASEIDENTIFIER",`(?:${v[E.NONNUMERICIDENTIFIER]}|${v[E.NUMERICIDENTIFIER]})`);y("PRERELEASEIDENTIFIERLOOSE",`(?:${v[E.NONNUMERICIDENTIFIER]}|${v[E.NUMERICIDENTIFIERLOOSE]})`);y("PRERELEASE",`(?:-(${v[E.PRERELEASEIDENTIFIER]}(?:\\.${v[E.PRERELEASEIDENTIFIER]})*))`);y("PRERELEASELOOSE",`(?:-?(${v[E.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${v[E.PRERELEASEIDENTIFIERLOOSE]})*))`);y("BUILDIDENTIFIER",`${$o}+`);y("BUILD",`(?:\\+(${v[E.BUILDIDENTIFIER]}(?:\\.${v[E.BUILDIDENTIFIER]})*))`);y("FULLPLAIN",`v?${v[E.MAINVERSION]}${v[E.PRERELEASE]}?${v[E.BUILD]}?`);y("FULL",`^${v[E.FULLPLAIN]}$`);y("LOOSEPLAIN",`[v=\\s]*${v[E.MAINVERSIONLOOSE]}${v[E.PRERELEASELOOSE]}?${v[E.BUILD]}?`);y("LOOSE",`^${v[E.LOOSEPLAIN]}$`);y("GTLT","((?:<|>)?=?)");y("XRANGEIDENTIFIERLOOSE",`${v[E.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);y("XRANGEIDENTIFIER",`${v[E.NUMERICIDENTIFIER]}|x|X|\\*`);y("XRANGEPLAIN",`[v=\\s]*(${v[E.XRANGEIDENTIFIER]})(?:\\.(${v[E.XRANGEIDENTIFIER]})(?:\\.(${v[E.XRANGEIDENTIFIER]})(?:${v[E.PRERELEASE]})?${v[E.BUILD]}?)?)?`);y("XRANGEPLAINLOOSE",`[v=\\s]*(${v[E.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[E.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[E.XRANGEIDENTIFIERLOOSE]})(?:${v[E.PRERELEASELOOSE]})?${v[E.BUILD]}?)?)?`);y("XRANGE",`^${v[E.GTLT]}\\s*${v[E.XRANGEPLAIN]}$`);y("XRANGELOOSE",`^${v[E.GTLT]}\\s*${v[E.XRANGEPLAINLOOSE]}$`);y("COERCEPLAIN",`(^|[^\\d])(\\d{1,${xo}})(?:\\.(\\d{1,${xo}}))?(?:\\.(\\d{1,${xo}}))?`);y("COERCE",`${v[E.COERCEPLAIN]}(?:$|[^\\d])`);y("COERCEFULL",v[E.COERCEPLAIN]+`(?:${v[E.PRERELEASE]})?(?:${v[E.BUILD]})?(?:$|[^\\d])`);y("COERCERTL",v[E.COERCE],!0);y("COERCERTLFULL",v[E.COERCEFULL],!0);y("LONETILDE","(?:~>?)");y("TILDETRIM",`(\\s*)${v[E.LONETILDE]}\\s+`,!0);de.tildeTrimReplace="$1~";y("TILDE",`^${v[E.LONETILDE]}${v[E.XRANGEPLAIN]}$`);y("TILDELOOSE",`^${v[E.LONETILDE]}${v[E.XRANGEPLAINLOOSE]}$`);y("LONECARET","(?:\\^)");y("CARETTRIM",`(\\s*)${v[E.LONECARET]}\\s+`,!0);de.caretTrimReplace="$1^";y("CARET",`^${v[E.LONECARET]}${v[E.XRANGEPLAIN]}$`);y("CARETLOOSE",`^${v[E.LONECARET]}${v[E.XRANGEPLAINLOOSE]}$`);y("COMPARATORLOOSE",`^${v[E.GTLT]}\\s*(${v[E.LOOSEPLAIN]})$|^$`);y("COMPARATOR",`^${v[E.GTLT]}\\s*(${v[E.FULLPLAIN]})$|^$`);y("COMPARATORTRIM",`(\\s*)${v[E.GTLT]}\\s*(${v[E.LOOSEPLAIN]}|${v[E.XRANGEPLAIN]})`,!0);de.comparatorTrimReplace="$1$2$3";y("HYPHENRANGE",`^\\s*(${v[E.XRANGEPLAIN]})\\s+-\\s+(${v[E.XRANGEPLAIN]})\\s*$`);y("HYPHENRANGELOOSE",`^\\s*(${v[E.XRANGEPLAINLOOSE]})\\s+-\\s+(${v[E.XRANGEPLAINLOOSE]})\\s*$`);y("STAR","(<|>)?=?\\s*\\*");y("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");y("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var pr=S((Zv,Ns)=>{"use strict";var xl=Object.freeze({loose:!0}),$l=Object.freeze({}),Ol=a(n=>n?typeof n!="object"?xl:n:$l,"parseOptions");Ns.exports=Ol});var Oo=S((tE,$s)=>{"use strict";var As=/^[0-9]+$/,xs=a((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=As.test(n),r=As.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),Dl=a((n,e)=>xs(e,n),"rcompareIdentifiers");$s.exports={compareIdentifiers:xs,rcompareIdentifiers:Dl}});var F=S((oE,Ds)=>{"use strict";var ur=vt(),{MAX_LENGTH:Os,MAX_SAFE_INTEGER:dr}=Ct(),{safeRe:mr,t:hr}=Je(),Ll=pr(),{compareIdentifiers:Do}=Oo(),Lo=class n{static{a(this,"SemVer")}constructor(e,t){if(t=Ll(t),e instanceof n){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>Os)throw new TypeError(`version is longer than ${Os} characters`);ur("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?mr[hr.LOOSE]:mr[hr.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>dr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>dr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>dr||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(o=>{if(/^[0-9]+$/.test(o)){let s=+o;if(s>=0&&s<dr)return s}return o}):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(ur("SemVer.compare",this.version,this.options,e),!(e instanceof n)){if(typeof e=="string"&&e===this.version)return 0;e=new n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof n||(e=new n(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 n||(e=new n(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],o=e.prerelease[t];if(ur("prerelease compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return Do(r,o)}while(++t)}compareBuild(e){e instanceof n||(e=new n(e,this.options));let t=0;do{let r=this.build[t],o=e.build[t];if(ur("build compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return Do(r,o)}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 o=`-${t}`.match(this.options.loose?mr[hr.PRERELEASELOOSE]:mr[hr.PRERELEASE]);if(!o||o[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 o=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[o];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(o)}}if(t){let s=[t,o];r===!1&&(s=[t]),Do(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}};Ds.exports=Lo});var Ae=S((sE,_s)=>{"use strict";var Ls=F(),_l=a((n,e,t=!1)=>{if(n instanceof Ls)return n;try{return new Ls(n,e)}catch(r){if(!t)return null;throw r}},"parse");_s.exports=_l});var js=S((aE,ks)=>{"use strict";var kl=Ae(),jl=a((n,e)=>{let t=kl(n,e);return t?t.version:null},"valid");ks.exports=jl});var zs=S((lE,Hs)=>{"use strict";var Hl=Ae(),zl=a((n,e)=>{let t=Hl(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Hs.exports=zl});var Vs=S((pE,Us)=>{"use strict";var Fs=F(),Fl=a((n,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new Fs(n instanceof Fs?n.version:n,t).inc(e,r,o).version}catch{return null}},"inc");Us.exports=Fl});var qs=S((dE,Bs)=>{"use strict";var Ws=Ae(),Ul=a((n,e)=>{let t=Ws(n,null,!0),r=Ws(e,null,!0),o=t.compare(r);if(o===0)return null;let s=o>0,i=s?t:r,c=s?r:t,l=!!i.prerelease.length;if(!!c.prerelease.length&&!l){if(!c.patch&&!c.minor)return"major";if(c.compareMain(i)===0)return c.minor&&!c.patch?"minor":"patch"}let u=l?"pre":"";return t.major!==r.major?u+"major":t.minor!==r.minor?u+"minor":t.patch!==r.patch?u+"patch":"prerelease"},"diff");Bs.exports=Ul});var Js=S((hE,Gs)=>{"use strict";var Vl=F(),Wl=a((n,e)=>new Vl(n,e).major,"major");Gs.exports=Wl});var Ks=S((CE,Xs)=>{"use strict";var Bl=F(),ql=a((n,e)=>new Bl(n,e).minor,"minor");Xs.exports=ql});var Qs=S((EE,Ys)=>{"use strict";var Gl=F(),Jl=a((n,e)=>new Gl(n,e).patch,"patch");Ys.exports=Jl});var ei=S((yE,Zs)=>{"use strict";var Xl=Ae(),Kl=a((n,e)=>{let t=Xl(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Zs.exports=Kl});var te=S((ME,ri)=>{"use strict";var ti=F(),Yl=a((n,e,t)=>new ti(n,t).compare(new ti(e,t)),"compare");ri.exports=Yl});var ni=S((wE,oi)=>{"use strict";var Ql=te(),Zl=a((n,e,t)=>Ql(e,n,t),"rcompare");oi.exports=Zl});var ii=S((bE,si)=>{"use strict";var eg=te(),tg=a((n,e)=>eg(n,e,!0),"compareLoose");si.exports=tg});var fr=S((NE,ci)=>{"use strict";var ai=F(),rg=a((n,e,t)=>{let r=new ai(n,t),o=new ai(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");ci.exports=rg});var gi=S((xE,li)=>{"use strict";var og=fr(),ng=a((n,e)=>n.sort((t,r)=>og(t,r,e)),"sort");li.exports=ng});var ui=S((OE,pi)=>{"use strict";var sg=fr(),ig=a((n,e)=>n.sort((t,r)=>sg(r,t,e)),"rsort");pi.exports=ig});var Et=S((LE,di)=>{"use strict";var ag=te(),cg=a((n,e,t)=>ag(n,e,t)>0,"gt");di.exports=cg});var Cr=S((kE,mi)=>{"use strict";var lg=te(),gg=a((n,e,t)=>lg(n,e,t)<0,"lt");mi.exports=gg});var _o=S((HE,hi)=>{"use strict";var pg=te(),ug=a((n,e,t)=>pg(n,e,t)===0,"eq");hi.exports=ug});var ko=S((FE,fi)=>{"use strict";var dg=te(),mg=a((n,e,t)=>dg(n,e,t)!==0,"neq");fi.exports=mg});var vr=S((VE,Ci)=>{"use strict";var hg=te(),fg=a((n,e,t)=>hg(n,e,t)>=0,"gte");Ci.exports=fg});var Er=S((BE,vi)=>{"use strict";var Cg=te(),vg=a((n,e,t)=>Cg(n,e,t)<=0,"lte");vi.exports=vg});var jo=S((GE,Ei)=>{"use strict";var Eg=_o(),Sg=ko(),yg=Et(),Tg=vr(),Mg=Cr(),Rg=Er(),wg=a((n,e,t,r)=>{switch(e){case"===":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n===t;case"!==":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n!==t;case"":case"=":case"==":return Eg(n,t,r);case"!=":return Sg(n,t,r);case">":return yg(n,t,r);case">=":return Tg(n,t,r);case"<":return Mg(n,t,r);case"<=":return Rg(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Ei.exports=wg});var yi=S((XE,Si)=>{"use strict";var Pg=F(),bg=Ae(),{safeRe:Sr,t:yr}=Je(),Ig=a((n,e)=>{if(n instanceof Pg)return n;if(typeof n=="number"&&(n=String(n)),typeof n!="string")return null;e=e||{};let t=null;if(!e.rtl)t=n.match(e.includePrerelease?Sr[yr.COERCEFULL]:Sr[yr.COERCE]);else{let l=e.includePrerelease?Sr[yr.COERCERTLFULL]:Sr[yr.COERCERTL],g;for(;(g=l.exec(n))&&(!t||t.index+t[0].length!==n.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],o=t[3]||"0",s=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",c=e.includePrerelease&&t[6]?`+${t[6]}`:"";return bg(`${r}.${o}.${s}${i}${c}`,e)},"coerce");Si.exports=Ig});var Mi=S((YE,Ti)=>{"use strict";var Ho=class{static{a(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 o=this.map.keys().next().value;this.delete(o)}this.map.set(e,t)}return this}};Ti.exports=Ho});var re=S((ZE,bi)=>{"use strict";var Ng=/\s+/g,zo=class n{static{a(this,"Range")}constructor(e,t){if(t=xg(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof Fo)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(Ng," "),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(o=>!wi(o[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let o of this.set)if(o.length===1&&jg(o[0])){this.set=[o];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&&_g)|(this.options.loose&&kg))+":"+e,o=Ri.get(r);if(o)return o;let s=this.options.loose,i=s?q[U.HYPHENRANGELOOSE]:q[U.HYPHENRANGE];e=e.replace(i,Jg(this.options.includePrerelease)),I("hyphen replace",e),e=e.replace(q[U.COMPARATORTRIM],Og),I("comparator trim",e),e=e.replace(q[U.TILDETRIM],Dg),I("tilde trim",e),e=e.replace(q[U.CARETTRIM],Lg),I("caret trim",e);let c=e.split(" ").map(d=>Hg(d,this.options)).join(" ").split(/\s+/).map(d=>Gg(d,this.options));s&&(c=c.filter(d=>(I("loose invalid filter",d,this.options),!!d.match(q[U.COMPARATORLOOSE])))),I("range list",c);let l=new Map,g=c.map(d=>new Fo(d,this.options));for(let d of g){if(wi(d))return[d];l.set(d.value,d)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return Ri.set(r,u),u}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Pi(r,t)&&e.set.some(o=>Pi(o,t)&&r.every(s=>o.every(i=>s.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new $g(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Xg(this.set[t],e,this.options))return!0;return!1}};bi.exports=zo;var Ag=Mi(),Ri=new Ag,xg=pr(),Fo=St(),I=vt(),$g=F(),{safeRe:q,t:U,comparatorTrimReplace:Og,tildeTrimReplace:Dg,caretTrimReplace:Lg}=Je(),{FLAG_INCLUDE_PRERELEASE:_g,FLAG_LOOSE:kg}=Ct(),wi=a(n=>n.value==="<0.0.0-0","isNullSet"),jg=a(n=>n.value==="","isAny"),Pi=a((n,e)=>{let t=!0,r=n.slice(),o=r.pop();for(;t&&r.length;)t=r.every(s=>o.intersects(s,e)),o=r.pop();return t},"isSatisfiable"),Hg=a((n,e)=>(n=n.replace(q[U.BUILD],""),I("comp",n,e),n=Ug(n,e),I("caret",n),n=zg(n,e),I("tildes",n),n=Wg(n,e),I("xrange",n),n=qg(n,e),I("stars",n),n),"parseComparator"),G=a(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),zg=a((n,e)=>n.trim().split(/\s+/).map(t=>Fg(t,e)).join(" "),"replaceTildes"),Fg=a((n,e)=>{let t=e.loose?q[U.TILDELOOSE]:q[U.TILDE];return n.replace(t,(r,o,s,i,c)=>{I("tilde",n,r,o,s,i,c);let l;return G(o)?l="":G(s)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:G(i)?l=`>=${o}.${s}.0 <${o}.${+s+1}.0-0`:c?(I("replaceTilde pr",c),l=`>=${o}.${s}.${i}-${c} <${o}.${+s+1}.0-0`):l=`>=${o}.${s}.${i} <${o}.${+s+1}.0-0`,I("tilde return",l),l})},"replaceTilde"),Ug=a((n,e)=>n.trim().split(/\s+/).map(t=>Vg(t,e)).join(" "),"replaceCarets"),Vg=a((n,e)=>{I("caret",n,e);let t=e.loose?q[U.CARETLOOSE]:q[U.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(o,s,i,c,l)=>{I("caret",n,o,s,i,c,l);let g;return G(s)?g="":G(i)?g=`>=${s}.0.0${r} <${+s+1}.0.0-0`:G(c)?s==="0"?g=`>=${s}.${i}.0${r} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.0${r} <${+s+1}.0.0-0`:l?(I("replaceCaret pr",l),s==="0"?i==="0"?g=`>=${s}.${i}.${c}-${l} <${s}.${i}.${+c+1}-0`:g=`>=${s}.${i}.${c}-${l} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.${c}-${l} <${+s+1}.0.0-0`):(I("no pr"),s==="0"?i==="0"?g=`>=${s}.${i}.${c}${r} <${s}.${i}.${+c+1}-0`:g=`>=${s}.${i}.${c}${r} <${s}.${+i+1}.0-0`:g=`>=${s}.${i}.${c} <${+s+1}.0.0-0`),I("caret return",g),g})},"replaceCaret"),Wg=a((n,e)=>(I("replaceXRanges",n,e),n.split(/\s+/).map(t=>Bg(t,e)).join(" ")),"replaceXRanges"),Bg=a((n,e)=>{n=n.trim();let t=e.loose?q[U.XRANGELOOSE]:q[U.XRANGE];return n.replace(t,(r,o,s,i,c,l)=>{I("xRange",n,r,o,s,i,c,l);let g=G(s),u=g||G(i),d=u||G(c),C=d;return o==="="&&C&&(o=""),l=e.includePrerelease?"-0":"",g?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&C?(u&&(i=0),c=0,o===">"?(o=">=",u?(s=+s+1,i=0,c=0):(i=+i+1,c=0)):o==="<="&&(o="<",u?s=+s+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+s}.${i}.${c}${l}`):u?r=`>=${s}.0.0${l} <${+s+1}.0.0-0`:d&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),I("xRange return",r),r})},"replaceXRange"),qg=a((n,e)=>(I("replaceStars",n,e),n.trim().replace(q[U.STAR],"")),"replaceStars"),Gg=a((n,e)=>(I("replaceGTE0",n,e),n.trim().replace(q[e.includePrerelease?U.GTE0PRE:U.GTE0],"")),"replaceGTE0"),Jg=a(n=>(e,t,r,o,s,i,c,l,g,u,d,C)=>(G(r)?t="":G(o)?t=`>=${r}.0.0${n?"-0":""}`:G(s)?t=`>=${r}.${o}.0${n?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,G(g)?l="":G(u)?l=`<${+g+1}.0.0-0`:G(d)?l=`<${g}.${+u+1}.0-0`:C?l=`<=${g}.${u}.${d}-${C}`:n?l=`<${g}.${u}.${+d+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),Xg=a((n,e,t)=>{for(let r=0;r<n.length;r++)if(!n[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<n.length;r++)if(I(n[r].semver),n[r].semver!==Fo.ANY&&n[r].semver.prerelease.length>0){let o=n[r].semver;if(o.major===e.major&&o.minor===e.minor&&o.patch===e.patch)return!0}return!1}return!0},"testSet")});var St=S((tS,Oi)=>{"use strict";var yt=Symbol("SemVer ANY"),Wo=class n{static{a(this,"Comparator")}static get ANY(){return yt}constructor(e,t){if(t=Ii(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Vo("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===yt?this.value="":this.value=this.operator+this.semver.version,Vo("comp",this)}parse(e){let t=this.options.loose?Ni[Ai.COMPARATORLOOSE]:Ni[Ai.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 xi(r[2],this.options.loose):this.semver=yt}toString(){return this.value}test(e){if(Vo("Comparator.test",e,this.options.loose),this.semver===yt||e===yt)return!0;if(typeof e=="string")try{e=new xi(e,this.options)}catch{return!1}return Uo(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new $i(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new $i(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("=")||Uo(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Uo(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Oi.exports=Wo;var Ii=pr(),{safeRe:Ni,t:Ai}=Je(),Uo=jo(),Vo=vt(),xi=F(),$i=re()});var Tt=S((oS,Di)=>{"use strict";var Kg=re(),Yg=a((n,e,t)=>{try{e=new Kg(e,t)}catch{return!1}return e.test(n)},"satisfies");Di.exports=Yg});var _i=S((sS,Li)=>{"use strict";var Qg=re(),Zg=a((n,e)=>new Qg(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");Li.exports=Zg});var ji=S((aS,ki)=>{"use strict";var ep=F(),tp=re(),rp=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new tp(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new ep(r,t))}),r},"maxSatisfying");ki.exports=rp});var zi=S((lS,Hi)=>{"use strict";var op=F(),np=re(),sp=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new np(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new op(r,t))}),r},"minSatisfying");Hi.exports=sp});var Vi=S((pS,Ui)=>{"use strict";var Bo=F(),ip=re(),Fi=Et(),ap=a((n,e)=>{n=new ip(n,e);let t=new Bo("0.0.0");if(n.test(t)||(t=new Bo("0.0.0-0"),n.test(t)))return t;t=null;for(let r=0;r<n.set.length;++r){let o=n.set[r],s=null;o.forEach(i=>{let c=new Bo(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!s||Fi(c,s))&&(s=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Fi(t,s))&&(t=s)}return t&&n.test(t)?t:null},"minVersion");Ui.exports=ap});var Bi=S((dS,Wi)=>{"use strict";var cp=re(),lp=a((n,e)=>{try{return new cp(n,e).range||"*"}catch{return null}},"validRange");Wi.exports=lp});var Tr=S((hS,Xi)=>{"use strict";var gp=F(),Ji=St(),{ANY:pp}=Ji,up=re(),dp=Tt(),qi=Et(),Gi=Cr(),mp=Er(),hp=vr(),fp=a((n,e,t,r)=>{n=new gp(n,r),e=new up(e,r);let o,s,i,c,l;switch(t){case">":o=qi,s=mp,i=Gi,c=">",l=">=";break;case"<":o=Gi,s=hp,i=qi,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(dp(n,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],d=null,C=null;if(u.forEach(f=>{f.semver===pp&&(f=new Ji(">=0.0.0")),d=d||f,C=C||f,o(f.semver,d.semver,r)?d=f:i(f.semver,C.semver,r)&&(C=f)}),d.operator===c||d.operator===l||(!C.operator||C.operator===c)&&s(n,C.semver))return!1;if(C.operator===l&&i(n,C.semver))return!1}return!0},"outside");Xi.exports=fp});var Yi=S((CS,Ki)=>{"use strict";var Cp=Tr(),vp=a((n,e,t)=>Cp(n,e,">",t),"gtr");Ki.exports=vp});var Zi=S((ES,Qi)=>{"use strict";var Ep=Tr(),Sp=a((n,e,t)=>Ep(n,e,"<",t),"ltr");Qi.exports=Sp});var ra=S((yS,ta)=>{"use strict";var ea=re(),yp=a((n,e,t)=>(n=new ea(n,t),e=new ea(e,t),n.intersects(e,t)),"intersects");ta.exports=yp});var na=S((MS,oa)=>{"use strict";var Tp=Tt(),Mp=te();oa.exports=(n,e,t)=>{let r=[],o=null,s=null,i=n.sort((u,d)=>Mp(u,d,t));for(let u of i)Tp(u,e,t)?(s=u,o||(o=u)):(s&&r.push([o,s]),s=null,o=null);o&&r.push([o,null]);let c=[];for(let[u,d]of r)u===d?c.push(u):!d&&u===i[0]?c.push("*"):d?u===i[0]?c.push(`<=${d}`):c.push(`${u} - ${d}`):c.push(`>=${u}`);let l=c.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var ga=S((RS,la)=>{"use strict";var sa=re(),Go=St(),{ANY:qo}=Go,Mt=Tt(),Jo=te(),Rp=a((n,e,t={})=>{if(n===e)return!0;n=new sa(n,t),e=new sa(e,t);let r=!1;e:for(let o of n.set){for(let s of e.set){let i=Pp(o,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),wp=[new Go(">=0.0.0-0")],ia=[new Go(">=0.0.0")],Pp=a((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===qo){if(e.length===1&&e[0].semver===qo)return!0;t.includePrerelease?n=wp:n=ia}if(e.length===1&&e[0].semver===qo){if(t.includePrerelease)return!0;e=ia}let r=new Set,o,s;for(let f of n)f.operator===">"||f.operator===">="?o=aa(o,f,t):f.operator==="<"||f.operator==="<="?s=ca(s,f,t):r.add(f.semver);if(r.size>1)return null;let i;if(o&&s){if(i=Jo(o.semver,s.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||s.operator!=="<="))return null}for(let f of r){if(o&&!Mt(f,String(o),t)||s&&!Mt(f,String(s),t))return null;for(let x of e)if(!Mt(f,String(x),t))return!1;return!0}let c,l,g,u,d=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,C=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;d&&d.prerelease.length===1&&s.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let f of e){if(u=u||f.operator===">"||f.operator===">=",g=g||f.operator==="<"||f.operator==="<=",o){if(C&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===C.major&&f.semver.minor===C.minor&&f.semver.patch===C.patch&&(C=!1),f.operator===">"||f.operator===">="){if(c=aa(o,f,t),c===f&&c!==o)return!1}else if(o.operator===">="&&!Mt(o.semver,String(f),t))return!1}if(s){if(d&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===d.major&&f.semver.minor===d.minor&&f.semver.patch===d.patch&&(d=!1),f.operator==="<"||f.operator==="<="){if(l=ca(s,f,t),l===f&&l!==s)return!1}else if(s.operator==="<="&&!Mt(s.semver,String(f),t))return!1}if(!f.operator&&(s||o)&&i!==0)return!1}return!(o&&g&&!s&&i!==0||s&&u&&!o&&i!==0||C||d)},"simpleSubset"),aa=a((n,e,t)=>{if(!n)return e;let r=Jo(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),ca=a((n,e,t)=>{if(!n)return e;let r=Jo(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");la.exports=Rp});var ma=S((PS,da)=>{"use strict";var Xo=Je(),pa=Ct(),bp=F(),ua=Oo(),Ip=Ae(),Np=js(),Ap=zs(),xp=Vs(),$p=qs(),Op=Js(),Dp=Ks(),Lp=Qs(),_p=ei(),kp=te(),jp=ni(),Hp=ii(),zp=fr(),Fp=gi(),Up=ui(),Vp=Et(),Wp=Cr(),Bp=_o(),qp=ko(),Gp=vr(),Jp=Er(),Xp=jo(),Kp=yi(),Yp=St(),Qp=re(),Zp=Tt(),eu=_i(),tu=ji(),ru=zi(),ou=Vi(),nu=Bi(),su=Tr(),iu=Yi(),au=Zi(),cu=ra(),lu=na(),gu=ga();da.exports={parse:Ip,valid:Np,clean:Ap,inc:xp,diff:$p,major:Op,minor:Dp,patch:Lp,prerelease:_p,compare:kp,rcompare:jp,compareLoose:Hp,compareBuild:zp,sort:Fp,rsort:Up,gt:Vp,lt:Wp,eq:Bp,neq:qp,gte:Gp,lte:Jp,cmp:Xp,coerce:Kp,Comparator:Yp,Range:Qp,satisfies:Zp,toComparators:eu,maxSatisfying:tu,minSatisfying:ru,minVersion:ou,validRange:nu,outside:su,gtr:iu,ltr:au,intersects:cu,simplifyRange:lu,subset:gu,SemVer:bp,re:Xo.re,src:Xo.src,tokens:Xo.t,SEMVER_SPEC_VERSION:pa.SEMVER_SPEC_VERSION,RELEASE_TYPES:pa.RELEASE_TYPES,compareIdentifiers:ua.compareIdentifiers,rcompareIdentifiers:ua.rcompareIdentifiers}});import{exec as pu,spawn as uu}from"child_process";import{promisify as du}from"util";var Rt,ha,xe,Ko=m(()=>{"use strict";M();z();Rt=pc(ma(),1),ha=du(pu),xe=class{static{a(this,"NPMManager")}logger=p.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||R()}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 o=uu("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((s,i)=>{o.stdout.on("data",c=>{let l=c.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),o.stderr.on("data",c=>{let l=c.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),o.on("close",c=>{let l=Date.now()-r;if(c===0)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: ${c}`;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 ha("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 ha("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(s=>s&&typeof s=="string"&&Rt.default.valid(s));return e!=="all"&&(o=o.filter(s=>{let i=Rt.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})),o.sort((s,i)=>Rt.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],o=!1;try{o=Rt.default.gt(r,e)}catch(s){this.logger.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25:",s),o=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: ${o}`),{currentVersion:e,latestVersion:r,hasUpdate:o}}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 fa}from"zod";var mu,Mr,Ca=m(()=>{"use strict";M();z();Ko();mu=fa.object({version:fa.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Mr=class{static{a(this,"UpdateApiHandler")}npmManager;logger=p.withTag("UpdateApiHandler");eventBus=R();activeInstalls=new Map;constructor(){this.npmManager=new xe(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=mu.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:o}=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(o).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:o,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 Rr,va=m(()=>{"use strict";zr();M();Ko();Rr=class{static{a(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=Se.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=Se.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"),Se.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 xe().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 xe().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 Ea=m(()=>{"use strict";us();ds();ms();Ro();hs();Cs();vs();Es();Ss();ys();Ms();ws();Ca();va()});var wr,Sa=m(()=>{"use strict";M();z();wr=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=p.withTag("StatusService"),this.eventBus=R()}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 Pr,ya=m(()=>{"use strict";M();ee();z();Pr=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=p.withTag("NotificationService"),this.eventBus=R(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=h.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:a(o=>{t.readyState===1&&t.send(o)},"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[o,s]of this.clients)this.sendMessageToClient(s,r,o)}sendToClient(e,t,r){let o={type:t,data:r,timestamp:Date.now()},s=this.clients.get(e);s?this.sendMessageToClient(s,o,e):this.queueMessage(e,o)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let o=JSON.stringify(t);e.send(o),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(o){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,o),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:o instanceof Error?o:new Error(String(o)),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 o of t)this.sendMessageToClient(r,o,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let o={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",o)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,o)=>r+o.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 Ta=m(()=>{"use strict";M()});var Ma=m(()=>{"use strict";ft();Sa();ya();z();Ta();so()});var wt,Ra=m(()=>{"use strict";So();wt=class{static{a(this,"RouteManager")}routes=new Map;registerRoute(e,t){this.routes.has(e),this.routes.set(e,t)}registerRoutes(e){for(let[t,r]of Object.entries(e))this.registerRoute(t,r)}getAllRoutes(){return new Map(this.routes)}getRoute(e){return this.routes.get(e)}applyToApp(e){let t=Array.from(this.routes.entries());t.sort(([r],[o])=>r==="static"?1:o==="static"?-1:0);for(let[r,o]of t)try{this.applyRouteConfig(e,o)}catch{}}applyRouteConfig(e,t){for(let r of t.routes){let o=t.path+r.path,s=[...t.middleware||[],...r.middleware||[]],i=a(async(g,u)=>{try{return await r.handler(g)}catch(d){let C=k("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",d instanceof Error?d.message:String(d));return g.json(C,500)}},"wrappedHandler"),l={GET:e.get.bind(e),POST:e.post.bind(e),PUT:e.put.bind(e),DELETE:e.delete.bind(e),PATCH:e.patch.bind(e)}[r.method];if(!l)throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${r.method}`);s.length>0?l(o,...s,i):l(o,i)}}clear(){this.routes.clear()}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}}});var Yo,wa=m(()=>{"use strict";Yo={name:"config",path:"/api/config",description:"\u914D\u7F6E\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getConfig(n)},"handler")},{method:"PUT",path:"",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.updateConfig(n)},"handler")},{method:"GET",path:"/mcp-endpoint",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getMcpEndpoint(n)},"handler")},{method:"GET",path:"/mcp-endpoints",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getMcpEndpoints(n)},"handler")},{method:"GET",path:"/mcp-servers",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getMcpServers(n)},"handler")},{method:"GET",path:"/connection",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getConnectionConfig(n)},"handler")},{method:"POST",path:"/reload",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.reloadConfig(n)},"handler")},{method:"GET",path:"/path",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getConfigPath(n)},"handler")},{method:"GET",path:"/exists",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.checkConfigExists(n)},"handler")}]}});var Qo,Pa=m(()=>{"use strict";Qo={name:"status",path:"/api/status",description:"\u72B6\u6001\u67E5\u8BE2\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.getStatus(n)},"handler")},{method:"GET",path:"/client",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.getClientStatus(n)},"handler")},{method:"PUT",path:"/client",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.updateClientStatus(n)},"handler")},{method:"POST",path:"/reset",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.resetStatus(n)},"handler")},{method:"GET",path:"/mcp-servers",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.getActiveMCPServers(n)},"handler")},{method:"PUT",path:"/mcp-servers",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.setActiveMCPServers(n)},"handler")}]}});var Zo,ba=m(()=>{"use strict";Zo={name:"tools",path:"/api/tools",description:"\u5DE5\u5177\u8C03\u7528\u76F8\u5173 API",routes:[{method:"POST",path:"/call",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.callTool(n)},"handler")},{method:"GET",path:"/list",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.listTools(n)},"handler")},{method:"GET",path:"/custom",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.getCustomTools(n)},"handler")},{method:"POST",path:"/custom",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.addCustomTool(n)},"handler")},{method:"PUT",path:"/custom/:toolName",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.updateCustomTool(n)},"handler")},{method:"DELETE",path:"/custom/:toolName",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.removeCustomTool(n)},"handler")}]}});var en,Ia=m(()=>{"use strict";en={name:"mcp",path:"/mcp",description:"MCP \u534F\u8BAE\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(n=>{let{mcpRouteHandler:e}=n.get("dependencies");return e.handlePost(n)},"handler")},{method:"GET",path:"",handler:a(n=>{let{mcpRouteHandler:e}=n.get("dependencies");return e.handleGet(n)},"handler")}]}});var tn,Na=m(()=>{"use strict";tn={name:"version",path:"/api/version",description:"\u7248\u672C\u4FE1\u606F\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.getVersion(n)},"handler")},{method:"GET",path:"/simple",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.getVersionSimple(n)},"handler")},{method:"DELETE",path:"/cache",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.clearVersionCache(n)},"handler")},{method:"GET",path:"/latest",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.checkLatestVersion(n)},"handler")}]}});var rn,Aa=m(()=>{"use strict";rn={name:"services",path:"/api/services",description:"\u670D\u52A1\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/restart",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.restartService(n)},"handler")},{method:"POST",path:"/stop",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.stopService(n)},"handler")},{method:"POST",path:"/start",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.startService(n)},"handler")},{method:"GET",path:"/status",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.getServiceStatus(n)},"handler")},{method:"GET",path:"/health",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.getServiceHealth(n)},"handler")}]}});var on,xa=m(()=>{"use strict";on={name:"update",path:"/api",description:"\u66F4\u65B0\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/update",handler:a(n=>{let{updateApiHandler:e}=n.get("dependencies");return e.performUpdate(n)},"handler")}]}});var nn,$a=m(()=>{"use strict";nn={name:"static",path:"/",description:"\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u7531",routes:[{method:"GET",path:"*",handler:a(async n=>n.req.path.startsWith("/api/")?n.notFound():await n.get("dependencies").staticFileHandler.handleStaticFile(n),"handler")}]}});var sn,Oa=m(()=>{"use strict";sn={name:"coze",path:"/api/coze",description:"\u6263\u5B50 API \u76F8\u5173\u8DEF\u7531",routes:[{method:"GET",path:"/workspaces",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.getWorkspaces(n)},"handler")},{method:"GET",path:"/workflows",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.getWorkflows(n)},"handler")},{method:"POST",path:"/cache/clear",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.clearCache(n)},"handler")},{method:"GET",path:"/cache/stats",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.getCacheStats(n)},"handler")}]}});var an,Da=m(()=>{"use strict";an={name:"tool-logs",path:"/api/tool-calls",description:"\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u76F8\u5173 API",routes:[{method:"GET",path:"/logs",handler:a(n=>{let{toolCallLogApiHandler:e}=n.get("dependencies");return e.getToolCallLogs(n)},"handler")}]}});var br,cn,La=m(()=>{"use strict";br=a(async(n,e)=>{let r=n.get("dependencies").mcpServerApiHandler;return r?await e(r):n.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),cn={name:"mcpserver",path:"/api/mcp-servers",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(n=>br(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/:serverName",handler:a(n=>br(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/:serverName/status",handler:a(n=>br(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"",handler:a(n=>br(n,e=>e.listMCPServers(n)),"handler")}]}});var _a,Pt,ln,ka=m(()=>{"use strict";_a=a((n,e)=>({error:{code:n,message:e}}),"createErrorResponse"),Pt=a(async(n,e)=>{let t=n.get("endpointHandler");if(!t){let r=_a("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");return n.json(r,503)}try{return await t[e](n)}catch(r){let o=_a("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return n.json(o,500)}},"withEndpointHandler"),ln={name:"endpoint",path:"/api/endpoint",description:"\u7AEF\u70B9\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/status",handler:a(n=>Pt(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/connect",handler:a(n=>Pt(n,"connectEndpoint"),"handler")},{method:"POST",path:"/disconnect",handler:a(n=>Pt(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/add",handler:a(n=>Pt(n,"addEndpoint"),"handler")},{method:"POST",path:"/remove",handler:a(n=>Pt(n,"removeEndpoint"),"handler")}]}});var gn,ja=m(()=>{"use strict";gn={name:"misc",path:"/api",description:"\u901A\u7528 API \u8DEF\u7531",routes:[{method:"POST",path:"/restart",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.restartService(n)},"handler")}]}});var Ha=m(()=>{"use strict";wa();Pa();ba();Ia();Na();Aa();xa();$a();Oa();Da();La();ka();ja()});var za=m(()=>{"use strict";Ra();Ha()});var un={};X(un,{WebServer:()=>pn});import{createServer as hu}from"http";import{serve as fu}from"@hono/node-server";import{WebSocketServer as Cu}from"ws";var pn,dn=m(()=>{"use strict";zn();ve();se();ss();Ea();Po();M();ee();ho();Ma();yo();za();pn=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;toolCallLogApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;updateApiHandler;cozeApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointConnection;endpointManager=null;mcpServiceManager=null;constructor(e){try{this.port=e??h.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=p.withTag("WebServer"),this.eventBus=R(),this.configService=new ue,this.statusService=new wr,this.notificationService=new Pr,this.configApiHandler=new qt,this.statusApiHandler=new sr(this.statusService),this.serviceApiHandler=new rr(this.statusService),this.toolApiHandler=new ar,this.toolCallLogApiHandler=new gr,this.versionApiHandler=new Rr,this.staticFileHandler=new nr,this.mcpRouteHandler=new Yt,this.updateApiHandler=new Mr,this.cozeApiHandler=new Xt,this.realtimeNotificationHandler=new er(this.notificationService,this.statusService),this.heartbeatHandler=new Kt(this.statusService,this.notificationService),this.app=Zn(),this.setupMiddleware(),this.app.notFound(Eo),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5..."),this.mcpServiceManager?this.logger.debug("\u4F7F\u7528\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u8DF3\u8FC7\u521B\u5EFA"):(this.logger.debug("\u521B\u5EFA\u65B0\u7684 MCPServiceManager \u5B9E\u4F8B"),this.mcpServiceManager=new ut,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpServerApiHandler=new Zt(this.mcpServiceManager,h),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`);let r=t.map(o=>({name:o.name,description:o.description||"",inputSchema:ye(o.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint,r),this.logger.debug("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),this.mcpServiceManager||(this.logger.warn(`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u8FDB\u5165\u964D\u7EA7\u6A21\u5F0F\u3002\u5728\u964D\u7EA7\u6A21\u5F0F\u4E0B\uFF1A
|
|
95
|
-
1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
|
|
96
|
-
2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
|
|
97
|
-
3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
|
|
98
|
-
4. \u7528\u6237\u9700\u8981\u901A\u8FC7 API \u91CD\u65B0\u914D\u7F6E\u7AEF\u70B9\u6216\u670D\u52A1\u5668
|
|
99
|
-
5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new ut,await this.mcpServiceManager.start(),this.logger.info("\u964D\u7EA7\u6A21\u5F0F\u5DF2\u6FC0\u6D3B\uFF0CMCPServiceManager \u4F7F\u7528\u7A7A\u914D\u7F6E\u542F\u52A8"))}}async loadConfiguration(){if(!h.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");h.cleanupInvalidServerToolsConfig();let e=h.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.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let o=Vn(t,r);this.mcpServiceManager.addServiceConfig(t,o)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e,t){let o=(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: ${o.length}`);try{this.endpointManager||(this.endpointManager=new it(h,{connectionTimeout:1e4}),this.logger.debug("\u2705 \u65B0\u5EFA\u8FDE\u63A5\u7BA1\u7406\u5668\u5B9E\u4F8B")),this.mcpServiceManager&&this.endpointManager.setServiceManager(this.mcpServiceManager),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u8BBE\u7F6E\u5B8C\u6210"),o.length>0?(this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",o),await this.endpointManager.initialize(o,t),await this.endpointManager.connect(),this.endpointManager.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 ${o.length} \u4E2A\u7AEF\u70B9`)):(await this.endpointManager.initialize([],t),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF08\u65E0\u7AEF\u70B9\uFF09"))}catch(s){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s),s}}setXiaozhiConnectionManager(e){this.endpointManager=e}getEndpointManager(){if(!this.endpointManager)throw new Error("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.endpointManager}setMCPServiceManager(e){this.mcpServiceManager&&this.mcpServiceManager!==e&&this.logger.warn("\u66FF\u6362\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u6CE8\u610F\u6E05\u7406\u539F\u6709\u5B9E\u4F8B\u7684\u8D44\u6E90"),this.mcpServiceManager=e,this.logger.debug("MCPServiceManager \u5B9E\u4F8B\u5DF2\u66F4\u65B0")}getMCPServiceManager(){if(!this.mcpServiceManager)throw new Be("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.mcpServiceManager}getEndpointConnectionStatus(){return this.endpointManager?{type:"multi-endpoint",manager:{connectedConnections:this.endpointManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.endpointManager.getConnectionStatus().length,healthCheckStats:{}},connections:this.endpointManager.getConnectionStatus()}:this.endpointConnection?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async connectWithRetry(e,t,r=5,o=1e3,s=3e4,i=2){let c=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(c=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let u=Math.min(o*i**(l-1),s);this.logger.info(`${t} - ${u}ms \u540E\u91CD\u8BD5...`),await this.sleep(u)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${c?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",fo),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",To),this.app?.use("*",Mo()),this.app?.use("*",wo()),this.app?.use("*",Co),this.app?.onError(vo),this.app?.use("*",async(e,t)=>{let r=this.createHandlerDependencies();e.set("dependencies",r),await t()})}createHandlerDependencies(){return{configApiHandler:this.configApiHandler,statusApiHandler:this.statusApiHandler,serviceApiHandler:this.serviceApiHandler,toolApiHandler:this.toolApiHandler,toolCallLogApiHandler:this.toolCallLogApiHandler,versionApiHandler:this.versionApiHandler,staticFileHandler:this.staticFileHandler,mcpRouteHandler:this.mcpRouteHandler,mcpServerApiHandler:this.mcpServerApiHandler,updateApiHandler:this.updateApiHandler,cozeApiHandler:this.cozeApiHandler}}setupRouteSystem(){this.routeManager=new wt}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Yo,status:Qo,tools:Zo,mcp:en,version:tn,services:rn,update:on,coze:sn,"tool-logs":an,mcpserver:cn,endpoint:ln,misc:gn,static:nn}),this.routeManager.applyToApp(this.app),this.logger.info("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5B8C\u6210")}catch(e){this.logger.error("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5931\u8D25:",e)}}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 o=JSON.parse(r.toString());o.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,o,t):await this.realtimeNotificationHandler.handleMessage(e,o,t)}catch(o){this.logger.error("WebSocket message error:",o);let s={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:o instanceof Error?o.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}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=fu({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:hu});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Cu({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}`)}stop(){return new Promise(e=>{let t=!1,r=a(()=>{t||(t=!0,e())},"doResolve");this.endpointConnection?.disconnect(),(async()=>{try{this.endpointManager&&(await this.endpointManager.cleanup(),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u6E05\u7406"))}catch(o){this.logger.error("\u8FDE\u63A5\u7BA1\u7406\u5668\u6E05\u7406\u5931\u8D25:",o)}try{this.mcpServiceManager&&(await this.mcpServiceManager.stopAllServices(),this.mcpServiceManager=null,this.logger.debug("MCPServiceManager \u5DF2\u6E05\u7406"))}catch(o){this.logger.error("MCPServiceManager \u6E05\u7406\u5931\u8D25:",o)}if(this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let o of this.wss.clients)o.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(),xn(),this.endpointConnection?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});var Fa={};X(Fa,{ServiceManagerImpl:()=>mn});var mn,Ua=m(()=>{"use strict";ce();Ee();At();mn=class{constructor(e,t){this.processManager=e;this.configManager=t}static{a(this,"ServiceManagerImpl")}async start(e){try{this.validateStartOptions(e),this.processManager.cleanupContainerState();let t=this.getStatus();if(t.running)try{await this.processManager.gracefulKillProcess(t.pid||0),this.processManager.cleanupPidFile(),await new Promise(r=>setTimeout(r,1e3))}catch{}switch(this.checkEnvironment(),e.mode){case"mcp-server":await this.startMcpServerMode(e);break;case"stdio":await this.startNormalMode(e);break;case"normal":await this.startNormalMode(e);break;default:await this.startNormalMode(e);break}}catch(t){throw t instanceof D?t:D.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw D.notRunning();await this.processManager.gracefulKillProcess(e.pid||0),this.processManager.cleanupPidFile()}catch(e){throw e instanceof D?e:new D(`\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 D(`\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&&Y.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new D(`\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F: ${e.mode}`)}checkEnvironment(){if(!this.configManager.configExists())throw we.configNotFound();try{if(!this.configManager.getConfig())throw new we("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof we?e:new we(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${e instanceof Error?e.message:String(e)}`)}}async startNormalMode(e){e.daemon?await this.startWebServerInDaemon():await this.startWebServerInForeground()}async startMcpServerMode(e){let t=e.port||3e3,{spawn:r}=await import("child_process");if(e.daemon){let o=A.getExecutablePath("cli"),s=r("node",[o,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(s.pid||0,"daemon"),s.unref(),process.exit(0)}else{let{WebServer:o}=await Promise.resolve().then(()=>(dn(),un)),s=new o(t),i=a(async()=>{await s.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i),await s.start()}}async startWebServerInDaemon(){let{spawn:e}=await import("child_process"),t=A.getWebServerLauncherPath();if(!(await import("fs")).default.existsSync(t))throw new D(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`);let s=e("node",[t],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(s.pid||0,"daemon"),s.unref(),process.exit(0)}async startWebServerInForeground(){let{WebServer:e}=await Promise.resolve().then(()=>(dn(),un)),t=new e,r=a(async()=>{await t.stop(),this.processManager.cleanupPidFile(),process.exit(0)},"cleanup");process.on("SIGINT",r),process.on("SIGTERM",r),this.processManager.savePidInfo(process.pid,"foreground"),await t.start()}}});var Va={};X(Va,{TemplateManagerImpl:()=>hn});import vu from"fs";import $e from"path";var hn,Wa=m(()=>{"use strict";ce();Ze();Ee();At();hn=class{static{a(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=A.findTemplatesDir();if(!e)return[];let t=[],r=vu.readdirSync(e,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name);for(let o of r)try{let s=await this.getTemplateInfo(o);s&&t.push(s)}catch{}return t}catch{throw new T("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",A.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(Y.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=A.getTemplatePath(e);if(!t)return null;let r=$e.join(t,"template.json"),o={};if(b.exists(r))try{let c=b.readFile(r);o=JSON.parse(c)}catch{}let s=this.getTemplateFiles(t),i={name:e,path:t,description:o.description||`${e} \u6A21\u677F`,version:o.version||"1.0.0",author:o.author,files:s};return this.templateCache.set(e,i),i}catch(t){throw t instanceof P?t:new T(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:$e.basename(t)})}async createProject(e){try{this.validateCreateOptions(e);let t=e.templateName||"default",r=await this.getTemplateInfo(t);if(!r)throw new T(`\u6A21\u677F\u4E0D\u5B58\u5728: ${t}`,"");let o=$e.resolve(e.targetPath);if(b.exists(o))throw T.alreadyExists(o);b.ensureDir(o),await this.copyTemplateFiles(r,o,e),await this.processTemplateVariables(o,e)}catch(t){throw t instanceof T||t instanceof P?t:new T(`\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 o of r){let s=$e.join(t.path,o);if(!b.exists(s))return!1}return!0}catch{return!1}}clearCache(){this.templateCache.clear()}getTemplateFiles(e){try{return b.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let o=$e.relative(e,r);return!o.startsWith(".")&&o!=="template.json"&&!o.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){Y.validateRequired(e.targetPath,"targetPath"),Y.validateRequired(e.projectName,"projectName"),Y.validateProjectName(e.projectName),e.templateName&&Y.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{b.copyDirectory(e.path,t,{exclude:["template.json",".git","node_modules"],overwrite:!1,recursive:!0})}catch(o){throw new T(`\u590D\u5236\u6A21\u677F\u6587\u4EF6\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`,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},o=["package.json","README.md","src/**/*.ts","src/**/*.js","src/**/*.json"];for(let s of o){let i=this.findFilesByPattern(e,s);for(let c of i)await this.replaceVariablesInFile(c,r)}}catch{}}findFilesByPattern(e,t){try{if(!t.includes("*")){let s=$e.join(e,t);return b.exists(s)?[s]:[]}let r=b.listDirectory(e,{recursive:!0}),o=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(s=>{let i=$e.relative(e,s);return o.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=b.readFile(e),o=!1;for(let[s,i]of Object.entries(t)){let c=new RegExp(`{{\\s*${s}\\s*}}`,"g");c.test(r)&&(r=r.replace(c,i),o=!0)}o&&b.writeFile(e,r,{overwrite:!0})}catch{}}}});async function Ne(){return fn.create()}var fn,Ao=m(()=>{"use strict";jr();Ze();Hr();Ee();Nt();At();zr();M();ee();fn=class n{static{a(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 n;return e.registerSingleton("versionUtils",()=>Se),e.registerSingleton("platformUtils",()=>ne),e.registerSingleton("formatUtils",()=>ke),e.registerSingleton("fileUtils",()=>b),e.registerSingleton("pathUtils",()=>A),e.registerSingleton("validation",()=>Y),e.registerSingleton("configManager",()=>h),e.registerSingleton("logger",()=>p),e.registerSingleton("errorHandler",()=>le),e.registerSingleton("processManager",()=>{let t=(Gr(),me(Ln));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(jn(),me(kn)),r=e.get("processManager"),o=e.get("logger");return new t.DaemonManagerImpl(r,o)}),e.registerSingleton("serviceManager",()=>{let t=(Ua(),me(Fa)),r=e.get("processManager"),o=e.get("configManager"),s=e.get("logger");return new t.ServiceManagerImpl(r,o,s)}),e.registerSingleton("templateManager",()=>{let t=(Wa(),me(Va));return new t.TemplateManagerImpl}),e}};a(Ne,"createContainer")});var oe,Xe=m(()=>{"use strict";oe=class{constructor(e){this.container=e}static{a(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 Ba={};X(Ba,{ServiceCommandHandler:()=>Cn});var Cn,qa=m(()=>{"use strict";Xe();M();Cn=class extends oe{static{a(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:"--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:a(async(e,t)=>{await this.handleStart(t)},"execute")},{name:"stop",description:"\u505C\u6B62\u670D\u52A1",execute:a(async(e,t)=>{await this.handleStop()},"execute")},{name:"status",description:"\u68C0\u67E5\u670D\u52A1\u72B6\u6001",execute:a(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"}],execute:a(async(e,t)=>{await this.handleRestart(t)},"execute")},{name:"attach",description:"\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7",execute:a(async(e,t)=>{await this.handleAttach()},"execute")}];constructor(e){super(e)}async execute(e,t){}async handleStart(e){try{e.debug&&An("debug");let t=this.getService("serviceManager");if(e.stdio){this.showStdioMigrationGuide();return}await t.start({daemon:e.daemon||!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&&(t.uptime,t.mode)}catch(e){this.handleError(e)}}async handleRestart(e){try{await this.getService("serviceManager").restart({daemon:e.daemon||!1})}catch(t){this.handleError(t)}}async handleAttach(){try{await this.getService("daemonManager").attachToLogs()}catch(e){this.handleError(e)}}showStdioMigrationGuide(){}}});var Ga={};X(Ga,{ConfigCommandHandler:()=>En});import Eu from"path";import"chalk";import vn from"ora";var En,Ja=m(()=>{"use strict";Xe();En=class extends oe{static{a(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:a(async(e,t)=>{await this.handleInit(t)},"execute")},{name:"get",description:"\u67E5\u770B\u914D\u7F6E\u503C",execute:a(async(e,t)=>{this.validateArgs(e,1),await this.handleGet(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E\u914D\u7F6E\u503C",execute:a(async(e,t)=>{this.validateArgs(e,2),await this.handleSet(e[0],e[1])},"execute")}];constructor(e){super(e)}async execute(e,t){}async handleInit(e){let t=vn("\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 o=this.getService("configManager");if(o.configExists()){t.warn("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728");return}o.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}`,c=Eu.join(s,i)}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=vn("\u8BFB\u53D6\u914D\u7F6E...").start();try{let r=this.getService("configManager");if(!r.configExists()){t.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728");return}let o=r.getConfig();switch(e){case"mcpEndpoint":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let s=r.getMcpEndpoints();s.length===0||s.length===1||s.forEach((i,c)=>{});break}case"mcpServers":t.succeed("\u914D\u7F6E\u4FE1\u606F");for(let[s,i]of Object.entries(o.mcpServers)){let c=i;"type"in c&&c.type}break;case"connection":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let s=r.getConnectionConfig();break}case"heartbeatInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F");break;case"heartbeatTimeout":t.succeed("\u914D\u7F6E\u4FE1\u606F");break;case"reconnectInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F");break;default:t.fail(`\u672A\u77E5\u7684\u914D\u7F6E\u9879: ${e}`)}}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=vn("\u66F4\u65B0\u914D\u7F6E...").start();try{let o=this.getService("configManager");if(!o.configExists()){r.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728");return}switch(e){case"mcpEndpoint":o.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");o.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");o.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");o.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}`)}}catch(o){r.fail(`\u8BBE\u7F6E\u914D\u7F6E\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`),this.handleError(o)}}}});var Xa={};X(Xa,{ProjectCommandHandler:()=>Sn});import Su from"path";import yu from"chalk";import Tu from"ora";var Sn,Ka=m(()=>{"use strict";Xe();Sn=class extends oe{static{a(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=Tu("\u521D\u59CB\u5316\u9879\u76EE...").start();try{let o=this.getService("templateManager"),s=this.getService("fileUtils"),i=Su.join(process.cwd(),e);if(await s.exists(i)){r.fail(`\u76EE\u5F55 "${e}" \u5DF2\u5B58\u5728`);return}t.template?await this.createFromTemplate(e,t.template,i,r,o):await this.createBasicProject(e,i,r,o)}catch(o){r.fail(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`),this.handleError(o)}}async createFromTemplate(e,t,r,o,s){o.text="\u68C0\u67E5\u6A21\u677F...";let i=await s.getAvailableTemplates();if(i.length===0){o.fail("\u627E\u4E0D\u5230\u53EF\u7528\u6A21\u677F");return}let c=t;if(!await s.validateTemplate(c)){o.fail(`\u6A21\u677F "${c}" \u4E0D\u5B58\u5728`);let g=this.findSimilarTemplate(c,i);if(g)if(await this.askUserConfirmation(yu.cyan("\u786E\u8BA4\u4F7F\u7528\u6B64\u6A21\u677F\uFF1F(y/n): ")))c=g;else{this.showAvailableTemplates(i);return}else{this.showAvailableTemplates(i);return}}o.text=`\u4ECE\u6A21\u677F "${c}" \u521B\u5EFA\u9879\u76EE "${e}"...`,await s.createProject({templateName:c,targetPath:r,projectName:e}),o.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`)}async createBasicProject(e,t,r,o){r.text=`\u521B\u5EFA\u57FA\u672C\u9879\u76EE "${e}"...`,await o.createProject({templateName:null,targetPath:t,projectName:e}),r.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`)}showAvailableTemplates(e){for(let t of e);}findSimilarTemplate(e,t){let r=this.getService("formatUtils"),o=null,s=0;for(let i of t){let c=r.calculateSimilarity(e.toLowerCase(),i.toLowerCase());c>s&&c>.6&&(s=c,o=i)}return o}async askUserConfirmation(e){let r=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{r.question(e,s=>{r.close(),o(s.toLowerCase().trim()==="y"||s.toLowerCase().trim()==="yes")})})}}});var Ir,Ya=m(()=>{"use strict";Gr();M();ee();Ir=class{static{a(this,"ToolCallService")}logger;processManager;baseUrl;constructor(){this.logger=p.withTag("ToolCallService"),this.processManager=new rt;try{let e=h.getWebUIPort()??9999;this.baseUrl=`http://localhost:${e}`}catch{this.baseUrl="http://localhost:9999"}}async callTool(e,t,r){await this.validateServiceStatus();try{let o=await fetch(`${this.baseUrl}/api/tools/call`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceName:e,toolName:t,args:r})});if(!o.ok){let i=await o.json();throw new Error(i.error?.message||`HTTP ${o.status}: ${o.statusText}`)}let s=await o.json();if(!s.success)throw new Error(s.error?.message||"\u5DE5\u5177\u8C03\u7528\u5931\u8D25");return s.data}catch(o){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`,o instanceof Error?o.message:String(o)),o}}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 Ar={};X(Ar,{getDisplayWidth:()=>Tn,listMcpServers:()=>Mu,listServerTools:()=>Ru,setToolEnabled:()=>wu,truncateToWidth:()=>Nr});import _ from"chalk";import Qa from"cli-table3";import yn from"ora";function Tn(n){let e=0;for(let t of n)/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(t)?e+=2:e+=1;return e}function Nr(n,e){if(Tn(n)<=e)return n;if(e<=3)return"";let t="",r=0,o=!1;for(let s of n){let i=/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(s)?2:1;if(r+i>e-3){if(!o)return"";t+="...";break}t+=s,r+=i,o=!0}return t}async function Mu(n={}){let e=yn("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{let t=h.getMcpServers(),r=Object.keys(t),o=h.getCustomMCPTools(),s=o.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");return}if(e.succeed(`\u627E\u5230 ${i} \u4E2A MCP \u670D\u52A1${s?" (\u5305\u62EC customMCP)":""}`),n.tools){let c=8,l=[];for(let u of r){let d=h.getServerToolsConfig(u),C=Object.keys(d);l.push(...C)}if(s){let u=o.map(d=>d.name);l.push(...u)}for(let u of l){let d=Tn(u);d>c&&(c=d)}c=Math.max(10,Math.min(c+2,30));let g=new Qa({head:[_.bold("MCP"),_.bold("\u5DE5\u5177\u540D\u79F0"),_.bold("\u72B6\u6001"),_.bold("\u63CF\u8FF0")],colWidths:[15,c,8,40],wordWrap:!0,style:{head:[],border:[]}});if(s)for(let u of o){let d=Nr(u.description||"",32);g.push(["customMCP",u.name,_.green("\u542F\u7528"),d])}for(let u of r){let d=h.getServerToolsConfig(u),C=Object.keys(d);if(C.length===0)g.push([_.gray(u),_.gray("-"),_.gray("-"),_.gray("\u6682\u672A\u8BC6\u522B\u5230\u76F8\u5173\u5DE5\u5177")]);else{g.length>0&&g.push([{colSpan:4,content:""}]);for(let f of C){let x=d[f],Oe=x.enable?_.green("\u542F\u7528"):_.red("\u7981\u7528"),Ke=Nr(x.description||"",32);g.push([u,f,Oe,Ke])}}}}else for(let c of r){let l=t[c],g=h.getServerToolsConfig(c),u=Object.keys(g).length,d=Object.values(g).filter(C=>C.enable!==!1).length;"url"in l&&"type"in l&&l.type,u>0}}catch{e.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),process.exit(1)}}async function Ru(n){let e=yn(`\u83B7\u53D6 ${n} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!h.getMcpServers()[n]){e.fail(`\u670D\u52A1 '${n}' \u4E0D\u5B58\u5728`);return}let r=h.getServerToolsConfig(n),o=Object.keys(r);if(o.length===0){e.warn(`\u670D\u52A1 '${n}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`);return}e.succeed(`\u670D\u52A1 '${n}' \u5171\u6709 ${o.length} \u4E2A\u5DE5\u5177`);let s=new Qa({head:[_.bold("\u5DE5\u5177\u540D\u79F0"),_.bold("\u72B6\u6001"),_.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(let i of o){let c=r[i],l=c.enable?_.green("\u542F\u7528"):_.red("\u7981\u7528"),g=Nr(c.description||"",40);s.push([i,l,g])}}catch{e.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),process.exit(1)}}async function wu(n,e,t){let r=t?"\u542F\u7528":"\u7981\u7528",o=yn(`${r}\u5DE5\u5177 ${n}/${e}...`).start();try{if(!h.getMcpServers()[n]){o.fail(`\u670D\u52A1 '${n}' \u4E0D\u5B58\u5728`);return}let i=h.getServerToolsConfig(n);if(!i[e]){o.fail(`\u5DE5\u5177 '${e}' \u5728\u670D\u52A1 '${n}' \u4E2D\u4E0D\u5B58\u5728`);return}h.setToolEnabled(n,e,t,i[e].description),o.succeed(`\u6210\u529F${r}\u5DE5\u5177 ${_.cyan(n)}/${_.cyan(e)}`)}catch{o.fail(`${r}\u5DE5\u5177\u5931\u8D25`),process.exit(1)}}var xr=m(()=>{"use strict";ee();a(Tn,"getDisplayWidth");a(Nr,"truncateToWidth");a(Mu,"listMcpServers");a(Ru,"listServerTools");a(wu,"setToolEnabled")});var Za={};X(Za,{McpCommandHandler:()=>Mn});import"chalk";var Mn,ec=m(()=>{"use strict";Xe();Ya();Mn=class extends oe{static{a(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:a(async(e,t)=>{await this.handleList(t)},"execute")},{name:"server",description:"\u7BA1\u7406\u6307\u5B9A\u7684 MCP \u670D\u52A1",execute:a(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:a(async(e,t)=>{this.validateArgs(e,3);let[r,o,s]=e;s!=="enable"&&s!=="disable"&&process.exit(1);let i=s==="enable";await this.handleTool(r,o,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:a(async(e,t)=>{this.validateArgs(e,2);let[r,o]=e;await this.handleCall(r,o,t.args)},"execute")}];constructor(e){super(e)}async execute(e,t){}async handleList(e){try{let{listMcpServers:t}=await Promise.resolve().then(()=>(xr(),Ar));await t(e)}catch(t){this.handleError(t)}}async handleServer(e){try{let{listServerTools:t}=await Promise.resolve().then(()=>(xr(),Ar));await t(e)}catch(t){this.handleError(t)}}async handleTool(e,t,r){try{let{setToolEnabled:o}=await Promise.resolve().then(()=>(xr(),Ar));await o(e,t,r)}catch(o){this.handleError(o)}}async handleCall(e,t,r){try{let o=new Ir,s=o.parseJsonArgs(r),i=await o.callTool(e,t,s)}catch(o){o.message.includes("\u670D\u52A1\u672A\u542F\u52A8")||o.message.includes("\u53C2\u6570\u683C\u5F0F\u9519\u8BEF"),process.exit(1)}}}});var tc={};X(tc,{EndpointCommandHandler:()=>Rn});import"chalk";import $r from"ora";var Rn,rc=m(()=>{"use strict";Xe();Rn=class extends oe{static{a(this,"EndpointCommandHandler")}name="endpoint";description="\u7BA1\u7406 MCP \u7AEF\u70B9";subcommands=[{name:"list",description:"\u5217\u51FA\u6240\u6709 MCP \u7AEF\u70B9",execute:a(async(e,t)=>{await this.handleList()},"execute")},{name:"add",description:"\u6DFB\u52A0\u65B0\u7684 MCP \u7AEF\u70B9",execute:a(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:a(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:a(async(e,t)=>{this.validateArgs(e,1),await this.handleSet(e)},"execute")}];constructor(e){super(e)}async execute(e,t){}async handleList(){let e=$r("\u8BFB\u53D6\u7AEF\u70B9\u914D\u7F6E...").start();try{let r=this.getService("configManager").getMcpEndpoints();e.succeed("\u7AEF\u70B9\u5217\u8868"),r.length===0||r.forEach((o,s)=>{})}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=$r("\u6DFB\u52A0\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.addMcpEndpoint(e),t.succeed(`\u6210\u529F\u6DFB\u52A0\u7AEF\u70B9: ${e}`);let o=r.getMcpEndpoints()}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=$r("\u79FB\u9664\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.removeMcpEndpoint(e),t.succeed(`\u6210\u529F\u79FB\u9664\u7AEF\u70B9: ${e}`);let o=r.getMcpEndpoints()}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=$r("\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[o,s]of e.entries());}}catch(r){t.fail(`\u8BBE\u7F6E\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}}});Ao();var Or=class{constructor(e){this.container=e}static{a(this,"CommandHandlerFactory")}createHandlers(){return[this.createHandler("service"),this.createHandler("config"),this.createHandler("project"),this.createHandler("mcp"),this.createHandler("endpoint")]}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();default:throw new Error(`\u672A\u77E5\u7684\u547D\u4EE4\u5904\u7406\u5668\u7C7B\u578B: ${e}`)}}createServiceCommandHandler(){let{ServiceCommandHandler:e}=(qa(),me(Ba));return new e(this.container)}createConfigCommandHandler(){let{ConfigCommandHandler:e}=(Ja(),me(Ga));return new e(this.container)}createProjectCommandHandler(){let{ProjectCommandHandler:e}=(Ka(),me(Xa));return new e(this.container)}createMcpCommandHandler(){let{McpCommandHandler:e}=(ec(),me(Za));return new e(this.container)}createEndpointCommandHandler(){let{EndpointCommandHandler:e}=(rc(),me(tc));return new e(this.container)}};jr();var Dr=class{constructor(e){this.container=e;this.handlerFactory=new Or(e)}static{a(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){le.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 o of t.subcommands){let s=o.name;o.name==="get"?s="get <key>":o.name==="set"?s="set <key> <value>":o.name==="call"&&(s="call <serviceName> <toolName>");let i=r.command(s).description(o.description);if(o.options)for(let c of o.options)i.option(c.flags,c.description,c.defaultValue);i.action(async(...c)=>{try{let g=c[c.length-1].opts();await o.execute(c.slice(0,-1),g)}catch(l){le.handle(l)}})}r.action(async(...o)=>{try{let i=o[o.length-1].opts();await t.execute(o.slice(0,-1),i)}catch(s){le.handle(s)}})}else{let r=t.name;t.name==="create"&&(r="create <projectName>");let o=e.command(r).description(t.description);if(t.options)for(let s of t.options)o.option(s.flags,s.description,s.defaultValue);o.action(async(...s)=>{try{let c=s[s.length-1].opts();await t.execute(s.slice(0,-1),c)}catch(i){le.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",`
|
|
100
|
-
\u793A\u4F8B:
|
|
101
|
-
xiaozhi init # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6
|
|
102
|
-
xiaozhi start # \u542F\u52A8\u670D\u52A1\uFF08\u5305\u542B Web UI\uFF09
|
|
103
|
-
xiaozhi start -d # \u540E\u53F0\u542F\u52A8\u670D\u52A1
|
|
104
|
-
xiaozhi start -s 3000 # \u4EE5 MCP Server \u6A21\u5F0F\u542F\u52A8
|
|
105
|
-
xiaozhi stop # \u505C\u6B62\u670D\u52A1
|
|
106
|
-
xiaozhi status # \u68C0\u67E5\u670D\u52A1\u72B6\u6001
|
|
107
|
-
xiaozhi restart -d # \u91CD\u542F\u670D\u52A1\uFF08\u540E\u53F0\u6A21\u5F0F\uFF09
|
|
108
|
-
xiaozhi config mcpEndpoint <url> # \u8BBE\u7F6E MCP \u7AEF\u70B9
|
|
109
|
-
xiaozhi create my-project # \u521B\u5EFA\u9879\u76EE
|
|
110
|
-
xiaozhi mcp list # \u5217\u51FA MCP \u670D\u52A1
|
|
111
|
-
|
|
112
|
-
\u66F4\u591A\u4FE1\u606F\u8BF7\u8BBF\u95EE: https://github.com/your-org/xiaozhi-client
|
|
113
|
-
`)}registerLegacyServiceCommands(e,t){let r=t.find(o=>o.name==="service");if(!(!r||!r.subcommands))for(let o of r.subcommands){let s=e.command(o.name).description(o.description);if(o.options)for(let i of o.options)s.option(i.flags,i.description,i.defaultValue);s.action(async(...i)=>{try{let l=i[i.length-1].opts();await o.execute(i.slice(0,-1),l)}catch(c){le.handle(c)}})}}};import"chalk";import{Command as Pu}from"commander";var Lr=new Pu;function bu(n){let e=n.get("versionUtils"),t=n.get("platformUtils"),r=e.getVersionInfo(),o=t.getSystemInfo();r.description,o.isContainer;let s=n.get("configManager");if(s.configExists()){let i=s.getConfigPath();try{let c=s.getMcpEndpoints()}catch{}}}a(bu,"showDetailedInfo");async function Iu(){try{if(process.argv.includes("--info")){let t=await Ne();bu(t),process.exit(0)}if(process.argv.includes("--version-info")){let t=await Ne(),r=t.get("versionUtils"),o=t.get("platformUtils"),s=r.getVersionInfo(),i=o.getSystemInfo();s.description,i.isContainer,process.exit(0)}let n=await Ne(),e=new Dr(n);Lr.name("xiaozhi").description("\u5C0F\u667A MCP \u5BA2\u6237\u7AEF - \u5F3A\u5927\u7684 Model Context Protocol \u5BA2\u6237\u7AEF"),await e.registerCommands(Lr),Lr.helpOption("-h, --help","\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").addHelpText("after",`
|
|
114
|
-
\u793A\u4F8B:
|
|
115
|
-
xiaozhi config init # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6
|
|
116
|
-
xiaozhi start # \u542F\u52A8\u670D\u52A1\uFF08\u5305\u542B Web UI\uFF09
|
|
117
|
-
xiaozhi start -d # \u540E\u53F0\u542F\u52A8\u670D\u52A1
|
|
118
|
-
xiaozhi start -s 3000 # \u4EE5 MCP Server \u6A21\u5F0F\u542F\u52A8
|
|
119
|
-
xiaozhi stop # \u505C\u6B62\u670D\u52A1
|
|
120
|
-
xiaozhi status # \u68C0\u67E5\u670D\u52A1\u72B6\u6001
|
|
121
|
-
xiaozhi restart -d # \u91CD\u542F\u670D\u52A1\uFF08\u540E\u53F0\u6A21\u5F0F\uFF09
|
|
122
|
-
xiaozhi config set mcpEndpoint <url> # \u8BBE\u7F6E MCP \u7AEF\u70B9
|
|
123
|
-
xiaozhi create my-project # \u521B\u5EFA\u9879\u76EE
|
|
124
|
-
xiaozhi mcp list # \u5217\u51FA MCP \u670D\u52A1
|
|
125
|
-
xiaozhi endpoint list # \u5217\u51FA MCP \u7AEF\u70B9
|
|
126
|
-
|
|
127
|
-
\u66F4\u591A\u4FE1\u606F\u8BF7\u8BBF\u95EE: https://github.com/your-org/xiaozhi-client
|
|
128
|
-
`),process.argv.length<=2&&process.exit(0),await Lr.parseAsync(process.argv)}catch{process.exit(1)}}a(Iu,"main");Iu().catch(n=>{process.exit(1)});
|
|
129
|
-
//# sourceMappingURL=cli.js.map
|
|
1
|
+
// 向后兼容包装脚本 - 重定向到新的路径
|
|
2
|
+
export * from './backend/cli.js';
|