xiaozhi-client 1.9.4-beta.1 → 1.9.4-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/WebServerLauncher.js +11 -11
- package/dist/backend/WebServerLauncher.js.map +1 -1
- package/dist/backend/cli.js +13 -13
- package/dist/backend/cli.js.map +1 -1
- package/dist/backend/package.json +1 -2
- package/dist/docs/404/index.html +2 -2
- package/dist/docs/404.html +2 -2
- package/dist/docs/changelog/index.html +2 -2
- package/dist/docs/changelog/index.txt +3 -3
- package/dist/docs/index.html +2 -2
- package/dist/docs/index.txt +3 -3
- package/dist/docs/quickstart/index.html +2 -2
- package/dist/docs/quickstart/index.txt +3 -3
- package/dist/docs/reference/command/index.html +2 -2
- package/dist/docs/reference/command/index.txt +3 -3
- package/dist/docs/usage/as-mcp/index.html +2 -2
- package/dist/docs/usage/as-mcp/index.txt +3 -3
- package/dist/docs/usage/coze-workflow/index.html +2 -2
- package/dist/docs/usage/coze-workflow/index.txt +3 -3
- package/dist/docs/usage/docker/index.html +2 -2
- package/dist/docs/usage/docker/index.txt +3 -3
- package/dist/docs/usage/modelscope/index.html +2 -2
- package/dist/docs/usage/modelscope/index.txt +3 -3
- package/dist/docs/usage/multi-endpoint/index.html +2 -2
- package/dist/docs/usage/multi-endpoint/index.txt +3 -3
- package/package.json +1 -2
- /package/dist/docs/_next/static/{JZ0ESgtaHnsqkxSabOqqU → n-fSNbLuSo5pbGuhnk2qQ}/_buildManifest.js +0 -0
- /package/dist/docs/_next/static/{JZ0ESgtaHnsqkxSabOqqU → n-fSNbLuSo5pbGuhnk2qQ}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`)}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=za(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=X.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),V.existsSync(this.logFilePath)||V.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||!V.existsSync(this.logFilePath)))try{V.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=X.dirname(this.logFilePath),t=X.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let s=X.join(e,`${t}.${o}.log`),i=X.join(e,`${t}.${o+1}.log`);V.existsSync(s)&&(o===this.maxLogFiles-1?V.unlinkSync(s):V.renameSync(s,i))}let r=X.join(e,`${t}.1.log`);V.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=X.dirname(this.logFilePath),t=X.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=X.join(e,`${t}.${r}.log`);V.existsSync(o)&&V.unlinkSync(o)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},Ne=null,Et="info";a(Ua,"createLogger");a(on,"getLogger");a(Va,"setGlobalLogger");a(Wa,"setGlobalLogLevel");a(qa,"getGlobalLogLevel");f=on()});import{EventEmitter as Ba}from"events";function M(){return Ae||(Ae=new Nr),Ae}function sn(){Ae&&(Ae.destroy(),Ae=null)}var Nr,Ae,W=d(()=>{"use strict";P();Nr=class extends Ba{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=f,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")}},Ae=null;a(M,"getEventBus");a(sn,"destroyEventBus")});function Ga(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 Ar(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=Ga(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 Oe(n){return`${n.slice(0,30)}...${n.slice(-10)}`}var St=d(()=>{"use strict";a(Ga,"getMcpServerCommunicationType");a(Ar,"validateMcpServerConfig");a(Oe,"sliceEndpoint")});var gn={};ue(gn,{ConfigManager:()=>Tt,configManager:()=>m});import{copyFileSync as Ja,existsSync as Rt,readFileSync as Xa,writeFileSync as Ka}from"fs";import{dirname as Ya,resolve as Ee}from"path";import{fileURLToPath as Qa}from"url";import*as Mt from"comment-json";import an from"dayjs";import Or from"json5";import*as ln from"json5-writer";var cn,xr,Tt,m,J=d(()=>{"use strict";W();ze();St();cn=Ya(Qa(import.meta.url)),xr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},Tt=class n{static{a(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=M();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[Ee(cn,"templates","default","xiaozhi.config.json"),Ee(cn,"..","templates","default","xiaozhi.config.json"),Ee(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>Rt(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=Ee(e,r);if(Rt(o))return o}return Ee(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=Ee(e,r);if(Rt(o))return!0}return!1}initConfig(e="json"){if(!Rt(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=Ee(t,r);Ja(this.defaultConfigPath,o),this.config=null,this.json5Writer=null}loadConfig(){if(!this.configExists()){let e=new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C xiaozhi init \u521D\u59CB\u5316\u914D\u7F6E");throw this.eventBus.emitEvent("config:error",{error:e,operation:"loadConfig"}),e}try{let e=this.getConfigFilePath();this.currentConfigPath=e;let t=this.getConfigFileFormat(e),o=Xa(e,"utf8").replace(/^\uFEFF/,""),s;switch(t){case"json5":s=Or.parse(o),this.json5Writer=ln.load(o);break;case"jsonc":s=Mt.parse(o);break;default:s=JSON.parse(o);break}return this.validateConfig(s),s}catch(e){throw this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"loadConfig"}),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=te.normalizeTypeField(o),i=Ar(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),this.eventBus.emitEvent("config:updated",{type:"endpoint",timestamp:new Date})}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=Ar(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})}updateConfig(e){let t=this.getMutableConfig();if(e.mcpEndpoint!==void 0&&(t.mcpEndpoint=e.mcpEndpoint),e.mcpServers){let r={...t.mcpServers};for(let[o,s]of Object.entries(e.mcpServers))t.mcpServers[o]=s;for(let o of Object.keys(r))o in e.mcpServers||(delete t.mcpServers[o],t.mcpServerConfig?.[o]&&delete t.mcpServerConfig[o])}if(e.connection&&(t.connection||(t.connection={}),Object.assign(t.connection,e.connection)),e.modelscope&&(t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e.modelscope)),e.webUI&&(t.webUI||(t.webUI={}),Object.assign(t.webUI,e.webUI)),e.mcpServerConfig)for(let[r,o]of Object.entries(e.mcpServerConfig))t.mcpServerConfig?.[r]&&(t.mcpServerConfig[r]=o);if(e.platforms)for(let[r,o]of Object.entries(e.platforms))t.platforms||(t.platforms={}),t.platforms[r]=o;this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date})}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)}}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=Or.stringify(e,null,2)}catch{o=Or.stringify(e,null,2)}break;case"jsonc":try{o=Mt.stringify(e,null,2)}catch{o=JSON.stringify(e,null,2)}break;default:o=JSON.stringify(e,null,2);break}Ka(t,o,"utf8"),this.config=e,this.notifyConfigUpdate(e)}catch(t){throw this.eventBus.emitEvent("config:error",{error:t instanceof Error?t:new Error(String(t)),operation:"saveConfig"}),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??xr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??xr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??xr.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),this.eventBus.emitEvent("config:updated",{type:"connection",timestamp:new Date})}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)])}else{let o=e,s=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(o,i,s)}}catch{if(typeof t=="string"&&r){let s=e,i=t}else{let s=e}}}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),this.eventBus.emitEvent("config:updated",{type:"modelscope",timestamp:new Date})}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"||!t.description||typeof t.description!="string"||!t.inputSchema||typeof t.inputSchema!="object"||!t.handler||typeof t.handler!="object"||!["proxy","function","http","script","chain","mcp"].includes(t.handler.type)||!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!1}}validateProxyHandler(e,t){return!(!t.platform||!["coze","openai","anthropic","custom"].includes(t.platform)||!t.config||typeof t.config!="object"||t.platform==="coze"&&!t.config.workflow_id&&!t.config.bot_id)}validateHttpHandler(e,t){if(!t.url||typeof t.url!="string")return!1;try{new URL(t.url)}catch{return!1}return!(t.method&&!["GET","POST","PUT","DELETE","PATCH"].includes(t.method))}validateFunctionHandler(e,t){return!(!t.module||typeof t.module!="string"||!t.function||typeof t.function!="string")}validateScriptHandler(e,t){return!(!t.script||typeof t.script!="string"||t.interpreter&&!["node","python","bash"].includes(t.interpreter))}validateChainHandler(e,t){return!(!t.tools||!Array.isArray(t.tools)||t.tools.length===0||!["sequential","parallel"].includes(t.mode)||!["stop","continue","retry"].includes(t.error_handling))}validateMCPHandler(e,t){return!(!t.config||typeof t.config!="object"||!t.config.serviceName||typeof t.config.serviceName!="string"||!t.config.toolName||typeof t.config.toolName!="string")}hasValidCustomMCPTools(){try{let e=this.getCustomMCPTools();return e.length===0?!1:this.validateCustomMCPTools(e)}catch{return!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)}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})}}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)}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)}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})}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),this.eventBus.emitEvent("config:updated",{type:"webui",timestamp:new Date})}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),this.eventBus.emitEvent("config:updated",{type:"platform",platformName:e,timestamp:new Date})}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=an(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 $=e;o=`${$}__${t}`,s=r,c=`${$}/${t}`}else o=e,s=t,i=r||!0,c=o;let l=this.getCustomMCPTools(),g=l.findIndex($=>$.name===o);if(g===-1)return;let u=[...l],p=u[g];p.stats||(p.stats={});let E=p.stats.usageCount||0,h=p.stats.lastUsedTime;i&&(p.stats.usageCount=E+1),(!h||new Date(s)>new Date(h))&&(p.stats.lastUsedTime=an(s).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(u)}catch{if(typeof r=="string"){let s=e,i=t}else{let s=e}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return!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))}async updateToolUsageStatsWithLock(e,t=!0){let r=`custommcp_${e}`;if(await this.acquireStatsUpdateLock(r))try{await this.updateToolUsageStats(e,t)}catch(o){throw 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)}catch(i){throw 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}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()}},m=Tt.getInstance()});import qe from"ws";var Be,yt=d(()=>{"use strict";ee();Ue();St();ee();Be=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:de(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 qe(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===qe.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===qe.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===qe.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 x(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=Date.now();try{let o=vt(e.params);if(!this.serviceManager)throw new x(-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 x(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),s(new x(-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 x(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?s(new x(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?s(new x(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?s(new x(-32001,l)):s(new x(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let o;if(e instanceof x)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===qe.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r))}}}});import{EventEmitter as Za}from"events";import{z as $r}from"zod";var ec,tc,Ge,Dr=d(()=>{"use strict";ee();W();St();yt();ec={connectionTimeout:1e4,reconnectDelay:2e3},tc=$r.object({connectionTimeout:$r.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),reconnectDelay:$r.number().min(500,"reconnectDelay \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 500 \u7684\u6570\u5B57").optional()}).strict(),Ge=class extends Za{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=M(),this.options={...ec,...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 ${Oe(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 ${Oe(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 ${Oe(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=tc.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 Be(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: ${Oe(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: ${Oe(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:de(t.inputSchema)}))}catch{return[]}}}});var pn=d(()=>{"use strict";yt();Dr();Dr();yt()});var Je,Lr=d(()=>{"use strict";Je={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 Pt(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Je[e]||Je.zh;return new le.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var _r=d(()=>{"use strict";wt();Lr();a(Pt,"createCozeClient")});import rc from"node-cache";var me,un=d(()=>{"use strict";_r();me=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Pt(this.token),this.cache=new rc({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 le={};ue(le,{CozeApiService:()=>me,config:()=>Je,createCozeClient:()=>Pt});import*as td from"@coze/api";var wt=d(()=>{"use strict";Lr();be(le,td);_r();un()});import{createHash as oc}from"crypto";function se(n,e){let t=oc("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function kr(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Xe(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 bt,jr=d(()=>{"use strict";a(se,"generateCacheKey");a(kr,"isCacheExpired");a(Xe,"shouldCleanupCache");bt={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function dn(n,e){return{content:[{type:"text",text:e?nc(e,n):mn(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 nc(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...
|
|
2
|
+
var ba=Object.create;var ze=Object.defineProperty;var Ia=Object.getOwnPropertyDescriptor;var Na=Object.getOwnPropertyNames;var Aa=Object.getPrototypeOf,Oa=Object.prototype.hasOwnProperty;var a=(n,e)=>ze(n,"name",{value:e,configurable:!0});var d=(n,e)=>()=>(n&&(e=n(n=0)),e);var S=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ue=(n,e)=>{for(var t in e)ze(n,t,{get:e[t],enumerable:!0})},ft=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Na(e))!Oa.call(n,o)&&o!==t&&ze(n,o,{get:()=>e[o],enumerable:!(r=Ia(e,o))||r.enumerable});return n},be=(n,e,t)=>(ft(n,e,"default"),t&&ft(t,e,"default")),xa=(n,e,t)=>(t=n!=null?ba(Aa(n)):{},ft(e||!n||!n.__esModule?ze(t,"default",{value:n,enumerable:!0}):t,n)),Ct=n=>ft(ze({},"__esModule",{value:!0}),n);function $a(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function de(n){return $a(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var ve,x,ee=d(()=>{"use strict";ve=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(ve||{});a($a,"isValidToolJSONSchema");a(de,"ensureToolJSONSchema");x=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{a(this,"ToolCallError")}}});var te,Ue=d(()=>{"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")})(te||={})});function vt(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 Zo(n){if(n.type)return te.normalizeTypeField(n);if(n.command)return{...n,type:"stdio"};if(n.url!==void 0&&n.url!==null){let e=vt(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 Et(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new x(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new x(-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 x(-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 x(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new x(-32602,o)}return{name:r.name,arguments:r.arguments}}var Ve=d(()=>{"use strict";Ue();ee();a(vt,"inferTransportTypeFromUrl");a(Zo,"inferTransportTypeFromConfig");a(Et,"validateToolCallParams")});import{isAbsolute as Da,resolve as La}from"path";function rn(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=te.normalizeTypeField(e),r=_a(n,t);return Fa(r),r}catch(t){throw t instanceof L?t:new L(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,n)}}function _a(n,e){if(Ha(e))return ka(n,e);if("type"in e)switch(e.type){case"sse":return en(n,e);case"streamable-http":return tn(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(vt(e.url||"")==="sse"){let o={...e,type:"sse"};return en(n,o)}let r={...e,type:"streamable-http"};return tn(n,r)}throw new L("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",n)}function ka(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=>ja(o)?La(t,o):o);return{name:n,type:"stdio",command:e.command,args:r,env:e.env,timeout:3e4}}function en(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":vt(e.url||""),r=e.url?br(e.url):!1,o={name:n,type:t,url:e.url,timeout:3e4,headers:e.headers};return r&&(o.modelScopeAuth=!0),o}function tn(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 ja(n){return Da(n)?!1:!!(n.startsWith("./")||n.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(n))}function Ha(n){return"command"in n&&typeof n.command=="string"}function br(n){return n.includes("modelscope.net")||n.includes("modelscope.cn")}function Fa(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(ve).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 L,Ir=d(()=>{"use strict";ee();Ve();Ue();L=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{a(this,"ConfigValidationError")}};a(rn,"convertLegacyToNew");a(_a,"convertByConfigType");a(ka,"convertLocalConfig");a(en,"convertSSEConfig");a(tn,"convertStreamableHTTPConfig");a(ja,"isRelativePath");a(Ha,"isLocalConfig");a(br,"isModelScopeURL");a(Fa,"validateNewConfig")});var nn={};ue(nn,{Logger:()=>qe,createLogger:()=>Wa,getGlobalLogLevel:()=>Ga,getLogger:()=>on,logger:()=>f,setGlobalLogLevel:()=>Ba,setGlobalLogger:()=>qa});import*as V from"fs";import*as X from"path";import We from"chalk";import Ie from"pino";import{z as za}from"zod";function Va(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 Wa(n){return new qe(n||St)}function on(){return Ne||(Ne=new qe(St)),Ne}function qa(n){Ne=n}function Ba(n){St=n,Ne&&Ne.setLevel(n)}function Ga(){return St}var Ua,qe,Ne,St,f,P=d(()=>{"use strict";Ua=za.enum(["fatal","error","warn","info","debug","trace"]);a(Va,"formatDateTime");qe=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=Ua.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:Ie.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Ie.destination({dest:"/dev/null"})}),Ie({level:this.logLevel,timestamp:Ie.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((t,r)=>({level:r}),"level")},base:null,serializers:{err:Ie.stdSerializers?.err||(t=>t)}},Ie.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:We.gray}],[30,{name:"INFO",color:We.blue}],[40,{name:"WARN",color:We.yellow}],[50,{name:"ERROR",color:We.red}],[60,{name:"FATAL",color:We.red}]]);return{write:a(t=>{try{let r=JSON.parse(t),o=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${o}
|
|
3
|
+
`)}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=Va(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=X.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),V.existsSync(this.logFilePath)||V.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||!V.existsSync(this.logFilePath)))try{V.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=X.dirname(this.logFilePath),t=X.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let s=X.join(e,`${t}.${o}.log`),i=X.join(e,`${t}.${o+1}.log`);V.existsSync(s)&&(o===this.maxLogFiles-1?V.unlinkSync(s):V.renameSync(s,i))}let r=X.join(e,`${t}.1.log`);V.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=X.dirname(this.logFilePath),t=X.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=X.join(e,`${t}.${r}.log`);V.existsSync(o)&&V.unlinkSync(o)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},Ne=null,St="info";a(Wa,"createLogger");a(on,"getLogger");a(qa,"setGlobalLogger");a(Ba,"setGlobalLogLevel");a(Ga,"getGlobalLogLevel");f=on()});import{EventEmitter as Ja}from"events";function M(){return Ae||(Ae=new Nr),Ae}function sn(){Ae&&(Ae.destroy(),Ae=null)}var Nr,Ae,W=d(()=>{"use strict";P();Nr=class extends Ja{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=f,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")}},Ae=null;a(M,"getEventBus");a(sn,"destroyEventBus")});function Xa(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 Ar(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=Xa(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 Oe(n){return`${n.slice(0,30)}...${n.slice(-10)}`}var Rt=d(()=>{"use strict";a(Xa,"getMcpServerCommunicationType");a(Ar,"validateMcpServerConfig");a(Oe,"sliceEndpoint")});import Or from"json5";function an(n){let e=Or.parse(n);return{write(t){e&&typeof e=="object"&&t&&Object.assign(e,t)},toSource(){return Or.stringify(e,null,2)}}}function cn(n){return Or.parse(n)}var ln=d(()=>{"use strict";a(an,"createJson5Writer");a(cn,"parseJson5")});var un={};ue(un,{ConfigManager:()=>Mt,configManager:()=>m});import{copyFileSync as Ka,existsSync as Tt,readFileSync as Ya,writeFileSync as Qa}from"fs";import{dirname as Za,resolve as Ee}from"path";import{fileURLToPath as ec}from"url";import*as xe from"comment-json";import gn from"dayjs";var pn,xr,Mt,m,J=d(()=>{"use strict";W();Ue();Rt();ln();pn=Za(ec(import.meta.url)),xr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},Mt=class n{static{a(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=M();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[Ee(pn,"templates","default","xiaozhi.config.json"),Ee(pn,"..","templates","default","xiaozhi.config.json"),Ee(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>Tt(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=Ee(e,r);if(Tt(o))return o}return Ee(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=Ee(e,r);if(Tt(o))return!0}return!1}initConfig(e="json"){if(!Tt(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=Ee(t,r);Ka(this.defaultConfigPath,o),this.config=null,this.json5Writer=null}loadConfig(){if(!this.configExists()){let e=new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C xiaozhi init \u521D\u59CB\u5316\u914D\u7F6E");throw this.eventBus.emitEvent("config:error",{error:e,operation:"loadConfig"}),e}try{let e=this.getConfigFilePath();this.currentConfigPath=e;let t=this.getConfigFileFormat(e),o=Ya(e,"utf8").replace(/^\uFEFF/,""),s;switch(t){case"json5":s=cn(o),this.json5Writer=an(o);break;case"jsonc":s=xe.parse(o);break;default:s=JSON.parse(o);break}return this.validateConfig(s),s}catch(e){throw this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"loadConfig"}),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=te.normalizeTypeField(o),i=Ar(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),this.eventBus.emitEvent("config:updated",{type:"endpoint",timestamp:new Date})}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=Ar(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})}updateConfig(e){let t=this.getMutableConfig();if(e.mcpEndpoint!==void 0&&(t.mcpEndpoint=e.mcpEndpoint),e.mcpServers){let r={...t.mcpServers};for(let[o,s]of Object.entries(e.mcpServers))t.mcpServers[o]=s;for(let o of Object.keys(r))o in e.mcpServers||(delete t.mcpServers[o],t.mcpServerConfig?.[o]&&delete t.mcpServerConfig[o])}if(e.connection&&(t.connection||(t.connection={}),Object.assign(t.connection,e.connection)),e.modelscope&&(t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e.modelscope)),e.webUI&&(t.webUI||(t.webUI={}),Object.assign(t.webUI,e.webUI)),e.mcpServerConfig)for(let[r,o]of Object.entries(e.mcpServerConfig))t.mcpServerConfig?.[r]&&(t.mcpServerConfig[r]=o);if(e.platforms)for(let[r,o]of Object.entries(e.platforms))t.platforms||(t.platforms={}),t.platforms[r]=o;this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date})}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)}}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=xe.stringify(e,null,2)}catch{o=xe.stringify(e,null,2)}break;case"jsonc":try{o=xe.stringify(e,null,2)}catch{o=JSON.stringify(e,null,2)}break;default:o=JSON.stringify(e,null,2);break}Qa(t,o,"utf8"),this.config=e,this.notifyConfigUpdate(e)}catch(t){throw this.eventBus.emitEvent("config:error",{error:t instanceof Error?t:new Error(String(t)),operation:"saveConfig"}),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??xr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??xr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??xr.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),this.eventBus.emitEvent("config:updated",{type:"connection",timestamp:new Date})}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)])}else{let o=e,s=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(o,i,s)}}catch{if(typeof t=="string"&&r){let s=e,i=t}else{let s=e}}}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),this.eventBus.emitEvent("config:updated",{type:"modelscope",timestamp:new Date})}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"||!t.description||typeof t.description!="string"||!t.inputSchema||typeof t.inputSchema!="object"||!t.handler||typeof t.handler!="object"||!["proxy","function","http","script","chain","mcp"].includes(t.handler.type)||!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!1}}validateProxyHandler(e,t){return!(!t.platform||!["coze","openai","anthropic","custom"].includes(t.platform)||!t.config||typeof t.config!="object"||t.platform==="coze"&&!t.config.workflow_id&&!t.config.bot_id)}validateHttpHandler(e,t){if(!t.url||typeof t.url!="string")return!1;try{new URL(t.url)}catch{return!1}return!(t.method&&!["GET","POST","PUT","DELETE","PATCH"].includes(t.method))}validateFunctionHandler(e,t){return!(!t.module||typeof t.module!="string"||!t.function||typeof t.function!="string")}validateScriptHandler(e,t){return!(!t.script||typeof t.script!="string"||t.interpreter&&!["node","python","bash"].includes(t.interpreter))}validateChainHandler(e,t){return!(!t.tools||!Array.isArray(t.tools)||t.tools.length===0||!["sequential","parallel"].includes(t.mode)||!["stop","continue","retry"].includes(t.error_handling))}validateMCPHandler(e,t){return!(!t.config||typeof t.config!="object"||!t.config.serviceName||typeof t.config.serviceName!="string"||!t.config.toolName||typeof t.config.toolName!="string")}hasValidCustomMCPTools(){try{let e=this.getCustomMCPTools();return e.length===0?!1:this.validateCustomMCPTools(e)}catch{return!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)}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})}}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)}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)}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})}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),this.eventBus.emitEvent("config:updated",{type:"webui",timestamp:new Date})}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),this.eventBus.emitEvent("config:updated",{type:"platform",platformName:e,timestamp:new Date})}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=gn(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 $=e;o=`${$}__${t}`,s=r,c=`${$}/${t}`}else o=e,s=t,i=r||!0,c=o;let l=this.getCustomMCPTools(),g=l.findIndex($=>$.name===o);if(g===-1)return;let u=[...l],p=u[g];p.stats||(p.stats={});let E=p.stats.usageCount||0,h=p.stats.lastUsedTime;i&&(p.stats.usageCount=E+1),(!h||new Date(s)>new Date(h))&&(p.stats.lastUsedTime=gn(s).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(u)}catch{if(typeof r=="string"){let s=e,i=t}else{let s=e}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return!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))}async updateToolUsageStatsWithLock(e,t=!0){let r=`custommcp_${e}`;if(await this.acquireStatsUpdateLock(r))try{await this.updateToolUsageStats(e,t)}catch(o){throw 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)}catch(i){throw 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}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()}},m=Mt.getInstance()});import Be from"ws";var Ge,yt=d(()=>{"use strict";ee();Ve();Rt();ee();Ge=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:de(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 Be(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===Be.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===Be.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===Be.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 x(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=Date.now();try{let o=Et(e.params);if(!this.serviceManager)throw new x(-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 x(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),s(new x(-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 x(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?s(new x(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?s(new x(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?s(new x(-32001,l)):s(new x(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let o;if(e instanceof x)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===Be.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r))}}}});import{EventEmitter as tc}from"events";import{z as $r}from"zod";var rc,oc,Je,Dr=d(()=>{"use strict";ee();W();Rt();yt();rc={connectionTimeout:1e4,reconnectDelay:2e3},oc=$r.object({connectionTimeout:$r.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),reconnectDelay:$r.number().min(500,"reconnectDelay \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 500 \u7684\u6570\u5B57").optional()}).strict(),Je=class extends tc{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=M(),this.options={...rc,...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 ${Oe(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 ${Oe(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 ${Oe(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=oc.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 Ge(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: ${Oe(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: ${Oe(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:de(t.inputSchema)}))}catch{return[]}}}});var dn=d(()=>{"use strict";yt();Dr();Dr();yt()});var Xe,Lr=d(()=>{"use strict";Xe={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 Pt(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Xe[e]||Xe.zh;return new le.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var _r=d(()=>{"use strict";wt();Lr();a(Pt,"createCozeClient")});import nc from"node-cache";var me,mn=d(()=>{"use strict";_r();me=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Pt(this.token),this.cache=new nc({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 le={};ue(le,{CozeApiService:()=>me,config:()=>Xe,createCozeClient:()=>Pt});import*as id from"@coze/api";var wt=d(()=>{"use strict";Lr();be(le,id);_r();mn()});import{createHash as sc}from"crypto";function se(n,e){let t=sc("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function kr(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Ke(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 bt,jr=d(()=>{"use strict";a(se,"generateCacheKey");a(kr,"isCacheExpired");a(Ke,"shouldCleanupCache");bt={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function hn(n,e){return{content:[{type:"text",text:e?ic(e,n):fn(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 ic(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...
|
|
4
4
|
|
|
5
5
|
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
6
6
|
- \u4EFB\u52A1ID: ${e}
|
|
@@ -11,7 +11,7 @@ var Pa=Object.create;var Fe=Object.defineProperty;var wa=Object.getOwnPropertyDe
|
|
|
11
11
|
\u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
|
|
12
12
|
1. \u4F7F\u7528\u76F8\u540C\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
|
|
13
13
|
2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
|
|
14
|
-
3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:
|
|
14
|
+
3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:fn(e)};return t[n]||t.default}function fn(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
|
|
15
15
|
|
|
16
16
|
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
17
17
|
- \u4EFB\u52A1ID: ${n}
|
|
@@ -21,20 +21,20 @@ var Pa=Object.create;var Fe=Object.defineProperty;var wa=Object.getOwnPropertyDe
|
|
|
21
21
|
\u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
|
|
22
22
|
1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
|
|
23
23
|
2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
|
|
24
|
-
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var Ke,Hr=d(()=>{"use strict";Ke=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(dn,"createTimeoutResponse");a(nc,"getToolSpecificTimeoutMessage");a(mn,"getDefaultTimeoutMessage")});function hn(n){return n.type==="proxy"}var Ye,It=d(()=>{"use strict";J();wt();Se();ee();P();W();jr();Hr();a(hn,"isProxyHandler");Ye=class{static{a(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=bt.TIMEOUT;CACHE_TTL=bt.CACHE_TTL;constructor(e,t){this.logger=f,this.cacheManager=e||new ge,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=m.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new me(e)}setupEventListeners(){M().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||m.getCustomMCPTools();this.tools.clear();for(let r of t)if(hn(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=hn(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:de(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=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,c),c}catch(i){if(i instanceof Ke){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}`),dn(c,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new Ke(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}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&&!kr(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];Xe(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 se(e,t)}generateCacheKey(e,t){return se(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()}}});var Fr,xe,Qe,y,zr,Ur,$e=d(()=>{"use strict";Fr={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},xe={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"},y={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"},zr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3},Ur={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var q,Re,D,w,T,pe,ie=d(()=>{"use strict";$e();q=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)}},Re=class n extends q{static{a(this,"ConfigError")}constructor(e,t){super(e,y.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 q{static{a(this,"ServiceError")}constructor(e,t){super(e,y.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"])}},w=class n extends q{static{a(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,y.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 q{static{a(this,"FileError")}constructor(e,t,r){let o=t?`${e}: ${t}`:e;super(o,y.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"])}},pe=class n extends q{static{a(this,"ProcessError")}constructor(e,t,r){let o=t?`${e} (PID: ${t})`:e;super(o,y.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 j from"fs";import K from"path";var b,Ze=d(()=>{"use strict";ie();b=class n{static{a(this,"FileUtils")}static exists(e){try{return j.existsSync(e)}catch{return!1}}static ensureDir(e){try{j.existsSync(e)||j.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 j.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),j.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),j.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)&&j.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=j.readdirSync(e);for(let s of o){if(r.exclude?.includes(s))continue;let i=K.join(e,s),c=K.join(t,s);j.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)&&j.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=j.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=j.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&&j.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=j.constants.R_OK|j.constants.W_OK){try{return j.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)}}});import{realpathSync as sc}from"fs";import{tmpdir as ic}from"os";import N from"path";import{fileURLToPath as fn}from"url";var A,Te=d(()=>{"use strict";$e();Ze();A=class n{static{a(this,"PathUtils")}static getPidFile(){let e=process.env[xe.DIR_ENV_VAR]||process.cwd();return N.join(e,`.${Fr.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return N.join(t,Fr.LOG_FILE)}static getConfigDir(){return process.env[xe.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=n.getConfigDir();return N.join(e,Qe.WORK_DIR)}static getTemplatesDir(){let e=fn(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=fn(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 xe.FILE_NAMES){let o=N.join(t,r);if(b.exists(o))return o}return N.join(t,xe.FILE_NAMES[2])}static getDefaultConfigPath(){let e=n.getProjectRoot();return N.join(e,xe.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=sc(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||ic()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import*as he from"fs";import*as Me from"path";import Nt from"pino";var et,At,Ot=d(()=>{"use strict";Te();et=class{static{a(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=Me.resolve(Me.normalize(e.logFilePath));else{let r=t||A.getTempDir();this.logFilePath=Me.join(Me.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:a(r=>{try{let o=JSON.parse(r),s=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:Nt.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch{}return Nt({level:"info",timestamp:Nt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((r,o)=>({level:o}),"level")},base:null},Nt.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(!he.existsSync(this.logFilePath))return;let t=he.readFileSync(this.logFilePath,"utf8").trim().split(`
|
|
24
|
+
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var Ye,Hr=d(()=>{"use strict";Ye=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(hn,"createTimeoutResponse");a(ic,"getToolSpecificTimeoutMessage");a(fn,"getDefaultTimeoutMessage")});function Cn(n){return n.type==="proxy"}var Qe,It=d(()=>{"use strict";J();wt();Se();ee();P();W();jr();Hr();a(Cn,"isProxyHandler");Qe=class{static{a(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=bt.TIMEOUT;CACHE_TTL=bt.CACHE_TTL;constructor(e,t){this.logger=f,this.cacheManager=e||new ge,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=m.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new me(e)}setupEventListeners(){M().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||m.getCustomMCPTools();this.tools.clear();for(let r of t)if(Cn(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=Cn(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:de(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=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,c),c}catch(i){if(i instanceof Ye){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}`),hn(c,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new Ye(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}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&&!kr(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];Ke(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 se(e,t)}generateCacheKey(e,t){return se(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()}}});var Fr,$e,Ze,y,zr,Ur,De=d(()=>{"use strict";Fr={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},$e={FILE_NAMES:["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"],DEFAULT_FILE:"xiaozhi.config.default.json",DIR_ENV_VAR:"XIAOZHI_CONFIG_DIR"},Ze={WORK_DIR:".xiaozhi",TEMPLATES_DIR:"templates",LOGS_DIR:"logs"},y={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"},zr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3},Ur={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var q,Re,D,w,T,pe,ie=d(()=>{"use strict";De();q=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)}},Re=class n extends q{static{a(this,"ConfigError")}constructor(e,t){super(e,y.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 q{static{a(this,"ServiceError")}constructor(e,t){super(e,y.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"])}},w=class n extends q{static{a(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,y.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 q{static{a(this,"FileError")}constructor(e,t,r){let o=t?`${e}: ${t}`:e;super(o,y.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"])}},pe=class n extends q{static{a(this,"ProcessError")}constructor(e,t,r){let o=t?`${e} (PID: ${t})`:e;super(o,y.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 j from"fs";import K from"path";var b,et=d(()=>{"use strict";ie();b=class n{static{a(this,"FileUtils")}static exists(e){try{return j.existsSync(e)}catch{return!1}}static ensureDir(e){try{j.existsSync(e)||j.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 j.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),j.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),j.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)&&j.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=j.readdirSync(e);for(let s of o){if(r.exclude?.includes(s))continue;let i=K.join(e,s),c=K.join(t,s);j.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)&&j.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=j.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=j.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&&j.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=j.constants.R_OK|j.constants.W_OK){try{return j.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)}}});import{realpathSync as ac}from"fs";import{tmpdir as cc}from"os";import N from"path";import{fileURLToPath as vn}from"url";var A,Te=d(()=>{"use strict";De();et();A=class n{static{a(this,"PathUtils")}static getPidFile(){let e=process.env[$e.DIR_ENV_VAR]||process.cwd();return N.join(e,`.${Fr.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return N.join(t,Fr.LOG_FILE)}static getConfigDir(){return process.env[$e.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=n.getConfigDir();return N.join(e,Ze.WORK_DIR)}static getTemplatesDir(){let e=vn(import.meta.url),t=N.dirname(e);return[N.join(t,Ze.TEMPLATES_DIR),N.join(t,"..","..","..",Ze.TEMPLATES_DIR),N.join(t,"..","..","..","..",Ze.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=vn(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 $e.FILE_NAMES){let o=N.join(t,r);if(b.exists(o))return o}return N.join(t,$e.FILE_NAMES[2])}static getDefaultConfigPath(){let e=n.getProjectRoot();return N.join(e,$e.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=ac(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||cc()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import*as he from"fs";import*as Me from"path";import Nt from"pino";var tt,At,Ot=d(()=>{"use strict";Te();tt=class{static{a(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=Me.resolve(Me.normalize(e.logFilePath));else{let r=t||A.getTempDir();this.logFilePath=Me.join(Me.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:a(r=>{try{let o=JSON.parse(r),s=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:Nt.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch{}return Nt({level:"info",timestamp:Nt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((r,o)=>({level:o}),"level")},base:null},Nt.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(!he.existsSync(this.logFilePath))return;let t=he.readFileSync(this.logFilePath,"utf8").trim().split(`
|
|
25
25
|
`).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,o=t.slice(r),s=o.join(`
|
|
26
26
|
`)+(o.length>0?`
|
|
27
|
-
`:"");he.writeFileSync(this.logFilePath,s,"utf8")}catch{}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch{}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},At=class{static{a(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||A.getConfigDir()}getLogFilePath(){return new
|
|
28
|
-
`).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,o.push(i)}catch{}return o.sort((s,i)=>(i.timestamp||0)-(s.timestamp||0)),o}catch{throw 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||50,1e3),i=e.offset||0,c=r.slice(i,i+s),l=i+s<o;return{records:c,total:o,hasMore:l}}}});var De,xt=d(()=>{"use strict";Se();P();De=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=f}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=vt(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 $t=d(()=>{"use strict"});var Cn=d(()=>{"use strict";$t()});import Kd,{WebSocketServer as Yd}from"ws";var vn=d(()=>{"use strict";$t()});var qr=d(()=>{"use strict";$t();Cn();vn()});import{EventEmitter as lc}from"events";var tt,En=d(()=>{"use strict";Ir();J();Se();Se();W();It();Ot();xt();qr();tt=class extends lc{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=M();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 ge(r),this.customMCPHandler=new Ye(this.cacheManager,this);let o=m.getToolCallLogConfig(),s=m.getConfigDir();this.toolCallLogger=new et(o,s),this.setupEventListeners(),this.messageHandler=new De(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(!m.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,r){let o=Date.now(),s="unknown",i=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(s=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(c=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(c=await this.customMCPHandler.callTool(e,t,r),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);s=l.serviceName,i=l.originalName;let g=this.services.get(l.serviceName);if(!g)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!g.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await g.callTool(l.originalName,t||{}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-o}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:null,success:!1,duration:Date.now()-o,error:c instanceof Error?c.message:String(c)}),this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l?.handler?.type==="mcp"?this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!1):this.updateToolStatsSafe(e,"customMCP",e,!1)}else{let l=this.tools.get(e);l&&this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1)}throw c}}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 m.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await m.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await m.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await m.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{m.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=m.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?br(e.url):!1}handleModelScopeAuth(e,t){if(e.headers?.Authorization)return;let o=m.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=m.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 p of o){let E=s[p.name];E?i[p.name]={...E,description:p.description||E.description||""}:i[p.name]={description:p.description||"",enable:!0}}let c=o.map(p=>p.name),g=Object.keys(s).filter(p=>!c.includes(p));if(g.length>0,this.hasToolsConfigChanged(s,i)){m.updateServerToolsConfig(t,i);let p=Object.keys(i).filter(h=>!s[h]),E=Object.keys(i).filter(h=>{let $=s[h],mt=i[h];return $&&$.description!==mt.description});p.length>0,E.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 gc}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as pc}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as uc}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as dc}from"eventsource";function mc(n){switch(n.type){case"stdio":return hc(n);case"sse":return fc(n);case"streamable-http":return Cc(n);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function hc(n){if(!n.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new pc({command:n.command,args:n.args||[],env:n.env})}function fc(n){if(!n.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=vc(n);return new gc(e,t)}function Cc(n){if(!n.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Ec(n);return new uc(e,t)}function vc(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Ec(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Sc(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(ve).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 Rc(){return["stdio","sse","streamable-http"]}var Br,Gr=d(()=>{"use strict";ee();typeof global<"u"&&!global.EventSource&&(global.EventSource=dc);a(mc,"createTransport");a(hc,"createStdioTransport");a(fc,"createSSETransport");a(Cc,"createStreamableHTTPTransport");a(vc,"createSSEOptions");a(Ec,"createStreamableHTTPOptions");a(Sc,"validateConfig");a(Rc,"getSupportedTypes");Br={create:mc,validateConfig:Sc,getSupportedTypes:Rc}});import{Client as Tc}from"@modelcontextprotocol/sdk/client/index.js";var Dt,Sn=d(()=>{"use strict";W();Gr();ee();Ue();Dt=class{static{a(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";connectionTimeout=null;initialized=!1;eventBus=M();constructor(e){this.config=Zo(e),this.validateConfig()}validateConfig(){Br.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 Tc({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{}}),this.transport=Br.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 Rn=d(()=>{"use strict"});import{Hono as Mc}from"hono";var Tn,Jr=d(()=>{"use strict";Tn=a(()=>new Mc,"createApp")});var Xr=d(()=>{"use strict";jr();Rn();Hr();Jr()});import{createHash as yc}from"crypto";import{existsSync as rt,mkdirSync as Pc,readFileSync as Mn,renameSync as wc,writeFileSync as yn}from"fs";import{dirname as bc,resolve as Pn}from"path";import Ic from"dayjs";var ge,wn=d(()=>{"use strict";P();Xr();ge=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=f,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ic().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return Pn(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return Pn(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!rt(this.cachePath)){let e=bc(this.cachePath);rt(e)||(Pc(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(!rt(this.cachePath))return await this.createInitialCache();let e=Mn(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{yn(r,t,"utf8"),wc(r,e)}catch(o){try{rt(r)&&yn(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return yc("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:rt(this.cachePath)?Mn(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=se(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=se(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=se(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=se(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=se(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)Xe(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 Se=d(()=>{"use strict";En();Sn();ee();Ue();Gr();xt();wn();It();Ot();qr()});var Kr,bn=d(()=>{"use strict";P();Kr=a(async(n,e)=>{n.set("logger",f),await e()},"loggerMiddleware")});import{cors as Nc}from"hono/cors";var Yr,In=d(()=>{"use strict";Yr=Nc({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var H,re,Qr,Zr,eo=d(()=>{"use strict";P();H=a((n,e,t)=>({error:{code:n,message:e,details:t}}),"createErrorResponse"),re=a((n,e)=>({success:!0,data:n,message:e}),"createSuccessResponse"),Qr=a((n,e)=>{let t;try{let o=e.get("logger");o?t=o:t=f}catch{t=f}process.env.NODE_ENV,t.error("HTTP request error:",n);let r=H("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"),Zr=a(n=>{if(n.req.path.startsWith("/api/")){let t=H("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=H("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 Le,ot,to=d(()=>{"use strict";Le=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},ot=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var ro,Nn=d(()=>{"use strict";P();to();ro=a(async(n,e)=>{if(!n.get("mcpServiceManager"))try{let t=n.get("logger")||f;t.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let r=n.get("webServer");if(!r)throw new ot("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")||f;if(t instanceof Le)r.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof ot?(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 oo,An=d(()=>{"use strict";oo=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 Lt,no=d(()=>{"use strict";P();W();Lt=class{static{a(this,"MCPEndpointApiHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=f,this.endpointManager=e,this.configManager=t,this.eventBus=M()}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 so,On=d(()=>{"use strict";J();no();so=a(()=>{let n=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?n=new Lt(o,m):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var io=d(()=>{"use strict";bn();In();eo();Nn();An();On();Jr()});var _t,xn=d(()=>{"use strict";_t=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 kt,$n=d(()=>{"use strict";J();io();xn();kt=class extends _t{static{a(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=m.getConfig();return t.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(re(r))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r);let o=H("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(m.validateConfig(r),m.updateConfig(r),r.mcpServerConfig)for(let[o,s]of Object.entries(r.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))m.setToolEnabled(o,i,c.enable);return t.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(re(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(r){t.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r);let o=H("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=m.getMcpEndpoint();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(re({endpoint:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",r);let o=H("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=m.getMcpEndpoints();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(re({endpoints:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",r);let o=H("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=m.getMcpServers();return t.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(re({servers:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",r);let o=H("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=m.getConnectionConfig();return t.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(re({connection:r}))}catch(r){t.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",r);let o=H("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"),m.reloadConfig();let r=m.getConfig();return t.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(re(r,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(r){t.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",r);let o=H("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=m.getConfigPath();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(re({path:r}))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",r);let o=H("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=m.configExists();return t.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${r}`),e.json(re({exists:r}))}catch(r){t.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",r);let o=H("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 _e(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 jt(n,e){return{success:!0,data:n,message:e}}function _(n,e,t){return{success:!1,message:n,error:e?{code:e,details:t}:void 0}}function Ht(){let n=m.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 me(n)}var Ft,Dn=d(()=>{"use strict";J();wt();P();a(_e,"isErrorWithCode");a(jt,"createSuccessResponse");a(_,"createErrorResponse");a(Ht,"getCozeApiService");Ft=class{static{a(this,"CozeApiHandler")}async getWorkspaces(e){try{if(f.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=Ht();f.info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return f.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(jt({workspaces:r}))}catch(t){return f.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),_e(t)&&t.code==="AUTH_FAILED"?e.json(_("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):_e(t)&&t.code==="RATE_LIMITED"?e.json(_("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):_e(t)&&t.code==="TIMEOUT"?e.json(_("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(_(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(f.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\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 f.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(_("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(_("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(o<1||o>100)return e.json(_("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let s={workspace_id:t,page_num:r,page_size:o},i=Ht();f.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);f.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=m.getCustomMCPTools(),g=c.items.map(u=>{let p=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!p,toolName:p?.name||null}});return f.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(jt({items:g,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length}))}catch(t){return f.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),_e(t)&&t.code==="AUTH_FAILED"?e.json(_("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):_e(t)&&t.code==="RATE_LIMITED"?e.json(_("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):_e(t)&&t.code==="TIMEOUT"?e.json(_("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(_(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(f.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\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=Ht(),o=r.getCacheStats();f.info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let s=r.getCacheStats();return f.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${s.size} \u9879`),e.json(jt({cleared:o.size-s.size,remaining:s.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return f.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(_(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(f.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=Ht().getCacheStats();return e.json(jt(r))}catch(t){return f.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(_(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 zt,Ln=d(()=>{"use strict";J();P();zt=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=f,this.statusService=e,this.notificationService=t}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:m.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 Ac}from"crypto";var Ut,_n=d(()=>{"use strict";xt();P();Ut=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=f,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 De(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 E=await e.req.text();if(E.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(E),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 p=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+p)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:g.method,messageId:r,responseTime:p,isNotification:u===null}),u===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.toString()}}):e.json(u,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.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=Ac(),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,p={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,p),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($){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,$),p.isAlive=!1}this.startHeartbeat(p);let E=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"}}),h=a(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",h),u.signal.addEventListener("abort",h),E}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}
|
|
27
|
+
`:"");he.writeFileSync(this.logFilePath,s,"utf8")}catch{}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch{}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},At=class{static{a(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||A.getConfigDir()}getLogFilePath(){return new tt({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!he.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=he.readFileSync(e,"utf8").trim().split(`
|
|
28
|
+
`).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,o.push(i)}catch{}return o.sort((s,i)=>(i.timestamp||0)-(s.timestamp||0)),o}catch{throw 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||50,1e3),i=e.offset||0,c=r.slice(i,i+s),l=i+s<o;return{records:c,total:o,hasMore:l}}}});var Le,xt=d(()=>{"use strict";Se();P();Le=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=f}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=Et(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 $t=d(()=>{"use strict"});var En=d(()=>{"use strict";$t()});import tm,{WebSocketServer as rm}from"ws";var Sn=d(()=>{"use strict";$t()});var qr=d(()=>{"use strict";$t();En();Sn()});import{EventEmitter as pc}from"events";var rt,Rn=d(()=>{"use strict";Ir();J();Se();Se();W();It();Ot();xt();qr();rt=class extends pc{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=M();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 ge(r),this.customMCPHandler=new Qe(this.cacheManager,this);let o=m.getToolCallLogConfig(),s=m.getConfigDir();this.toolCallLogger=new tt(o,s),this.setupEventListeners(),this.messageHandler=new Le(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(!m.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,r){let o=Date.now(),s="unknown",i=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(s=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(c=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(c=await this.customMCPHandler.callTool(e,t,r),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);s=l.serviceName,i=l.originalName;let g=this.services.get(l.serviceName);if(!g)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!g.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await g.callTool(l.originalName,t||{}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-o}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:null,success:!1,duration:Date.now()-o,error:c instanceof Error?c.message:String(c)}),this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l?.handler?.type==="mcp"?this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!1):this.updateToolStatsSafe(e,"customMCP",e,!1)}else{let l=this.tools.get(e);l&&this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1)}throw c}}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 m.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await m.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await m.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await m.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{m.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=m.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?br(e.url):!1}handleModelScopeAuth(e,t){if(e.headers?.Authorization)return;let o=m.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=m.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 p of o){let E=s[p.name];E?i[p.name]={...E,description:p.description||E.description||""}:i[p.name]={description:p.description||"",enable:!0}}let c=o.map(p=>p.name),g=Object.keys(s).filter(p=>!c.includes(p));if(g.length>0,this.hasToolsConfigChanged(s,i)){m.updateServerToolsConfig(t,i);let p=Object.keys(i).filter(h=>!s[h]),E=Object.keys(i).filter(h=>{let $=s[h],ht=i[h];return $&&$.description!==ht.description});p.length>0,E.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 uc}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as dc}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as mc}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as hc}from"eventsource";function fc(n){switch(n.type){case"stdio":return Cc(n);case"sse":return vc(n);case"streamable-http":return Ec(n);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function Cc(n){if(!n.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new dc({command:n.command,args:n.args||[],env:n.env})}function vc(n){if(!n.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Sc(n);return new uc(e,t)}function Ec(n){if(!n.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Rc(n);return new mc(e,t)}function Sc(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Rc(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Tc(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(ve).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 Mc(){return["stdio","sse","streamable-http"]}var Br,Gr=d(()=>{"use strict";ee();typeof global<"u"&&!global.EventSource&&(global.EventSource=hc);a(fc,"createTransport");a(Cc,"createStdioTransport");a(vc,"createSSETransport");a(Ec,"createStreamableHTTPTransport");a(Sc,"createSSEOptions");a(Rc,"createStreamableHTTPOptions");a(Tc,"validateConfig");a(Mc,"getSupportedTypes");Br={create:fc,validateConfig:Tc,getSupportedTypes:Mc}});import{Client as yc}from"@modelcontextprotocol/sdk/client/index.js";var Dt,Tn=d(()=>{"use strict";W();Gr();ee();Ve();Dt=class{static{a(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";connectionTimeout=null;initialized=!1;eventBus=M();constructor(e){this.config=Zo(e),this.validateConfig()}validateConfig(){Br.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 yc({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{}}),this.transport=Br.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 Mn=d(()=>{"use strict"});import{Hono as Pc}from"hono";var yn,Jr=d(()=>{"use strict";yn=a(()=>new Pc,"createApp")});var Xr=d(()=>{"use strict";jr();Mn();Hr();Jr()});import{createHash as wc}from"crypto";import{existsSync as ot,mkdirSync as bc,readFileSync as Pn,renameSync as Ic,writeFileSync as wn}from"fs";import{dirname as Nc,resolve as bn}from"path";import Ac from"dayjs";var ge,In=d(()=>{"use strict";P();Xr();ge=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=f,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ac().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return bn(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return bn(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!ot(this.cachePath)){let e=Nc(this.cachePath);ot(e)||(bc(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(!ot(this.cachePath))return await this.createInitialCache();let e=Pn(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{wn(r,t,"utf8"),Ic(r,e)}catch(o){try{ot(r)&&wn(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return wc("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:ot(this.cachePath)?Pn(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=se(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=se(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=se(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=se(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=se(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)Ke(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 Se=d(()=>{"use strict";Rn();Tn();ee();Ve();Gr();xt();In();It();Ot();qr()});var Kr,Nn=d(()=>{"use strict";P();Kr=a(async(n,e)=>{n.set("logger",f),await e()},"loggerMiddleware")});import{cors as Oc}from"hono/cors";var Yr,An=d(()=>{"use strict";Yr=Oc({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var H,re,Qr,Zr,eo=d(()=>{"use strict";P();H=a((n,e,t)=>({error:{code:n,message:e,details:t}}),"createErrorResponse"),re=a((n,e)=>({success:!0,data:n,message:e}),"createSuccessResponse"),Qr=a((n,e)=>{let t;try{let o=e.get("logger");o?t=o:t=f}catch{t=f}process.env.NODE_ENV,t.error("HTTP request error:",n);let r=H("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"),Zr=a(n=>{if(n.req.path.startsWith("/api/")){let t=H("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=H("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 _e,nt,to=d(()=>{"use strict";_e=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},nt=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var ro,On=d(()=>{"use strict";P();to();ro=a(async(n,e)=>{if(!n.get("mcpServiceManager"))try{let t=n.get("logger")||f;t.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let r=n.get("webServer");if(!r)throw new nt("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")||f;if(t instanceof _e)r.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof nt?(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 oo,xn=d(()=>{"use strict";oo=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 Lt,no=d(()=>{"use strict";P();W();Lt=class{static{a(this,"MCPEndpointApiHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=f,this.endpointManager=e,this.configManager=t,this.eventBus=M()}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 so,$n=d(()=>{"use strict";J();no();so=a(()=>{let n=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?n=new Lt(o,m):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var io=d(()=>{"use strict";Nn();An();eo();On();xn();$n();Jr()});var _t,Dn=d(()=>{"use strict";_t=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 kt,Ln=d(()=>{"use strict";J();io();Dn();kt=class extends _t{static{a(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=m.getConfig();return t.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(re(r))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r);let o=H("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(m.validateConfig(r),m.updateConfig(r),r.mcpServerConfig)for(let[o,s]of Object.entries(r.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))m.setToolEnabled(o,i,c.enable);return t.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(re(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(r){t.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r);let o=H("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=m.getMcpEndpoint();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(re({endpoint:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",r);let o=H("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=m.getMcpEndpoints();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(re({endpoints:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",r);let o=H("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=m.getMcpServers();return t.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(re({servers:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",r);let o=H("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=m.getConnectionConfig();return t.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(re({connection:r}))}catch(r){t.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",r);let o=H("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"),m.reloadConfig();let r=m.getConfig();return t.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(re(r,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(r){t.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",r);let o=H("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=m.getConfigPath();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(re({path:r}))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",r);let o=H("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=m.configExists();return t.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${r}`),e.json(re({exists:r}))}catch(r){t.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",r);let o=H("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 ke(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 jt(n,e){return{success:!0,data:n,message:e}}function _(n,e,t){return{success:!1,message:n,error:e?{code:e,details:t}:void 0}}function Ht(){let n=m.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 me(n)}var Ft,_n=d(()=>{"use strict";J();wt();P();a(ke,"isErrorWithCode");a(jt,"createSuccessResponse");a(_,"createErrorResponse");a(Ht,"getCozeApiService");Ft=class{static{a(this,"CozeApiHandler")}async getWorkspaces(e){try{if(f.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=Ht();f.info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return f.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(jt({workspaces:r}))}catch(t){return f.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),ke(t)&&t.code==="AUTH_FAILED"?e.json(_("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):ke(t)&&t.code==="RATE_LIMITED"?e.json(_("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):ke(t)&&t.code==="TIMEOUT"?e.json(_("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(_(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(f.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\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 f.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(_("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(_("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(o<1||o>100)return e.json(_("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let s={workspace_id:t,page_num:r,page_size:o},i=Ht();f.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);f.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=m.getCustomMCPTools(),g=c.items.map(u=>{let p=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!p,toolName:p?.name||null}});return f.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(jt({items:g,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length}))}catch(t){return f.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),ke(t)&&t.code==="AUTH_FAILED"?e.json(_("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):ke(t)&&t.code==="RATE_LIMITED"?e.json(_("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):ke(t)&&t.code==="TIMEOUT"?e.json(_("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(_(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(f.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\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=Ht(),o=r.getCacheStats();f.info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let s=r.getCacheStats();return f.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${s.size} \u9879`),e.json(jt({cleared:o.size-s.size,remaining:s.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return f.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(_(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(f.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(_("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=Ht().getCacheStats();return e.json(jt(r))}catch(t){return f.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(_(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 zt,kn=d(()=>{"use strict";J();P();zt=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=f,this.statusService=e,this.notificationService=t}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:m.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 xc}from"crypto";var Ut,jn=d(()=>{"use strict";xt();P();Ut=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=f,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 Le(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 E=await e.req.text();if(E.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(E),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 p=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+p)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:g.method,messageId:r,responseTime:p,isNotification:u===null}),u===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.toString()}}):e.json(u,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.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=xc(),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,p={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,p),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($){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,$),p.isAlive=!1}this.startHeartbeat(p);let E=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"}}),h=a(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",h),u.signal.addEventListener("abort",h),E}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}
|
|
29
29
|
data: ${r}
|
|
30
30
|
|
|
31
|
-
`;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 O,Vt,ao,co,lo,uf,kn=d(()=>{"use strict";O=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}})}},Vt=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof O)}handle(e,t){return O.fromError(e,"INTERNAL_ERROR","system")}},ao=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 O.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},co=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 O.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},lo=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new ao),this.registerHandler(new co),this.registerHandler(new Vt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof O)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new Vt().handle(e,t)}},uf=new lo});var Wt,oe,jn=d(()=>{"use strict";P();kn();W();ze();Wt=class{static{a(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=f,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 O)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=O.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?s=O.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?s=O.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?s=O.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):s=O.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=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,p=await this.addMCPServersBatch(u),E=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:p.addedCount,failedCount:p.failedCount,duration:E}),e.json(this.createSuccessResponse(p,p.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=te.normalizeTypeField(t);try{let o=oe.validateServiceName(e);if(!o.isValid){let g=O.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(oe.checkServiceExists(e,this.configManager)){let g=O.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=oe.validateConfig(r);if(!s.isValid){let g=O.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 M().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}`),M().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)&&M().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=oe.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!oe.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),M().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=oe.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!oe.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 O.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 O.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,p]of Object.entries(t)){let E=te.normalizeTypeField(p);try{let h=await this.addMCPServerSingle(u,E);o.push({name:u,success:!0,config:E,tools:h.tools,status:h.status}),s.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:h.tools?.length||0})}catch(h){let $=this.handleError(h,"addMCPServersBatch",{serverName:u,serverConfig:E});o.push({name:u,success:!1,error:$.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:$.message})}}let c=s.length,l=r.length-c;if(c===0)throw O.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");M().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 O?c:O.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=oe.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(oe.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=te.normalizeTypeField(s),l=oe.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),M().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")})(oe||={})});var qt,Hn=d(()=>{"use strict";J();P();W();qt=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=f,this.notificationService=e,this.statusService=t,this.eventBus=M()}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=m.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{if(m.validateConfig(t),m.updateConfig(t),t.mcpServerConfig)for(let[o,s]of Object.entries(t.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))m.setToolEnabled(o,i,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(o){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",o),this.sendError(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o))}}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=m.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)}}});var Oc,xc,Bt,Fn=d(()=>{"use strict";$e();Oc={[y.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[y.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[y.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[y.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[y.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[y.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[y.PERMISSION_ERROR]:"\u5C1D\u8BD5\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"},xc={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"]},Bt=class{static{a(this,"ERROR_MESSAGES")}static getHelpMessage(e){return Oc[e]}static getSolutions(e){return xc[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[y.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[y.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[y.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[y.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[y.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[y.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[y.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[y.NETWORK_ERROR,y.FILE_ERROR,y.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[y.VALIDATION_ERROR]:"low",[y.FILE_ERROR]:"medium",[y.CONFIG_ERROR]:"medium",[y.NETWORK_ERROR]:"medium",[y.SERVICE_ERROR]:"high",[y.PROCESS_ERROR]:"high",[y.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});import"chalk";var Gt,zn=d(()=>{"use strict";Fn();ie();Gt=class n{static{a(this,"ErrorHandler")}static handle(e){e instanceof q?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=Bt.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 q?r:r instanceof Error?new q(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new q(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof q?r:r instanceof Error?new q(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new q(`${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){}}});var ke,go=d(()=>{"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+=`
|
|
31
|
+
`;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 O,Vt,ao,co,lo,Cf,Hn=d(()=>{"use strict";O=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}})}},Vt=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof O)}handle(e,t){return O.fromError(e,"INTERNAL_ERROR","system")}},ao=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 O.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},co=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 O.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},lo=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new ao),this.registerHandler(new co),this.registerHandler(new Vt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof O)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new Vt().handle(e,t)}},Cf=new lo});var Wt,oe,Fn=d(()=>{"use strict";P();Hn();W();Ue();Wt=class{static{a(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=f,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 O)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=O.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?s=O.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?s=O.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?s=O.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):s=O.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=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,p=await this.addMCPServersBatch(u),E=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:p.addedCount,failedCount:p.failedCount,duration:E}),e.json(this.createSuccessResponse(p,p.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=te.normalizeTypeField(t);try{let o=oe.validateServiceName(e);if(!o.isValid){let g=O.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(oe.checkServiceExists(e,this.configManager)){let g=O.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=oe.validateConfig(r);if(!s.isValid){let g=O.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 M().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}`),M().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)&&M().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=oe.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!oe.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),M().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=oe.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!oe.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 O.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 O.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,p]of Object.entries(t)){let E=te.normalizeTypeField(p);try{let h=await this.addMCPServerSingle(u,E);o.push({name:u,success:!0,config:E,tools:h.tools,status:h.status}),s.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:h.tools?.length||0})}catch(h){let $=this.handleError(h,"addMCPServersBatch",{serverName:u,serverConfig:E});o.push({name:u,success:!1,error:$.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:$.message})}}let c=s.length,l=r.length-c;if(c===0)throw O.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");M().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 O?c:O.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=oe.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(oe.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=te.normalizeTypeField(s),l=oe.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),M().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")})(oe||={})});var qt,zn=d(()=>{"use strict";J();P();W();qt=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=f,this.notificationService=e,this.statusService=t,this.eventBus=M()}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=m.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{if(m.validateConfig(t),m.updateConfig(t),t.mcpServerConfig)for(let[o,s]of Object.entries(t.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))m.setToolEnabled(o,i,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(o){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",o),this.sendError(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o))}}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=m.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)}}});var $c,Dc,Bt,Un=d(()=>{"use strict";De();$c={[y.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[y.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[y.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[y.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[y.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[y.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[y.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"]},Bt=class{static{a(this,"ERROR_MESSAGES")}static getHelpMessage(e){return $c[e]}static getSolutions(e){return Dc[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[y.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[y.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[y.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[y.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[y.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[y.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[y.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[y.NETWORK_ERROR,y.FILE_ERROR,y.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[y.VALIDATION_ERROR]:"low",[y.FILE_ERROR]:"medium",[y.CONFIG_ERROR]:"medium",[y.NETWORK_ERROR]:"medium",[y.SERVICE_ERROR]:"high",[y.PROCESS_ERROR]:"high",[y.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});import"chalk";var Gt,Vn=d(()=>{"use strict";Un();ie();Gt=class n{static{a(this,"ErrorHandler")}static handle(e){e instanceof q?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=Bt.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 q?r:r instanceof Error?new q(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new q(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof q?r:r instanceof Error?new q(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new q(`${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){}}});var je,go=d(()=>{"use strict";je=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+=`
|
|
32
32
|
\u5806\u6808\u4FE1\u606F:
|
|
33
33
|
${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join(`
|
|
34
34
|
`)}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(`
|
|
35
|
-
`)}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{execSync as Un}from"child_process";var ne,Jt=d(()=>{"use strict";$e();ie();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=Un(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:zr.PROCESS_STOP}).toLowerCase():t=Un(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:zr.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 pe(`\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,Xt=d(()=>{"use strict";ie();Y=class n{static{a(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw w.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new w(`\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 w.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new w(`\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 w(`\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 w(`\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 w(`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 w(`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 w('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new w("\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 w("\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 w("\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 w(`\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 w(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new w(`\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 w(`\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 w(`\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 w(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${o}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new w(`\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 w(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import Kt from"fs";import ae from"path";import{fileURLToPath as Vn}from"url";var fe,po=d(()=>{"use strict";ie();fe=class n{static{a(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(n.cachedVersion)return n.cachedVersion;try{let e=Vn(import.meta.url),t=ae.dirname(e),r=[ae.join(t,"package.json"),ae.join(t,"..","package.json"),ae.join(t,"..","..","..","package.json"),ae.join(t,"..","..","..","..","package.json")];for(let o of r)if(Kt.existsSync(o)){let s=JSON.parse(Kt.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=Vn(import.meta.url),t=ae.dirname(e),r=[ae.join(t,"package.json"),ae.join(t,"..","package.json"),ae.join(t,"..","..","..","package.json"),ae.join(t,"..","..","..","..","package.json")];for(let o of r)if(Kt.existsSync(o)){let s=JSON.parse(Kt.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}}});var Wn={};ue(Wn,{ProcessManagerImpl:()=>uo});var uo,qn=d(()=>{"use strict";ie();Ze();go();Te();Jt();uo=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 pe(`\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 pe(`\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 Gn={};ue(Gn,{DaemonManagerImpl:()=>mo});import{spawn as Bn}from"child_process";import Yt from"fs";var mo,Jn=d(()=>{"use strict";ie();Te();Jt();mo=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(!Yt.existsSync(t))throw new D("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:o}=ne.getTailCommand(t),s=Bn(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=Bn("node",o,{detached:!0,stdio:["ignore","pipe","pipe"],env:s,cwd:t.cwd||process.cwd()});if(!i.pid)throw new pe("\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);Yt.existsSync(s)||Yt.mkdirSync(s,{recursive:!0});let i=Yt.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let c=new Date().toISOString();i.write(`
|
|
35
|
+
`)}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{execSync as Wn}from"child_process";var ne,Jt=d(()=>{"use strict";De();ie();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=Wn(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:zr.PROCESS_STOP}).toLowerCase():t=Wn(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:zr.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 pe(`\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,Xt=d(()=>{"use strict";ie();Y=class n{static{a(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw w.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new w(`\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 w.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new w(`\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 w(`\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 w(`\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 w(`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 w(`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 w('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new w("\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 w("\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 w("\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 w(`\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 w(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new w(`\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 w(`\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 w(`\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 w(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${o}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new w(`\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 w(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import Kt from"fs";import ae from"path";import{fileURLToPath as qn}from"url";var fe,po=d(()=>{"use strict";ie();fe=class n{static{a(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(n.cachedVersion)return n.cachedVersion;try{let e=qn(import.meta.url),t=ae.dirname(e),r=[ae.join(t,"package.json"),ae.join(t,"..","package.json"),ae.join(t,"..","..","..","package.json"),ae.join(t,"..","..","..","..","package.json")];for(let o of r)if(Kt.existsSync(o)){let s=JSON.parse(Kt.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=qn(import.meta.url),t=ae.dirname(e),r=[ae.join(t,"package.json"),ae.join(t,"..","package.json"),ae.join(t,"..","..","..","package.json"),ae.join(t,"..","..","..","..","package.json")];for(let o of r)if(Kt.existsSync(o)){let s=JSON.parse(Kt.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}}});var Bn={};ue(Bn,{ProcessManagerImpl:()=>uo});var uo,Gn=d(()=>{"use strict";ie();et();go();Te();Jt();uo=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=je.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 pe(`\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 pe(`\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 Xn={};ue(Xn,{DaemonManagerImpl:()=>mo});import{spawn as Jn}from"child_process";import Yt from"fs";var mo,Kn=d(()=>{"use strict";ie();Te();Jt();mo=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(!Yt.existsSync(t))throw new D("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:o}=ne.getTailCommand(t),s=Jn(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=Jn("node",o,{detached:!0,stdio:["ignore","pipe","pipe"],env:s,cwd:t.cwd||process.cwd()});if(!i.pid)throw new pe("\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);Yt.existsSync(s)||Yt.mkdirSync(s,{recursive:!0});let i=Yt.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let c=new Date().toISOString();i.write(`
|
|
36
36
|
[${c}] \u5B88\u62A4\u8FDB\u7A0B\u542F\u52A8 (PID: ${e.pid})
|
|
37
|
-
`)}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}}}});var Xn={};ue(Xn,{ServiceManagerImpl:()=>ho});var ho,Kn=d(()=>{"use strict";ie();Te();Xt();ho=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 Re.configNotFound();try{if(!this.configManager.getConfig())throw new Re("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof Re?e:new Re(`\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(()=>(Zt(),Qt)),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(()=>(Zt(),Qt)),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 Yn={};ue(Yn,{TemplateManagerImpl:()=>fo});import $c from"fs";import ye from"path";var fo,Qn=d(()=>{"use strict";ie();Ze();Te();Xt();fo=class{static{a(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=A.findTemplatesDir();if(!e)return[];let t=[],r=$c.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=ye.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 w?t:new T(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:ye.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=ye.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 w?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=ye.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=ye.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=ye.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=ye.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 vo(){return Co.create()}var Co,Zn=d(()=>{"use strict";J();zn();Ze();go();Te();Jt();Xt();po();P();Co=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",()=>fe),e.registerSingleton("platformUtils",()=>ne),e.registerSingleton("formatUtils",()=>ke),e.registerSingleton("fileUtils",()=>b),e.registerSingleton("pathUtils",()=>A),e.registerSingleton("validation",()=>Y),e.registerSingleton("configManager",()=>m),e.registerSingleton("logger",()=>f),e.registerSingleton("errorHandler",()=>Gt),e.registerSingleton("processManager",()=>{let t=(qn(),ft(Wn));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(Jn(),ft(Gn)),r=e.get("processManager"),o=e.get("logger");return new t.DaemonManagerImpl(r,o)}),e.registerSingleton("serviceManager",()=>{let t=(Kn(),ft(Xn)),r=e.get("processManager"),o=e.get("configManager"),s=e.get("logger");return new t.ServiceManagerImpl(r,o,s)}),e.registerSingleton("templateManager",()=>{let t=(Qn(),ft(Yn));return new t.TemplateManagerImpl}),e}};a(vo,"createContainer")});import{spawn as er}from"child_process";var tr,es=d(()=>{"use strict";Zn();P();W();tr=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=f,this.statusService=e,this.eventBus=M()}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 vo()).get("serviceManager").getStatus();if(!r.running){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),er("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"),er("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"),er("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"),er("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 vo()).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 rr}from"fs";import{readFile as Dc}from"fs/promises";import{dirname as Lc,join as k}from"path";import{fileURLToPath as _c}from"url";var or,ts=d(()=>{"use strict";P();or=class{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=f,this.initializeWebPath()}initializeWebPath(){try{let e=Lc(_c(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[k(e,"..","..","..","frontend"),k(e,"..","..","frontend"),k(e,"..","frontend"),k(e,"..","..","apps","frontend","dist"),k(e,"..","apps","frontend","dist"),k(e,"..","..","apps","frontend"),k(e,"..","apps","frontend"),k(e,"..","..","web","dist"),k(e,"..","web","dist"),k(e,"..","..","web"),k(e,"..","web"),k(e,"..","..","..","apps","frontend","dist"),k(e,"..","..","..","apps","frontend"),k(e,"..","..","..","web","dist"),k(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=rr(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=k(this.webPath,r);if(!rr(o)){let i=k(this.webPath,"index.html");return rr(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 Dc(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
|
+
`)}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}}}});var Yn={};ue(Yn,{ServiceManagerImpl:()=>ho});var ho,Qn=d(()=>{"use strict";ie();Te();Xt();ho=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 Re.configNotFound();try{if(!this.configManager.getConfig())throw new Re("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof Re?e:new Re(`\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(()=>(Zt(),Qt)),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(()=>(Zt(),Qt)),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 Zn={};ue(Zn,{TemplateManagerImpl:()=>fo});import Lc from"fs";import ye from"path";var fo,es=d(()=>{"use strict";ie();et();Te();Xt();fo=class{static{a(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=A.findTemplatesDir();if(!e)return[];let t=[],r=Lc.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=ye.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 w?t:new T(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:ye.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=ye.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 w?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=ye.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=ye.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=ye.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=ye.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 vo(){return Co.create()}var Co,ts=d(()=>{"use strict";J();Vn();et();go();Te();Jt();Xt();po();P();Co=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",()=>fe),e.registerSingleton("platformUtils",()=>ne),e.registerSingleton("formatUtils",()=>je),e.registerSingleton("fileUtils",()=>b),e.registerSingleton("pathUtils",()=>A),e.registerSingleton("validation",()=>Y),e.registerSingleton("configManager",()=>m),e.registerSingleton("logger",()=>f),e.registerSingleton("errorHandler",()=>Gt),e.registerSingleton("processManager",()=>{let t=(Gn(),Ct(Bn));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(Kn(),Ct(Xn)),r=e.get("processManager"),o=e.get("logger");return new t.DaemonManagerImpl(r,o)}),e.registerSingleton("serviceManager",()=>{let t=(Qn(),Ct(Yn)),r=e.get("processManager"),o=e.get("configManager"),s=e.get("logger");return new t.ServiceManagerImpl(r,o,s)}),e.registerSingleton("templateManager",()=>{let t=(es(),Ct(Zn));return new t.TemplateManagerImpl}),e}};a(vo,"createContainer")});import{spawn as er}from"child_process";var tr,rs=d(()=>{"use strict";ts();P();W();tr=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=f,this.statusService=e,this.eventBus=M()}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 vo()).get("serviceManager").getStatus();if(!r.running){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),er("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"),er("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"),er("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"),er("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 vo()).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 rr}from"fs";import{readFile as _c}from"fs/promises";import{dirname as kc,join as k}from"path";import{fileURLToPath as jc}from"url";var or,os=d(()=>{"use strict";P();or=class{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=f,this.initializeWebPath()}initializeWebPath(){try{let e=kc(jc(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[k(e,"..","..","..","frontend"),k(e,"..","..","frontend"),k(e,"..","frontend"),k(e,"..","..","apps","frontend","dist"),k(e,"..","apps","frontend","dist"),k(e,"..","..","apps","frontend"),k(e,"..","apps","frontend"),k(e,"..","..","web","dist"),k(e,"..","web","dist"),k(e,"..","..","web"),k(e,"..","web"),k(e,"..","..","..","apps","frontend","dist"),k(e,"..","..","..","apps","frontend"),k(e,"..","..","..","web","dist"),k(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=rr(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=k(this.webPath,r);if(!rr(o)){let i=k(this.webPath,"index.html");return rr(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 _c(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=`
|
|
38
38
|
<!DOCTYPE html>
|
|
39
39
|
<html>
|
|
40
40
|
<head>
|
|
@@ -91,10 +91,10 @@ ${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join
|
|
|
91
91
|
</div>
|
|
92
92
|
</body>
|
|
93
93
|
</html>
|
|
94
|
-
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&rr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var nr,rs=d(()=>{"use strict";P();nr=class{static{a(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=f,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 je,os=d(()=>{"use strict";je=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(je||{})});import kc from"ajv";import sr from"dayjs";var ir,ns=d(()=>{"use strict";J();Se();P();os();ir=class{static{a(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=f,this.ajv=new kc({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||{},{timeout:6e4});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"),!m.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=m.getCustomMCPTools(),r=m.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(!m.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=m.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=m.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=m.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),o=await new ge().getAllCachedTools(),s=m.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(p=>{let E=p.instancePath||p.schemaPath||"",h=p.message||"\u672A\u77E5\u9519\u8BEF";if(p.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${p.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(p.keyword==="type"){let $=p.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${$}`}if(p.keyword==="enum"){let $=p.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${$.join(", ")}`}return`\u53C2\u6570 ${E} ${h}`}).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(je).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(je).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 m.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 U=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(U,400)}let c=e.get("mcpServiceManager");if(!c){let U=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(U,503)}try{await this.validateServiceAndTool(c,r,o)}catch(U){let Ma=U instanceof Error?U.message:String(U),ya=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Ma);return e.json(ya,404)}let g=await new ge().getAllCachedTools(),u=`${r}__${o}`,p=g.find(U=>U.name===u);if(!p){let U=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`);return e.json(U,404)}let E=s||u,h=m.getCustomMCPTools();if(new Set(h.map(U=>U.name)).has(E)){let U=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${E}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(U,409)}let mt={name:E,description:i||p.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:p.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:sr().format("YYYY-MM-DD HH:mm:ss")}};m.addCustomMCPTool(mt),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`);let Pr=m.getServerToolsConfig(r);Pr?.toolName&&(Pr[o].enable=!0,m.updateServerToolsConfig(r,Pr),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: ${E}`);let Ta={tool:mt,toolName:E,toolType:"mcp",addedAt:sr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(Ta,`MCP \u5DE5\u5177 "${E}" \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);m.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:sr().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(je).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(je).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=m.getCustomMCPTools().find(h=>h.name===t);if(!g){let h=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(h,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let h=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(h,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),p={...g,description:i||g.description,inputSchema:u};m.updateCustomMCPTool(t,p),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:p,toolName:t,toolType:"coze",updatedAt:sr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(E,`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=m.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=m.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,m.updateServerToolsConfig(s.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return m.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=m.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=m.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),!m.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=m.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=m.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{z as Ce}from"zod";var jc,ar,ss=d(()=>{"use strict";Ot();$e();P();jc=Ce.object({limit:Ce.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=Ur.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Ur.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Ce.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:Ce.string().optional(),serverName:Ce.string().optional(),success:Ce.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Ce.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:Ce.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"]}),ar=class{static{a(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new At}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=jc.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 f.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){f.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 nt=S((gv,is)=>{"use strict";var Hc="2.0.0",Fc=Number.MAX_SAFE_INTEGER||9007199254740991,zc=16,Uc=250,Vc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];is.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:zc,MAX_SAFE_BUILD_LENGTH:Uc,MAX_SAFE_INTEGER:Fc,RELEASE_TYPES:Vc,SEMVER_SPEC_VERSION:Hc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var st=S((pv,as)=>{"use strict";var Wc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};as.exports=Wc});var He=S((ce,cs)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Eo,MAX_SAFE_BUILD_LENGTH:qc,MAX_LENGTH:Bc}=nt(),Gc=st();ce=cs.exports={};var Jc=ce.re=[],Xc=ce.safeRe=[],C=ce.src=[],Kc=ce.safeSrc=[],v=ce.t={},Yc=0,So="[a-zA-Z0-9-]",Qc=[["\\s",1],["\\d",Bc],[So,qc]],Zc=a(n=>{for(let[e,t]of Qc)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),R=a((n,e,t)=>{let r=Zc(e),o=Yc++;Gc(n,o,e),v[n]=o,C[o]=e,Kc[o]=r,Jc[o]=new RegExp(e,t?"g":void 0),Xc[o]=new RegExp(r,t?"g":void 0)},"createToken");R("NUMERICIDENTIFIER","0|[1-9]\\d*");R("NUMERICIDENTIFIERLOOSE","\\d+");R("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${So}*`);R("MAINVERSION",`(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})`);R("MAINVERSIONLOOSE",`(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})`);R("PRERELEASEIDENTIFIER",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIER]})`);R("PRERELEASEIDENTIFIERLOOSE",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIERLOOSE]})`);R("PRERELEASE",`(?:-(${C[v.PRERELEASEIDENTIFIER]}(?:\\.${C[v.PRERELEASEIDENTIFIER]})*))`);R("PRERELEASELOOSE",`(?:-?(${C[v.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${C[v.PRERELEASEIDENTIFIERLOOSE]})*))`);R("BUILDIDENTIFIER",`${So}+`);R("BUILD",`(?:\\+(${C[v.BUILDIDENTIFIER]}(?:\\.${C[v.BUILDIDENTIFIER]})*))`);R("FULLPLAIN",`v?${C[v.MAINVERSION]}${C[v.PRERELEASE]}?${C[v.BUILD]}?`);R("FULL",`^${C[v.FULLPLAIN]}$`);R("LOOSEPLAIN",`[v=\\s]*${C[v.MAINVERSIONLOOSE]}${C[v.PRERELEASELOOSE]}?${C[v.BUILD]}?`);R("LOOSE",`^${C[v.LOOSEPLAIN]}$`);R("GTLT","((?:<|>)?=?)");R("XRANGEIDENTIFIERLOOSE",`${C[v.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);R("XRANGEIDENTIFIER",`${C[v.NUMERICIDENTIFIER]}|x|X|\\*`);R("XRANGEPLAIN",`[v=\\s]*(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:${C[v.PRERELEASE]})?${C[v.BUILD]}?)?)?`);R("XRANGEPLAINLOOSE",`[v=\\s]*(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:${C[v.PRERELEASELOOSE]})?${C[v.BUILD]}?)?)?`);R("XRANGE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAIN]}$`);R("XRANGELOOSE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAINLOOSE]}$`);R("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Eo}})(?:\\.(\\d{1,${Eo}}))?(?:\\.(\\d{1,${Eo}}))?`);R("COERCE",`${C[v.COERCEPLAIN]}(?:$|[^\\d])`);R("COERCEFULL",C[v.COERCEPLAIN]+`(?:${C[v.PRERELEASE]})?(?:${C[v.BUILD]})?(?:$|[^\\d])`);R("COERCERTL",C[v.COERCE],!0);R("COERCERTLFULL",C[v.COERCEFULL],!0);R("LONETILDE","(?:~>?)");R("TILDETRIM",`(\\s*)${C[v.LONETILDE]}\\s+`,!0);ce.tildeTrimReplace="$1~";R("TILDE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAIN]}$`);R("TILDELOOSE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAINLOOSE]}$`);R("LONECARET","(?:\\^)");R("CARETTRIM",`(\\s*)${C[v.LONECARET]}\\s+`,!0);ce.caretTrimReplace="$1^";R("CARET",`^${C[v.LONECARET]}${C[v.XRANGEPLAIN]}$`);R("CARETLOOSE",`^${C[v.LONECARET]}${C[v.XRANGEPLAINLOOSE]}$`);R("COMPARATORLOOSE",`^${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]})$|^$`);R("COMPARATOR",`^${C[v.GTLT]}\\s*(${C[v.FULLPLAIN]})$|^$`);R("COMPARATORTRIM",`(\\s*)${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]}|${C[v.XRANGEPLAIN]})`,!0);ce.comparatorTrimReplace="$1$2$3";R("HYPHENRANGE",`^\\s*(${C[v.XRANGEPLAIN]})\\s+-\\s+(${C[v.XRANGEPLAIN]})\\s*$`);R("HYPHENRANGELOOSE",`^\\s*(${C[v.XRANGEPLAINLOOSE]})\\s+-\\s+(${C[v.XRANGEPLAINLOOSE]})\\s*$`);R("STAR","(<|>)?=?\\s*\\*");R("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");R("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var cr=S((dv,ls)=>{"use strict";var el=Object.freeze({loose:!0}),tl=Object.freeze({}),rl=a(n=>n?typeof n!="object"?el:n:tl,"parseOptions");ls.exports=rl});var Ro=S((hv,us)=>{"use strict";var gs=/^[0-9]+$/,ps=a((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=gs.test(n),r=gs.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),ol=a((n,e)=>ps(e,n),"rcompareIdentifiers");us.exports={compareIdentifiers:ps,rcompareIdentifiers:ol}});var F=S((Cv,ms)=>{"use strict";var lr=st(),{MAX_LENGTH:ds,MAX_SAFE_INTEGER:gr}=nt(),{safeRe:pr,t:ur}=He(),nl=cr(),{compareIdentifiers:To}=Ro(),Mo=class n{static{a(this,"SemVer")}constructor(e,t){if(t=nl(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>ds)throw new TypeError(`version is longer than ${ds} characters`);lr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?pr[ur.LOOSE]:pr[ur.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>gr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>gr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>gr||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<gr)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(lr("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(lr("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 To(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(lr("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 To(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?pr[ur.PRERELEASELOOSE]:pr[ur.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]),To(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}};ms.exports=Mo});var Pe=S((Ev,fs)=>{"use strict";var hs=F(),sl=a((n,e,t=!1)=>{if(n instanceof hs)return n;try{return new hs(n,e)}catch(r){if(!t)return null;throw r}},"parse");fs.exports=sl});var vs=S((Rv,Cs)=>{"use strict";var il=Pe(),al=a((n,e)=>{let t=il(n,e);return t?t.version:null},"valid");Cs.exports=al});var Ss=S((Mv,Es)=>{"use strict";var cl=Pe(),ll=a((n,e)=>{let t=cl(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Es.exports=ll});var Ms=S((Pv,Ts)=>{"use strict";var Rs=F(),gl=a((n,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new Rs(n instanceof Rs?n.version:n,t).inc(e,r,o).version}catch{return null}},"inc");Ts.exports=gl});var ws=S((bv,Ps)=>{"use strict";var ys=Pe(),pl=a((n,e)=>{let t=ys(n,null,!0),r=ys(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");Ps.exports=pl});var Is=S((Nv,bs)=>{"use strict";var ul=F(),dl=a((n,e)=>new ul(n,e).major,"major");bs.exports=dl});var As=S((Ov,Ns)=>{"use strict";var ml=F(),hl=a((n,e)=>new ml(n,e).minor,"minor");Ns.exports=hl});var xs=S(($v,Os)=>{"use strict";var fl=F(),Cl=a((n,e)=>new fl(n,e).patch,"patch");Os.exports=Cl});var Ds=S((Lv,$s)=>{"use strict";var vl=Pe(),El=a((n,e)=>{let t=vl(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");$s.exports=El});var Q=S((kv,_s)=>{"use strict";var Ls=F(),Sl=a((n,e,t)=>new Ls(n,t).compare(new Ls(e,t)),"compare");_s.exports=Sl});var js=S((Hv,ks)=>{"use strict";var Rl=Q(),Tl=a((n,e,t)=>Rl(e,n,t),"rcompare");ks.exports=Tl});var Fs=S((zv,Hs)=>{"use strict";var Ml=Q(),yl=a((n,e)=>Ml(n,e,!0),"compareLoose");Hs.exports=yl});var dr=S((Vv,Us)=>{"use strict";var zs=F(),Pl=a((n,e,t)=>{let r=new zs(n,t),o=new zs(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");Us.exports=Pl});var Ws=S((qv,Vs)=>{"use strict";var wl=dr(),bl=a((n,e)=>n.sort((t,r)=>wl(t,r,e)),"sort");Vs.exports=bl});var Bs=S((Gv,qs)=>{"use strict";var Il=dr(),Nl=a((n,e)=>n.sort((t,r)=>Il(r,t,e)),"rsort");qs.exports=Nl});var it=S((Xv,Gs)=>{"use strict";var Al=Q(),Ol=a((n,e,t)=>Al(n,e,t)>0,"gt");Gs.exports=Ol});var mr=S((Yv,Js)=>{"use strict";var xl=Q(),$l=a((n,e,t)=>xl(n,e,t)<0,"lt");Js.exports=$l});var yo=S((Zv,Xs)=>{"use strict";var Dl=Q(),Ll=a((n,e,t)=>Dl(n,e,t)===0,"eq");Xs.exports=Ll});var Po=S((tE,Ks)=>{"use strict";var _l=Q(),kl=a((n,e,t)=>_l(n,e,t)!==0,"neq");Ks.exports=kl});var hr=S((oE,Ys)=>{"use strict";var jl=Q(),Hl=a((n,e,t)=>jl(n,e,t)>=0,"gte");Ys.exports=Hl});var fr=S((sE,Qs)=>{"use strict";var Fl=Q(),zl=a((n,e,t)=>Fl(n,e,t)<=0,"lte");Qs.exports=zl});var wo=S((aE,Zs)=>{"use strict";var Ul=yo(),Vl=Po(),Wl=it(),ql=hr(),Bl=mr(),Gl=fr(),Jl=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 Ul(n,t,r);case"!=":return Vl(n,t,r);case">":return Wl(n,t,r);case">=":return ql(n,t,r);case"<":return Bl(n,t,r);case"<=":return Gl(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Zs.exports=Jl});var ti=S((lE,ei)=>{"use strict";var Xl=F(),Kl=Pe(),{safeRe:Cr,t:vr}=He(),Yl=a((n,e)=>{if(n instanceof Xl)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?Cr[vr.COERCEFULL]:Cr[vr.COERCE]);else{let l=e.includePrerelease?Cr[vr.COERCERTLFULL]:Cr[vr.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 Kl(`${r}.${o}.${s}${i}${c}`,e)},"coerce");ei.exports=Yl});var oi=S((pE,ri)=>{"use strict";var bo=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}};ri.exports=bo});var Z=S((dE,ai)=>{"use strict";var Ql=/\s+/g,Io=class n{static{a(this,"Range")}constructor(e,t){if(t=eg(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof No)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(Ql," "),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=>!si(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&&ag(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&&sg)|(this.options.loose&&ig))+":"+e,o=ni.get(r);if(o)return o;let s=this.options.loose,i=s?B[z.HYPHENRANGELOOSE]:B[z.HYPHENRANGE];e=e.replace(i,Cg(this.options.includePrerelease)),I("hyphen replace",e),e=e.replace(B[z.COMPARATORTRIM],rg),I("comparator trim",e),e=e.replace(B[z.TILDETRIM],og),I("tilde trim",e),e=e.replace(B[z.CARETTRIM],ng),I("caret trim",e);let c=e.split(" ").map(p=>cg(p,this.options)).join(" ").split(/\s+/).map(p=>fg(p,this.options));s&&(c=c.filter(p=>(I("loose invalid filter",p,this.options),!!p.match(B[z.COMPARATORLOOSE])))),I("range list",c);let l=new Map,g=c.map(p=>new No(p,this.options));for(let p of g){if(si(p))return[p];l.set(p.value,p)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return ni.set(r,u),u}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>ii(r,t)&&e.set.some(o=>ii(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 tg(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(vg(this.set[t],e,this.options))return!0;return!1}};ai.exports=Io;var Zl=oi(),ni=new Zl,eg=cr(),No=at(),I=st(),tg=F(),{safeRe:B,t:z,comparatorTrimReplace:rg,tildeTrimReplace:og,caretTrimReplace:ng}=He(),{FLAG_INCLUDE_PRERELEASE:sg,FLAG_LOOSE:ig}=nt(),si=a(n=>n.value==="<0.0.0-0","isNullSet"),ag=a(n=>n.value==="","isAny"),ii=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"),cg=a((n,e)=>(n=n.replace(B[z.BUILD],""),I("comp",n,e),n=pg(n,e),I("caret",n),n=lg(n,e),I("tildes",n),n=dg(n,e),I("xrange",n),n=hg(n,e),I("stars",n),n),"parseComparator"),G=a(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),lg=a((n,e)=>n.trim().split(/\s+/).map(t=>gg(t,e)).join(" "),"replaceTildes"),gg=a((n,e)=>{let t=e.loose?B[z.TILDELOOSE]:B[z.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"),pg=a((n,e)=>n.trim().split(/\s+/).map(t=>ug(t,e)).join(" "),"replaceCarets"),ug=a((n,e)=>{I("caret",n,e);let t=e.loose?B[z.CARETLOOSE]:B[z.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"),dg=a((n,e)=>(I("replaceXRanges",n,e),n.split(/\s+/).map(t=>mg(t,e)).join(" ")),"replaceXRanges"),mg=a((n,e)=>{n=n.trim();let t=e.loose?B[z.XRANGELOOSE]:B[z.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),p=u||G(c),E=p;return o==="="&&E&&(o=""),l=e.includePrerelease?"-0":"",g?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&E?(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`:p&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),I("xRange return",r),r})},"replaceXRange"),hg=a((n,e)=>(I("replaceStars",n,e),n.trim().replace(B[z.STAR],"")),"replaceStars"),fg=a((n,e)=>(I("replaceGTE0",n,e),n.trim().replace(B[e.includePrerelease?z.GTE0PRE:z.GTE0],"")),"replaceGTE0"),Cg=a(n=>(e,t,r,o,s,i,c,l,g,u,p,E)=>(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(p)?l=`<${g}.${+u+1}.0-0`:E?l=`<=${g}.${u}.${p}-${E}`:n?l=`<${g}.${u}.${+p+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),vg=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!==No.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 at=S((hE,di)=>{"use strict";var ct=Symbol("SemVer ANY"),xo=class n{static{a(this,"Comparator")}static get ANY(){return ct}constructor(e,t){if(t=ci(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Oo("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ct?this.value="":this.value=this.operator+this.semver.version,Oo("comp",this)}parse(e){let t=this.options.loose?li[gi.COMPARATORLOOSE]:li[gi.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 pi(r[2],this.options.loose):this.semver=ct}toString(){return this.value}test(e){if(Oo("Comparator.test",e,this.options.loose),this.semver===ct||e===ct)return!0;if(typeof e=="string")try{e=new pi(e,this.options)}catch{return!1}return Ao(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 ui(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new ui(this.value,t).test(e.semver):(t=ci(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("=")||Ao(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Ao(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};di.exports=xo;var ci=cr(),{safeRe:li,t:gi}=He(),Ao=wo(),Oo=st(),pi=F(),ui=Z()});var lt=S((CE,mi)=>{"use strict";var Eg=Z(),Sg=a((n,e,t)=>{try{e=new Eg(e,t)}catch{return!1}return e.test(n)},"satisfies");mi.exports=Sg});var fi=S((EE,hi)=>{"use strict";var Rg=Z(),Tg=a((n,e)=>new Rg(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");hi.exports=Tg});var vi=S((RE,Ci)=>{"use strict";var Mg=F(),yg=Z(),Pg=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new yg(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new Mg(r,t))}),r},"maxSatisfying");Ci.exports=Pg});var Si=S((ME,Ei)=>{"use strict";var wg=F(),bg=Z(),Ig=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new bg(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new wg(r,t))}),r},"minSatisfying");Ei.exports=Ig});var Mi=S((PE,Ti)=>{"use strict";var $o=F(),Ng=Z(),Ri=it(),Ag=a((n,e)=>{n=new Ng(n,e);let t=new $o("0.0.0");if(n.test(t)||(t=new $o("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 $o(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!s||Ri(c,s))&&(s=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Ri(t,s))&&(t=s)}return t&&n.test(t)?t:null},"minVersion");Ti.exports=Ag});var Pi=S((bE,yi)=>{"use strict";var Og=Z(),xg=a((n,e)=>{try{return new Og(n,e).range||"*"}catch{return null}},"validRange");yi.exports=xg});var Er=S((NE,Ni)=>{"use strict";var $g=F(),Ii=at(),{ANY:Dg}=Ii,Lg=Z(),_g=lt(),wi=it(),bi=mr(),kg=fr(),jg=hr(),Hg=a((n,e,t,r)=>{n=new $g(n,r),e=new Lg(e,r);let o,s,i,c,l;switch(t){case">":o=wi,s=kg,i=bi,c=">",l=">=";break;case"<":o=bi,s=jg,i=wi,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(_g(n,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],p=null,E=null;if(u.forEach(h=>{h.semver===Dg&&(h=new Ii(">=0.0.0")),p=p||h,E=E||h,o(h.semver,p.semver,r)?p=h:i(h.semver,E.semver,r)&&(E=h)}),p.operator===c||p.operator===l||(!E.operator||E.operator===c)&&s(n,E.semver))return!1;if(E.operator===l&&i(n,E.semver))return!1}return!0},"outside");Ni.exports=Hg});var Oi=S((OE,Ai)=>{"use strict";var Fg=Er(),zg=a((n,e,t)=>Fg(n,e,">",t),"gtr");Ai.exports=zg});var $i=S(($E,xi)=>{"use strict";var Ug=Er(),Vg=a((n,e,t)=>Ug(n,e,"<",t),"ltr");xi.exports=Vg});var _i=S((LE,Li)=>{"use strict";var Di=Z(),Wg=a((n,e,t)=>(n=new Di(n,t),e=new Di(e,t),n.intersects(e,t)),"intersects");Li.exports=Wg});var ji=S((kE,ki)=>{"use strict";var qg=lt(),Bg=Q();ki.exports=(n,e,t)=>{let r=[],o=null,s=null,i=n.sort((u,p)=>Bg(u,p,t));for(let u of i)qg(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,p]of r)u===p?c.push(u):!p&&u===i[0]?c.push("*"):p?u===i[0]?c.push(`<=${p}`):c.push(`${u} - ${p}`):c.push(`>=${u}`);let l=c.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Wi=S((jE,Vi)=>{"use strict";var Hi=Z(),Lo=at(),{ANY:Do}=Lo,gt=lt(),_o=Q(),Gg=a((n,e,t={})=>{if(n===e)return!0;n=new Hi(n,t),e=new Hi(e,t);let r=!1;e:for(let o of n.set){for(let s of e.set){let i=Xg(o,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Jg=[new Lo(">=0.0.0-0")],Fi=[new Lo(">=0.0.0")],Xg=a((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Do){if(e.length===1&&e[0].semver===Do)return!0;t.includePrerelease?n=Jg:n=Fi}if(e.length===1&&e[0].semver===Do){if(t.includePrerelease)return!0;e=Fi}let r=new Set,o,s;for(let h of n)h.operator===">"||h.operator===">="?o=zi(o,h,t):h.operator==="<"||h.operator==="<="?s=Ui(s,h,t):r.add(h.semver);if(r.size>1)return null;let i;if(o&&s){if(i=_o(o.semver,s.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||s.operator!=="<="))return null}for(let h of r){if(o&&!gt(h,String(o),t)||s&&!gt(h,String(s),t))return null;for(let $ of e)if(!gt(h,String($),t))return!1;return!0}let c,l,g,u,p=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,E=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;p&&p.prerelease.length===1&&s.operator==="<"&&p.prerelease[0]===0&&(p=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",g=g||h.operator==="<"||h.operator==="<=",o){if(E&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===E.major&&h.semver.minor===E.minor&&h.semver.patch===E.patch&&(E=!1),h.operator===">"||h.operator===">="){if(c=zi(o,h,t),c===h&&c!==o)return!1}else if(o.operator===">="&&!gt(o.semver,String(h),t))return!1}if(s){if(p&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===p.major&&h.semver.minor===p.minor&&h.semver.patch===p.patch&&(p=!1),h.operator==="<"||h.operator==="<="){if(l=Ui(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!gt(s.semver,String(h),t))return!1}if(!h.operator&&(s||o)&&i!==0)return!1}return!(o&&g&&!s&&i!==0||s&&u&&!o&&i!==0||E||p)},"simpleSubset"),zi=a((n,e,t)=>{if(!n)return e;let r=_o(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),Ui=a((n,e,t)=>{if(!n)return e;let r=_o(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");Vi.exports=Gg});var Ji=S((FE,Gi)=>{"use strict";var ko=He(),qi=nt(),Kg=F(),Bi=Ro(),Yg=Pe(),Qg=vs(),Zg=Ss(),ep=Ms(),tp=ws(),rp=Is(),op=As(),np=xs(),sp=Ds(),ip=Q(),ap=js(),cp=Fs(),lp=dr(),gp=Ws(),pp=Bs(),up=it(),dp=mr(),mp=yo(),hp=Po(),fp=hr(),Cp=fr(),vp=wo(),Ep=ti(),Sp=at(),Rp=Z(),Tp=lt(),Mp=fi(),yp=vi(),Pp=Si(),wp=Mi(),bp=Pi(),Ip=Er(),Np=Oi(),Ap=$i(),Op=_i(),xp=ji(),$p=Wi();Gi.exports={parse:Yg,valid:Qg,clean:Zg,inc:ep,diff:tp,major:rp,minor:op,patch:np,prerelease:sp,compare:ip,rcompare:ap,compareLoose:cp,compareBuild:lp,sort:gp,rsort:pp,gt:up,lt:dp,eq:mp,neq:hp,gte:fp,lte:Cp,cmp:vp,coerce:Ep,Comparator:Sp,Range:Rp,satisfies:Tp,toComparators:Mp,maxSatisfying:yp,minSatisfying:Pp,minVersion:wp,validRange:bp,outside:Ip,gtr:Np,ltr:Ap,intersects:Op,simplifyRange:xp,subset:$p,SemVer:Kg,re:ko.re,src:ko.src,tokens:ko.t,SEMVER_SPEC_VERSION:qi.SEMVER_SPEC_VERSION,RELEASE_TYPES:qi.RELEASE_TYPES,compareIdentifiers:Bi.compareIdentifiers,rcompareIdentifiers:Bi.rcompareIdentifiers}});import{exec as Dp,spawn as Lp}from"child_process";import{promisify as _p}from"util";var pt,Xi,we,Ki=d(()=>{"use strict";W();pt=Aa(Ji(),1),Xi=_p(Dp),we=class{static{a(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||M()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=Lp("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 Xi("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 Xi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(s=>s&&typeof s=="string"&&pt.default.valid(s));return e!=="all"&&(o=o.filter(s=>{let i=pt.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)=>pt.default.rcompare(s,i))}catch{return[]}}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=pt.default.gt(r,e)}catch{o=r!==e}return{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});var jo=d(()=>{"use strict";Ki()});import{z as Yi}from"zod";var kp,Sr,Qi=d(()=>{"use strict";jo();P();W();kp=Yi.object({version:Yi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Sr=class{static{a(this,"UpdateApiHandler")}npmManager;logger=f;eventBus=M();activeInstalls=new Map;constructor(){this.npmManager=new we(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=kp.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,Zi=d(()=>{"use strict";jo();po();P();Rr=class{static{a(this,"VersionApiHandler")}logger;constructor(){this.logger=f}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=fe.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=fe.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"),fe.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 we().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 we().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=d(()=>{"use strict";$n();Dn();Ln();no();_n();jn();Hn();es();ts();rs();ns();ss();Qi();Zi()});var Tr,ta=d(()=>{"use strict";P();W();Tr=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=f,this.eventBus=M()}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 Mr,ra=d(()=>{"use strict";J();P();W();Mr=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=f,this.eventBus=M(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=m.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 oa=d(()=>{"use strict";P()});var na=d(()=>{"use strict";ta();ra();W();oa();It()});var ut,sa=d(()=>{"use strict";eo();ut=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(p){let E=H("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",p instanceof Error?p.message:String(p));return g.json(E,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 Ho,ia=d(()=>{"use strict";Ho={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 Fo,aa=d(()=>{"use strict";Fo={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,ca=d(()=>{"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 Uo,la=d(()=>{"use strict";Uo={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 Vo,ga=d(()=>{"use strict";Vo={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 Wo,pa=d(()=>{"use strict";Wo={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 qo,ua=d(()=>{"use strict";qo={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 Bo,da=d(()=>{"use strict";Bo={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 Go,ma=d(()=>{"use strict";Go={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 Jo,ha=d(()=>{"use strict";Jo={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 yr,Xo,fa=d(()=>{"use strict";yr=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"),Xo={name:"mcpserver",path:"/api/mcp-servers",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(n=>yr(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/:serverName",handler:a(n=>yr(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/:serverName/status",handler:a(n=>yr(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"",handler:a(n=>yr(n,e=>e.listMCPServers(n)),"handler")}]}});var Ca,dt,Ko,va=d(()=>{"use strict";Ca=a((n,e)=>({error:{code:n,message:e}}),"createErrorResponse"),dt=a(async(n,e)=>{let t=n.get("endpointHandler");if(!t){let r=Ca("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=Ca("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return n.json(o,500)}},"withEndpointHandler"),Ko={name:"endpoint",path:"/api/endpoint",description:"\u7AEF\u70B9\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/status",handler:a(n=>dt(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/connect",handler:a(n=>dt(n,"connectEndpoint"),"handler")},{method:"POST",path:"/disconnect",handler:a(n=>dt(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/add",handler:a(n=>dt(n,"addEndpoint"),"handler")},{method:"POST",path:"/remove",handler:a(n=>dt(n,"removeEndpoint"),"handler")}]}});var Yo,Ea=d(()=>{"use strict";Yo={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 Sa=d(()=>{"use strict";ia();aa();ca();la();ga();pa();ua();da();ma();ha();fa();va();Ea()});var Ra=d(()=>{"use strict";sa();Sa()});var Qt={};ue(Qt,{WebServer:()=>Qo});import{createServer as jp}from"http";import{serve as Hp}from"@hono/node-server";import{WebSocketServer as Fp}from"ws";var Qo,Zt=d(()=>{"use strict";Ir();J();pn();Se();ee();ea();io();P();Xr();na();to();Ra();Qo=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;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??m.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=f,this.eventBus=M(),this.statusService=new Tr,this.notificationService=new Mr,this.configApiHandler=new kt,this.statusApiHandler=new nr(this.statusService),this.serviceApiHandler=new tr(this.statusService),this.toolApiHandler=new ir,this.toolCallLogApiHandler=new ar,this.versionApiHandler=new Rr,this.staticFileHandler=new or,this.mcpRouteHandler=new Ut,this.updateApiHandler=new Sr,this.cozeApiHandler=new Ft,this.realtimeNotificationHandler=new qt(this.notificationService,this.statusService),this.heartbeatHandler=new zt(this.statusService,this.notificationService),this.app=Tn(),this.setupMiddleware(),this.app.notFound(Zr),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 tt,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpServerApiHandler=new Wt(this.mcpServiceManager,m),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:de(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
|
|
94
|
+
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&rr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var nr,ns=d(()=>{"use strict";P();nr=class{static{a(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=f,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 He,ss=d(()=>{"use strict";He=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(He||{})});import Hc from"ajv";import sr from"dayjs";var ir,is=d(()=>{"use strict";J();Se();P();ss();ir=class{static{a(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=f,this.ajv=new Hc({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||{},{timeout:6e4});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"),!m.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=m.getCustomMCPTools(),r=m.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(!m.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=m.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=m.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=m.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),o=await new ge().getAllCachedTools(),s=m.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(p=>{let E=p.instancePath||p.schemaPath||"",h=p.message||"\u672A\u77E5\u9519\u8BEF";if(p.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${p.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(p.keyword==="type"){let $=p.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${$}`}if(p.keyword==="enum"){let $=p.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${$.join(", ")}`}return`\u53C2\u6570 ${E} ${h}`}).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(He).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(He).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 m.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 U=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(U,400)}let c=e.get("mcpServiceManager");if(!c){let U=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(U,503)}try{await this.validateServiceAndTool(c,r,o)}catch(U){let Pa=U instanceof Error?U.message:String(U),wa=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Pa);return e.json(wa,404)}let g=await new ge().getAllCachedTools(),u=`${r}__${o}`,p=g.find(U=>U.name===u);if(!p){let U=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`);return e.json(U,404)}let E=s||u,h=m.getCustomMCPTools();if(new Set(h.map(U=>U.name)).has(E)){let U=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${E}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(U,409)}let ht={name:E,description:i||p.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:p.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:sr().format("YYYY-MM-DD HH:mm:ss")}};m.addCustomMCPTool(ht),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`);let Pr=m.getServerToolsConfig(r);Pr?.toolName&&(Pr[o].enable=!0,m.updateServerToolsConfig(r,Pr),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: ${E}`);let ya={tool:ht,toolName:E,toolType:"mcp",addedAt:sr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(ya,`MCP \u5DE5\u5177 "${E}" \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);m.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:sr().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(He).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(He).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=m.getCustomMCPTools().find(h=>h.name===t);if(!g){let h=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(h,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let h=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(h,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),p={...g,description:i||g.description,inputSchema:u};m.updateCustomMCPTool(t,p),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:p,toolName:t,toolType:"coze",updatedAt:sr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(E,`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=m.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=m.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,m.updateServerToolsConfig(s.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return m.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=m.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=m.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),!m.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=m.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=m.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{z as Ce}from"zod";var Fc,ar,as=d(()=>{"use strict";Ot();De();P();Fc=Ce.object({limit:Ce.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=Ur.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Ur.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Ce.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:Ce.string().optional(),serverName:Ce.string().optional(),success:Ce.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Ce.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:Ce.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"]}),ar=class{static{a(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new At}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=Fc.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 f.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){f.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 st=S((hv,cs)=>{"use strict";var zc="2.0.0",Uc=Number.MAX_SAFE_INTEGER||9007199254740991,Vc=16,Wc=250,qc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];cs.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Vc,MAX_SAFE_BUILD_LENGTH:Wc,MAX_SAFE_INTEGER:Uc,RELEASE_TYPES:qc,SEMVER_SPEC_VERSION:zc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var it=S((fv,ls)=>{"use strict";var Bc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};ls.exports=Bc});var Fe=S((ce,gs)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Eo,MAX_SAFE_BUILD_LENGTH:Gc,MAX_LENGTH:Jc}=st(),Xc=it();ce=gs.exports={};var Kc=ce.re=[],Yc=ce.safeRe=[],C=ce.src=[],Qc=ce.safeSrc=[],v=ce.t={},Zc=0,So="[a-zA-Z0-9-]",el=[["\\s",1],["\\d",Jc],[So,Gc]],tl=a(n=>{for(let[e,t]of el)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),R=a((n,e,t)=>{let r=tl(e),o=Zc++;Xc(n,o,e),v[n]=o,C[o]=e,Qc[o]=r,Kc[o]=new RegExp(e,t?"g":void 0),Yc[o]=new RegExp(r,t?"g":void 0)},"createToken");R("NUMERICIDENTIFIER","0|[1-9]\\d*");R("NUMERICIDENTIFIERLOOSE","\\d+");R("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${So}*`);R("MAINVERSION",`(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})`);R("MAINVERSIONLOOSE",`(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})`);R("PRERELEASEIDENTIFIER",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIER]})`);R("PRERELEASEIDENTIFIERLOOSE",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIERLOOSE]})`);R("PRERELEASE",`(?:-(${C[v.PRERELEASEIDENTIFIER]}(?:\\.${C[v.PRERELEASEIDENTIFIER]})*))`);R("PRERELEASELOOSE",`(?:-?(${C[v.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${C[v.PRERELEASEIDENTIFIERLOOSE]})*))`);R("BUILDIDENTIFIER",`${So}+`);R("BUILD",`(?:\\+(${C[v.BUILDIDENTIFIER]}(?:\\.${C[v.BUILDIDENTIFIER]})*))`);R("FULLPLAIN",`v?${C[v.MAINVERSION]}${C[v.PRERELEASE]}?${C[v.BUILD]}?`);R("FULL",`^${C[v.FULLPLAIN]}$`);R("LOOSEPLAIN",`[v=\\s]*${C[v.MAINVERSIONLOOSE]}${C[v.PRERELEASELOOSE]}?${C[v.BUILD]}?`);R("LOOSE",`^${C[v.LOOSEPLAIN]}$`);R("GTLT","((?:<|>)?=?)");R("XRANGEIDENTIFIERLOOSE",`${C[v.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);R("XRANGEIDENTIFIER",`${C[v.NUMERICIDENTIFIER]}|x|X|\\*`);R("XRANGEPLAIN",`[v=\\s]*(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:${C[v.PRERELEASE]})?${C[v.BUILD]}?)?)?`);R("XRANGEPLAINLOOSE",`[v=\\s]*(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:${C[v.PRERELEASELOOSE]})?${C[v.BUILD]}?)?)?`);R("XRANGE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAIN]}$`);R("XRANGELOOSE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAINLOOSE]}$`);R("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Eo}})(?:\\.(\\d{1,${Eo}}))?(?:\\.(\\d{1,${Eo}}))?`);R("COERCE",`${C[v.COERCEPLAIN]}(?:$|[^\\d])`);R("COERCEFULL",C[v.COERCEPLAIN]+`(?:${C[v.PRERELEASE]})?(?:${C[v.BUILD]})?(?:$|[^\\d])`);R("COERCERTL",C[v.COERCE],!0);R("COERCERTLFULL",C[v.COERCEFULL],!0);R("LONETILDE","(?:~>?)");R("TILDETRIM",`(\\s*)${C[v.LONETILDE]}\\s+`,!0);ce.tildeTrimReplace="$1~";R("TILDE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAIN]}$`);R("TILDELOOSE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAINLOOSE]}$`);R("LONECARET","(?:\\^)");R("CARETTRIM",`(\\s*)${C[v.LONECARET]}\\s+`,!0);ce.caretTrimReplace="$1^";R("CARET",`^${C[v.LONECARET]}${C[v.XRANGEPLAIN]}$`);R("CARETLOOSE",`^${C[v.LONECARET]}${C[v.XRANGEPLAINLOOSE]}$`);R("COMPARATORLOOSE",`^${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]})$|^$`);R("COMPARATOR",`^${C[v.GTLT]}\\s*(${C[v.FULLPLAIN]})$|^$`);R("COMPARATORTRIM",`(\\s*)${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]}|${C[v.XRANGEPLAIN]})`,!0);ce.comparatorTrimReplace="$1$2$3";R("HYPHENRANGE",`^\\s*(${C[v.XRANGEPLAIN]})\\s+-\\s+(${C[v.XRANGEPLAIN]})\\s*$`);R("HYPHENRANGELOOSE",`^\\s*(${C[v.XRANGEPLAINLOOSE]})\\s+-\\s+(${C[v.XRANGEPLAINLOOSE]})\\s*$`);R("STAR","(<|>)?=?\\s*\\*");R("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");R("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var cr=S((vv,ps)=>{"use strict";var rl=Object.freeze({loose:!0}),ol=Object.freeze({}),nl=a(n=>n?typeof n!="object"?rl:n:ol,"parseOptions");ps.exports=nl});var Ro=S((Sv,ms)=>{"use strict";var us=/^[0-9]+$/,ds=a((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=us.test(n),r=us.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),sl=a((n,e)=>ds(e,n),"rcompareIdentifiers");ms.exports={compareIdentifiers:ds,rcompareIdentifiers:sl}});var F=S((Tv,fs)=>{"use strict";var lr=it(),{MAX_LENGTH:hs,MAX_SAFE_INTEGER:gr}=st(),{safeRe:pr,t:ur}=Fe(),il=cr(),{compareIdentifiers:To}=Ro(),Mo=class n{static{a(this,"SemVer")}constructor(e,t){if(t=il(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>hs)throw new TypeError(`version is longer than ${hs} characters`);lr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?pr[ur.LOOSE]:pr[ur.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>gr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>gr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>gr||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<gr)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(lr("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(lr("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 To(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(lr("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 To(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?pr[ur.PRERELEASELOOSE]:pr[ur.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]),To(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}};fs.exports=Mo});var Pe=S((yv,vs)=>{"use strict";var Cs=F(),al=a((n,e,t=!1)=>{if(n instanceof Cs)return n;try{return new Cs(n,e)}catch(r){if(!t)return null;throw r}},"parse");vs.exports=al});var Ss=S((wv,Es)=>{"use strict";var cl=Pe(),ll=a((n,e)=>{let t=cl(n,e);return t?t.version:null},"valid");Es.exports=ll});var Ts=S((Iv,Rs)=>{"use strict";var gl=Pe(),pl=a((n,e)=>{let t=gl(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Rs.exports=pl});var Ps=S((Av,ys)=>{"use strict";var Ms=F(),ul=a((n,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new Ms(n instanceof Ms?n.version:n,t).inc(e,r,o).version}catch{return null}},"inc");ys.exports=ul});var Is=S((xv,bs)=>{"use strict";var ws=Pe(),dl=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=dl});var As=S((Dv,Ns)=>{"use strict";var ml=F(),hl=a((n,e)=>new ml(n,e).major,"major");Ns.exports=hl});var xs=S((_v,Os)=>{"use strict";var fl=F(),Cl=a((n,e)=>new fl(n,e).minor,"minor");Os.exports=Cl});var Ds=S((jv,$s)=>{"use strict";var vl=F(),El=a((n,e)=>new vl(n,e).patch,"patch");$s.exports=El});var _s=S((Fv,Ls)=>{"use strict";var Sl=Pe(),Rl=a((n,e)=>{let t=Sl(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Ls.exports=Rl});var Q=S((Uv,js)=>{"use strict";var ks=F(),Tl=a((n,e,t)=>new ks(n,t).compare(new ks(e,t)),"compare");js.exports=Tl});var Fs=S((Wv,Hs)=>{"use strict";var Ml=Q(),yl=a((n,e,t)=>Ml(e,n,t),"rcompare");Hs.exports=yl});var Us=S((Bv,zs)=>{"use strict";var Pl=Q(),wl=a((n,e)=>Pl(n,e,!0),"compareLoose");zs.exports=wl});var dr=S((Jv,Ws)=>{"use strict";var Vs=F(),bl=a((n,e,t)=>{let r=new Vs(n,t),o=new Vs(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");Ws.exports=bl});var Bs=S((Kv,qs)=>{"use strict";var Il=dr(),Nl=a((n,e)=>n.sort((t,r)=>Il(t,r,e)),"sort");qs.exports=Nl});var Js=S((Qv,Gs)=>{"use strict";var Al=dr(),Ol=a((n,e)=>n.sort((t,r)=>Al(r,t,e)),"rsort");Gs.exports=Ol});var at=S((eE,Xs)=>{"use strict";var xl=Q(),$l=a((n,e,t)=>xl(n,e,t)>0,"gt");Xs.exports=$l});var mr=S((rE,Ks)=>{"use strict";var Dl=Q(),Ll=a((n,e,t)=>Dl(n,e,t)<0,"lt");Ks.exports=Ll});var yo=S((nE,Ys)=>{"use strict";var _l=Q(),kl=a((n,e,t)=>_l(n,e,t)===0,"eq");Ys.exports=kl});var Po=S((iE,Qs)=>{"use strict";var jl=Q(),Hl=a((n,e,t)=>jl(n,e,t)!==0,"neq");Qs.exports=Hl});var hr=S((cE,Zs)=>{"use strict";var Fl=Q(),zl=a((n,e,t)=>Fl(n,e,t)>=0,"gte");Zs.exports=zl});var fr=S((gE,ei)=>{"use strict";var Ul=Q(),Vl=a((n,e,t)=>Ul(n,e,t)<=0,"lte");ei.exports=Vl});var wo=S((uE,ti)=>{"use strict";var Wl=yo(),ql=Po(),Bl=at(),Gl=hr(),Jl=mr(),Xl=fr(),Kl=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 Wl(n,t,r);case"!=":return ql(n,t,r);case">":return Bl(n,t,r);case">=":return Gl(n,t,r);case"<":return Jl(n,t,r);case"<=":return Xl(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");ti.exports=Kl});var oi=S((mE,ri)=>{"use strict";var Yl=F(),Ql=Pe(),{safeRe:Cr,t:vr}=Fe(),Zl=a((n,e)=>{if(n instanceof Yl)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?Cr[vr.COERCEFULL]:Cr[vr.COERCE]);else{let l=e.includePrerelease?Cr[vr.COERCERTLFULL]:Cr[vr.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 Ql(`${r}.${o}.${s}${i}${c}`,e)},"coerce");ri.exports=Zl});var si=S((fE,ni)=>{"use strict";var bo=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}};ni.exports=bo});var Z=S((vE,li)=>{"use strict";var eg=/\s+/g,Io=class n{static{a(this,"Range")}constructor(e,t){if(t=rg(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof No)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(eg," "),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=>!ai(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&&lg(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&&ag)|(this.options.loose&&cg))+":"+e,o=ii.get(r);if(o)return o;let s=this.options.loose,i=s?B[z.HYPHENRANGELOOSE]:B[z.HYPHENRANGE];e=e.replace(i,Eg(this.options.includePrerelease)),I("hyphen replace",e),e=e.replace(B[z.COMPARATORTRIM],ng),I("comparator trim",e),e=e.replace(B[z.TILDETRIM],sg),I("tilde trim",e),e=e.replace(B[z.CARETTRIM],ig),I("caret trim",e);let c=e.split(" ").map(p=>gg(p,this.options)).join(" ").split(/\s+/).map(p=>vg(p,this.options));s&&(c=c.filter(p=>(I("loose invalid filter",p,this.options),!!p.match(B[z.COMPARATORLOOSE])))),I("range list",c);let l=new Map,g=c.map(p=>new No(p,this.options));for(let p of g){if(ai(p))return[p];l.set(p.value,p)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return ii.set(r,u),u}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>ci(r,t)&&e.set.some(o=>ci(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 og(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Sg(this.set[t],e,this.options))return!0;return!1}};li.exports=Io;var tg=si(),ii=new tg,rg=cr(),No=ct(),I=it(),og=F(),{safeRe:B,t:z,comparatorTrimReplace:ng,tildeTrimReplace:sg,caretTrimReplace:ig}=Fe(),{FLAG_INCLUDE_PRERELEASE:ag,FLAG_LOOSE:cg}=st(),ai=a(n=>n.value==="<0.0.0-0","isNullSet"),lg=a(n=>n.value==="","isAny"),ci=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"),gg=a((n,e)=>(n=n.replace(B[z.BUILD],""),I("comp",n,e),n=dg(n,e),I("caret",n),n=pg(n,e),I("tildes",n),n=hg(n,e),I("xrange",n),n=Cg(n,e),I("stars",n),n),"parseComparator"),G=a(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),pg=a((n,e)=>n.trim().split(/\s+/).map(t=>ug(t,e)).join(" "),"replaceTildes"),ug=a((n,e)=>{let t=e.loose?B[z.TILDELOOSE]:B[z.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"),dg=a((n,e)=>n.trim().split(/\s+/).map(t=>mg(t,e)).join(" "),"replaceCarets"),mg=a((n,e)=>{I("caret",n,e);let t=e.loose?B[z.CARETLOOSE]:B[z.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"),hg=a((n,e)=>(I("replaceXRanges",n,e),n.split(/\s+/).map(t=>fg(t,e)).join(" ")),"replaceXRanges"),fg=a((n,e)=>{n=n.trim();let t=e.loose?B[z.XRANGELOOSE]:B[z.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),p=u||G(c),E=p;return o==="="&&E&&(o=""),l=e.includePrerelease?"-0":"",g?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&E?(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`:p&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),I("xRange return",r),r})},"replaceXRange"),Cg=a((n,e)=>(I("replaceStars",n,e),n.trim().replace(B[z.STAR],"")),"replaceStars"),vg=a((n,e)=>(I("replaceGTE0",n,e),n.trim().replace(B[e.includePrerelease?z.GTE0PRE:z.GTE0],"")),"replaceGTE0"),Eg=a(n=>(e,t,r,o,s,i,c,l,g,u,p,E)=>(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(p)?l=`<${g}.${+u+1}.0-0`:E?l=`<=${g}.${u}.${p}-${E}`:n?l=`<${g}.${u}.${+p+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),Sg=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!==No.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 ct=S((SE,hi)=>{"use strict";var lt=Symbol("SemVer ANY"),xo=class n{static{a(this,"Comparator")}static get ANY(){return lt}constructor(e,t){if(t=gi(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Oo("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===lt?this.value="":this.value=this.operator+this.semver.version,Oo("comp",this)}parse(e){let t=this.options.loose?pi[ui.COMPARATORLOOSE]:pi[ui.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 di(r[2],this.options.loose):this.semver=lt}toString(){return this.value}test(e){if(Oo("Comparator.test",e,this.options.loose),this.semver===lt||e===lt)return!0;if(typeof e=="string")try{e=new di(e,this.options)}catch{return!1}return Ao(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 mi(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new mi(this.value,t).test(e.semver):(t=gi(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("=")||Ao(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Ao(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};hi.exports=xo;var gi=cr(),{safeRe:pi,t:ui}=Fe(),Ao=wo(),Oo=it(),di=F(),mi=Z()});var gt=S((TE,fi)=>{"use strict";var Rg=Z(),Tg=a((n,e,t)=>{try{e=new Rg(e,t)}catch{return!1}return e.test(n)},"satisfies");fi.exports=Tg});var vi=S((yE,Ci)=>{"use strict";var Mg=Z(),yg=a((n,e)=>new Mg(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");Ci.exports=yg});var Si=S((wE,Ei)=>{"use strict";var Pg=F(),wg=Z(),bg=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new wg(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new Pg(r,t))}),r},"maxSatisfying");Ei.exports=bg});var Ti=S((IE,Ri)=>{"use strict";var Ig=F(),Ng=Z(),Ag=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new Ng(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new Ig(r,t))}),r},"minSatisfying");Ri.exports=Ag});var Pi=S((AE,yi)=>{"use strict";var $o=F(),Og=Z(),Mi=at(),xg=a((n,e)=>{n=new Og(n,e);let t=new $o("0.0.0");if(n.test(t)||(t=new $o("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 $o(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!s||Mi(c,s))&&(s=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Mi(t,s))&&(t=s)}return t&&n.test(t)?t:null},"minVersion");yi.exports=xg});var bi=S((xE,wi)=>{"use strict";var $g=Z(),Dg=a((n,e)=>{try{return new $g(n,e).range||"*"}catch{return null}},"validRange");wi.exports=Dg});var Er=S((DE,Oi)=>{"use strict";var Lg=F(),Ai=ct(),{ANY:_g}=Ai,kg=Z(),jg=gt(),Ii=at(),Ni=mr(),Hg=fr(),Fg=hr(),zg=a((n,e,t,r)=>{n=new Lg(n,r),e=new kg(e,r);let o,s,i,c,l;switch(t){case">":o=Ii,s=Hg,i=Ni,c=">",l=">=";break;case"<":o=Ni,s=Fg,i=Ii,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(jg(n,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],p=null,E=null;if(u.forEach(h=>{h.semver===_g&&(h=new Ai(">=0.0.0")),p=p||h,E=E||h,o(h.semver,p.semver,r)?p=h:i(h.semver,E.semver,r)&&(E=h)}),p.operator===c||p.operator===l||(!E.operator||E.operator===c)&&s(n,E.semver))return!1;if(E.operator===l&&i(n,E.semver))return!1}return!0},"outside");Oi.exports=zg});var $i=S((_E,xi)=>{"use strict";var Ug=Er(),Vg=a((n,e,t)=>Ug(n,e,">",t),"gtr");xi.exports=Vg});var Li=S((jE,Di)=>{"use strict";var Wg=Er(),qg=a((n,e,t)=>Wg(n,e,"<",t),"ltr");Di.exports=qg});var ji=S((FE,ki)=>{"use strict";var _i=Z(),Bg=a((n,e,t)=>(n=new _i(n,t),e=new _i(e,t),n.intersects(e,t)),"intersects");ki.exports=Bg});var Fi=S((UE,Hi)=>{"use strict";var Gg=gt(),Jg=Q();Hi.exports=(n,e,t)=>{let r=[],o=null,s=null,i=n.sort((u,p)=>Jg(u,p,t));for(let u of i)Gg(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,p]of r)u===p?c.push(u):!p&&u===i[0]?c.push("*"):p?u===i[0]?c.push(`<=${p}`):c.push(`${u} - ${p}`):c.push(`>=${u}`);let l=c.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Bi=S((VE,qi)=>{"use strict";var zi=Z(),Lo=ct(),{ANY:Do}=Lo,pt=gt(),_o=Q(),Xg=a((n,e,t={})=>{if(n===e)return!0;n=new zi(n,t),e=new zi(e,t);let r=!1;e:for(let o of n.set){for(let s of e.set){let i=Yg(o,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Kg=[new Lo(">=0.0.0-0")],Ui=[new Lo(">=0.0.0")],Yg=a((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Do){if(e.length===1&&e[0].semver===Do)return!0;t.includePrerelease?n=Kg:n=Ui}if(e.length===1&&e[0].semver===Do){if(t.includePrerelease)return!0;e=Ui}let r=new Set,o,s;for(let h of n)h.operator===">"||h.operator===">="?o=Vi(o,h,t):h.operator==="<"||h.operator==="<="?s=Wi(s,h,t):r.add(h.semver);if(r.size>1)return null;let i;if(o&&s){if(i=_o(o.semver,s.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||s.operator!=="<="))return null}for(let h of r){if(o&&!pt(h,String(o),t)||s&&!pt(h,String(s),t))return null;for(let $ of e)if(!pt(h,String($),t))return!1;return!0}let c,l,g,u,p=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,E=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;p&&p.prerelease.length===1&&s.operator==="<"&&p.prerelease[0]===0&&(p=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",g=g||h.operator==="<"||h.operator==="<=",o){if(E&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===E.major&&h.semver.minor===E.minor&&h.semver.patch===E.patch&&(E=!1),h.operator===">"||h.operator===">="){if(c=Vi(o,h,t),c===h&&c!==o)return!1}else if(o.operator===">="&&!pt(o.semver,String(h),t))return!1}if(s){if(p&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===p.major&&h.semver.minor===p.minor&&h.semver.patch===p.patch&&(p=!1),h.operator==="<"||h.operator==="<="){if(l=Wi(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!pt(s.semver,String(h),t))return!1}if(!h.operator&&(s||o)&&i!==0)return!1}return!(o&&g&&!s&&i!==0||s&&u&&!o&&i!==0||E||p)},"simpleSubset"),Vi=a((n,e,t)=>{if(!n)return e;let r=_o(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),Wi=a((n,e,t)=>{if(!n)return e;let r=_o(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");qi.exports=Xg});var Ki=S((qE,Xi)=>{"use strict";var ko=Fe(),Gi=st(),Qg=F(),Ji=Ro(),Zg=Pe(),ep=Ss(),tp=Ts(),rp=Ps(),op=Is(),np=As(),sp=xs(),ip=Ds(),ap=_s(),cp=Q(),lp=Fs(),gp=Us(),pp=dr(),up=Bs(),dp=Js(),mp=at(),hp=mr(),fp=yo(),Cp=Po(),vp=hr(),Ep=fr(),Sp=wo(),Rp=oi(),Tp=ct(),Mp=Z(),yp=gt(),Pp=vi(),wp=Si(),bp=Ti(),Ip=Pi(),Np=bi(),Ap=Er(),Op=$i(),xp=Li(),$p=ji(),Dp=Fi(),Lp=Bi();Xi.exports={parse:Zg,valid:ep,clean:tp,inc:rp,diff:op,major:np,minor:sp,patch:ip,prerelease:ap,compare:cp,rcompare:lp,compareLoose:gp,compareBuild:pp,sort:up,rsort:dp,gt:mp,lt:hp,eq:fp,neq:Cp,gte:vp,lte:Ep,cmp:Sp,coerce:Rp,Comparator:Tp,Range:Mp,satisfies:yp,toComparators:Pp,maxSatisfying:wp,minSatisfying:bp,minVersion:Ip,validRange:Np,outside:Ap,gtr:Op,ltr:xp,intersects:$p,simplifyRange:Dp,subset:Lp,SemVer:Qg,re:ko.re,src:ko.src,tokens:ko.t,SEMVER_SPEC_VERSION:Gi.SEMVER_SPEC_VERSION,RELEASE_TYPES:Gi.RELEASE_TYPES,compareIdentifiers:Ji.compareIdentifiers,rcompareIdentifiers:Ji.rcompareIdentifiers}});import{exec as _p,spawn as kp}from"child_process";import{promisify as jp}from"util";var ut,Yi,we,Qi=d(()=>{"use strict";W();ut=xa(Ki(),1),Yi=jp(_p),we=class{static{a(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||M()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=kp("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 Yi("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 Yi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(s=>s&&typeof s=="string"&&ut.default.valid(s));return e!=="all"&&(o=o.filter(s=>{let i=ut.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)=>ut.default.rcompare(s,i))}catch{return[]}}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=ut.default.gt(r,e)}catch{o=r!==e}return{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});var jo=d(()=>{"use strict";Qi()});import{z as Zi}from"zod";var Hp,Sr,ea=d(()=>{"use strict";jo();P();W();Hp=Zi.object({version:Zi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Sr=class{static{a(this,"UpdateApiHandler")}npmManager;logger=f;eventBus=M();activeInstalls=new Map;constructor(){this.npmManager=new we(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Hp.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,ta=d(()=>{"use strict";jo();po();P();Rr=class{static{a(this,"VersionApiHandler")}logger;constructor(){this.logger=f}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=fe.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=fe.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"),fe.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 we().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 we().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 ra=d(()=>{"use strict";Ln();_n();kn();no();jn();Fn();zn();rs();os();ns();is();as();ea();ta()});var Tr,oa=d(()=>{"use strict";P();W();Tr=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=f,this.eventBus=M()}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 Mr,na=d(()=>{"use strict";J();P();W();Mr=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=f,this.eventBus=M(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=m.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 sa=d(()=>{"use strict";P()});var ia=d(()=>{"use strict";oa();na();W();sa();It()});var dt,aa=d(()=>{"use strict";eo();dt=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(p){let E=H("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",p instanceof Error?p.message:String(p));return g.json(E,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 Ho,ca=d(()=>{"use strict";Ho={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 Fo,la=d(()=>{"use strict";Fo={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,ga=d(()=>{"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 Uo,pa=d(()=>{"use strict";Uo={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 Vo,ua=d(()=>{"use strict";Vo={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 Wo,da=d(()=>{"use strict";Wo={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 qo,ma=d(()=>{"use strict";qo={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 Bo,ha=d(()=>{"use strict";Bo={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 Go,fa=d(()=>{"use strict";Go={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 Jo,Ca=d(()=>{"use strict";Jo={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 yr,Xo,va=d(()=>{"use strict";yr=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"),Xo={name:"mcpserver",path:"/api/mcp-servers",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(n=>yr(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/:serverName",handler:a(n=>yr(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/:serverName/status",handler:a(n=>yr(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"",handler:a(n=>yr(n,e=>e.listMCPServers(n)),"handler")}]}});var Ea,mt,Ko,Sa=d(()=>{"use strict";Ea=a((n,e)=>({error:{code:n,message:e}}),"createErrorResponse"),mt=a(async(n,e)=>{let t=n.get("endpointHandler");if(!t){let r=Ea("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=Ea("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return n.json(o,500)}},"withEndpointHandler"),Ko={name:"endpoint",path:"/api/endpoint",description:"\u7AEF\u70B9\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/status",handler:a(n=>mt(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/connect",handler:a(n=>mt(n,"connectEndpoint"),"handler")},{method:"POST",path:"/disconnect",handler:a(n=>mt(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/add",handler:a(n=>mt(n,"addEndpoint"),"handler")},{method:"POST",path:"/remove",handler:a(n=>mt(n,"removeEndpoint"),"handler")}]}});var Yo,Ra=d(()=>{"use strict";Yo={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 Ta=d(()=>{"use strict";ca();la();ga();pa();ua();da();ma();ha();fa();Ca();va();Sa();Ra()});var Ma=d(()=>{"use strict";aa();Ta()});var Qt={};ue(Qt,{WebServer:()=>Qo});import{createServer as Fp}from"http";import{serve as zp}from"@hono/node-server";import{WebSocketServer as Up}from"ws";var Qo,Zt=d(()=>{"use strict";Ir();J();dn();Se();ee();ra();io();P();Xr();ia();to();Ma();Qo=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;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??m.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=f,this.eventBus=M(),this.statusService=new Tr,this.notificationService=new Mr,this.configApiHandler=new kt,this.statusApiHandler=new nr(this.statusService),this.serviceApiHandler=new tr(this.statusService),this.toolApiHandler=new ir,this.toolCallLogApiHandler=new ar,this.versionApiHandler=new Rr,this.staticFileHandler=new or,this.mcpRouteHandler=new Ut,this.updateApiHandler=new Sr,this.cozeApiHandler=new Ft,this.realtimeNotificationHandler=new qt(this.notificationService,this.statusService),this.heartbeatHandler=new zt(this.statusService,this.notificationService),this.app=yn(),this.setupMiddleware(),this.app.notFound(Zr),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 rt,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpServerApiHandler=new Wt(this.mcpServiceManager,m),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:de(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
95
|
1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
|
|
96
96
|
2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
|
|
97
97
|
3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
|
|
98
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 tt,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(!m.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");m.cleanupInvalidServerToolsConfig();let e=m.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=rn(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 Ge(m,{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 Le("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("*",Kr),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",ro),this.app?.use("*",oo()),this.app?.use("*",so()),this.app?.use("*",Yr),this.app?.onError(Qr),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 ut}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Ho,status:Fo,tools:zo,mcp:Uo,version:Vo,services:Wo,update:qo,coze:Go,"tool-logs":Jo,mcpserver:Xo,endpoint:Ko,misc:Yo,static:Bo}),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=Hp({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:jp});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Fp({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(),sn(),this.endpointConnection?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function zp(){let n=await Promise.resolve().then(()=>(Zt(),Qt)),e=await Promise.resolve().then(()=>(J(),gn)),t=await Promise.resolve().then(()=>(P(),nn));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}a(zp,"importModules");async function Up(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await zp();process.env.XIAOZHI_CONFIG_DIR&&(r.initLogFile(process.env.XIAOZHI_CONFIG_DIR),r.enableFileLogging(!0));let o=new e;await o.start(),r.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F");let s=a(async()=>{r.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await o.stop(),process.exit(0)},"cleanup");process.on("SIGINT",s),process.on("SIGTERM",s)}catch{process.exit(1)}}a(Up,"main");import.meta.url===`file://${process.argv[1]}`&&Up();
|
|
99
|
+
5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new rt,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(!m.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");m.cleanupInvalidServerToolsConfig();let e=m.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=rn(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 Je(m,{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 _e("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("*",Kr),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",ro),this.app?.use("*",oo()),this.app?.use("*",so()),this.app?.use("*",Yr),this.app?.onError(Qr),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 dt}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Ho,status:Fo,tools:zo,mcp:Uo,version:Vo,services:Wo,update:qo,coze:Go,"tool-logs":Jo,mcpserver:Xo,endpoint:Ko,misc:Yo,static:Bo}),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=zp({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:Fp});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Up({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(),sn(),this.endpointConnection?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function Vp(){let n=await Promise.resolve().then(()=>(Zt(),Qt)),e=await Promise.resolve().then(()=>(J(),un)),t=await Promise.resolve().then(()=>(P(),nn));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}a(Vp,"importModules");async function Wp(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await Vp();process.env.XIAOZHI_CONFIG_DIR&&(r.initLogFile(process.env.XIAOZHI_CONFIG_DIR),r.enableFileLogging(!0));let o=new e;await o.start(),r.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F");let s=a(async()=>{r.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await o.stop(),process.exit(0)},"cleanup");process.on("SIGINT",s),process.on("SIGTERM",s)}catch{process.exit(1)}}a(Wp,"main");import.meta.url===`file://${process.argv[1]}`&&Wp();
|
|
100
100
|
//# sourceMappingURL=WebServerLauncher.js.map
|