xiaozhi-client 1.8.2 → 1.8.3

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/cli.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
- var Ca=Object.create;var lt=Object.defineProperty;var va=Object.getOwnPropertyDescriptor;var Sa=Object.getOwnPropertyNames;var Ea=Object.getPrototypeOf,ya=Object.prototype.hasOwnProperty;var c=(o,e)=>lt(o,"name",{value:e,configurable:!0});var C=(o,e)=>()=>(o&&(e=o(o=0)),e);var T=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports),re=(o,e)=>{for(var t in e)lt(o,t,{get:e[t],enumerable:!0})},Js=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Sa(e))!ya.call(o,s)&&s!==t&&lt(o,s,{get:()=>e[s],enumerable:!(r=va(e,s))||r.enumerable});return o};var Ta=(o,e,t)=>(t=o!=null?Ca(Ea(o)):{},Js(e||!o||!o.__esModule?lt(t,"default",{value:o,enumerable:!0}):t,o)),fe=o=>Js(lt({},"__esModule",{value:!0}),o);import*as G from"fs";import*as ae from"path";import gt from"chalk";import Ge from"pino";import{z as Ma}from"zod";function wa(o){let e=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),r=String(o.getDate()).padStart(2,"0"),s=String(o.getHours()).padStart(2,"0"),n=String(o.getMinutes()).padStart(2,"0"),i=String(o.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${s}:${n}:${i}`}function Ra(){return ut||(ut=new ht(Ks)),ut}function Ys(o){Ks=o,ut&&ut.setLevel(o)}var Pa,ht,ut,Ks,p,P=C(()=>{"use strict";Pa=Ma.enum(["fatal","error","warn","info","debug","trace"]);c(wa,"formatDateTime");ht=class{static{c(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=Pa.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:Ge.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Ge.destination({dest:"/dev/null"})}),Ge({level:this.logLevel,timestamp:Ge.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:Ge.stdSerializers?.err||(t=>t)}},Ge.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:gt.gray}],[30,{name:"INFO",color:gt.blue}],[40,{name:"WARN",color:gt.yellow}],[50,{name:"ERROR",color:gt.red}],[60,{name:"FATAL",color:gt.red}]]);return{write:c(t=>{try{let r=JSON.parse(t),s=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${s}
3
- `)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"?process.stderr.write(e):console&&typeof console.error=="function"&&console.error(e.trim())}catch{}}formatConsoleMessageOptimized(e,t){let r=wa(new Date),s=t.get(e.level)||{name:"UNKNOWN",color:c(a=>a,"color")},n=s.color(`[${s.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let a=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${a}`}return`[${r}] ${n} ${i}`}initLogFile(e){this.logFilePath=ae.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),G.existsSync(this.logFilePath)||G.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(s=>s instanceof Error?{message:s.message,stack:s.stack,name:s.name,cause:s.cause}:s);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,s]of Object.entries(t))s instanceof Error&&(t[r]={message:s.message,stack:s.stack,name:s.name,cause:s.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!G.existsSync(this.logFilePath)))try{G.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=ae.dirname(this.logFilePath),t=ae.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let n=ae.join(e,`${t}.${s}.log`),i=ae.join(e,`${t}.${s+1}.log`);G.existsSync(n)&&(s===this.maxLogFiles-1?G.unlinkSync(n):G.renameSync(n,i))}let r=ae.join(e,`${t}.1.log`);G.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=ae.dirname(this.logFilePath),t=ae.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=ae.join(e,`${t}.${r}.log`);G.existsSync(s)&&G.unlinkSync(s)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}withTag(e){return this}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},ut=null,Ks="info";c(Ra,"getLogger");c(Ys,"setGlobalLogLevel");p=Ra()});import{EventEmitter as ba}from"events";function w(){return Xe||(Xe=new Ur),Xe}function Zs(){Xe&&(Xe.destroy(),Xe=null)}var Ur,Xe,z=C(()=>{"use strict";P();Ur=class extends ba{static{c(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=p.withTag("EventBus"),this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=c(s=>{try{t(s)}catch(n){throw this.emit("error",n),n}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")}},Xe=null;c(w,"getEventBus");c(Zs,"destroyEventBus")});function Ia(o){if(!o||typeof o!="object")throw new Error("\u670D\u52A1\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u6709\u6548\u7684\u5BF9\u8C61");if("command"in o&&typeof o.command=="string")return"stdio";if("type"in o&&o.type==="sse")return"sse";if("type"in o&&o.type==="streamable-http"||"url"in o&&typeof o.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 Fr(o,e){if(!e||typeof e!="object")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61`};try{switch(Ia(e)){case"stdio":if(!e.command||typeof e.command!="string")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7F3A\u5C11\u5FC5\u9700\u7684 command \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(!Array.isArray(e.args))return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 args \u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4`};if(e.env&&typeof e.env!="object")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 env \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"sse":if(e.type!=="sse")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 type \u5B57\u6BB5\u5FC5\u987B\u662F "sse"`};if(!e.url||typeof e.url!="string")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};break;case"streamable-http":if(!e.url||typeof e.url!="string")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(e.type&&e.type!=="streamable-http")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 type \u5B57\u6BB5\u5982\u679C\u5B58\u5728\uFF0C\u5FC5\u987B\u662F "streamable-http"`};break;default:return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684\u914D\u7F6E\u7C7B\u578B\u65E0\u6CD5\u8BC6\u522B`}}return{valid:!0}}catch(t){return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684\u914D\u7F6E\u65E0\u6548: ${t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF"}`}}}function E(o){return`${o.slice(0,30)}...${o.slice(-10)}`}var Lt=C(()=>{"use strict";c(Ia,"getMcpServerCommunicationType");c(Fr,"validateMcpServerConfig");c(E,"sliceEndpoint")});import{copyFileSync as $a,existsSync as _t,readFileSync as Oa,writeFileSync as Aa}from"fs";import{dirname as xa,resolve as _e}from"path";import{fileURLToPath as Na}from"url";import*as kt from"comment-json";import Qs from"dayjs";import Vr from"json5";import*as tn from"json5-writer";var en,Wr,Br,d,se=C(()=>{"use strict";P();z();Lt();en=xa(Na(import.meta.url)),Wr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},Br=class o{static{c(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=w();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[_e(en,"templates","default","xiaozhi.config.json"),_e(en,"..","templates","default","xiaozhi.config.json"),_e(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>_t(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 s=_e(e,r);if(_t(s))return s}return _e(e,"xiaozhi.config.json")}getConfigFileFormat(e){return e.endsWith(".json5")?"json5":e.endsWith(".jsonc")?"jsonc":"json"}static getInstance(){return o.instance||(o.instance=new o),o.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 s=_e(e,r);if(_t(s))return!0}return!1}initConfig(e="json"){if(!_t(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}`,s=_e(t,r);$a(this.defaultConfigPath,s),this.config=null,this.json5Writer=null}loadConfig(){if(!this.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C xiaozhi init \u521D\u59CB\u5316\u914D\u7F6E");try{let e=this.getConfigFilePath();this.currentConfigPath=e;let t=this.getConfigFileFormat(e),s=Oa(e,"utf8").replace(/^\uFEFF/,""),n;switch(t){case"json5":n=Vr.parse(s),this.json5Writer=tn.load(s);break;case"jsonc":n=kt.parse(s);break;default:n=JSON.parse(s);break}return this.validateConfig(n),n}catch(e){throw e instanceof SyntaxError?new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF: ${e.message}`):e}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A\u6839\u5BF9\u8C61\u65E0\u6548");let t=e;if(t.mcpEndpoint===void 0||t.mcpEndpoint===null)throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5B57\u6BB5\u65E0\u6548");if(typeof t.mcpEndpoint!="string")if(Array.isArray(t.mcpEndpoint)){for(let r of t.mcpEndpoint)if(typeof r!="string"||r.trim()==="")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6216\u5B57\u7B26\u4E32\u6570\u7EC4");if(!t.mcpServers||typeof t.mcpServers!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers \u5B57\u6BB5\u65E0\u6548");for(let[r,s]of Object.entries(t.mcpServers)){if(!s||typeof s!="object")throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers.${r} \u65E0\u6548`);let n=Fr(r,s);if(!n.valid)throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A${n.error}`)}}getConfig(){return this.config=this.loadConfig(),JSON.parse(JSON.stringify(this.config))}getMutableConfig(){return this.config||(this.config=this.loadConfig()),this.config}getMcpEndpoint(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?e.mcpEndpoint[0]||"":e.mcpEndpoint}getMcpEndpoints(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?[...e.mcpEndpoint]:e.mcpEndpoint?[e.mcpEndpoint]:[]}getMcpServers(){return this.getConfig().mcpServers}getMcpServerConfig(){return this.getConfig().mcpServerConfig||{}}getServerToolsConfig(e){return this.getMcpServerConfig()[e]?.tools||{}}isToolEnabled(e,t){return this.getServerToolsConfig(e)[t]?.enable!==!1}updateMcpEndpoint(e){if(Array.isArray(e)){for(let r of e)if(!r||typeof r!="string")throw new Error("MCP \u7AEF\u70B9\u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}let t=this.getMutableConfig();t.mcpEndpoint=e,this.saveConfig(t)}addMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.includes(e))throw new Error(`MCP \u7AEF\u70B9 ${e} \u5DF2\u5B58\u5728`);let s=[...r,e];t.mcpEndpoint=s,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 n=r.filter(i=>i!==e);t.mcpEndpoint=n,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=Fr(e,t);if(!r.valid)throw new Error(r.error||"\u670D\u52A1\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let s=this.getMutableConfig();s.mcpServers[e]=t,this.saveConfig(s)}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(s=>s.handler?.type==="mcp"&&s.handler.config?.serviceName===e);for(let s of r){let n=t.customMCP.tools.findIndex(i=>i.name===s.name);n!==-1&&t.customMCP.tools.splice(n,1)}t.customMCP.tools.length===0&&(t.customMCP=void 0)}this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),p.info(`\u6210\u529F\u79FB\u9664 MCP \u670D\u52A1 ${e} \u53CA\u5176\u76F8\u5173\u914D\u7F6E`)}updateServerToolsConfig(e,t){let r=this.getMutableConfig();r.mcpServerConfig||(r.mcpServerConfig={}),Object.keys(t).length===0?delete r.mcpServerConfig[e]:r.mcpServerConfig[e]={tools:t},this.saveConfig(r),this.eventBus.emitEvent("config:updated",{type:"serverTools",serviceName:e,timestamp:new Date})}removeServerToolsConfig(e){let r={...this.getConfig()};r.mcpServerConfig&&(delete r.mcpServerConfig[e],this.saveConfig(r))}cleanupInvalidServerToolsConfig(){let e=this.getMutableConfig();if(!e.mcpServerConfig)return;let t=Object.keys(e.mcpServers),s=Object.keys(e.mcpServerConfig).filter(n=>!t.includes(n));if(s.length>0){for(let n of s)delete e.mcpServerConfig[n];this.saveConfig(e),p.info(`\u5DF2\u6E05\u7406 ${s.length} \u4E2A\u65E0\u6548\u7684\u670D\u52A1\u5DE5\u5177\u914D\u7F6E: ${s.join(", ")}`)}}setToolEnabled(e,t,r,s){let n=this.getMutableConfig();n.mcpServerConfig||(n.mcpServerConfig={}),n.mcpServerConfig[e]||(n.mcpServerConfig[e]={tools:{}}),n.mcpServerConfig[e].tools[t]={...n.mcpServerConfig[e].tools[t],enable:r,...s&&{description:s}},this.saveConfig(n)}saveConfig(e){try{this.validateConfig(e);let t;this.currentConfigPath?t=this.currentConfigPath:(t=this.getConfigFilePath(),this.currentConfigPath=t);let r=this.getConfigFileFormat(t),s;switch(r){case"json5":try{this.json5Writer?(this.json5Writer.write(e),s=this.json5Writer.toSource()):(console.warn("\u6CA1\u6709 json5Writer \u5B9E\u4F8B\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON5 \u683C\u5F0F"),s=Vr.stringify(e,null,2))}catch(n){console.warn("\u4F7F\u7528 json5-writer \u4FDD\u5B58\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON5 \u683C\u5F0F:",n),s=Vr.stringify(e,null,2)}break;case"jsonc":try{s=kt.stringify(e,null,2)}catch(n){console.warn("\u4F7F\u7528 comment-json \u4FDD\u5B58\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON \u683C\u5F0F:",n),s=JSON.stringify(e,null,2)}break;default:s=JSON.stringify(e,null,2);break}Aa(t,s,"utf8"),this.config=e,this.notifyConfigUpdate(e)}catch(t){throw new Error(`\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}reloadConfig(){this.config=null,this.currentConfigPath=null,this.json5Writer=null}getConfigPath(){return this.getConfigFilePath()}getDefaultConfigPath(){return this.defaultConfigPath}getConnectionConfig(){let t=this.getConfig().connection||{};return{heartbeatInterval:t.heartbeatInterval??Wr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??Wr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??Wr.reconnectInterval}}getHeartbeatInterval(){return this.getConnectionConfig().heartbeatInterval}getHeartbeatTimeout(){return this.getConnectionConfig().heartbeatTimeout}getReconnectInterval(){return this.getConnectionConfig().reconnectInterval}updateConnectionConfig(e){let t=this.getMutableConfig();t.connection||(t.connection={}),Object.assign(t.connection,e),this.saveConfig(t)}async updateToolUsageStats(e,t,r){try{if(typeof t=="string"&&r){let s=e,n=t,i=r;await Promise.all([this._updateMCPServerToolStats(s,n,i),this.updateCustomMCPToolStats(s,n,i)]),p.debug(`\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}/${n}`)}else{let s=e,n=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(s,i,n),p.debug(`CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}`)}}catch(s){if(typeof t=="string"&&r){let n=e,i=t;p.error(`\u66F4\u65B0\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${n}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let n=e;p.error(`\u66F4\u65B0 CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${n}): ${s instanceof Error?s.message:String(s)}`)}}}async updateMCPServerToolStats(e,t,r,s=!0){await this._updateMCPServerToolStats(e,t,r,s)}setHeartbeatInterval(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatInterval:e})}setHeartbeatTimeout(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatTimeout:e})}setReconnectInterval(e){if(e<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({reconnectInterval:e})}getModelScopeConfig(){return this.getConfig().modelscope||{}}getModelScopeApiKey(){return this.getModelScopeConfig().apiKey||process.env.MODELSCOPE_API_TOKEN}updateModelScopeConfig(e){let t=this.getMutableConfig();t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e),this.saveConfig(t)}setModelScopeApiKey(e){if(!e||typeof e!="string")throw new Error("API Key \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");this.updateModelScopeConfig({apiKey:e})}getCustomMCPConfig(){return this.getConfig().customMCP||null}getCustomMCPTools(){let e=this.getCustomMCPConfig();return!e||!e.tools?[]:e.tools}validateCustomMCPTools(e){if(!Array.isArray(e))return!1;for(let t of e){if(!t.name||typeof t.name!="string")return p.warn(`CustomMCP \u5DE5\u5177\u7F3A\u5C11\u6709\u6548\u7684 name \u5B57\u6BB5: ${JSON.stringify(t)}`),!1;if(!t.description||typeof t.description!="string")return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 description \u5B57\u6BB5`),!1;if(!t.inputSchema||typeof t.inputSchema!="object")return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 inputSchema \u5B57\u6BB5`),!1;if(!t.handler||typeof t.handler!="object")return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 handler \u5B57\u6BB5`),!1;if(!["proxy","function","http","script","chain","mcp"].includes(t.handler.type))return p.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7684 handler.type \u5FC5\u987B\u662F 'proxy', 'function', 'http', 'script', 'chain' \u6216 'mcp'`),!1;if(!this.validateHandlerConfig(t.name,t.handler))return!1}return!0}validateHandlerConfig(e,t){switch(t.type){case"proxy":return this.validateProxyHandler(e,t);case"http":return this.validateHttpHandler(e,t);case"function":return this.validateFunctionHandler(e,t);case"script":return this.validateScriptHandler(e,t);case"chain":return this.validateChainHandler(e,t);case"mcp":return this.validateMCPHandler(e,t);default:return p.warn(`CustomMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u4E86\u672A\u77E5\u7684\u5904\u7406\u5668\u7C7B\u578B`),!1}}validateProxyHandler(e,t){return t.platform?["coze","openai","anthropic","custom"].includes(t.platform)?!t.config||typeof t.config!="object"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):t.platform==="coze"&&!t.config.workflow_id&&!t.config.bot_id?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 Coze \u5904\u7406\u5668\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id`),!1):!0:(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u5E73\u53F0: ${t.platform}`),!1):(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u7F3A\u5C11 platform \u5B57\u6BB5`),!1)}validateHttpHandler(e,t){if(!t.url||typeof t.url!="string")return p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 url \u5B57\u6BB5`),!1;try{new URL(t.url)}catch{return p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668 url \u683C\u5F0F\u65E0\u6548: ${t.url}`),!1}return t.method&&!["GET","POST","PUT","DELETE","PATCH"].includes(t.method)?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${t.method}`),!1):!0}validateFunctionHandler(e,t){return!t.module||typeof t.module!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 function \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 module \u5B57\u6BB5`),!1):!t.function||typeof t.function!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 function \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 function \u5B57\u6BB5`),!1):!0}validateScriptHandler(e,t){return!t.script||typeof t.script!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 script \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 script \u5B57\u6BB5`),!1):t.interpreter&&!["node","python","bash"].includes(t.interpreter)?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 script \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u89E3\u91CA\u5668: ${t.interpreter}`),!1):!0}validateChainHandler(e,t){return!t.tools||!Array.isArray(t.tools)||t.tools.length===0?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 tools \u6570\u7EC4`),!1):["sequential","parallel"].includes(t.mode)?["stop","continue","retry"].includes(t.error_handling)?!0:(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u9519\u8BEF\u5904\u7406\u7B56\u7565: ${t.error_handling}`),!1):(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u6267\u884C\u6A21\u5F0F: ${t.mode}`),!1)}validateMCPHandler(e,t){return!t.config||typeof t.config!="object"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):!t.config.serviceName||typeof t.config.serviceName!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 serviceName`),!1):!t.config.toolName||typeof t.config.toolName!="string"?(p.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 toolName`),!1):!0}hasValidCustomMCPTools(){try{let e=this.getCustomMCPTools();return e.length===0?!1:this.validateCustomMCPTools(e)}catch(e){return p.error("\u68C0\u67E5 customMCP \u5DE5\u5177\u914D\u7F6E\u65F6\u51FA\u9519:",e),!1}}addCustomMCPTool(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools.find(s=>s.name===e.name))throw new Error(`\u5DE5\u5177 "${e.name}" \u5DF2\u5B58\u5728`);if(!this.validateCustomMCPTools([e]))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.unshift(e),this.saveConfig(t),p.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e.name}`)}async addCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(e.length===0)return;let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]});let r=new Set(t.customMCP.tools.map(n=>n.name)),s=e.filter(n=>!r.has(n.name));if(s.length>0){if(!this.validateCustomMCPTools(s))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.push(...s),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),p.info(`\u6210\u529F\u6279\u91CF\u6DFB\u52A0 ${s.length} \u4E2A\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${s.map(n=>n.name).join(", ")}`)}}removeCustomMCPTool(e){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(!t.customMCP||!t.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let r=t.customMCP.tools.findIndex(s=>s.name===e);if(r===-1)throw new Error(`\u5DE5\u5177 "${e}" \u4E0D\u5B58\u5728`);t.customMCP.tools.splice(r,1),this.saveConfig(t),p.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e}`)}updateCustomMCPTool(e,t){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="object")throw new Error("\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let r=this.getMutableConfig();if(!r.customMCP||!r.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let s=r.customMCP.tools.findIndex(n=>n.name===e);if(s===-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[s]=t,this.saveConfig(r),p.info(`\u6210\u529F\u66F4\u65B0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e}`)}updateCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(!this.validateCustomMCPTools(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools=e,this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),p.info(`\u6210\u529F\u66F4\u65B0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\uFF0C\u5171 ${e.length} \u4E2A\u5DE5\u5177`)}getWebUIConfig(){return this.getConfig().webUI||{}}getWebUIPort(){return this.getWebUIConfig().port??9999}notifyConfigUpdate(e){try{let t=global.__webServer;t&&typeof t.broadcastConfigUpdate=="function"&&(t.broadcastConfigUpdate(e),console.log("\u5DF2\u901A\u8FC7 WebSocket \u5E7F\u64AD\u914D\u7F6E\u66F4\u65B0"))}catch(t){console.warn("\u901A\u77E5 Web \u754C\u9762\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t instanceof Error?t.message:String(t))}}updateWebUIConfig(e){let t=this.getMutableConfig();t.webUI||(t.webUI={}),Object.assign(t.webUI,e),this.saveConfig(t)}setWebUIPort(e){if(!Number.isInteger(e)||e<=0||e>65535)throw new Error("\u7AEF\u53E3\u53F7\u5FC5\u987B\u662F 1-65535 \u4E4B\u95F4\u7684\u6574\u6570");this.updateWebUIConfig({port:e})}updatePlatformConfig(e,t){let r=this.getMutableConfig();r.platforms||(r.platforms={}),r.platforms[e]=t,this.saveConfig(r)}getCozePlatformConfig(){let t=this.getConfig().platforms?.coze;return!t||!t.token?null:{token:t.token}}getCozeToken(){return this.getCozePlatformConfig()?.token||null}setCozePlatformConfig(e){if(!e.token||typeof e.token!="string"||e.token.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.updatePlatformConfig("coze",{token:e.token.trim()})}isCozeConfigValid(){let e=this.getCozePlatformConfig();return e!==null&&typeof e.token=="string"&&e.token.trim()!==""}async _updateMCPServerToolStats(e,t,r,s=!0){let n=this.getMutableConfig();n.mcpServerConfig||(n.mcpServerConfig={}),n.mcpServerConfig[e]||(n.mcpServerConfig[e]={tools:{}}),n.mcpServerConfig[e].tools[t]||(n.mcpServerConfig[e].tools[t]={enable:!0});let i=n.mcpServerConfig[e].tools[t],a=i.usageCount||0,l=i.lastUsedTime;s&&(i.usageCount=a+1),(!l||new Date(r)>new Date(l))&&(i.lastUsedTime=Qs(r).format("YYYY-MM-DD HH:mm:ss")),this.saveConfig(n)}async updateCustomMCPToolStats(e,t,r){try{let s,n,i=!0,a;if(typeof r=="string"){let A=e;s=`${A}__${t}`,n=r,a=`${A}/${t}`}else s=e,n=t,i=r||!0,a=s;let l=this.getCustomMCPTools(),g=l.findIndex(A=>A.name===s);if(g===-1)return;let u=[...l],h=u[g];h.stats||(h.stats={});let f=h.stats.usageCount||0,m=h.stats.lastUsedTime;i&&(h.stats.usageCount=f+1),(!m||new Date(n)>new Date(m))&&(h.stats.lastUsedTime=Qs(n).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(u)}catch(s){if(typeof r=="string"){let n=e,i=t;p.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${n}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let n=e;p.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${n}): ${s instanceof Error?s.message:String(s)}`)}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return p.debug(`\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u66F4\u65B0\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8DF3\u8FC7\u672C\u6B21\u66F4\u65B0`),!1;let t=new Promise(s=>{});this.statsUpdateLocks.set(e,t);let r=setTimeout(()=>{this.releaseStatsUpdateLock(e)},this.STATS_UPDATE_TIMEOUT);return this.statsUpdateLockTimeouts.set(e,r),!0}releaseStatsUpdateLock(e){this.statsUpdateLocks.delete(e);let t=this.statsUpdateLockTimeouts.get(e);t&&(clearTimeout(t),this.statsUpdateLockTimeouts.delete(e)),p.debug(`\u5DF2\u91CA\u653E\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u66F4\u65B0\u9501`)}async updateToolUsageStatsWithLock(e,t=!0){let r=`custommcp_${e}`;if(await this.acquireStatsUpdateLock(r))try{await this.updateToolUsageStats(e,t),p.debug(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(s){throw p.error(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,s),s}finally{this.releaseStatsUpdateLock(r)}}async updateMCPServerToolStatsWithLock(e,t,r,s=!0){let n=`mcpserver_${e}_${t}`;if(await this.acquireStatsUpdateLock(n))try{await this.updateMCPServerToolStats(e,t,r,s),p.debug(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(i){throw p.error(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,i),i}finally{this.releaseStatsUpdateLock(n)}}clearAllStatsUpdateLocks(){let e=this.statsUpdateLocks.size;this.statsUpdateLocks.clear();for(let t of this.statsUpdateLockTimeouts.values())clearTimeout(t);this.statsUpdateLockTimeouts.clear(),e>0&&p.info(`\u5DF2\u6E05\u7406 ${e} \u4E2A\u7EDF\u8BA1\u66F4\u65B0\u9501`)}getStatsUpdateLocks(){return Array.from(this.statsUpdateLocks.keys())}},d=Br.getInstance()});var qr,Je,pt,b,Gr,dt=C(()=>{"use strict";qr={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},Je={FILE_NAMES:["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"],DEFAULT_FILE:"xiaozhi.config.default.json",DIR_ENV_VAR:"XIAOZHI_CONFIG_DIR"},pt={WORK_DIR:".xiaozhi",TEMPLATES_DIR:"templates",LOGS_DIR:"logs"},b={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"},Gr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3}});var Da,La,jt,rn=C(()=>{"use strict";dt();Da={[b.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[b.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[b.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[b.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[b.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[b.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[b.PERMISSION_ERROR]:"\u5C1D\u8BD5\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"},La={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"]},jt=class{static{c(this,"ERROR_MESSAGES")}static getHelpMessage(e){return Da[e]}static getSolutions(e){return La[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[b.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[b.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[b.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[b.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[b.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[b.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[b.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[b.NETWORK_ERROR,b.FILE_ERROR,b.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[b.VALIDATION_ERROR]:"low",[b.FILE_ERROR]:"medium",[b.CONFIG_ERROR]:"medium",[b.NETWORK_ERROR]:"medium",[b.SERVICE_ERROR]:"high",[b.PROCESS_ERROR]:"high",[b.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});var X,ke,_,I,R,Re,Ce=C(()=>{"use strict";dt();X=class o extends Error{constructor(t,r,s=1,n){super(t);this.code=r;this.exitCode=s;this.suggestions=n;this.name="CLIError",Error.captureStackTrace&&Error.captureStackTrace(this,o)}static{c(this,"CLIError")}static withSuggestions(t,r,s){return new o(t,r,1,s)}},ke=class o extends X{static{c(this,"ConfigError")}constructor(e,t){super(e,b.CONFIG_ERROR,1,t),this.name="ConfigError"}static configNotFound(){return new o("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728",['\u8BF7\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6'])}static invalidFormat(e){return new o(`\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F: ${e}`,["\u652F\u6301\u7684\u683C\u5F0F: json, json5, jsonc"])}},_=class o extends X{static{c(this,"ServiceError")}constructor(e,t){super(e,b.SERVICE_ERROR,1,t),this.name="ServiceError"}static alreadyRunning(e){return new o(`\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 o(`\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 o("\u670D\u52A1\u672A\u8FD0\u884C",['\u8BF7\u8FD0\u884C "xiaozhi start" \u542F\u52A8\u670D\u52A1'])}static startFailed(e){return new o(`\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"])}},I=class o extends X{static{c(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,b.VALIDATION_ERROR,1),this.name="ValidationError"}static invalidPort(e){return new o(`\u7AEF\u53E3\u53F7\u5FC5\u987B\u5728 1-65535 \u8303\u56F4\u5185\uFF0C\u5F53\u524D\u503C: ${e}`,"port")}static requiredField(e){return new o("\u5FC5\u586B\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A",e)}},R=class o extends X{static{c(this,"FileError")}constructor(e,t,r){let s=t?`${e}: ${t}`:e;super(s,b.FILE_ERROR,1,r),this.name="FileError"}static notFound(e){return new o("\u6587\u4EF6\u4E0D\u5B58\u5728",e,["\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u662F\u5426\u6B63\u786E"])}static permissionDenied(e){return new o("\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 o("\u6587\u4EF6\u5DF2\u5B58\u5728",e,["\u4F7F\u7528\u4E0D\u540C\u7684\u6587\u4EF6\u540D\u6216\u5220\u9664\u73B0\u6709\u6587\u4EF6"])}},Re=class o extends X{static{c(this,"ProcessError")}constructor(e,t,r){let s=t?`${e} (PID: ${t})`:e;super(s,b.PROCESS_ERROR,1,r),this.name="ProcessError"}static killFailed(e){return new o("\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 o("\u8FDB\u7A0B\u4E0D\u5B58\u5728",e)}}});import Y from"chalk";var ve,Xr=C(()=>{"use strict";rn();Ce();ve=class o{static{c(this,"ErrorHandler")}static handle(e){e instanceof X?o.handleCLIError(e):o.handleUnknownError(e),process.exit(1)}static handleCLIError(e){if(console.error(Y.red(`\u274C \u9519\u8BEF: ${e.message}`)),process.env.DEBUG&&console.error(Y.gray(`\u9519\u8BEF\u7801: ${e.code}`)),e.suggestions&&e.suggestions.length>0){console.log(Y.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of e.suggestions)console.log(Y.gray(` ${r}`))}let t=jt.getHelpMessage(e.code);t&&console.log(Y.blue(`\u2139\uFE0F ${t}`))}static handleUnknownError(e){console.error(Y.red(`\u274C \u672A\u77E5\u9519\u8BEF: ${e.message}`)),process.env.DEBUG||process.env.NODE_ENV==="development"?(console.error(Y.gray("\u5806\u6808\u4FE1\u606F:")),console.error(Y.gray(e.stack))):console.log(Y.yellow("\u{1F4A1} \u63D0\u793A: \u8BBE\u7F6E DEBUG=1 \u73AF\u5883\u53D8\u91CF\u67E5\u770B\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F"))}static async handleAsync(e,t){try{return await e()}catch(r){throw r instanceof X?r:r instanceof Error?new X(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new X(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof X?r:r instanceof Error?new X(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new X(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static warn(e,t){if(console.warn(Y.yellow(`\u26A0\uFE0F \u8B66\u544A: ${e}`)),t&&t.length>0){console.log(Y.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of t)console.log(Y.gray(` ${r}`))}}static info(e){console.log(Y.blue(`\u2139\uFE0F ${e}`))}static success(e){console.log(Y.green(`\u2705 ${e}`))}}});import V from"fs";import ce from"path";var $,mt=C(()=>{"use strict";Ce();$=class o{static{c(this,"FileUtils")}static exists(e){try{return V.existsSync(e)}catch{return!1}}static ensureDir(e){try{V.existsSync(e)||V.mkdirSync(e,{recursive:!0})}catch{throw new R("\u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55",e)}}static readFile(e,t="utf8"){try{if(!o.exists(e))throw R.notFound(e);return V.readFileSync(e,t)}catch(r){throw r instanceof R?r:new R("\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6",e)}}static writeFile(e,t,r){try{if(!r?.overwrite&&o.exists(e))throw R.alreadyExists(e);let s=ce.dirname(e);o.ensureDir(s),V.writeFileSync(e,t,"utf8")}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u5199\u5165\u6587\u4EF6",e)}}static copyFile(e,t,r){try{if(!o.exists(e))throw R.notFound(e);if(!r?.overwrite&&o.exists(t))throw R.alreadyExists(t);let s=ce.dirname(t);o.ensureDir(s),V.copyFileSync(e,t)}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u590D\u5236\u6587\u4EF6",e)}}static deleteFile(e){try{o.exists(e)&&V.unlinkSync(e)}catch{throw new R("\u65E0\u6CD5\u5220\u9664\u6587\u4EF6",e)}}static copyDirectory(e,t,r={}){try{if(!o.exists(e))throw R.notFound(e);o.ensureDir(t);let s=V.readdirSync(e);for(let n of s){if(r.exclude?.includes(n))continue;let i=ce.join(e,n),a=ce.join(t,n);V.statSync(i).isDirectory()?r.recursive!==!1&&o.copyDirectory(i,a,r):o.copyFile(i,a,{overwrite:r.overwrite})}}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u590D\u5236\u76EE\u5F55",e)}}static deleteDirectory(e,t={}){try{o.exists(e)&&V.rmSync(e,{recursive:t.recursive??!0,force:!0})}catch{throw new R("\u65E0\u6CD5\u5220\u9664\u76EE\u5F55",e)}}static getFileInfo(e){try{if(!o.exists(e))throw R.notFound(e);let t=V.statSync(e);return{size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory(),mtime:t.mtime,ctime:t.ctime}}catch(t){throw t instanceof R?t:new R("\u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u4FE1\u606F",e)}}static listDirectory(e,t={}){try{if(!o.exists(e))throw R.notFound(e);let r=V.readdirSync(e),s=[];for(let n of r){if(!t.includeHidden&&n.startsWith("."))continue;let i=ce.join(e,n);if(s.push(i),t.recursive&&V.statSync(i).isDirectory()){let a=o.listDirectory(i,t);s=s.concat(a)}}return s}catch(r){throw r instanceof R?r:new R("\u65E0\u6CD5\u5217\u51FA\u76EE\u5F55\u5185\u5BB9",e)}}static createTempFile(e="xiaozhi-",t=".tmp"){let r=process.env.TMPDIR||process.env.TEMP||"/tmp",s=Date.now(),n=Math.random().toString(36).substring(2),i=`${e}${s}-${n}${t}`;return ce.join(r,i)}static checkPermissions(e,t=V.constants.R_OK|V.constants.W_OK){try{return V.accessSync(e,t),!0}catch{return!1}}static getExtension(e){return ce.extname(e).toLowerCase()}static getBaseName(e){return ce.basename(e,ce.extname(e))}static normalizePath(e){return ce.normalize(e)}static resolvePath(e,t){return t?ce.resolve(t,e):ce.resolve(e)}}});var Ke,Jr=C(()=>{"use strict";Ke=class{static{c(this,"FormatUtils")}static formatUptime(e){let t=Math.floor(e/1e3),r=Math.floor(t/60),s=Math.floor(r/60),n=Math.floor(s/24);return n>0?`${n}\u5929 ${s%24}\u5C0F\u65F6 ${r%60}\u5206\u949F`:s>0?`${s}\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,s=0;for(;r>=1024&&s<t.length-1;)r/=1024,s++;return`${r.toFixed(s===0?0:1)} ${t[s]}`}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,s){let n=`${e}://${t}:${r}`;return s?`${n}${s}`:n}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+=`
2
+ var Ca=Object.create;var at=Object.defineProperty;var va=Object.getOwnPropertyDescriptor;var Sa=Object.getOwnPropertyNames;var Ea=Object.getPrototypeOf,ya=Object.prototype.hasOwnProperty;var c=(o,e)=>at(o,"name",{value:e,configurable:!0});var C=(o,e)=>()=>(o&&(e=o(o=0)),e);var T=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports),re=(o,e)=>{for(var t in e)at(o,t,{get:e[t],enumerable:!0})},Js=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Sa(e))!ya.call(o,s)&&s!==t&&at(o,s,{get:()=>e[s],enumerable:!(r=va(e,s))||r.enumerable});return o};var Ta=(o,e,t)=>(t=o!=null?Ca(Ea(o)):{},Js(e||!o||!o.__esModule?at(t,"default",{value:o,enumerable:!0}):t,o)),fe=o=>Js(at({},"__esModule",{value:!0}),o);import*as q from"fs";import*as ae from"path";import ct from"chalk";import Ge from"pino";import{z as Pa}from"zod";function wa(o){let e=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),r=String(o.getDate()).padStart(2,"0"),s=String(o.getHours()).padStart(2,"0"),n=String(o.getMinutes()).padStart(2,"0"),i=String(o.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${s}:${n}:${i}`}function Ra(){return lt||(lt=new gt(Ks)),lt}function Ys(o){Ks=o,lt&&lt.setLevel(o)}var Ma,gt,lt,Ks,h,M=C(()=>{"use strict";Ma=Pa.enum(["fatal","error","warn","info","debug","trace"]);c(wa,"formatDateTime");gt=class{static{c(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=Ma.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:Ge.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Ge.destination({dest:"/dev/null"})}),Ge({level:this.logLevel,timestamp:Ge.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:Ge.stdSerializers?.err||(t=>t)}},Ge.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:ct.gray}],[30,{name:"INFO",color:ct.blue}],[40,{name:"WARN",color:ct.yellow}],[50,{name:"ERROR",color:ct.red}],[60,{name:"FATAL",color:ct.red}]]);return{write:c(t=>{try{let r=JSON.parse(t),s=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${s}
3
+ `)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"?process.stderr.write(e):console&&typeof console.error=="function"&&console.error(e.trim())}catch{}}formatConsoleMessageOptimized(e,t){let r=wa(new Date),s=t.get(e.level)||{name:"UNKNOWN",color:c(a=>a,"color")},n=s.color(`[${s.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let a=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${a}`}return`[${r}] ${n} ${i}`}initLogFile(e){this.logFilePath=ae.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),q.existsSync(this.logFilePath)||q.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(s=>s instanceof Error?this.pinoInstance.level==="debug"?s.message:{message:s.message,stack:s.stack,name:s.name,cause:s.cause}:s);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,s]of Object.entries(t))s instanceof Error&&(t[r]={message:s.message,stack:s.stack,name:s.name,cause:s.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!q.existsSync(this.logFilePath)))try{q.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=ae.dirname(this.logFilePath),t=ae.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let n=ae.join(e,`${t}.${s}.log`),i=ae.join(e,`${t}.${s+1}.log`);q.existsSync(n)&&(s===this.maxLogFiles-1?q.unlinkSync(n):q.renameSync(n,i))}let r=ae.join(e,`${t}.1.log`);q.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=ae.dirname(this.logFilePath),t=ae.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=ae.join(e,`${t}.${r}.log`);q.existsSync(s)&&q.unlinkSync(s)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}withTag(e){return this}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},lt=null,Ks="info";c(Ra,"getLogger");c(Ys,"setGlobalLogLevel");h=Ra()});import{EventEmitter as ba}from"events";function w(){return Xe||(Xe=new Ur),Xe}function Zs(){Xe&&(Xe.destroy(),Xe=null)}var Ur,Xe,z=C(()=>{"use strict";M();Ur=class extends ba{static{c(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=h.withTag("EventBus"),this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=c(s=>{try{t(s)}catch(n){throw this.emit("error",n),n}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")}},Xe=null;c(w,"getEventBus");c(Zs,"destroyEventBus")});function Ia(o){if(!o||typeof o!="object")throw new Error("\u670D\u52A1\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u6709\u6548\u7684\u5BF9\u8C61");if("command"in o&&typeof o.command=="string")return"stdio";if("type"in o&&o.type==="sse")return"sse";if("type"in o&&o.type==="streamable-http"||"url"in o&&typeof o.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 Fr(o,e){if(!e||typeof e!="object")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61`};try{switch(Ia(e)){case"stdio":if(!e.command||typeof e.command!="string")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7F3A\u5C11\u5FC5\u9700\u7684 command \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(!Array.isArray(e.args))return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 args \u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4`};if(e.env&&typeof e.env!="object")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 env \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"sse":if(e.type!=="sse")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 type \u5B57\u6BB5\u5FC5\u987B\u662F "sse"`};if(!e.url||typeof e.url!="string")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};break;case"streamable-http":if(!e.url||typeof e.url!="string")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(e.type&&e.type!=="streamable-http")return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684 type \u5B57\u6BB5\u5982\u679C\u5B58\u5728\uFF0C\u5FC5\u987B\u662F "streamable-http"`};break;default:return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684\u914D\u7F6E\u7C7B\u578B\u65E0\u6CD5\u8BC6\u522B`}}return{valid:!0}}catch(t){return{valid:!1,error:`\u670D\u52A1 "${o}" \u7684\u914D\u7F6E\u65E0\u6548: ${t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF"}`}}}function E(o){return`${o.slice(0,30)}...${o.slice(-10)}`}var Lt=C(()=>{"use strict";c(Ia,"getMcpServerCommunicationType");c(Fr,"validateMcpServerConfig");c(E,"sliceEndpoint")});import{copyFileSync as $a,existsSync as _t,readFileSync as Oa,writeFileSync as Aa}from"fs";import{dirname as xa,resolve as _e}from"path";import{fileURLToPath as Na}from"url";import*as kt from"comment-json";import Qs from"dayjs";import Vr from"json5";import*as tn from"json5-writer";var en,Wr,Br,d,se=C(()=>{"use strict";M();z();Lt();en=xa(Na(import.meta.url)),Wr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},Br=class o{static{c(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=w();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[_e(en,"templates","default","xiaozhi.config.json"),_e(en,"..","templates","default","xiaozhi.config.json"),_e(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>_t(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 s=_e(e,r);if(_t(s))return s}return _e(e,"xiaozhi.config.json")}getConfigFileFormat(e){return e.endsWith(".json5")?"json5":e.endsWith(".jsonc")?"jsonc":"json"}static getInstance(){return o.instance||(o.instance=new o),o.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 s=_e(e,r);if(_t(s))return!0}return!1}initConfig(e="json"){if(!_t(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}`,s=_e(t,r);$a(this.defaultConfigPath,s),this.config=null,this.json5Writer=null}loadConfig(){if(!this.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C xiaozhi init \u521D\u59CB\u5316\u914D\u7F6E");try{let e=this.getConfigFilePath();this.currentConfigPath=e;let t=this.getConfigFileFormat(e),s=Oa(e,"utf8").replace(/^\uFEFF/,""),n;switch(t){case"json5":n=Vr.parse(s),this.json5Writer=tn.load(s);break;case"jsonc":n=kt.parse(s);break;default:n=JSON.parse(s);break}return this.validateConfig(n),n}catch(e){throw e instanceof SyntaxError?new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF: ${e.message}`):e}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A\u6839\u5BF9\u8C61\u65E0\u6548");let t=e;if(t.mcpEndpoint===void 0||t.mcpEndpoint===null)throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5B57\u6BB5\u65E0\u6548");if(typeof t.mcpEndpoint!="string")if(Array.isArray(t.mcpEndpoint)){for(let r of t.mcpEndpoint)if(typeof r!="string"||r.trim()==="")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6216\u5B57\u7B26\u4E32\u6570\u7EC4");if(!t.mcpServers||typeof t.mcpServers!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers \u5B57\u6BB5\u65E0\u6548");for(let[r,s]of Object.entries(t.mcpServers)){if(!s||typeof s!="object")throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers.${r} \u65E0\u6548`);let n=Fr(r,s);if(!n.valid)throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A${n.error}`)}}getConfig(){return this.config=this.loadConfig(),JSON.parse(JSON.stringify(this.config))}getMutableConfig(){return this.config||(this.config=this.loadConfig()),this.config}getMcpEndpoint(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?e.mcpEndpoint[0]||"":e.mcpEndpoint}getMcpEndpoints(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?[...e.mcpEndpoint]:e.mcpEndpoint?[e.mcpEndpoint]:[]}getMcpServers(){return this.getConfig().mcpServers}getMcpServerConfig(){return this.getConfig().mcpServerConfig||{}}getServerToolsConfig(e){return this.getMcpServerConfig()[e]?.tools||{}}isToolEnabled(e,t){return this.getServerToolsConfig(e)[t]?.enable!==!1}updateMcpEndpoint(e){if(Array.isArray(e)){for(let r of e)if(!r||typeof r!="string")throw new Error("MCP \u7AEF\u70B9\u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}let t=this.getMutableConfig();t.mcpEndpoint=e,this.saveConfig(t)}addMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.includes(e))throw new Error(`MCP \u7AEF\u70B9 ${e} \u5DF2\u5B58\u5728`);let s=[...r,e];t.mcpEndpoint=s,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 n=r.filter(i=>i!==e);t.mcpEndpoint=n,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=Fr(e,t);if(!r.valid)throw new Error(r.error||"\u670D\u52A1\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let s=this.getMutableConfig();s.mcpServers[e]=t,this.saveConfig(s)}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(s=>s.handler?.type==="mcp"&&s.handler.config?.serviceName===e);for(let s of r){let n=t.customMCP.tools.findIndex(i=>i.name===s.name);n!==-1&&t.customMCP.tools.splice(n,1)}t.customMCP.tools.length===0&&(t.customMCP=void 0)}this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),h.info(`\u6210\u529F\u79FB\u9664 MCP \u670D\u52A1 ${e} \u53CA\u5176\u76F8\u5173\u914D\u7F6E`)}updateServerToolsConfig(e,t){let r=this.getMutableConfig();r.mcpServerConfig||(r.mcpServerConfig={}),Object.keys(t).length===0?delete r.mcpServerConfig[e]:r.mcpServerConfig[e]={tools:t},this.saveConfig(r),this.eventBus.emitEvent("config:updated",{type:"serverTools",serviceName:e,timestamp:new Date})}removeServerToolsConfig(e){let r={...this.getConfig()};r.mcpServerConfig&&(delete r.mcpServerConfig[e],this.saveConfig(r))}cleanupInvalidServerToolsConfig(){let e=this.getMutableConfig();if(!e.mcpServerConfig)return;let t=Object.keys(e.mcpServers),s=Object.keys(e.mcpServerConfig).filter(n=>!t.includes(n));if(s.length>0){for(let n of s)delete e.mcpServerConfig[n];this.saveConfig(e),h.info(`\u5DF2\u6E05\u7406 ${s.length} \u4E2A\u65E0\u6548\u7684\u670D\u52A1\u5DE5\u5177\u914D\u7F6E: ${s.join(", ")}`)}}setToolEnabled(e,t,r,s){let n=this.getMutableConfig();n.mcpServerConfig||(n.mcpServerConfig={}),n.mcpServerConfig[e]||(n.mcpServerConfig[e]={tools:{}}),n.mcpServerConfig[e].tools[t]={...n.mcpServerConfig[e].tools[t],enable:r,...s&&{description:s}},this.saveConfig(n)}saveConfig(e){try{this.validateConfig(e);let t;this.currentConfigPath?t=this.currentConfigPath:(t=this.getConfigFilePath(),this.currentConfigPath=t);let r=this.getConfigFileFormat(t),s;switch(r){case"json5":try{this.json5Writer?(this.json5Writer.write(e),s=this.json5Writer.toSource()):(console.warn("\u6CA1\u6709 json5Writer \u5B9E\u4F8B\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON5 \u683C\u5F0F"),s=Vr.stringify(e,null,2))}catch(n){console.warn("\u4F7F\u7528 json5-writer \u4FDD\u5B58\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON5 \u683C\u5F0F:",n),s=Vr.stringify(e,null,2)}break;case"jsonc":try{s=kt.stringify(e,null,2)}catch(n){console.warn("\u4F7F\u7528 comment-json \u4FDD\u5B58\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON \u683C\u5F0F:",n),s=JSON.stringify(e,null,2)}break;default:s=JSON.stringify(e,null,2);break}Aa(t,s,"utf8"),this.config=e,this.notifyConfigUpdate(e)}catch(t){throw new Error(`\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}reloadConfig(){this.config=null,this.currentConfigPath=null,this.json5Writer=null}getConfigPath(){return this.getConfigFilePath()}getDefaultConfigPath(){return this.defaultConfigPath}getConnectionConfig(){let t=this.getConfig().connection||{};return{heartbeatInterval:t.heartbeatInterval??Wr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??Wr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??Wr.reconnectInterval}}getHeartbeatInterval(){return this.getConnectionConfig().heartbeatInterval}getHeartbeatTimeout(){return this.getConnectionConfig().heartbeatTimeout}getReconnectInterval(){return this.getConnectionConfig().reconnectInterval}updateConnectionConfig(e){let t=this.getMutableConfig();t.connection||(t.connection={}),Object.assign(t.connection,e),this.saveConfig(t)}async updateToolUsageStats(e,t,r){try{if(typeof t=="string"&&r){let s=e,n=t,i=r;await Promise.all([this._updateMCPServerToolStats(s,n,i),this.updateCustomMCPToolStats(s,n,i)]),h.debug(`\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}/${n}`)}else{let s=e,n=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(s,i,n),h.debug(`CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}`)}}catch(s){if(typeof t=="string"&&r){let n=e,i=t;h.error(`\u66F4\u65B0\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${n}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let n=e;h.error(`\u66F4\u65B0 CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${n}): ${s instanceof Error?s.message:String(s)}`)}}}async updateMCPServerToolStats(e,t,r,s=!0){await this._updateMCPServerToolStats(e,t,r,s)}setHeartbeatInterval(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatInterval:e})}setHeartbeatTimeout(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatTimeout:e})}setReconnectInterval(e){if(e<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({reconnectInterval:e})}getModelScopeConfig(){return this.getConfig().modelscope||{}}getModelScopeApiKey(){return this.getModelScopeConfig().apiKey||process.env.MODELSCOPE_API_TOKEN}updateModelScopeConfig(e){let t=this.getMutableConfig();t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e),this.saveConfig(t)}setModelScopeApiKey(e){if(!e||typeof e!="string")throw new Error("API Key \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");this.updateModelScopeConfig({apiKey:e})}getCustomMCPConfig(){return this.getConfig().customMCP||null}getCustomMCPTools(){let e=this.getCustomMCPConfig();return!e||!e.tools?[]:e.tools}validateCustomMCPTools(e){if(!Array.isArray(e))return!1;for(let t of e){if(!t.name||typeof t.name!="string")return h.warn(`CustomMCP \u5DE5\u5177\u7F3A\u5C11\u6709\u6548\u7684 name \u5B57\u6BB5: ${JSON.stringify(t)}`),!1;if(!t.description||typeof t.description!="string")return h.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 description \u5B57\u6BB5`),!1;if(!t.inputSchema||typeof t.inputSchema!="object")return h.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 inputSchema \u5B57\u6BB5`),!1;if(!t.handler||typeof t.handler!="object")return h.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 handler \u5B57\u6BB5`),!1;if(!["proxy","function","http","script","chain","mcp"].includes(t.handler.type))return h.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7684 handler.type \u5FC5\u987B\u662F 'proxy', 'function', 'http', 'script', 'chain' \u6216 'mcp'`),!1;if(!this.validateHandlerConfig(t.name,t.handler))return!1}return!0}validateHandlerConfig(e,t){switch(t.type){case"proxy":return this.validateProxyHandler(e,t);case"http":return this.validateHttpHandler(e,t);case"function":return this.validateFunctionHandler(e,t);case"script":return this.validateScriptHandler(e,t);case"chain":return this.validateChainHandler(e,t);case"mcp":return this.validateMCPHandler(e,t);default:return h.warn(`CustomMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u4E86\u672A\u77E5\u7684\u5904\u7406\u5668\u7C7B\u578B`),!1}}validateProxyHandler(e,t){return t.platform?["coze","openai","anthropic","custom"].includes(t.platform)?!t.config||typeof t.config!="object"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):t.platform==="coze"&&!t.config.workflow_id&&!t.config.bot_id?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 Coze \u5904\u7406\u5668\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id`),!1):!0:(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u5E73\u53F0: ${t.platform}`),!1):(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u7F3A\u5C11 platform \u5B57\u6BB5`),!1)}validateHttpHandler(e,t){if(!t.url||typeof t.url!="string")return h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 url \u5B57\u6BB5`),!1;try{new URL(t.url)}catch{return h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668 url \u683C\u5F0F\u65E0\u6548: ${t.url}`),!1}return t.method&&!["GET","POST","PUT","DELETE","PATCH"].includes(t.method)?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 http \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${t.method}`),!1):!0}validateFunctionHandler(e,t){return!t.module||typeof t.module!="string"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 function \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 module \u5B57\u6BB5`),!1):!t.function||typeof t.function!="string"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 function \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 function \u5B57\u6BB5`),!1):!0}validateScriptHandler(e,t){return!t.script||typeof t.script!="string"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 script \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 script \u5B57\u6BB5`),!1):t.interpreter&&!["node","python","bash"].includes(t.interpreter)?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 script \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u89E3\u91CA\u5668: ${t.interpreter}`),!1):!0}validateChainHandler(e,t){return!t.tools||!Array.isArray(t.tools)||t.tools.length===0?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 tools \u6570\u7EC4`),!1):["sequential","parallel"].includes(t.mode)?["stop","continue","retry"].includes(t.error_handling)?!0:(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u9519\u8BEF\u5904\u7406\u7B56\u7565: ${t.error_handling}`),!1):(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 chain \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u6267\u884C\u6A21\u5F0F: ${t.mode}`),!1)}validateMCPHandler(e,t){return!t.config||typeof t.config!="object"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):!t.config.serviceName||typeof t.config.serviceName!="string"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 serviceName`),!1):!t.config.toolName||typeof t.config.toolName!="string"?(h.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11\u6709\u6548\u7684 toolName`),!1):!0}hasValidCustomMCPTools(){try{let e=this.getCustomMCPTools();return e.length===0?!1:this.validateCustomMCPTools(e)}catch(e){return h.error("\u68C0\u67E5 customMCP \u5DE5\u5177\u914D\u7F6E\u65F6\u51FA\u9519:",e),!1}}addCustomMCPTool(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools.find(s=>s.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),h.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e.name}`)}async addCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(e.length===0)return;let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]});let r=new Set(t.customMCP.tools.map(n=>n.name)),s=e.filter(n=>!r.has(n.name));if(s.length>0){if(!this.validateCustomMCPTools(s))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.push(...s),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),h.debug(`\u6210\u529F\u6279\u91CF\u6DFB\u52A0 ${s.length} \u4E2A\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${s.map(n=>n.name).join(", ")}`)}}removeCustomMCPTool(e){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(!t.customMCP||!t.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let r=t.customMCP.tools.findIndex(s=>s.name===e);if(r===-1)throw new Error(`\u5DE5\u5177 "${e}" \u4E0D\u5B58\u5728`);t.customMCP.tools.splice(r,1),this.saveConfig(t),h.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e}`)}updateCustomMCPTool(e,t){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="object")throw new Error("\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let r=this.getMutableConfig();if(!r.customMCP||!r.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let s=r.customMCP.tools.findIndex(n=>n.name===e);if(s===-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[s]=t,this.saveConfig(r),h.debug(`\u6210\u529F\u66F4\u65B0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${e}`)}updateCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(!this.validateCustomMCPTools(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools=e,this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),h.debug(`\u6210\u529F\u66F4\u65B0\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\uFF0C\u5171 ${e.length} \u4E2A\u5DE5\u5177`)}getWebUIConfig(){return this.getConfig().webUI||{}}getWebUIPort(){return this.getWebUIConfig().port??9999}notifyConfigUpdate(e){try{let t=global.__webServer;t&&typeof t.broadcastConfigUpdate=="function"&&(t.broadcastConfigUpdate(e),console.log("\u5DF2\u901A\u8FC7 WebSocket \u5E7F\u64AD\u914D\u7F6E\u66F4\u65B0"))}catch(t){console.warn("\u901A\u77E5 Web \u754C\u9762\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t instanceof Error?t.message:String(t))}}updateWebUIConfig(e){let t=this.getMutableConfig();t.webUI||(t.webUI={}),Object.assign(t.webUI,e),this.saveConfig(t)}setWebUIPort(e){if(!Number.isInteger(e)||e<=0||e>65535)throw new Error("\u7AEF\u53E3\u53F7\u5FC5\u987B\u662F 1-65535 \u4E4B\u95F4\u7684\u6574\u6570");this.updateWebUIConfig({port:e})}updatePlatformConfig(e,t){let r=this.getMutableConfig();r.platforms||(r.platforms={}),r.platforms[e]=t,this.saveConfig(r)}getCozePlatformConfig(){let t=this.getConfig().platforms?.coze;return!t||!t.token?null:{token:t.token}}getCozeToken(){return this.getCozePlatformConfig()?.token||null}setCozePlatformConfig(e){if(!e.token||typeof e.token!="string"||e.token.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.updatePlatformConfig("coze",{token:e.token.trim()})}isCozeConfigValid(){let e=this.getCozePlatformConfig();return e!==null&&typeof e.token=="string"&&e.token.trim()!==""}async _updateMCPServerToolStats(e,t,r,s=!0){let n=this.getMutableConfig();n.mcpServerConfig||(n.mcpServerConfig={}),n.mcpServerConfig[e]||(n.mcpServerConfig[e]={tools:{}}),n.mcpServerConfig[e].tools[t]||(n.mcpServerConfig[e].tools[t]={enable:!0});let i=n.mcpServerConfig[e].tools[t],a=i.usageCount||0,l=i.lastUsedTime;s&&(i.usageCount=a+1),(!l||new Date(r)>new Date(l))&&(i.lastUsedTime=Qs(r).format("YYYY-MM-DD HH:mm:ss")),this.saveConfig(n)}async updateCustomMCPToolStats(e,t,r){try{let s,n,i=!0,a;if(typeof r=="string"){let A=e;s=`${A}__${t}`,n=r,a=`${A}/${t}`}else s=e,n=t,i=r||!0,a=s;let l=this.getCustomMCPTools(),g=l.findIndex(A=>A.name===s);if(g===-1)return;let u=[...l],p=u[g];p.stats||(p.stats={});let f=p.stats.usageCount||0,m=p.stats.lastUsedTime;i&&(p.stats.usageCount=f+1),(!m||new Date(n)>new Date(m))&&(p.stats.lastUsedTime=Qs(n).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(u)}catch(s){if(typeof r=="string"){let n=e,i=t;h.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${n}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let n=e;h.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${n}): ${s instanceof Error?s.message:String(s)}`)}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return h.debug(`\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u66F4\u65B0\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8DF3\u8FC7\u672C\u6B21\u66F4\u65B0`),!1;let t=new Promise(s=>{});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)),h.debug(`\u5DF2\u91CA\u653E\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u66F4\u65B0\u9501`)}async updateToolUsageStatsWithLock(e,t=!0){let r=`custommcp_${e}`;if(await this.acquireStatsUpdateLock(r))try{await this.updateToolUsageStats(e,t),h.debug(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(s){throw h.error(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,s),s}finally{this.releaseStatsUpdateLock(r)}}async updateMCPServerToolStatsWithLock(e,t,r,s=!0){let n=`mcpserver_${e}_${t}`;if(await this.acquireStatsUpdateLock(n))try{await this.updateMCPServerToolStats(e,t,r,s),h.debug(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(i){throw h.error(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,i),i}finally{this.releaseStatsUpdateLock(n)}}clearAllStatsUpdateLocks(){let e=this.statsUpdateLocks.size;this.statsUpdateLocks.clear();for(let t of this.statsUpdateLockTimeouts.values())clearTimeout(t);this.statsUpdateLockTimeouts.clear(),e>0&&h.info(`\u5DF2\u6E05\u7406 ${e} \u4E2A\u7EDF\u8BA1\u66F4\u65B0\u9501`)}getStatsUpdateLocks(){return Array.from(this.statsUpdateLocks.keys())}},d=Br.getInstance()});var qr,Je,ut,b,Gr,pt=C(()=>{"use strict";qr={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},Je={FILE_NAMES:["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"],DEFAULT_FILE:"xiaozhi.config.default.json",DIR_ENV_VAR:"XIAOZHI_CONFIG_DIR"},ut={WORK_DIR:".xiaozhi",TEMPLATES_DIR:"templates",LOGS_DIR:"logs"},b={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"},Gr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3}});var Da,La,jt,rn=C(()=>{"use strict";pt();Da={[b.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[b.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[b.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[b.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[b.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[b.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[b.PERMISSION_ERROR]:"\u5C1D\u8BD5\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"},La={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"]},jt=class{static{c(this,"ERROR_MESSAGES")}static getHelpMessage(e){return Da[e]}static getSolutions(e){return La[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[b.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[b.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[b.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[b.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[b.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[b.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[b.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[b.NETWORK_ERROR,b.FILE_ERROR,b.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[b.VALIDATION_ERROR]:"low",[b.FILE_ERROR]:"medium",[b.CONFIG_ERROR]:"medium",[b.NETWORK_ERROR]:"medium",[b.SERVICE_ERROR]:"high",[b.PROCESS_ERROR]:"high",[b.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});var G,ke,_,I,R,Re,Ce=C(()=>{"use strict";pt();G=class o extends Error{constructor(t,r,s=1,n){super(t);this.code=r;this.exitCode=s;this.suggestions=n;this.name="CLIError",Error.captureStackTrace&&Error.captureStackTrace(this,o)}static{c(this,"CLIError")}static withSuggestions(t,r,s){return new o(t,r,1,s)}},ke=class o extends G{static{c(this,"ConfigError")}constructor(e,t){super(e,b.CONFIG_ERROR,1,t),this.name="ConfigError"}static configNotFound(){return new o("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728",['\u8BF7\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6'])}static invalidFormat(e){return new o(`\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F: ${e}`,["\u652F\u6301\u7684\u683C\u5F0F: json, json5, jsonc"])}},_=class o extends G{static{c(this,"ServiceError")}constructor(e,t){super(e,b.SERVICE_ERROR,1,t),this.name="ServiceError"}static alreadyRunning(e){return new o(`\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 o(`\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 o("\u670D\u52A1\u672A\u8FD0\u884C",['\u8BF7\u8FD0\u884C "xiaozhi start" \u542F\u52A8\u670D\u52A1'])}static startFailed(e){return new o(`\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"])}},I=class o extends G{static{c(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,b.VALIDATION_ERROR,1),this.name="ValidationError"}static invalidPort(e){return new o(`\u7AEF\u53E3\u53F7\u5FC5\u987B\u5728 1-65535 \u8303\u56F4\u5185\uFF0C\u5F53\u524D\u503C: ${e}`,"port")}static requiredField(e){return new o("\u5FC5\u586B\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A",e)}},R=class o extends G{static{c(this,"FileError")}constructor(e,t,r){let s=t?`${e}: ${t}`:e;super(s,b.FILE_ERROR,1,r),this.name="FileError"}static notFound(e){return new o("\u6587\u4EF6\u4E0D\u5B58\u5728",e,["\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u662F\u5426\u6B63\u786E"])}static permissionDenied(e){return new o("\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 o("\u6587\u4EF6\u5DF2\u5B58\u5728",e,["\u4F7F\u7528\u4E0D\u540C\u7684\u6587\u4EF6\u540D\u6216\u5220\u9664\u73B0\u6709\u6587\u4EF6"])}},Re=class o extends G{static{c(this,"ProcessError")}constructor(e,t,r){let s=t?`${e} (PID: ${t})`:e;super(s,b.PROCESS_ERROR,1,r),this.name="ProcessError"}static killFailed(e){return new o("\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 o("\u8FDB\u7A0B\u4E0D\u5B58\u5728",e)}}});import Y from"chalk";var ve,Xr=C(()=>{"use strict";rn();Ce();ve=class o{static{c(this,"ErrorHandler")}static handle(e){e instanceof G?o.handleCLIError(e):o.handleUnknownError(e),process.exit(1)}static handleCLIError(e){if(console.error(Y.red(`\u274C \u9519\u8BEF: ${e.message}`)),process.env.DEBUG&&console.error(Y.gray(`\u9519\u8BEF\u7801: ${e.code}`)),e.suggestions&&e.suggestions.length>0){console.log(Y.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of e.suggestions)console.log(Y.gray(` ${r}`))}let t=jt.getHelpMessage(e.code);t&&console.log(Y.blue(`\u2139\uFE0F ${t}`))}static handleUnknownError(e){console.error(Y.red(`\u274C \u672A\u77E5\u9519\u8BEF: ${e.message}`)),process.env.DEBUG||process.env.NODE_ENV==="development"?(console.error(Y.gray("\u5806\u6808\u4FE1\u606F:")),console.error(Y.gray(e.stack))):console.log(Y.yellow("\u{1F4A1} \u63D0\u793A: \u8BBE\u7F6E DEBUG=1 \u73AF\u5883\u53D8\u91CF\u67E5\u770B\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F"))}static async handleAsync(e,t){try{return await e()}catch(r){throw r instanceof G?r:r instanceof Error?new G(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new G(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof G?r:r instanceof Error?new G(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new G(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static warn(e,t){if(console.warn(Y.yellow(`\u26A0\uFE0F \u8B66\u544A: ${e}`)),t&&t.length>0){console.log(Y.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of t)console.log(Y.gray(` ${r}`))}}static info(e){console.log(Y.blue(`\u2139\uFE0F ${e}`))}static success(e){console.log(Y.green(`\u2705 ${e}`))}}});import V from"fs";import ce from"path";var $,ht=C(()=>{"use strict";Ce();$=class o{static{c(this,"FileUtils")}static exists(e){try{return V.existsSync(e)}catch{return!1}}static ensureDir(e){try{V.existsSync(e)||V.mkdirSync(e,{recursive:!0})}catch{throw new R("\u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55",e)}}static readFile(e,t="utf8"){try{if(!o.exists(e))throw R.notFound(e);return V.readFileSync(e,t)}catch(r){throw r instanceof R?r:new R("\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6",e)}}static writeFile(e,t,r){try{if(!r?.overwrite&&o.exists(e))throw R.alreadyExists(e);let s=ce.dirname(e);o.ensureDir(s),V.writeFileSync(e,t,"utf8")}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u5199\u5165\u6587\u4EF6",e)}}static copyFile(e,t,r){try{if(!o.exists(e))throw R.notFound(e);if(!r?.overwrite&&o.exists(t))throw R.alreadyExists(t);let s=ce.dirname(t);o.ensureDir(s),V.copyFileSync(e,t)}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u590D\u5236\u6587\u4EF6",e)}}static deleteFile(e){try{o.exists(e)&&V.unlinkSync(e)}catch{throw new R("\u65E0\u6CD5\u5220\u9664\u6587\u4EF6",e)}}static copyDirectory(e,t,r={}){try{if(!o.exists(e))throw R.notFound(e);o.ensureDir(t);let s=V.readdirSync(e);for(let n of s){if(r.exclude?.includes(n))continue;let i=ce.join(e,n),a=ce.join(t,n);V.statSync(i).isDirectory()?r.recursive!==!1&&o.copyDirectory(i,a,r):o.copyFile(i,a,{overwrite:r.overwrite})}}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u590D\u5236\u76EE\u5F55",e)}}static deleteDirectory(e,t={}){try{o.exists(e)&&V.rmSync(e,{recursive:t.recursive??!0,force:!0})}catch{throw new R("\u65E0\u6CD5\u5220\u9664\u76EE\u5F55",e)}}static getFileInfo(e){try{if(!o.exists(e))throw R.notFound(e);let t=V.statSync(e);return{size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory(),mtime:t.mtime,ctime:t.ctime}}catch(t){throw t instanceof R?t:new R("\u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u4FE1\u606F",e)}}static listDirectory(e,t={}){try{if(!o.exists(e))throw R.notFound(e);let r=V.readdirSync(e),s=[];for(let n of r){if(!t.includeHidden&&n.startsWith("."))continue;let i=ce.join(e,n);if(s.push(i),t.recursive&&V.statSync(i).isDirectory()){let a=o.listDirectory(i,t);s=s.concat(a)}}return s}catch(r){throw r instanceof R?r:new R("\u65E0\u6CD5\u5217\u51FA\u76EE\u5F55\u5185\u5BB9",e)}}static createTempFile(e="xiaozhi-",t=".tmp"){let r=process.env.TMPDIR||process.env.TEMP||"/tmp",s=Date.now(),n=Math.random().toString(36).substring(2),i=`${e}${s}-${n}${t}`;return ce.join(r,i)}static checkPermissions(e,t=V.constants.R_OK|V.constants.W_OK){try{return V.accessSync(e,t),!0}catch{return!1}}static getExtension(e){return ce.extname(e).toLowerCase()}static getBaseName(e){return ce.basename(e,ce.extname(e))}static normalizePath(e){return ce.normalize(e)}static resolvePath(e,t){return t?ce.resolve(t,e):ce.resolve(e)}}});var Ke,Jr=C(()=>{"use strict";Ke=class{static{c(this,"FormatUtils")}static formatUptime(e){let t=Math.floor(e/1e3),r=Math.floor(t/60),s=Math.floor(r/60),n=Math.floor(s/24);return n>0?`${n}\u5929 ${s%24}\u5C0F\u65F6 ${r%60}\u5206\u949F`:s>0?`${s}\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,s=0;for(;r>=1024&&s<t.length-1;)r/=1024,s++;return`${r.toFixed(s===0?0:1)} ${t[s]}`}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,s){let n=`${e}://${t}:${r}`;return s?`${n}${s}`:n}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+=`
4
4
  \u5806\u6808\u4FE1\u606F:
5
5
  ${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join(`
6
6
  `)}static formatTable(e){if(e.length===0)return"";let t=Object.keys(e[0]),r=t.map(a=>Math.max(a.length,...e.map(l=>String(l[a]).length))),s=t.map((a,l)=>a.padEnd(r[l])).join(" | "),n=r.map(a=>"-".repeat(a)).join("-|-"),i=e.map(a=>t.map((l,g)=>String(a[l]).padEnd(r[g])).join(" | "));return[s,n,...i].join(`
7
- `)}static formatProgressBar(e,t,r=20){let s=Math.min(e/t,1),n=Math.floor(s*r),i=r-n,a="\u2588".repeat(n)+"\u2591".repeat(i),l=Math.floor(s*100);return`[${a}] ${l}% (${e}/${t})`}static formatCommandArgs(e,t){let r=t.map(s=>s.includes(" ")?`"${s}"`:s);return`${e} ${r.join(" ")}`}static truncateText(e,t,r="..."){return e.length<=t?e:e.substring(0,t-r.length)+r}static formatJson(e,t=2){try{return JSON.stringify(e,null,t)}catch{return String(e)}}static formatBoolean(e,t="\u662F",r="\u5426"){return e?t:r}}});import{realpathSync as _a}from"fs";import{tmpdir as ka}from"os";import x from"path";import{fileURLToPath as sn}from"url";var L,Ye=C(()=>{"use strict";dt();mt();L=class o{static{c(this,"PathUtils")}static getPidFile(){let e=process.env[Je.DIR_ENV_VAR]||process.cwd();return x.join(e,`.${qr.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return x.join(t,qr.LOG_FILE)}static getConfigDir(){return process.env[Je.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=o.getConfigDir();return x.join(e,pt.WORK_DIR)}static getTemplatesDir(){let e=sn(import.meta.url),t=x.dirname(e);return[x.join(t,pt.TEMPLATES_DIR),x.join(t,"..","..","..",pt.TEMPLATES_DIR),x.join(t,"..","..","..","..",pt.TEMPLATES_DIR)]}static findTemplatesDir(){let e=o.getTemplatesDir();for(let t of e)if($.exists(t))return t;return null}static getTemplatePath(e){let t=o.findTemplatesDir();if(!t)return null;let r=x.join(t,e);return $.exists(r)?r:null}static getScriptDir(){let e=sn(import.meta.url);return x.dirname(e)}static getProjectRoot(){let e=o.getScriptDir();return x.join(e,"..","..","..")}static getDistDir(){let e=o.getProjectRoot();return x.join(e,"dist")}static getRelativePath(e){let t=o.getProjectRoot();return x.relative(t,e)}static resolveConfigPath(e){let t=o.getConfigDir();if(e)return x.join(t,`xiaozhi.config.${e}`);for(let r of Je.FILE_NAMES){let s=x.join(t,r);if($.exists(s))return s}return x.join(t,Je.FILE_NAMES[2])}static getDefaultConfigPath(){let e=o.getProjectRoot();return x.join(e,Je.DEFAULT_FILE)}static validatePath(e){return!x.normalize(e).includes("..")}static ensurePathWithin(e,t){let r=x.resolve(t,e),s=x.resolve(t);if(!r.startsWith(s))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 x.join(process.cwd(),`${e}.js`);let r;try{r=_a(t)}catch{r=t}let s=x.dirname(r);return x.join(s,`${e}.js`)}static getMcpServerProxyPath(){return o.getExecutablePath("mcpServerProxy")}static getWebServerStandalonePath(){return o.getExecutablePath("WebServerStandalone")}static createSafePath(...e){let t=x.join(...e),r=x.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||ka()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import{execSync as nn}from"child_process";var ne,ft=C(()=>{"use strict";dt();Ce();ne=class o{static{c(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!o.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 o.isWindows()?t=nn(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:Gr.PROCESS_STOP}).toLowerCase():t=nn(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:Gr.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,s=30;for(;r<s;){await new Promise(n=>setTimeout(n,100));try{process.kill(e,0),r++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(n=>setTimeout(n,500))}catch{}}catch(r){throw new Re(`\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:o.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 o.isWindows()?{command:"powershell",args:["-Command",`Get-Content -Path "${e}" -Wait`]}:{command:"tail",args:["-f",e]}}}});var le,Ht=C(()=>{"use strict";Ce();le=class o{static{c(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw I.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new I(`\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 I.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new I(`\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 I(`\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 I(`\u65E0\u6548\u7684 URL \u683C\u5F0F: ${e}`,t)}}static validateWebSocketUrl(e,t="websocket_url"){o.validateUrl(e,t);let r=new URL(e);if(!["ws:","wss:"].includes(r.protocol))throw new I(`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"){o.validateUrl(e,t);let r=new URL(e);if(!["http:","https:"].includes(r.protocol))throw new I(`HTTP URL \u5FC5\u987B\u4F7F\u7528 http:// \u6216 https:// \u534F\u8BAE\uFF0C\u5F53\u524D\u534F\u8BAE: ${r.protocol}`,t)}static validateProjectName(e){o.validateRequired(e,"projectName"),o.validateStringLength(e,"projectName",{min:1,max:100});let t=/[<>:"/\\|?*]/,r=e.split("").some(s=>s.charCodeAt(0)<32);if(t.test(e)||r)throw new I('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new I("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4EE5\u70B9\u5F00\u5934","projectName")}static validateTemplateName(e){if(o.validateRequired(e,"templateName"),o.validateStringLength(e,"templateName",{min:1,max:50}),!/^[a-zA-Z0-9_-]+$/.test(e))throw new I("\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(o.validateRequired(e,"envVarName"),!/^[A-Z_][A-Z0-9_]*$/.test(e))throw new I("\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 I(`\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 I(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new I(`\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 I(`\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 I(`\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 s of t)if(!(s in e))throw new I(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${s}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new I(`\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 I(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import zt from"fs";import Se from"path";import{fileURLToPath as on}from"url";var xe,Kr=C(()=>{"use strict";Ce();xe=class o{static{c(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(o.cachedVersion)return o.cachedVersion;try{let e=on(import.meta.url),t=Se.dirname(e),r=[Se.join(t,"package.json"),Se.join(t,"..","package.json"),Se.join(t,"..","..","..","package.json"),Se.join(t,"..","..","..","..","package.json")];for(let s of r)if(zt.existsSync(s)){let n=JSON.parse(zt.readFileSync(s,"utf8"));if(n.version)return o.cachedVersion=n.version,n.version}return o.cachedVersion="unknown","unknown"}catch(e){return console.warn("\u65E0\u6CD5\u4ECE package.json \u8BFB\u53D6\u7248\u672C\u4FE1\u606F:",e),o.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=on(import.meta.url),t=Se.dirname(e),r=[Se.join(t,"package.json"),Se.join(t,"..","package.json"),Se.join(t,"..","..","..","package.json"),Se.join(t,"..","..","..","..","package.json")];for(let s of r)if(zt.existsSync(s)){let n=JSON.parse(zt.readFileSync(s,"utf8"));return{version:n.version||"unknown",name:n.name,description:n.description,author:n.author}}return{version:"unknown"}}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C\u4FE1\u606F","package.json")}}static compareVersions(e,t){let r=e.split(".").map(Number),s=t.split(".").map(Number),n=Math.max(r.length,s.length);for(let i=0;i<n;i++){let a=r[i]||0,l=s[i]||0;if(a>l)return 1;if(a<l)return-1}return 0}static isValidVersion(e){return/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(e)}static clearCache(){o.cachedVersion=null}}});var an={};re(an,{ProcessManagerImpl:()=>Ct});var Ct,Yr=C(()=>{"use strict";Ce();mt();Jr();Ye();ft();Ct=class{static{c(this,"ProcessManagerImpl")}getPidFilePath(){return L.getPidFile()}readPidFile(){try{let e=this.getPidFilePath();if(!$.exists(e))return null;let t=$.readFile(e).trim(),[r,s,n]=t.split("|"),i=Number.parseInt(r),a=Number.parseInt(s);return Number.isNaN(i)||Number.isNaN(a)?(this.cleanupPidFile(),null):{pid:i,startTime:a,mode:n||"foreground"}}catch{return this.cleanupPidFile(),null}}writePidFile(e,t){try{let r=`${e}|${Date.now()}|${t}`,s=this.getPidFilePath();$.writeFile(s,r,{overwrite:!0})}catch{throw new R("\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 Re(`\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(s=>setTimeout(s,100));try{process.kill(e,0),t++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(s=>setTimeout(s,500))}catch{}}catch(t){throw new Re(`\u65E0\u6CD5\u505C\u6B62\u8FDB\u7A0B: ${t instanceof Error?t.message:String(t)}`,e)}}cleanupPidFile(){try{let e=this.getPidFilePath();$.exists(e)&&$.deleteFile(e)}catch(e){console.warn("\u6E05\u7406 PID \u6587\u4EF6\u5931\u8D25:",e)}}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 ln={};re(ln,{DaemonManagerImpl:()=>Zr});import{spawn as cn}from"child_process";import Ut from"fs";var Zr,gn=C(()=>{"use strict";Ce();Ye();ft();Zr=class{constructor(e,t){this.processManager=e;this.logger=t}static{c(this,"DaemonManagerImpl")}currentDaemon=null;async startDaemon(e,t={}){try{let r=this.processManager.getServiceStatus();if(r.running)throw _.alreadyRunning(r.pid);let s=await this.spawnDaemonProcess(e,t);this.currentDaemon=s,this.processManager.savePidInfo(s.pid,"daemon"),await this.setupLogging(s,t.logFileName||"xiaozhi.log"),this.setupEventHandlers(s),s.unref(),this.logger.info(`\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8 (PID: ${s.pid})`)}catch(r){throw new _(`\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 _.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 _(`\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(s=>setTimeout(s,1e3))),await this.startDaemon(e,t)}catch(r){throw new _(`\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=L.getLogFile();if(!Ut.existsSync(t))throw new _("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:s}=ne.getTailCommand(t),n=cn(r,s,{stdio:"inherit"});process.on("SIGINT",()=>{console.log(`
7
+ `)}static formatProgressBar(e,t,r=20){let s=Math.min(e/t,1),n=Math.floor(s*r),i=r-n,a="\u2588".repeat(n)+"\u2591".repeat(i),l=Math.floor(s*100);return`[${a}] ${l}% (${e}/${t})`}static formatCommandArgs(e,t){let r=t.map(s=>s.includes(" ")?`"${s}"`:s);return`${e} ${r.join(" ")}`}static truncateText(e,t,r="..."){return e.length<=t?e:e.substring(0,t-r.length)+r}static formatJson(e,t=2){try{return JSON.stringify(e,null,t)}catch{return String(e)}}static formatBoolean(e,t="\u662F",r="\u5426"){return e?t:r}}});import{realpathSync as _a}from"fs";import{tmpdir as ka}from"os";import x from"path";import{fileURLToPath as sn}from"url";var L,Ye=C(()=>{"use strict";pt();ht();L=class o{static{c(this,"PathUtils")}static getPidFile(){let e=process.env[Je.DIR_ENV_VAR]||process.cwd();return x.join(e,`.${qr.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return x.join(t,qr.LOG_FILE)}static getConfigDir(){return process.env[Je.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=o.getConfigDir();return x.join(e,ut.WORK_DIR)}static getTemplatesDir(){let e=sn(import.meta.url),t=x.dirname(e);return[x.join(t,ut.TEMPLATES_DIR),x.join(t,"..","..","..",ut.TEMPLATES_DIR),x.join(t,"..","..","..","..",ut.TEMPLATES_DIR)]}static findTemplatesDir(){let e=o.getTemplatesDir();for(let t of e)if($.exists(t))return t;return null}static getTemplatePath(e){let t=o.findTemplatesDir();if(!t)return null;let r=x.join(t,e);return $.exists(r)?r:null}static getScriptDir(){let e=sn(import.meta.url);return x.dirname(e)}static getProjectRoot(){let e=o.getScriptDir();return x.join(e,"..","..","..")}static getDistDir(){let e=o.getProjectRoot();return x.join(e,"dist")}static getRelativePath(e){let t=o.getProjectRoot();return x.relative(t,e)}static resolveConfigPath(e){let t=o.getConfigDir();if(e)return x.join(t,`xiaozhi.config.${e}`);for(let r of Je.FILE_NAMES){let s=x.join(t,r);if($.exists(s))return s}return x.join(t,Je.FILE_NAMES[2])}static getDefaultConfigPath(){let e=o.getProjectRoot();return x.join(e,Je.DEFAULT_FILE)}static validatePath(e){return!x.normalize(e).includes("..")}static ensurePathWithin(e,t){let r=x.resolve(t,e),s=x.resolve(t);if(!r.startsWith(s))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 x.join(process.cwd(),`${e}.js`);let r;try{r=_a(t)}catch{r=t}let s=x.dirname(r);return x.join(s,`${e}.js`)}static getMcpServerProxyPath(){return o.getExecutablePath("mcpServerProxy")}static getWebServerStandalonePath(){return o.getExecutablePath("WebServerStandalone")}static createSafePath(...e){let t=x.join(...e),r=x.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||ka()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import{execSync as nn}from"child_process";var ne,dt=C(()=>{"use strict";pt();Ce();ne=class o{static{c(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!o.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 o.isWindows()?t=nn(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:Gr.PROCESS_STOP}).toLowerCase():t=nn(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:Gr.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,s=30;for(;r<s;){await new Promise(n=>setTimeout(n,100));try{process.kill(e,0),r++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(n=>setTimeout(n,500))}catch{}}catch(r){throw new Re(`\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:o.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 o.isWindows()?{command:"powershell",args:["-Command",`Get-Content -Path "${e}" -Wait`]}:{command:"tail",args:["-f",e]}}}});var le,Ht=C(()=>{"use strict";Ce();le=class o{static{c(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw I.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new I(`\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 I.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new I(`\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 I(`\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 I(`\u65E0\u6548\u7684 URL \u683C\u5F0F: ${e}`,t)}}static validateWebSocketUrl(e,t="websocket_url"){o.validateUrl(e,t);let r=new URL(e);if(!["ws:","wss:"].includes(r.protocol))throw new I(`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"){o.validateUrl(e,t);let r=new URL(e);if(!["http:","https:"].includes(r.protocol))throw new I(`HTTP URL \u5FC5\u987B\u4F7F\u7528 http:// \u6216 https:// \u534F\u8BAE\uFF0C\u5F53\u524D\u534F\u8BAE: ${r.protocol}`,t)}static validateProjectName(e){o.validateRequired(e,"projectName"),o.validateStringLength(e,"projectName",{min:1,max:100});let t=/[<>:"/\\|?*]/,r=e.split("").some(s=>s.charCodeAt(0)<32);if(t.test(e)||r)throw new I('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new I("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4EE5\u70B9\u5F00\u5934","projectName")}static validateTemplateName(e){if(o.validateRequired(e,"templateName"),o.validateStringLength(e,"templateName",{min:1,max:50}),!/^[a-zA-Z0-9_-]+$/.test(e))throw new I("\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(o.validateRequired(e,"envVarName"),!/^[A-Z_][A-Z0-9_]*$/.test(e))throw new I("\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 I(`\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 I(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new I(`\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 I(`\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 I(`\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 s of t)if(!(s in e))throw new I(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${s}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new I(`\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 I(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import zt from"fs";import Se from"path";import{fileURLToPath as on}from"url";var xe,Kr=C(()=>{"use strict";Ce();xe=class o{static{c(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(o.cachedVersion)return o.cachedVersion;try{let e=on(import.meta.url),t=Se.dirname(e),r=[Se.join(t,"package.json"),Se.join(t,"..","package.json"),Se.join(t,"..","..","..","package.json"),Se.join(t,"..","..","..","..","package.json")];for(let s of r)if(zt.existsSync(s)){let n=JSON.parse(zt.readFileSync(s,"utf8"));if(n.version)return o.cachedVersion=n.version,n.version}return o.cachedVersion="unknown","unknown"}catch(e){return console.warn("\u65E0\u6CD5\u4ECE package.json \u8BFB\u53D6\u7248\u672C\u4FE1\u606F:",e),o.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=on(import.meta.url),t=Se.dirname(e),r=[Se.join(t,"package.json"),Se.join(t,"..","package.json"),Se.join(t,"..","..","..","package.json"),Se.join(t,"..","..","..","..","package.json")];for(let s of r)if(zt.existsSync(s)){let n=JSON.parse(zt.readFileSync(s,"utf8"));return{version:n.version||"unknown",name:n.name,description:n.description,author:n.author}}return{version:"unknown"}}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u7248\u672C\u4FE1\u606F","package.json")}}static compareVersions(e,t){let r=e.split(".").map(Number),s=t.split(".").map(Number),n=Math.max(r.length,s.length);for(let i=0;i<n;i++){let a=r[i]||0,l=s[i]||0;if(a>l)return 1;if(a<l)return-1}return 0}static isValidVersion(e){return/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(e)}static clearCache(){o.cachedVersion=null}}});var an={};re(an,{ProcessManagerImpl:()=>mt});var mt,Yr=C(()=>{"use strict";Ce();ht();Jr();Ye();dt();mt=class{static{c(this,"ProcessManagerImpl")}getPidFilePath(){return L.getPidFile()}readPidFile(){try{let e=this.getPidFilePath();if(!$.exists(e))return null;let t=$.readFile(e).trim(),[r,s,n]=t.split("|"),i=Number.parseInt(r),a=Number.parseInt(s);return Number.isNaN(i)||Number.isNaN(a)?(this.cleanupPidFile(),null):{pid:i,startTime:a,mode:n||"foreground"}}catch{return this.cleanupPidFile(),null}}writePidFile(e,t){try{let r=`${e}|${Date.now()}|${t}`,s=this.getPidFilePath();$.writeFile(s,r,{overwrite:!0})}catch{throw new R("\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 Re(`\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(s=>setTimeout(s,100));try{process.kill(e,0),t++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(s=>setTimeout(s,500))}catch{}}catch(t){throw new Re(`\u65E0\u6CD5\u505C\u6B62\u8FDB\u7A0B: ${t instanceof Error?t.message:String(t)}`,e)}}cleanupPidFile(){try{let e=this.getPidFilePath();$.exists(e)&&$.deleteFile(e)}catch(e){console.warn("\u6E05\u7406 PID \u6587\u4EF6\u5931\u8D25:",e)}}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 ln={};re(ln,{DaemonManagerImpl:()=>Zr});import{spawn as cn}from"child_process";import Ut from"fs";var Zr,gn=C(()=>{"use strict";Ce();Ye();dt();Zr=class{constructor(e,t){this.processManager=e;this.logger=t}static{c(this,"DaemonManagerImpl")}currentDaemon=null;async startDaemon(e,t={}){try{let r=this.processManager.getServiceStatus();if(r.running)throw _.alreadyRunning(r.pid);let s=await this.spawnDaemonProcess(e,t);this.currentDaemon=s,this.processManager.savePidInfo(s.pid,"daemon"),await this.setupLogging(s,t.logFileName||"xiaozhi.log"),this.setupEventHandlers(s),s.unref(),this.logger.info(`\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8 (PID: ${s.pid})`)}catch(r){throw new _(`\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 _.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 _(`\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(s=>setTimeout(s,1e3))),await this.startDaemon(e,t)}catch(r){throw new _(`\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=L.getLogFile();if(!Ut.existsSync(t))throw new _("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:s}=ne.getTailCommand(t),n=cn(r,s,{stdio:"inherit"});process.on("SIGINT",()=>{console.log(`
8
8
  \u65AD\u5F00\u8FDE\u63A5\uFF0C\u670D\u52A1\u7EE7\u7EED\u5728\u540E\u53F0\u8FD0\u884C`),n.kill(),process.exit(0)}),n.on("exit",()=>{process.exit(0)}),n.on("error",i=>{throw new _(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${i.message}`)})}catch(t){throw new _(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}async spawnDaemonProcess(e,t){let s=[L.getWebServerStandalonePath()];t.openBrowser&&s.push("--open-browser");let n={...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true",...t.env},i=cn("node",s,{detached:!0,stdio:["ignore","pipe","pipe"],env:n,cwd:t.cwd||process.cwd()});if(!i.pid)throw new Re("\u65E0\u6CD5\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B",0);return i}async setupLogging(e,t){try{let r=L.getLogFile(),n=(await import("path")).dirname(r);Ut.existsSync(n)||Ut.mkdirSync(n,{recursive:!0});let i=Ut.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let a=new Date().toISOString();i.write(`
9
9
  [${a}] \u5B88\u62A4\u8FDB\u7A0B\u542F\u52A8 (PID: ${e.pid})
10
- `)}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}}}});import Ee from"ws";var U,be,Ft=C(()=>{"use strict";P();Lt();U=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{c(this,"ToolCallError")}},be=class{static{c(this,"ProxyMCPServer")}endpointUrl;ws=null;logger;connectionStatus=!1;serverInitialized=!1;tools=new Map;connectionState="disconnected";reconnectOptions;reconnectState={attempts:0,nextInterval:0,timer:null,lastError:null,isManualDisconnect:!1};connectionTimeout=null;performanceMetrics={totalCalls:0,successfulCalls:0,failedCalls:0,averageResponseTime:0,minResponseTime:Number.MAX_VALUE,maxResponseTime:0,successRate:0,lastUpdated:new Date};callRecords=[];maxCallRecords=100;retryConfig={maxAttempts:3,initialDelay:1e3,maxDelay:1e4,backoffMultiplier:2,retryableErrors:[-32001,-32002]};toolCallConfig={timeout:3e4,retryAttempts:3,retryDelay:1e3};constructor(e,t){this.endpointUrl=e,this.logger=p,this.reconnectOptions={enabled:!0,maxAttempts:10,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0,...t?.reconnect},this.reconnectState.nextInterval=this.reconnectOptions.initialInterval}setServiceManager(e){this.serviceManager=e,this.logger.info("\u5DF2\u8BBE\u7F6E MCPServiceManager"),this.syncToolsFromServiceManager()}syncToolsFromServiceManager(){let e=this.serviceManager;if(!e){this.logger.debug("MCPServiceManager \u672A\u8BBE\u7F6E\uFF0C\u8DF3\u8FC7\u5DE5\u5177\u540C\u6B65");return}try{let t=e.getAllTools(),r=new Map;for(let s of t)r.set(s.name,{name:s.name,description:s.description,inputSchema:s.inputSchema});this.tools=r,this.logger.info(`\u5DF2\u4ECE MCPServiceManager \u540C\u6B65 ${this.tools.size} \u4E2A\u5DE5\u5177`)}catch(t){this.logger.error(`\u540C\u6B65\u5DE5\u5177\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}addTool(e,t){return this.validateTool(e,t),this.tools.set(e,t),this.logger.debug(`\u5DE5\u5177 '${e}' \u5DF2\u6DFB\u52A0`),this}addTools(e){for(let[t,r]of Object.entries(e))this.addTool(t,r);return this}removeTool(e){return this.tools.delete(e)?this.logger.debug(`\u5DE5\u5177 '${e}' \u5DF2\u79FB\u9664`):this.logger.warn(`\u5C1D\u8BD5\u79FB\u9664\u4E0D\u5B58\u5728\u7684\u5DE5\u5177: '${e}'`),this}getTools(){try{this.syncToolsFromServiceManager()}catch{}return Array.from(this.tools.values())}hasTool(e){return this.tools.has(e)}validateTool(e,t){if(!e||typeof e!="string"||e.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(this.tools.has(e))throw new Error(`\u5DE5\u5177 '${e}' \u5DF2\u5B58\u5728`);if(!t||typeof t!="object")throw new Error("\u5DE5\u5177\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!t.name||typeof t.name!="string")throw new Error("\u5DE5\u5177\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 'name' \u5B57\u6BB5");if(!t.description||typeof t.description!="string")throw new Error("\u5DE5\u5177\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 'description' \u5B57\u6BB5");if(!t.inputSchema||typeof t.inputSchema!="object")throw new Error("\u5DE5\u5177\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 'inputSchema' \u5B57\u6BB5");if(!t.inputSchema.type||!t.inputSchema.properties)throw new Error("\u5DE5\u5177\u7684 inputSchema \u5FC5\u987B\u5305\u542B 'type' \u548C 'properties' \u5B57\u6BB5")}async connect(){if(this.tools.size===0)throw new Error("\u672A\u914D\u7F6E\u4EFB\u4F55\u5DE5\u5177\u3002\u8BF7\u5728\u8FDE\u63A5\u524D\u81F3\u5C11\u6DFB\u52A0\u4E00\u4E2A\u5DE5\u5177\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.reconnectState.isManualDisconnect=!1,this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",this.logger.debug(`\u6B63\u5728\u8FDE\u63A5\u5C0F\u667A\u63A5\u5165\u70B9: ${E(this.endpointUrl)} (\u5C1D\u8BD5 ${this.reconnectState.attempts+1}/${this.reconnectOptions.maxAttempts})`),new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.reconnectOptions.timeout}ms)`);this.handleConnectionError(r),t(r)},this.reconnectOptions.timeout),this.ws=new Ee(this.endpointUrl),this.ws.on("open",()=>{this.handleConnectionSuccess(),e()}),this.ws.on("message",r=>{try{let s=JSON.parse(r.toString());this.handleMessage(s)}catch(s){this.logger.error("MCP \u6D88\u606F\u89E3\u6790\u9519\u8BEF:",s)}}),this.ws.on("close",(r,s)=>{this.handleConnectionClose(r,s.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",this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.logger.info("MCP WebSocket \u8FDE\u63A5\u5DF2\u5EFA\u7ACB")}handleConnectionError(e){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.reconnectState.lastError=e,this.logger.error("MCP WebSocket \u9519\u8BEF:",e.message),this.cleanupConnection()}handleConnectionClose(e,t){if(this.connectionStatus=!1,this.serverInitialized=!1,this.logger.info(`\u5C0F\u667A\u8FDE\u63A5\u5DF2\u5173\u95ED (\u4EE3\u7801: ${e}, \u539F\u56E0: ${t})`),this.reconnectState.isManualDisconnect){this.connectionState="disconnected";return}this.shouldReconnect()?this.scheduleReconnect():(this.connectionState="failed",this.logger.warn(`\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u6B21\u6570 (${this.reconnectOptions.maxAttempts})\uFF0C\u505C\u6B62\u91CD\u8FDE`))}shouldReconnect(){return this.reconnectOptions.enabled&&this.reconnectState.attempts<this.reconnectOptions.maxAttempts&&!this.reconnectState.isManualDisconnect}scheduleReconnect(){this.connectionState="reconnecting",this.reconnectState.attempts++,this.calculateNextInterval(),this.logger.info(`\u5C06\u5728 ${Math.floor(this.reconnectState.nextInterval)}ms \u540E\u8FDB\u884C\u7B2C ${this.reconnectState.attempts} \u6B21\u91CD\u8FDE`),this.reconnectState.timer&&clearTimeout(this.reconnectState.timer),this.reconnectState.timer=setTimeout(async()=>{try{await this.attemptConnection()}catch{}},this.reconnectState.nextInterval)}calculateNextInterval(){let e;switch(this.reconnectOptions.backoffStrategy){case"fixed":e=this.reconnectOptions.initialInterval;break;case"linear":e=this.reconnectOptions.initialInterval+this.reconnectState.attempts*this.reconnectOptions.backoffMultiplier*1e3;break;case"exponential":e=this.reconnectOptions.initialInterval*this.reconnectOptions.backoffMultiplier**(this.reconnectState.attempts-1);break;default:e=this.reconnectOptions.initialInterval}if(e=Math.min(e,this.reconnectOptions.maxInterval),this.reconnectOptions.jitter){let t=e*.1,r=(Math.random()-.5)*2*t;e+=r}this.reconnectState.nextInterval=Math.max(e,1e3)}cleanupConnection(){if(this.ws){this.ws.removeAllListeners();try{this.ws.readyState===Ee.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===Ee.CONNECTING&&this.ws.terminate()}catch(e){this.logger.debug("WebSocket \u5173\u95ED\u65F6\u51FA\u73B0\u9519\u8BEF\uFF08\u5DF2\u5FFD\u7565\uFF09:",e)}this.ws=null}this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!1,this.serverInitialized=!1}stopReconnect(){this.reconnectState.timer&&(clearTimeout(this.reconnectState.timer),this.reconnectState.timer=null)}handleMessage(e){this.logger.debug("\u6536\u5230 MCP \u6D88\u606F:",JSON.stringify(e,null,2)),e.method&&this.handleServerRequest(e)}handleServerRequest(e){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,this.logger.info("MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210");break;case"tools/list":{let t=this.getTools();this.sendResponse(e.id,{tools:t}),this.logger.debug(`MCP \u5DE5\u5177\u5217\u8868\u5DF2\u53D1\u9001 (${t.length}\u4E2A\u5DE5\u5177)`);break}case"tools/call":{this.handleToolCall(e).catch(t=>{this.logger.error("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u65F6\u53D1\u751F\u672A\u6355\u83B7\u9519\u8BEF:",t)});break}case"ping":this.sendResponse(e.id,{}),this.logger.debug("\u56DE\u5E94 MCP ping \u6D88\u606F");break;default:this.logger.warn(`\u672A\u77E5\u7684 MCP \u8BF7\u6C42: ${e.method}`)}}sendResponse(e,t){if(this.logger.debug(`\u5C1D\u8BD5\u53D1\u9001\u54CD\u5E94: id=${e}, isConnected=${this.connectionStatus}, wsReadyState=${this.ws?.readyState}`),this.connectionStatus&&this.ws?.readyState===Ee.OPEN){let r={jsonrpc:"2.0",id:e,result:t};try{this.ws.send(JSON.stringify(r)),this.logger.info(`\u54CD\u5E94\u5DF2\u53D1\u9001: id=${e}`,{responseSize:JSON.stringify(r).length})}catch(s){this.logger.error(`\u53D1\u9001\u54CD\u5E94\u5931\u8D25: id=${e}`,s)}}else this.logger.error(`\u65E0\u6CD5\u53D1\u9001\u54CD\u5E94: id=${e}, \u8FDE\u63A5\u72B6\u6001\u68C0\u67E5\u5931\u8D25`,{isConnected:this.connectionStatus,wsReadyState:this.ws?.readyState,wsReadyStateText:this.ws?.readyState===Ee.OPEN?"OPEN":this.ws?.readyState===Ee.CONNECTING?"CONNECTING":this.ws?.readyState===Ee.CLOSING?"CLOSING":this.ws?.readyState===Ee.CLOSED?"CLOSED":"UNKNOWN"}),(!this.connectionStatus||this.ws?.readyState!==Ee.OPEN)&&(this.logger.warn(`\u5C1D\u8BD5\u91CD\u65B0\u8FDE\u63A5\u4EE5\u53D1\u9001\u54CD\u5E94: id=${e}`),this.scheduleReconnect())}getStatus(){return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:this.tools.size,connectionState:this.connectionState,reconnectAttempts:this.reconnectState.attempts,lastError:this.reconnectState.lastError?.message||null}}isConnected(){return this.connectionStatus}disconnect(){this.logger.info("\u4E3B\u52A8\u65AD\u5F00 \u5C0F\u667A\u8FDE\u63A5"),this.reconnectState.isManualDisconnect=!0,this.stopReconnect(),this.cleanupConnection(),this.connectionState="disconnected"}async reconnect(){this.logger.info("\u624B\u52A8\u91CD\u8FDE\u5C0F\u667A\u63A5\u5165\u70B9"),this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.isManualDisconnect=!1,this.cleanupConnection(),await this.connect()}enableReconnect(){this.reconnectOptions.enabled=!0,this.logger.info("\u81EA\u52A8\u91CD\u8FDE\u5DF2\u542F\u7528")}disableReconnect(){this.reconnectOptions.enabled=!1,this.stopReconnect(),this.logger.info("\u81EA\u52A8\u91CD\u8FDE\u5DF2\u7981\u7528")}updateReconnectOptions(e){this.reconnectOptions={...this.reconnectOptions,...e},this.logger.info("\u91CD\u8FDE\u914D\u7F6E\u5DF2\u66F4\u65B0",e)}getReconnectOptions(){return{...this.reconnectOptions}}resetReconnectState(){this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.logger.info("\u91CD\u8FDE\u72B6\u6001\u5DF2\u91CD\u7F6E")}async handleToolCall(e){if(e.id===void 0||e.id===null)throw new U(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=null;try{let s=this.validateToolCallParams(e.params);r=this.recordCallStart(s.name,t),this.logger.info(`\u5F00\u59CB\u5904\u7406\u5DE5\u5177\u8C03\u7528: ${s.name}`,{requestId:t,toolName:s.name,hasArguments:!!s.arguments});let n=this.serviceManager;if(!n)throw new U(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E");let i=await this.executeToolWithRetry(n,s.name,s.arguments||{});this.sendResponse(t,{content:i.content||[{type:"text",text:JSON.stringify(i)}],isError:i.isError||!1}),r&&this.recordCallEnd(r,!0),this.logger.info(`\u5DE5\u5177\u8C03\u7528\u6210\u529F: ${s.name}`,{requestId:t,duration:r?.duration?`${r.duration}ms`:"unknown"})}catch(s){if(r){let n=s instanceof U?s.code:-32e3,i=s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF";this.recordCallEnd(r,!1,n,i)}this.handleToolCallError(s,t,r?.duration||0)}}validateToolCallParams(e){if(!e||typeof e!="object")throw new U(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.name||typeof e.name!="string")throw new U(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.arguments!==void 0&&(typeof e.arguments!="object"||Array.isArray(e.arguments)))throw new U(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");return{name:e.name,arguments:e.arguments}}async executeToolWithRetry(e,t,r){let s=null;for(let n=1;n<=this.retryConfig.maxAttempts;n++)try{return await this.executeToolWithTimeout(e,t,r,this.toolCallConfig.timeout)}catch(i){if(i instanceof U?s=i:s=new U(-32e3,i instanceof Error?i.message:"\u672A\u77E5\u9519\u8BEF"),this.retryConfig.retryableErrors.includes(s.code)&&n<this.retryConfig.maxAttempts){let a=Math.min(this.retryConfig.initialDelay*this.retryConfig.backoffMultiplier**(n-1),this.retryConfig.maxDelay);this.logger.warn(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25\uFF0C\u5C06\u5728 ${a}ms \u540E\u91CD\u8BD5 (${n}/${this.retryConfig.maxAttempts})`,{toolName:t,error:s.message,attempt:n,delay:a}),await new Promise(l=>setTimeout(l,a));continue}break}throw s}async executeToolWithTimeout(e,t,r,s=3e4){return new Promise((n,i)=>{let a=setTimeout(()=>{i(new U(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${s}ms): ${t}`))},s);e.callTool(t,r).then(l=>{clearTimeout(a),n(l)}).catch(l=>{clearTimeout(a),l.message?.includes("\u672A\u627E\u5230\u5DE5\u5177")?i(new U(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${t}`)):l.message?.includes("\u670D\u52A1")&&l.message?.includes("\u4E0D\u53EF\u7528")?i(new U(-32001,l.message)):l.message?.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?i(new U(-32001,l.message)):l.message?.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?i(new U(-32001,l.message)):i(new U(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l.message}`))})})}handleToolCallError(e,t,r){let s;e instanceof U?s={code:e.code,message:e.message,data:e.data}:s={code:-32e3,message:e?.message||"\u672A\u77E5\u9519\u8BEF",data:{originalError:e?.toString()||"null"}},this.sendErrorResponse(t,s),this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{requestId:t,duration:`${r}ms`,error:s})}sendErrorResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===Ee.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r)),this.logger.debug("\u5DF2\u53D1\u9001\u9519\u8BEF\u54CD\u5E94:",r)}}recordCallStart(e,t){let r={id:String(t),toolName:e,startTime:new Date,success:!1};return this.callRecords.push(r),this.callRecords.length>this.maxCallRecords&&this.callRecords.shift(),r}recordCallEnd(e,t,r,s){e.endTime=new Date,e.duration=e.endTime.getTime()-e.startTime.getTime(),e.success=t,e.errorCode=r,e.errorMessage=s,this.updatePerformanceMetrics(e)}updatePerformanceMetrics(e){if(this.performanceMetrics.totalCalls++,e.success?this.performanceMetrics.successfulCalls++:this.performanceMetrics.failedCalls++,e.duration!==void 0){e.duration<this.performanceMetrics.minResponseTime&&(this.performanceMetrics.minResponseTime=e.duration),e.duration>this.performanceMetrics.maxResponseTime&&(this.performanceMetrics.maxResponseTime=e.duration);let t=this.callRecords.filter(s=>s.duration!==void 0).reduce((s,n)=>s+(n.duration||0),0),r=this.callRecords.filter(s=>s.duration!==void 0).length;this.performanceMetrics.averageResponseTime=r>0?t/r:0}this.performanceMetrics.successRate=this.performanceMetrics.totalCalls>0?this.performanceMetrics.successfulCalls/this.performanceMetrics.totalCalls*100:0,this.performanceMetrics.lastUpdated=new Date}getPerformanceMetrics(){return{...this.performanceMetrics}}getCallRecords(e){let t=[...this.callRecords].reverse();return e?t.slice(0,e):t}resetPerformanceMetrics(){this.performanceMetrics={totalCalls:0,successfulCalls:0,failedCalls:0,averageResponseTime:0,minResponseTime:Number.MAX_VALUE,maxResponseTime:0,successRate:0,lastUpdated:new Date},this.callRecords=[]}updateToolCallConfig(e){this.toolCallConfig={...this.toolCallConfig,...e},this.logger.info("\u5DE5\u5177\u8C03\u7528\u914D\u7F6E\u5DF2\u66F4\u65B0",this.toolCallConfig)}updateRetryConfig(e){this.retryConfig={...this.retryConfig,...e},this.logger.info("\u91CD\u8BD5\u914D\u7F6E\u5DF2\u66F4\u65B0",this.retryConfig)}getConfiguration(){return{toolCall:{...this.toolCallConfig},retry:{...this.retryConfig}}}getEnhancedStatus(){return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:this.tools.size,connectionState:this.connectionState,reconnectAttempts:this.reconnectState.attempts,lastError:this.reconnectState.lastError?.message||null,performance:this.getPerformanceMetrics(),configuration:this.getConfiguration()}}}});var Ze,vt=C(()=>{"use strict";P();Ze=class{static{c(this,"TransportAdapter")}logger;messageHandler;connectionId;config;state="disconnected";constructor(e,t){this.messageHandler=e,this.config=t,this.connectionId=this.generateConnectionId(),this.logger=p}async handleIncomingMessage(e){try{this.logger.debug(`\u5904\u7406\u63A5\u6536\u5230\u7684\u6D88\u606F: ${e.method}`,e);let t=await this.messageHandler.handleMessage(e);t!==null?(this.logger.debug("\u53D1\u9001\u54CD\u5E94\u6D88\u606F:",t),await this.sendMessage(t)):this.logger.debug("\u6536\u5230\u901A\u77E5\u6D88\u606F\uFF0C\u65E0\u9700\u54CD\u5E94")}catch(t){this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t);let r=this.createErrorResponse(t,e.id);await this.sendMessage(r)}}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||null}}generateConnectionId(){let e=Date.now(),t=Math.random().toString(36).substr(2,9);return`${this.config.name}_${e}_${t}`}getConnectionId(){return this.connectionId}getState(){return this.state}setState(e){let t=this.state;this.state=e,t!==e&&(this.logger.info(`\u8FDE\u63A5\u72B6\u6001\u53D8\u66F4: ${t} -> ${e}`),this.onStateChange(t,e))}onStateChange(e,t){}getConfig(){return{...this.config}}getMessageHandler(){return this.messageHandler}parseMessage(e){try{let t=JSON.parse(e.trim());return!t.jsonrpc||t.jsonrpc!=="2.0"?(this.logger.warn("\u6536\u5230\u975E JSON-RPC 2.0 \u683C\u5F0F\u7684\u6D88\u606F",t),null):t.method?t:(this.logger.warn("\u6536\u5230\u6CA1\u6709 method \u5B57\u6BB5\u7684\u6D88\u606F",t),null)}catch(t){return this.logger.error("\u89E3\u6790 JSON \u6D88\u606F\u5931\u8D25",{data:e,error:t}),null}}serializeMessage(e){try{return JSON.stringify(e)}catch(t){this.logger.error("\u5E8F\u5217\u5316\u6D88\u606F\u5931\u8D25",{message:e,error:t});let r=t instanceof Error?t.message:String(t);throw new Error(`\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25: ${r}`)}}validateMessage(e){return!(!e||typeof e!="object"||e.jsonrpc!=="2.0"||e.method&&typeof e.method!="string"||!e.method&&!e.result&&!e.error)}createTimeoutPromise(e,t){return Promise.race([e,new Promise((r,s)=>{setTimeout(()=>{s(new Error(`\u64CD\u4F5C\u8D85\u65F6: ${t}ms`))},t)})])}}});import{randomUUID as ja}from"crypto";import Qr from"express";var Vt,un=C(()=>{"use strict";vt();Vt=class extends Ze{static{c(this,"HTTPAdapter")}app;server=null;clients=new Map;port;host;enableSSE;enableRPC;corsOrigin;maxClients;constructor(e,t={name:"http"}){super(e,t),console.warn("[\u5DF2\u5E9F\u5F03] HTTPAdapter \u5C06\u5728 v2.0.0 \u4E2D\u79FB\u9664\u3002\u8BF7\u4F7F\u7528 WebServer \u7684 /mcp \u7AEF\u70B9\u66FF\u4EE3\u3002"),this.port=t.port||3e3,this.host=t.host||"0.0.0.0",this.enableSSE=t.enableSSE!==!1,this.enableRPC=t.enableRPC!==!1,this.corsOrigin=t.corsOrigin||"*",this.maxClients=t.maxClients!==void 0?t.maxClients:100,this.app=Qr(),this.setupMiddleware()}async initialize(){this.logger.info("\u521D\u59CB\u5316 HTTP \u9002\u914D\u5668");try{this.setupRoutes(),this.setState("connecting"),this.logger.info("HTTP \u9002\u914D\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("HTTP \u9002\u914D\u5668\u521D\u59CB\u5316\u5931\u8D25",e),this.setState("error"),e}}async start(){if(this.server){this.logger.warn("HTTP \u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");return}return this.logger.info(`\u542F\u52A8 HTTP \u670D\u52A1\u5668\u5728 ${this.host}:${this.port}`),new Promise((e,t)=>{this.server=this.app.listen(this.port,this.host,()=>{this.setState("connected"),this.logger.info("HTTP \u9002\u914D\u5668\u542F\u52A8\u6210\u529F"),this.logger.info(`- RPC \u7AEF\u70B9: http://${this.host}:${this.port}/rpc`),this.enableSSE&&(this.logger.info(`- SSE \u7AEF\u70B9: http://${this.host}:${this.port}/sse`),this.logger.info(`- \u6D88\u606F\u7AEF\u70B9: http://${this.host}:${this.port}/messages`)),e()}),this.server?.on("error",r=>{this.logger.error("HTTP \u670D\u52A1\u5668\u9519\u8BEF",r),this.setState("error"),t(r)})})}async stop(){if(this.server)return this.logger.info("\u505C\u6B62 HTTP \u670D\u52A1\u5668"),new Promise(e=>{for(let t of this.clients.values())t.response.end();this.clients.clear(),this.server.close(()=>{this.server=null,this.setState("disconnected"),this.logger.info("HTTP \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),e()})})}async sendMessage(e){this.clients.size>0&&this.broadcastToClients(e)}setupMiddleware(){this.app.use(Qr.json({limit:"10mb"})),this.app.use(Qr.urlencoded({extended:!0})),this.app.use((e,t,r)=>{t.header("Access-Control-Allow-Origin",this.corsOrigin),t.header("Access-Control-Allow-Methods","GET, POST, OPTIONS"),t.header("Access-Control-Allow-Headers","Content-Type, Accept"),t.header("Cache-Control","no-cache"),r()}),this.app.use((e,t,r)=>{this.logger.debug(`${e.method} ${e.path}`,{query:e.query,headers:e.headers}),r()})}setupRoutes(){this.enableSSE&&(this.app.get("/sse",this.handleSSE.bind(this)),this.app.post("/messages",this.handleMessages.bind(this))),this.enableRPC&&this.app.post("/rpc",this.handleRPC.bind(this)),this.app.get("/status",this.handleStatus.bind(this)),this.app.get("/health",this.handleHealth.bind(this))}handleSSE(e,t){if(this.clients.size>=this.maxClients){t.status(503).json({error:"\u670D\u52A1\u5668\u7E41\u5FD9\uFF0C\u5BA2\u6237\u7AEF\u8FDE\u63A5\u6570\u5DF2\u8FBE\u4E0A\u9650",maxClients:this.maxClients});return}let r=Date.now().toString(),s=ja();t.setHeader("Content-Type","text/event-stream"),t.setHeader("Cache-Control","no-cache, no-transform"),t.setHeader("Connection","keep-alive"),t.setHeader("X-Accel-Buffering","no");let n={id:r,sessionId:s,response:t,connectedAt:new Date};this.clients.set(s,n),this.logger.info(`SSE \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${r} (\u4F1A\u8BDD: ${s})`),t.write(`event: endpoint
10
+ `)}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}}}});import Ee from"ws";var U,be,Ft=C(()=>{"use strict";M();Lt();U=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{c(this,"ToolCallError")}},be=class{static{c(this,"ProxyMCPServer")}endpointUrl;ws=null;logger;connectionStatus=!1;serverInitialized=!1;tools=new Map;connectionState="disconnected";reconnectOptions;reconnectState={attempts:0,nextInterval:0,timer:null,lastError:null,isManualDisconnect:!1};connectionTimeout=null;performanceMetrics={totalCalls:0,successfulCalls:0,failedCalls:0,averageResponseTime:0,minResponseTime:Number.MAX_VALUE,maxResponseTime:0,successRate:0,lastUpdated:new Date};callRecords=[];maxCallRecords=100;retryConfig={maxAttempts:3,initialDelay:1e3,maxDelay:1e4,backoffMultiplier:2,retryableErrors:[-32001,-32002]};toolCallConfig={timeout:3e4,retryAttempts:3,retryDelay:1e3};constructor(e,t){this.endpointUrl=e,this.logger=h,this.reconnectOptions={enabled:!0,maxAttempts:10,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0,...t?.reconnect},this.reconnectState.nextInterval=this.reconnectOptions.initialInterval}setServiceManager(e){this.serviceManager=e,this.logger.info("\u5DF2\u8BBE\u7F6E MCPServiceManager"),this.syncToolsFromServiceManager()}syncToolsFromServiceManager(){let e=this.serviceManager;if(!e){this.logger.debug("MCPServiceManager \u672A\u8BBE\u7F6E\uFF0C\u8DF3\u8FC7\u5DE5\u5177\u540C\u6B65");return}try{let t=e.getAllTools(),r=new Map;for(let s of t)r.set(s.name,{name:s.name,description:s.description,inputSchema:s.inputSchema});this.tools=r,this.logger.info(`\u5DF2\u4ECE MCPServiceManager \u540C\u6B65 ${this.tools.size} \u4E2A\u5DE5\u5177`)}catch(t){this.logger.error(`\u540C\u6B65\u5DE5\u5177\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}addTool(e,t){return this.validateTool(e,t),this.tools.set(e,t),this.logger.debug(`\u5DE5\u5177 '${e}' \u5DF2\u6DFB\u52A0`),this}addTools(e){for(let[t,r]of Object.entries(e))this.addTool(t,r);return this}removeTool(e){return this.tools.delete(e)?this.logger.debug(`\u5DE5\u5177 '${e}' \u5DF2\u79FB\u9664`):this.logger.warn(`\u5C1D\u8BD5\u79FB\u9664\u4E0D\u5B58\u5728\u7684\u5DE5\u5177: '${e}'`),this}getTools(){try{this.syncToolsFromServiceManager()}catch{}return Array.from(this.tools.values())}hasTool(e){return this.tools.has(e)}validateTool(e,t){if(!e||typeof e!="string"||e.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(this.tools.has(e))throw new Error(`\u5DE5\u5177 '${e}' \u5DF2\u5B58\u5728`);if(!t||typeof t!="object")throw new Error("\u5DE5\u5177\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!t.name||typeof t.name!="string")throw new Error("\u5DE5\u5177\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 'name' \u5B57\u6BB5");if(!t.description||typeof t.description!="string")throw new Error("\u5DE5\u5177\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 'description' \u5B57\u6BB5");if(!t.inputSchema||typeof t.inputSchema!="object")throw new Error("\u5DE5\u5177\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 'inputSchema' \u5B57\u6BB5");if(!t.inputSchema.type||!t.inputSchema.properties)throw new Error("\u5DE5\u5177\u7684 inputSchema \u5FC5\u987B\u5305\u542B 'type' \u548C 'properties' \u5B57\u6BB5")}async connect(){if(this.tools.size===0)throw new Error("\u672A\u914D\u7F6E\u4EFB\u4F55\u5DE5\u5177\u3002\u8BF7\u5728\u8FDE\u63A5\u524D\u81F3\u5C11\u6DFB\u52A0\u4E00\u4E2A\u5DE5\u5177\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.reconnectState.isManualDisconnect=!1,this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",this.logger.debug(`\u6B63\u5728\u8FDE\u63A5\u5C0F\u667A\u63A5\u5165\u70B9: ${E(this.endpointUrl)} (\u5C1D\u8BD5 ${this.reconnectState.attempts+1}/${this.reconnectOptions.maxAttempts})`),new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.reconnectOptions.timeout}ms)`);this.handleConnectionError(r),t(r)},this.reconnectOptions.timeout),this.ws=new Ee(this.endpointUrl),this.ws.on("open",()=>{this.handleConnectionSuccess(),e()}),this.ws.on("message",r=>{try{let s=JSON.parse(r.toString());this.handleMessage(s)}catch(s){this.logger.error("MCP \u6D88\u606F\u89E3\u6790\u9519\u8BEF:",s)}}),this.ws.on("close",(r,s)=>{this.handleConnectionClose(r,s.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",this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.logger.debug("MCP WebSocket \u8FDE\u63A5\u5DF2\u5EFA\u7ACB")}handleConnectionError(e){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.reconnectState.lastError=e,this.logger.error("MCP WebSocket \u9519\u8BEF:",e.message),this.cleanupConnection()}handleConnectionClose(e,t){if(this.connectionStatus=!1,this.serverInitialized=!1,this.logger.info(`\u5C0F\u667A\u8FDE\u63A5\u5DF2\u5173\u95ED (\u4EE3\u7801: ${e}, \u539F\u56E0: ${t})`),this.reconnectState.isManualDisconnect){this.connectionState="disconnected";return}this.shouldReconnect()?this.scheduleReconnect():(this.connectionState="failed",this.logger.warn(`\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u6B21\u6570 (${this.reconnectOptions.maxAttempts})\uFF0C\u505C\u6B62\u91CD\u8FDE`))}shouldReconnect(){return this.reconnectOptions.enabled&&this.reconnectState.attempts<this.reconnectOptions.maxAttempts&&!this.reconnectState.isManualDisconnect}scheduleReconnect(){this.connectionState="reconnecting",this.reconnectState.attempts++,this.calculateNextInterval(),this.logger.debug(`\u5C06\u5728 ${Math.floor(this.reconnectState.nextInterval)}ms \u540E\u8FDB\u884C\u7B2C ${this.reconnectState.attempts} \u6B21\u91CD\u8FDE`),this.reconnectState.timer&&clearTimeout(this.reconnectState.timer),this.reconnectState.timer=setTimeout(async()=>{try{await this.attemptConnection()}catch{}},this.reconnectState.nextInterval)}calculateNextInterval(){let e;switch(this.reconnectOptions.backoffStrategy){case"fixed":e=this.reconnectOptions.initialInterval;break;case"linear":e=this.reconnectOptions.initialInterval+this.reconnectState.attempts*this.reconnectOptions.backoffMultiplier*1e3;break;case"exponential":e=this.reconnectOptions.initialInterval*this.reconnectOptions.backoffMultiplier**(this.reconnectState.attempts-1);break;default:e=this.reconnectOptions.initialInterval}if(e=Math.min(e,this.reconnectOptions.maxInterval),this.reconnectOptions.jitter){let t=e*.1,r=(Math.random()-.5)*2*t;e+=r}this.reconnectState.nextInterval=Math.max(e,1e3)}cleanupConnection(){if(this.ws){this.ws.removeAllListeners();try{this.ws.readyState===Ee.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===Ee.CONNECTING&&this.ws.terminate()}catch(e){this.logger.debug("WebSocket \u5173\u95ED\u65F6\u51FA\u73B0\u9519\u8BEF\uFF08\u5DF2\u5FFD\u7565\uFF09:",e)}this.ws=null}this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!1,this.serverInitialized=!1}stopReconnect(){this.reconnectState.timer&&(clearTimeout(this.reconnectState.timer),this.reconnectState.timer=null)}handleMessage(e){this.logger.debug("\u6536\u5230 MCP \u6D88\u606F:",JSON.stringify(e,null,2)),e.method&&this.handleServerRequest(e)}handleServerRequest(e){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,this.logger.debug("MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210");break;case"tools/list":{let t=this.getTools();this.sendResponse(e.id,{tools:t}),this.logger.debug(`MCP \u5DE5\u5177\u5217\u8868\u5DF2\u53D1\u9001 (${t.length}\u4E2A\u5DE5\u5177)`);break}case"tools/call":{this.handleToolCall(e).catch(t=>{this.logger.error("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u65F6\u53D1\u751F\u672A\u6355\u83B7\u9519\u8BEF:",t)});break}case"ping":this.sendResponse(e.id,{}),this.logger.debug("\u56DE\u5E94 MCP ping \u6D88\u606F");break;default:this.logger.warn(`\u672A\u77E5\u7684 MCP \u8BF7\u6C42: ${e.method}`)}}sendResponse(e,t){if(this.logger.debug(`\u5C1D\u8BD5\u53D1\u9001\u54CD\u5E94: id=${e}, isConnected=${this.connectionStatus}, wsReadyState=${this.ws?.readyState}`),this.connectionStatus&&this.ws?.readyState===Ee.OPEN){let r={jsonrpc:"2.0",id:e,result:t};try{this.ws.send(JSON.stringify(r)),this.logger.debug(`\u54CD\u5E94\u5DF2\u53D1\u9001: id=${e}`,{responseSize:JSON.stringify(r).length})}catch(s){this.logger.error(`\u53D1\u9001\u54CD\u5E94\u5931\u8D25: id=${e}`,s)}}else this.logger.error(`\u65E0\u6CD5\u53D1\u9001\u54CD\u5E94: id=${e}, \u8FDE\u63A5\u72B6\u6001\u68C0\u67E5\u5931\u8D25`,{isConnected:this.connectionStatus,wsReadyState:this.ws?.readyState,wsReadyStateText:this.ws?.readyState===Ee.OPEN?"OPEN":this.ws?.readyState===Ee.CONNECTING?"CONNECTING":this.ws?.readyState===Ee.CLOSING?"CLOSING":this.ws?.readyState===Ee.CLOSED?"CLOSED":"UNKNOWN"}),(!this.connectionStatus||this.ws?.readyState!==Ee.OPEN)&&(this.logger.warn(`\u5C1D\u8BD5\u91CD\u65B0\u8FDE\u63A5\u4EE5\u53D1\u9001\u54CD\u5E94: id=${e}`),this.scheduleReconnect())}getStatus(){return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:this.tools.size,connectionState:this.connectionState,reconnectAttempts:this.reconnectState.attempts,lastError:this.reconnectState.lastError?.message||null}}isConnected(){return this.connectionStatus}disconnect(){this.logger.info("\u4E3B\u52A8\u65AD\u5F00 \u5C0F\u667A\u8FDE\u63A5"),this.reconnectState.isManualDisconnect=!0,this.stopReconnect(),this.cleanupConnection(),this.connectionState="disconnected"}async reconnect(){this.logger.info("\u624B\u52A8\u91CD\u8FDE\u5C0F\u667A\u63A5\u5165\u70B9"),this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.isManualDisconnect=!1,this.cleanupConnection(),await this.connect()}enableReconnect(){this.reconnectOptions.enabled=!0,this.logger.info("\u81EA\u52A8\u91CD\u8FDE\u5DF2\u542F\u7528")}disableReconnect(){this.reconnectOptions.enabled=!1,this.stopReconnect(),this.logger.info("\u81EA\u52A8\u91CD\u8FDE\u5DF2\u7981\u7528")}updateReconnectOptions(e){this.reconnectOptions={...this.reconnectOptions,...e},this.logger.info("\u91CD\u8FDE\u914D\u7F6E\u5DF2\u66F4\u65B0",e)}getReconnectOptions(){return{...this.reconnectOptions}}resetReconnectState(){this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.logger.info("\u91CD\u8FDE\u72B6\u6001\u5DF2\u91CD\u7F6E")}async handleToolCall(e){if(e.id===void 0||e.id===null)throw new U(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=null;try{let s=this.validateToolCallParams(e.params);r=this.recordCallStart(s.name,t),this.logger.info(`\u5F00\u59CB\u5904\u7406\u5DE5\u5177\u8C03\u7528: ${s.name}`,{requestId:t,toolName:s.name,hasArguments:!!s.arguments});let n=this.serviceManager;if(!n)throw new U(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E");let i=await this.executeToolWithRetry(n,s.name,s.arguments||{});this.sendResponse(t,{content:i.content||[{type:"text",text:JSON.stringify(i)}],isError:i.isError||!1}),r&&this.recordCallEnd(r,!0),this.logger.info(`\u5DE5\u5177\u8C03\u7528\u6210\u529F: ${s.name}`,{requestId:t,duration:r?.duration?`${r.duration}ms`:"unknown"})}catch(s){if(r){let n=s instanceof U?s.code:-32e3,i=s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF";this.recordCallEnd(r,!1,n,i)}this.handleToolCallError(s,t,r?.duration||0)}}validateToolCallParams(e){if(!e||typeof e!="object")throw new U(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.name||typeof e.name!="string")throw new U(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.arguments!==void 0&&(typeof e.arguments!="object"||Array.isArray(e.arguments)))throw new U(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");return{name:e.name,arguments:e.arguments}}async executeToolWithRetry(e,t,r){let s=null;for(let n=1;n<=this.retryConfig.maxAttempts;n++)try{return await this.executeToolWithTimeout(e,t,r,this.toolCallConfig.timeout)}catch(i){if(i instanceof U?s=i:s=new U(-32e3,i instanceof Error?i.message:"\u672A\u77E5\u9519\u8BEF"),this.retryConfig.retryableErrors.includes(s.code)&&n<this.retryConfig.maxAttempts){let a=Math.min(this.retryConfig.initialDelay*this.retryConfig.backoffMultiplier**(n-1),this.retryConfig.maxDelay);this.logger.warn(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25\uFF0C\u5C06\u5728 ${a}ms \u540E\u91CD\u8BD5 (${n}/${this.retryConfig.maxAttempts})`,{toolName:t,error:s.message,attempt:n,delay:a}),await new Promise(l=>setTimeout(l,a));continue}break}throw s}async executeToolWithTimeout(e,t,r,s=3e4){return new Promise((n,i)=>{let a=setTimeout(()=>{i(new U(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${s}ms): ${t}`))},s);e.callTool(t,r).then(l=>{clearTimeout(a),n(l)}).catch(l=>{clearTimeout(a),l.message?.includes("\u672A\u627E\u5230\u5DE5\u5177")?i(new U(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${t}`)):l.message?.includes("\u670D\u52A1")&&l.message?.includes("\u4E0D\u53EF\u7528")?i(new U(-32001,l.message)):l.message?.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?i(new U(-32001,l.message)):l.message?.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?i(new U(-32001,l.message)):i(new U(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l.message}`))})})}handleToolCallError(e,t,r){let s;e instanceof U?s={code:e.code,message:e.message,data:e.data}:s={code:-32e3,message:e?.message||"\u672A\u77E5\u9519\u8BEF",data:{originalError:e?.toString()||"null"}},this.sendErrorResponse(t,s),this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{requestId:t,duration:`${r}ms`,error:s})}sendErrorResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===Ee.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r)),this.logger.debug("\u5DF2\u53D1\u9001\u9519\u8BEF\u54CD\u5E94:",r)}}recordCallStart(e,t){let r={id:String(t),toolName:e,startTime:new Date,success:!1};return this.callRecords.push(r),this.callRecords.length>this.maxCallRecords&&this.callRecords.shift(),r}recordCallEnd(e,t,r,s){e.endTime=new Date,e.duration=e.endTime.getTime()-e.startTime.getTime(),e.success=t,e.errorCode=r,e.errorMessage=s,this.updatePerformanceMetrics(e)}updatePerformanceMetrics(e){if(this.performanceMetrics.totalCalls++,e.success?this.performanceMetrics.successfulCalls++:this.performanceMetrics.failedCalls++,e.duration!==void 0){e.duration<this.performanceMetrics.minResponseTime&&(this.performanceMetrics.minResponseTime=e.duration),e.duration>this.performanceMetrics.maxResponseTime&&(this.performanceMetrics.maxResponseTime=e.duration);let t=this.callRecords.filter(s=>s.duration!==void 0).reduce((s,n)=>s+(n.duration||0),0),r=this.callRecords.filter(s=>s.duration!==void 0).length;this.performanceMetrics.averageResponseTime=r>0?t/r:0}this.performanceMetrics.successRate=this.performanceMetrics.totalCalls>0?this.performanceMetrics.successfulCalls/this.performanceMetrics.totalCalls*100:0,this.performanceMetrics.lastUpdated=new Date}getPerformanceMetrics(){return{...this.performanceMetrics}}getCallRecords(e){let t=[...this.callRecords].reverse();return e?t.slice(0,e):t}resetPerformanceMetrics(){this.performanceMetrics={totalCalls:0,successfulCalls:0,failedCalls:0,averageResponseTime:0,minResponseTime:Number.MAX_VALUE,maxResponseTime:0,successRate:0,lastUpdated:new Date},this.callRecords=[]}updateToolCallConfig(e){this.toolCallConfig={...this.toolCallConfig,...e},this.logger.info("\u5DE5\u5177\u8C03\u7528\u914D\u7F6E\u5DF2\u66F4\u65B0",this.toolCallConfig)}updateRetryConfig(e){this.retryConfig={...this.retryConfig,...e},this.logger.info("\u91CD\u8BD5\u914D\u7F6E\u5DF2\u66F4\u65B0",this.retryConfig)}getConfiguration(){return{toolCall:{...this.toolCallConfig},retry:{...this.retryConfig}}}getEnhancedStatus(){return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:this.tools.size,connectionState:this.connectionState,reconnectAttempts:this.reconnectState.attempts,lastError:this.reconnectState.lastError?.message||null,performance:this.getPerformanceMetrics(),configuration:this.getConfiguration()}}}});var Ze,ft=C(()=>{"use strict";M();Ze=class{static{c(this,"TransportAdapter")}logger;messageHandler;connectionId;config;state="disconnected";constructor(e,t){this.messageHandler=e,this.config=t,this.connectionId=this.generateConnectionId(),this.logger=h}async handleIncomingMessage(e){try{this.logger.debug(`\u5904\u7406\u63A5\u6536\u5230\u7684\u6D88\u606F: ${e.method}`,e);let t=await this.messageHandler.handleMessage(e);t!==null?(this.logger.debug("\u53D1\u9001\u54CD\u5E94\u6D88\u606F:",t),await this.sendMessage(t)):this.logger.debug("\u6536\u5230\u901A\u77E5\u6D88\u606F\uFF0C\u65E0\u9700\u54CD\u5E94")}catch(t){this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t);let r=this.createErrorResponse(t,e.id);await this.sendMessage(r)}}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||null}}generateConnectionId(){let e=Date.now(),t=Math.random().toString(36).substr(2,9);return`${this.config.name}_${e}_${t}`}getConnectionId(){return this.connectionId}getState(){return this.state}setState(e){let t=this.state;this.state=e,t!==e&&(this.logger.info(`\u8FDE\u63A5\u72B6\u6001\u53D8\u66F4: ${t} -> ${e}`),this.onStateChange(t,e))}onStateChange(e,t){}getConfig(){return{...this.config}}getMessageHandler(){return this.messageHandler}parseMessage(e){try{let t=JSON.parse(e.trim());return!t.jsonrpc||t.jsonrpc!=="2.0"?(this.logger.warn("\u6536\u5230\u975E JSON-RPC 2.0 \u683C\u5F0F\u7684\u6D88\u606F",t),null):t.method?t:(this.logger.warn("\u6536\u5230\u6CA1\u6709 method \u5B57\u6BB5\u7684\u6D88\u606F",t),null)}catch(t){return this.logger.error("\u89E3\u6790 JSON \u6D88\u606F\u5931\u8D25",{data:e,error:t}),null}}serializeMessage(e){try{return JSON.stringify(e)}catch(t){this.logger.error("\u5E8F\u5217\u5316\u6D88\u606F\u5931\u8D25",{message:e,error:t});let r=t instanceof Error?t.message:String(t);throw new Error(`\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25: ${r}`)}}validateMessage(e){return!(!e||typeof e!="object"||e.jsonrpc!=="2.0"||e.method&&typeof e.method!="string"||!e.method&&!e.result&&!e.error)}createTimeoutPromise(e,t){return Promise.race([e,new Promise((r,s)=>{setTimeout(()=>{s(new Error(`\u64CD\u4F5C\u8D85\u65F6: ${t}ms`))},t)})])}}});import{randomUUID as ja}from"crypto";import Qr from"express";var Vt,un=C(()=>{"use strict";ft();Vt=class extends Ze{static{c(this,"HTTPAdapter")}app;server=null;clients=new Map;port;host;enableSSE;enableRPC;corsOrigin;maxClients;constructor(e,t={name:"http"}){super(e,t),console.warn("[\u5DF2\u5E9F\u5F03] HTTPAdapter \u5C06\u5728 v2.0.0 \u4E2D\u79FB\u9664\u3002\u8BF7\u4F7F\u7528 WebServer \u7684 /mcp \u7AEF\u70B9\u66FF\u4EE3\u3002"),this.port=t.port||3e3,this.host=t.host||"0.0.0.0",this.enableSSE=t.enableSSE!==!1,this.enableRPC=t.enableRPC!==!1,this.corsOrigin=t.corsOrigin||"*",this.maxClients=t.maxClients!==void 0?t.maxClients:100,this.app=Qr(),this.setupMiddleware()}async initialize(){this.logger.info("\u521D\u59CB\u5316 HTTP \u9002\u914D\u5668");try{this.setupRoutes(),this.setState("connecting"),this.logger.info("HTTP \u9002\u914D\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("HTTP \u9002\u914D\u5668\u521D\u59CB\u5316\u5931\u8D25",e),this.setState("error"),e}}async start(){if(this.server){this.logger.warn("HTTP \u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");return}return this.logger.info(`\u542F\u52A8 HTTP \u670D\u52A1\u5668\u5728 ${this.host}:${this.port}`),new Promise((e,t)=>{this.server=this.app.listen(this.port,this.host,()=>{this.setState("connected"),this.logger.info("HTTP \u9002\u914D\u5668\u542F\u52A8\u6210\u529F"),this.logger.info(`- RPC \u7AEF\u70B9: http://${this.host}:${this.port}/rpc`),this.enableSSE&&(this.logger.info(`- SSE \u7AEF\u70B9: http://${this.host}:${this.port}/sse`),this.logger.info(`- \u6D88\u606F\u7AEF\u70B9: http://${this.host}:${this.port}/messages`)),e()}),this.server?.on("error",r=>{this.logger.error("HTTP \u670D\u52A1\u5668\u9519\u8BEF",r),this.setState("error"),t(r)})})}async stop(){if(this.server)return this.logger.info("\u505C\u6B62 HTTP \u670D\u52A1\u5668"),new Promise(e=>{for(let t of this.clients.values())t.response.end();this.clients.clear(),this.server.close(()=>{this.server=null,this.setState("disconnected"),this.logger.info("HTTP \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),e()})})}async sendMessage(e){this.clients.size>0&&this.broadcastToClients(e)}setupMiddleware(){this.app.use(Qr.json({limit:"10mb"})),this.app.use(Qr.urlencoded({extended:!0})),this.app.use((e,t,r)=>{t.header("Access-Control-Allow-Origin",this.corsOrigin),t.header("Access-Control-Allow-Methods","GET, POST, OPTIONS"),t.header("Access-Control-Allow-Headers","Content-Type, Accept"),t.header("Cache-Control","no-cache"),r()}),this.app.use((e,t,r)=>{this.logger.debug(`${e.method} ${e.path}`,{query:e.query,headers:e.headers}),r()})}setupRoutes(){this.enableSSE&&(this.app.get("/sse",this.handleSSE.bind(this)),this.app.post("/messages",this.handleMessages.bind(this))),this.enableRPC&&this.app.post("/rpc",this.handleRPC.bind(this)),this.app.get("/status",this.handleStatus.bind(this)),this.app.get("/health",this.handleHealth.bind(this))}handleSSE(e,t){if(this.clients.size>=this.maxClients){t.status(503).json({error:"\u670D\u52A1\u5668\u7E41\u5FD9\uFF0C\u5BA2\u6237\u7AEF\u8FDE\u63A5\u6570\u5DF2\u8FBE\u4E0A\u9650",maxClients:this.maxClients});return}let r=Date.now().toString(),s=ja();t.setHeader("Content-Type","text/event-stream"),t.setHeader("Cache-Control","no-cache, no-transform"),t.setHeader("Connection","keep-alive"),t.setHeader("X-Accel-Buffering","no");let n={id:r,sessionId:s,response:t,connectedAt:new Date};this.clients.set(s,n),this.logger.info(`SSE \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${r} (\u4F1A\u8BDD: ${s})`),t.write(`event: endpoint
11
11
  data: /messages?sessionId=${s}
12
12
 
13
13
  `),e.on("close",()=>{this.clients.delete(s),this.logger.info(`SSE \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${r} (\u4F1A\u8BDD: ${s})`)}),e.on("error",i=>{this.logger.error(`SSE \u5BA2\u6237\u7AEF\u8FDE\u63A5\u9519\u8BEF: ${r}`,i),this.clients.delete(s)})}async handleMessages(e,t){try{let r=e.query.sessionId,s=e.body;if(this.logger.debug(`\u6536\u5230 SSE \u6D88\u606F (\u4F1A\u8BDD: ${r}):`,s),!r||!this.clients.has(r)){t.status(400).json({jsonrpc:"2.0",error:{code:-32600,message:"\u65E0\u6548\u6216\u7F3A\u5C11 sessionId"},id:s.id});return}let n=await this.messageHandler.handleMessage(s);this.logger.debug("SSE \u6D88\u606F\u5904\u7406\u54CD\u5E94:",n);let i=this.clients.get(r);i&&n!==null&&this.sendToClient(i,n),t.status(202).send()}catch(r){this.logger.error("\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519",r),t.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:r.message}})}}async handleRPC(e,t){try{let r=e.body;this.logger.debug("\u6536\u5230 RPC \u6D88\u606F:",r);let s=await this.messageHandler.handleMessage(r);t.json(s)}catch(r){this.logger.error("\u5904\u7406 RPC \u6D88\u606F\u65F6\u51FA\u9519",r),t.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:r.message},id:e.body?.id||null})}}handleStatus(e,t){t.json({status:"ok",mode:"mcp-server",serviceManager:"running",clients:this.clients.size,tools:0,maxClients:this.maxClients,enableSSE:this.enableSSE,enableRPC:this.enableRPC,uptime:process.uptime()})}handleHealth(e,t){t.json({status:"ok",mode:"mcp-server",timestamp:new Date().toISOString()})}sendToClient(e,t){try{let r=this.serializeMessage(t);e.response.write(`data: ${r}
14
14
 
15
- `),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u5230\u5BA2\u6237\u7AEF ${e.id}`,{sessionId:e.sessionId,messageId:t.id})}catch(r){this.logger.error(`\u5411\u5BA2\u6237\u7AEF ${e.id} \u53D1\u9001\u6D88\u606F\u5931\u8D25`,r),this.clients.delete(e.sessionId)}}broadcastToClients(e){for(let t of this.clients.values())this.sendToClient(t,e)}getStatus(){return{isRunning:this.server!==null,port:this.port,host:this.host,clientCount:this.clients.size,maxClients:this.maxClients,enableSSE:this.enableSSE,enableRPC:this.enableRPC,connectionId:this.connectionId,state:this.state}}getClients(){return Array.from(this.clients.values()).map(e=>({id:e.id,sessionId:e.sessionId,connectedAt:e.connectedAt}))}}});var hn=C(()=>{"use strict";vt()});import kp,{WebSocketServer as jp}from"ws";var pn=C(()=>{"use strict";vt()});import{createHash as Ha}from"crypto";function Ne(o,e){let t=Ha("md5").update(JSON.stringify(e||{})).digest("hex");return`${o}_${t}`}function Qe(o,e){let t=new Date(o).getTime();return Date.now()-t>e}function je(o){let e=Date.now(),t=new Date(o.timestamp).getTime();return!!(o.consumed&&e-t>6e4||e-t>o.ttl||o.status==="failed")}var De,Wt=C(()=>{"use strict";c(Ne,"generateCacheKey");c(Qe,"isCacheExpired");c(je,"shouldCleanupCache");De={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});var Bt,dn=C(()=>{"use strict";Wt();Bt=class{static{c(this,"CacheLifecycleManager")}logger;cleanupInterval;statistics;lastCleanupTime;constructor(e){this.logger=e,this.statistics=this.initializeStatistics(),this.lastCleanupTime=new Date().toISOString()}initializeStatistics(){return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0}}startAutoCleanup(){if(this.cleanupInterval){this.logger.warn("[CacheLifecycle] \u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\u5DF2\u7ECF\u5728\u8FD0\u884C");return}this.cleanupInterval=setInterval(()=>{this.performCleanup().catch(e=>{this.logger.error(`[CacheLifecycle] \u81EA\u52A8\u6E05\u7406\u5931\u8D25: ${e}`)})},De.CLEANUP_INTERVAL),this.logger.info(`[CacheLifecycle] \u542F\u52A8\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${De.CLEANUP_INTERVAL}ms`)}stopAutoCleanup(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=void 0,this.logger.info("[CacheLifecycle] \u505C\u6B62\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668"))}createCacheEntry(e,t,r,s="pending",n){let i={result:r,timestamp:new Date().toISOString(),ttl:De.CACHE_TTL,status:s,consumed:!1,taskId:n,retryCount:0};return this.logger.debug(`[CacheLifecycle] \u521B\u5EFA\u7F13\u5B58\u6761\u76EE: ${e}, \u72B6\u6001: ${s}`),i}updateCacheStatus(e,t,r,s,n){if(!e.customMCPResults||!e.customMCPResults[t])return this.logger.warn(`[CacheLifecycle] \u7F13\u5B58\u6761\u76EE\u4E0D\u5B58\u5728: ${t}`),!1;let i=e.customMCPResults[t],a=i.status;return this.logStateTransition(t,a,r),i.status=r,i.timestamp=new Date().toISOString(),s&&(i.result=s),n&&r==="failed"&&(i.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},i.consumed=!0),r==="completed"&&(i.consumed=!1),this.logger.debug(`[CacheLifecycle] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${t} ${a} -> ${r}`),!0}markAsConsumed(e,t){if(!e.customMCPResults||!e.customMCPResults[t])return!1;let r=e.customMCPResults[t];return r.consumed?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u5DF2\u6807\u8BB0\u4E3A\u6D88\u8D39: ${t}`),!0):(r.consumed=!0,r.timestamp=new Date().toISOString(),this.logStateTransition(t,r.status,"consumed"),this.logger.debug(`[CacheLifecycle] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${t}`),!0)}isCacheAvailable(e,t){if(!e.customMCPResults||!e.customMCPResults[t])return!1;let r=e.customMCPResults[t];return Qe(r.timestamp,r.ttl)?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${t}`),!1):r.consumed?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u5DF2\u6D88\u8D39: ${t}`),!1):r.status!=="completed"?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u72B6\u6001\u672A\u5B8C\u6210: ${t}, \u72B6\u6001: ${r.status}`),!1):!0}async performCleanup(){try{this.logger.debug("[CacheLifecycle] \u6267\u884C\u7F13\u5B58\u6E05\u7406"),this.lastCleanupTime=new Date().toISOString()}catch(e){throw this.logger.error(`[CacheLifecycle] \u6E05\u7406\u5931\u8D25: ${e}`),e}}cleanupCacheEntries(e,t){if(!e.customMCPResults)return{cleaned:0,total:0};let r=Object.entries(e.customMCPResults),s=0,n=t||r.map(([i])=>i);for(let i of n){let a=e.customMCPResults[i];a&&je(a)&&(delete e.customMCPResults[i],s++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u7F13\u5B58\u6761\u76EE: ${i}`))}return this.logger.info(`[CacheLifecycle] \u6E05\u7406\u5B8C\u6210: ${s}/${n.length}`),{cleaned:s,total:n.length}}cleanupExpiredCache(e){if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[s,n]of t)Qe(n.timestamp,n.ttl)&&(delete e.customMCPResults[s],r++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58: ${s}`));return r>0&&this.logger.info(`[CacheLifecycle] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58: ${r}/${t.length}`),{cleaned:r,total:t.length}}cleanupConsumedCache(e){if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0,s=Date.now();for(let[n,i]of t)if(i.consumed){let a=new Date(i.timestamp).getTime();s-a>6e4&&(delete e.customMCPResults[n],r++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${n}`))}return r>0&&this.logger.info(`[CacheLifecycle] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}/${t.length}`),{cleaned:r,total:t.length}}updateStatistics(e){if(!e.customMCPResults){this.statistics=this.initializeStatistics();return}let t=Object.values(e.customMCPResults);this.statistics.totalEntries=t.length,this.statistics.pendingTasks=t.filter(n=>n.status==="pending").length,this.statistics.completedTasks=t.filter(n=>n.status==="completed").length,this.statistics.failedTasks=t.filter(n=>n.status==="failed").length,this.statistics.consumedEntries=t.filter(n=>n.consumed).length;let r=this.statistics.completedTasks,s=this.statistics.consumedEntries;this.statistics.cacheHitRate=r>0?s/r*100:0,this.statistics.lastCleanupTime=this.lastCleanupTime,this.statistics.memoryUsage=JSON.stringify(e.customMCPResults).length}getStatistics(){return{...this.statistics}}validateCacheIntegrity(e){let t=[];if(!e.customMCPResults)return{isValid:!0,issues:[]};for(let[r,s]of Object.entries(e.customMCPResults))(!s.timestamp||!s.ttl||!s.status)&&t.push(`\u7F13\u5B58\u6761\u76EE\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`),Number.isNaN(new Date(s.timestamp).getTime())&&t.push(`\u65E0\u6548\u7684\u65F6\u95F4\u6233\u683C\u5F0F: ${r}`),["pending","completed","failed"].includes(s.status)||t.push(`\u65E0\u6548\u7684\u72B6\u6001\u503C: ${r}, \u72B6\u6001: ${s.status}`),Qe(s.timestamp,s.ttl)&&t.push(`\u7F13\u5B58\u6761\u76EE\u5DF2\u8FC7\u671F: ${r}`);return{isValid:t.length===0,issues:t}}logStateTransition(e,t,r){let s={from:t,to:r,reason:this.getTransitionReason(t,r),timestamp:new Date().toISOString()};this.logger.debug(`[CacheLifecycle] \u72B6\u6001\u8F6C\u6362: ${e} ${t} -> ${r} (${s.reason})`)}getTransitionReason(e,t){return{"pending->completed":"\u4EFB\u52A1\u6267\u884C\u6210\u529F","pending->failed":"\u4EFB\u52A1\u6267\u884C\u5931\u8D25","completed->consumed":"\u7ED3\u679C\u88AB\u6D88\u8D39","failed->consumed":"\u5931\u8D25\u7ED3\u679C\u88AB\u5904\u7406","consumed->deleted":"\u7F13\u5B58\u88AB\u6E05\u7406"}[`${e}->${t}`]||"\u72B6\u6001\u66F4\u65B0"}cleanup(){this.stopAutoCleanup(),this.logger.info("[CacheLifecycle] \u6E05\u7406\u8D44\u6E90\u5B8C\u6210")}}});var qt,mn=C(()=>{"use strict";qt=class{static{c(this,"TaskStateManager")}logger;activeTasks;taskHistory;constructor(e){this.logger=e,this.activeTasks=new Map,this.taskHistory=[]}generateTaskId(e,t){let r=Date.now(),s=Math.random().toString(36).substring(2,11),n=`${e}_${r}_${s}`;return this.logger.debug(`[TaskState] \u751F\u6210\u4EFB\u52A1ID: ${n}`),n}validateTaskId(e){let r=/^[a-zA-Z0-9_-]+_\d+_[a-zA-Z0-9]+$/.test(e);return r||this.logger.warn(`[TaskState] \u65E0\u6548\u7684\u4EFB\u52A1ID\u683C\u5F0F: ${e}`),r}extractToolName(e){if(!this.validateTaskId(e))return null;let t=e.split("_");if(t.length<3)return null;let r=t.findIndex(n=>/^\d+$/.test(n));return r<=0?null:t.slice(0,r).join("_")}createTask(e,t,r,s="pending"){if(this.activeTasks.has(e))throw new Error(`\u4EFB\u52A1\u5DF2\u5B58\u5728: ${e}`);let n={taskId:e,toolName:t,arguments:r,status:s,startTime:new Date().toISOString()};return this.activeTasks.set(e,n),this.recordStateTransition(e,"none",s,"\u521B\u5EFA\u65B0\u4EFB\u52A1"),this.logger.info(`[TaskState] \u521B\u5EFA\u4EFB\u52A1: ${e}, \u5DE5\u5177: ${t}, \u72B6\u6001: ${s}`),n}updateTaskStatus(e,t,r,s){let n=this.activeTasks.get(e);if(!n)return this.logger.warn(`[TaskState] \u4EFB\u52A1\u4E0D\u5B58\u5728: ${e}`),!1;let i=n.status;return n.status=t,(t==="completed"||t==="failed")&&(n.endTime=new Date().toISOString()),r&&(n.result=r),s&&(n.error=s),this.recordStateTransition(e,i,t,this.getStatusChangeReason(i,t,s)),this.logger.info(`[TaskState] \u66F4\u65B0\u4EFB\u52A1\u72B6\u6001: ${e} ${i} -> ${t}`),!0}markTaskAsPending(e,t,r){let s=this.activeTasks.get(e);return s?this.updateTaskStatus(e,"pending"):s=this.createTask(e,t,r,"pending"),s}markTaskAsCompleted(e,t){return this.updateTaskStatus(e,"completed",t)}markTaskAsFailed(e,t){return this.updateTaskStatus(e,"failed",void 0,t)}markTaskAsConsumed(e){return this.updateTaskStatus(e,"consumed")}getTask(e){return this.activeTasks.get(e)||null}hasTask(e){return this.activeTasks.has(e)}getTaskStatus(e){let t=this.activeTasks.get(e);return t?t.status:null}getTasksByStatus(e){return Array.from(this.activeTasks.values()).filter(t=>t.status===e)}getTasksByTool(e){return Array.from(this.activeTasks.values()).filter(t=>t.toolName===e)}getTaskExecutionTime(e){let t=this.activeTasks.get(e);if(!t||!t.endTime)return null;let r=new Date(t.startTime).getTime();return new Date(t.endTime).getTime()-r}isTaskTimeout(e,t=8e3){let r=this.activeTasks.get(e);if(!r)return!1;let s=new Date(r.startTime).getTime();return Date.now()-s>t}getTimeoutTasks(e=8e3){let t=Date.now();return Array.from(this.activeTasks.values()).filter(r=>{let s=new Date(r.startTime).getTime();return t-s>e&&r.status==="pending"})}removeTask(e){let t=this.activeTasks.get(e);return t?(this.recordStateTransition(e,t.status,"deleted","\u4EFB\u52A1\u88AB\u79FB\u9664"),this.activeTasks.delete(e),this.logger.info(`[TaskState] \u79FB\u9664\u4EFB\u52A1: ${e}`),!0):!1}cleanupCompletedTasks(e=3e5){let t=Date.now(),r=0;for(let[s,n]of this.activeTasks.entries())if(n.status==="completed"||n.status==="failed"){let i=n.endTime?new Date(n.endTime).getTime():t;t-i>e&&(this.removeTask(s),r++)}return r>0&&this.logger.info(`[TaskState] \u6E05\u7406\u5DF2\u5B8C\u6210\u4EFB\u52A1: ${r}\u4E2A`),r}getTaskStatistics(){let e=Array.from(this.activeTasks.values()),t=e.length,r=e.filter(g=>g.status==="pending").length,s=e.filter(g=>g.status==="completed").length,n=e.filter(g=>g.status==="failed").length,i=e.filter(g=>g.status==="consumed").length,a=e.filter(g=>g.status==="completed"&&g.endTime),l=a.length>0?a.reduce((g,u)=>{let h=this.getTaskExecutionTime(u.taskId)||0;return g+h},0)/a.length:0;return{total:t,pending:r,completed:s,failed:n,consumed:i,averageExecutionTime:l}}getTaskHistory(e){return e?this.taskHistory.filter(t=>t.taskId===e):[...this.taskHistory]}recordStateTransition(e,t,r,s){let n={from:t,to:r,reason:s,timestamp:new Date().toISOString(),taskId:e};this.taskHistory.push(n),this.taskHistory.length>1e3&&(this.taskHistory=this.taskHistory.slice(-500))}getStatusChangeReason(e,t,r){if(r)return`\u6267\u884C\u5931\u8D25: ${r}`;let s={"none->pending":"\u4EFB\u52A1\u5F00\u59CB\u6267\u884C","pending->completed":"\u4EFB\u52A1\u6267\u884C\u6210\u529F","pending->failed":"\u4EFB\u52A1\u6267\u884C\u5931\u8D25","completed->consumed":"\u7ED3\u679C\u88AB\u6D88\u8D39","failed->consumed":"\u5931\u8D25\u7ED3\u679C\u88AB\u5904\u7406","consumed->deleted":"\u4EFB\u52A1\u88AB\u6E05\u7406"},n=`${e}->${t}`;return s[n]||"\u72B6\u6001\u66F4\u65B0"}validateTaskIntegrity(){let e=[];for(let[t,r]of this.activeTasks.entries())(!r.taskId||!r.toolName||!r.status||!r.startTime)&&e.push(`\u4EFB\u52A1\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${t}`),Number.isNaN(new Date(r.startTime).getTime())&&e.push(`\u65E0\u6548\u7684\u5F00\u59CB\u65F6\u95F4: ${t}`),r.endTime&&Number.isNaN(new Date(r.endTime).getTime())&&e.push(`\u65E0\u6548\u7684\u7ED3\u675F\u65F6\u95F4: ${t}`),r.status==="completed"&&!r.endTime&&e.push(`\u5DF2\u5B8C\u6210\u4EFB\u52A1\u7F3A\u5C11\u7ED3\u675F\u65F6\u95F4: ${t}`),r.status==="failed"&&!r.error&&e.push(`\u5931\u8D25\u4EFB\u52A1\u7F3A\u5C11\u9519\u8BEF\u4FE1\u606F: ${t}`);return{isValid:e.length===0,issues:e}}restartStalledTasks(e=3e4){let t=this.getTimeoutTasks(e),r=0;for(let s of t){this.logger.warn(`[TaskState] \u68C0\u6D4B\u5230\u505C\u6EDE\u4EFB\u52A1: ${s.taskId}`),this.markTaskAsFailed(s.taskId,"\u4EFB\u52A1\u6267\u884C\u8D85\u65F6");let n=this.generateTaskId(s.toolName,s.arguments);this.createTask(n,s.toolName,s.arguments,"pending"),r++}return r>0&&this.logger.info(`[TaskState] \u91CD\u542F\u505C\u6EDE\u4EFB\u52A1: ${r}\u4E2A`),r}cleanup(){this.activeTasks.clear(),this.taskHistory=[],this.logger.info("[TaskState] \u6E05\u7406\u4EFB\u52A1\u72B6\u6001\u7BA1\u7406\u5668\u8D44\u6E90")}}});function fn(o,e){return{content:[{type:"text",text:e?za(e,o):Cn(o)}],isError:!1,taskId:o,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 za(o,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
15
+ `),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u5230\u5BA2\u6237\u7AEF ${e.id}`,{sessionId:e.sessionId,messageId:t.id})}catch(r){this.logger.error(`\u5411\u5BA2\u6237\u7AEF ${e.id} \u53D1\u9001\u6D88\u606F\u5931\u8D25`,r),this.clients.delete(e.sessionId)}}broadcastToClients(e){for(let t of this.clients.values())this.sendToClient(t,e)}getStatus(){return{isRunning:this.server!==null,port:this.port,host:this.host,clientCount:this.clients.size,maxClients:this.maxClients,enableSSE:this.enableSSE,enableRPC:this.enableRPC,connectionId:this.connectionId,state:this.state}}getClients(){return Array.from(this.clients.values()).map(e=>({id:e.id,sessionId:e.sessionId,connectedAt:e.connectedAt}))}}});var pn=C(()=>{"use strict";ft()});import kh,{WebSocketServer as jh}from"ws";var hn=C(()=>{"use strict";ft()});import{createHash as Ha}from"crypto";function Ne(o,e){let t=Ha("md5").update(JSON.stringify(e||{})).digest("hex");return`${o}_${t}`}function Qe(o,e){let t=new Date(o).getTime();return Date.now()-t>e}function je(o){let e=Date.now(),t=new Date(o.timestamp).getTime();return!!(o.consumed&&e-t>6e4||e-t>o.ttl||o.status==="failed")}var De,Wt=C(()=>{"use strict";c(Ne,"generateCacheKey");c(Qe,"isCacheExpired");c(je,"shouldCleanupCache");De={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});var Bt,dn=C(()=>{"use strict";Wt();Bt=class{static{c(this,"CacheLifecycleManager")}logger;cleanupInterval;statistics;lastCleanupTime;constructor(e){this.logger=e,this.statistics=this.initializeStatistics(),this.lastCleanupTime=new Date().toISOString()}initializeStatistics(){return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0}}startAutoCleanup(){if(this.cleanupInterval){this.logger.warn("[CacheLifecycle] \u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\u5DF2\u7ECF\u5728\u8FD0\u884C");return}this.cleanupInterval=setInterval(()=>{this.performCleanup().catch(e=>{this.logger.error(`[CacheLifecycle] \u81EA\u52A8\u6E05\u7406\u5931\u8D25: ${e}`)})},De.CLEANUP_INTERVAL),this.logger.debug(`[CacheLifecycle] \u542F\u52A8\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${De.CLEANUP_INTERVAL}ms`)}stopAutoCleanup(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=void 0,this.logger.info("[CacheLifecycle] \u505C\u6B62\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668"))}createCacheEntry(e,t,r,s="pending",n){let i={result:r,timestamp:new Date().toISOString(),ttl:De.CACHE_TTL,status:s,consumed:!1,taskId:n,retryCount:0};return this.logger.debug(`[CacheLifecycle] \u521B\u5EFA\u7F13\u5B58\u6761\u76EE: ${e}, \u72B6\u6001: ${s}`),i}updateCacheStatus(e,t,r,s,n){if(!e.customMCPResults||!e.customMCPResults[t])return this.logger.warn(`[CacheLifecycle] \u7F13\u5B58\u6761\u76EE\u4E0D\u5B58\u5728: ${t}`),!1;let i=e.customMCPResults[t],a=i.status;return this.logStateTransition(t,a,r),i.status=r,i.timestamp=new Date().toISOString(),s&&(i.result=s),n&&r==="failed"&&(i.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},i.consumed=!0),r==="completed"&&(i.consumed=!1),this.logger.debug(`[CacheLifecycle] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${t} ${a} -> ${r}`),!0}markAsConsumed(e,t){if(!e.customMCPResults||!e.customMCPResults[t])return!1;let r=e.customMCPResults[t];return r.consumed?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u5DF2\u6807\u8BB0\u4E3A\u6D88\u8D39: ${t}`),!0):(r.consumed=!0,r.timestamp=new Date().toISOString(),this.logStateTransition(t,r.status,"consumed"),this.logger.debug(`[CacheLifecycle] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${t}`),!0)}isCacheAvailable(e,t){if(!e.customMCPResults||!e.customMCPResults[t])return!1;let r=e.customMCPResults[t];return Qe(r.timestamp,r.ttl)?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${t}`),!1):r.consumed?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u5DF2\u6D88\u8D39: ${t}`),!1):r.status!=="completed"?(this.logger.debug(`[CacheLifecycle] \u7F13\u5B58\u72B6\u6001\u672A\u5B8C\u6210: ${t}, \u72B6\u6001: ${r.status}`),!1):!0}async performCleanup(){try{this.logger.debug("[CacheLifecycle] \u6267\u884C\u7F13\u5B58\u6E05\u7406"),this.lastCleanupTime=new Date().toISOString()}catch(e){throw this.logger.error(`[CacheLifecycle] \u6E05\u7406\u5931\u8D25: ${e}`),e}}cleanupCacheEntries(e,t){if(!e.customMCPResults)return{cleaned:0,total:0};let r=Object.entries(e.customMCPResults),s=0,n=t||r.map(([i])=>i);for(let i of n){let a=e.customMCPResults[i];a&&je(a)&&(delete e.customMCPResults[i],s++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u7F13\u5B58\u6761\u76EE: ${i}`))}return this.logger.info(`[CacheLifecycle] \u6E05\u7406\u5B8C\u6210: ${s}/${n.length}`),{cleaned:s,total:n.length}}cleanupExpiredCache(e){if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[s,n]of t)Qe(n.timestamp,n.ttl)&&(delete e.customMCPResults[s],r++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58: ${s}`));return r>0&&this.logger.info(`[CacheLifecycle] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58: ${r}/${t.length}`),{cleaned:r,total:t.length}}cleanupConsumedCache(e){if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0,s=Date.now();for(let[n,i]of t)if(i.consumed){let a=new Date(i.timestamp).getTime();s-a>6e4&&(delete e.customMCPResults[n],r++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${n}`))}return r>0&&this.logger.info(`[CacheLifecycle] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}/${t.length}`),{cleaned:r,total:t.length}}updateStatistics(e){if(!e.customMCPResults){this.statistics=this.initializeStatistics();return}let t=Object.values(e.customMCPResults);this.statistics.totalEntries=t.length,this.statistics.pendingTasks=t.filter(n=>n.status==="pending").length,this.statistics.completedTasks=t.filter(n=>n.status==="completed").length,this.statistics.failedTasks=t.filter(n=>n.status==="failed").length,this.statistics.consumedEntries=t.filter(n=>n.consumed).length;let r=this.statistics.completedTasks,s=this.statistics.consumedEntries;this.statistics.cacheHitRate=r>0?s/r*100:0,this.statistics.lastCleanupTime=this.lastCleanupTime,this.statistics.memoryUsage=JSON.stringify(e.customMCPResults).length}getStatistics(){return{...this.statistics}}validateCacheIntegrity(e){let t=[];if(!e.customMCPResults)return{isValid:!0,issues:[]};for(let[r,s]of Object.entries(e.customMCPResults))(!s.timestamp||!s.ttl||!s.status)&&t.push(`\u7F13\u5B58\u6761\u76EE\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`),Number.isNaN(new Date(s.timestamp).getTime())&&t.push(`\u65E0\u6548\u7684\u65F6\u95F4\u6233\u683C\u5F0F: ${r}`),["pending","completed","failed"].includes(s.status)||t.push(`\u65E0\u6548\u7684\u72B6\u6001\u503C: ${r}, \u72B6\u6001: ${s.status}`),Qe(s.timestamp,s.ttl)&&t.push(`\u7F13\u5B58\u6761\u76EE\u5DF2\u8FC7\u671F: ${r}`);return{isValid:t.length===0,issues:t}}logStateTransition(e,t,r){let s={from:t,to:r,reason:this.getTransitionReason(t,r),timestamp:new Date().toISOString()};this.logger.debug(`[CacheLifecycle] \u72B6\u6001\u8F6C\u6362: ${e} ${t} -> ${r} (${s.reason})`)}getTransitionReason(e,t){return{"pending->completed":"\u4EFB\u52A1\u6267\u884C\u6210\u529F","pending->failed":"\u4EFB\u52A1\u6267\u884C\u5931\u8D25","completed->consumed":"\u7ED3\u679C\u88AB\u6D88\u8D39","failed->consumed":"\u5931\u8D25\u7ED3\u679C\u88AB\u5904\u7406","consumed->deleted":"\u7F13\u5B58\u88AB\u6E05\u7406"}[`${e}->${t}`]||"\u72B6\u6001\u66F4\u65B0"}cleanup(){this.stopAutoCleanup(),this.logger.info("[CacheLifecycle] \u6E05\u7406\u8D44\u6E90\u5B8C\u6210")}}});var qt,mn=C(()=>{"use strict";qt=class{static{c(this,"TaskStateManager")}logger;activeTasks;taskHistory;constructor(e){this.logger=e,this.activeTasks=new Map,this.taskHistory=[]}generateTaskId(e,t){let r=Date.now(),s=Math.random().toString(36).substring(2,11),n=`${e}_${r}_${s}`;return this.logger.debug(`[TaskState] \u751F\u6210\u4EFB\u52A1ID: ${n}`),n}validateTaskId(e){let r=/^[a-zA-Z0-9_-]+_\d+_[a-zA-Z0-9]+$/.test(e);return r||this.logger.warn(`[TaskState] \u65E0\u6548\u7684\u4EFB\u52A1ID\u683C\u5F0F: ${e}`),r}extractToolName(e){if(!this.validateTaskId(e))return null;let t=e.split("_");if(t.length<3)return null;let r=t.findIndex(n=>/^\d+$/.test(n));return r<=0?null:t.slice(0,r).join("_")}createTask(e,t,r,s="pending"){if(this.activeTasks.has(e))throw new Error(`\u4EFB\u52A1\u5DF2\u5B58\u5728: ${e}`);let n={taskId:e,toolName:t,arguments:r,status:s,startTime:new Date().toISOString()};return this.activeTasks.set(e,n),this.recordStateTransition(e,"none",s,"\u521B\u5EFA\u65B0\u4EFB\u52A1"),this.logger.info(`[TaskState] \u521B\u5EFA\u4EFB\u52A1: ${e}, \u5DE5\u5177: ${t}, \u72B6\u6001: ${s}`),n}updateTaskStatus(e,t,r,s){let n=this.activeTasks.get(e);if(!n)return this.logger.warn(`[TaskState] \u4EFB\u52A1\u4E0D\u5B58\u5728: ${e}`),!1;let i=n.status;return n.status=t,(t==="completed"||t==="failed")&&(n.endTime=new Date().toISOString()),r&&(n.result=r),s&&(n.error=s),this.recordStateTransition(e,i,t,this.getStatusChangeReason(i,t,s)),this.logger.info(`[TaskState] \u66F4\u65B0\u4EFB\u52A1\u72B6\u6001: ${e} ${i} -> ${t}`),!0}markTaskAsPending(e,t,r){let s=this.activeTasks.get(e);return s?this.updateTaskStatus(e,"pending"):s=this.createTask(e,t,r,"pending"),s}markTaskAsCompleted(e,t){return this.updateTaskStatus(e,"completed",t)}markTaskAsFailed(e,t){return this.updateTaskStatus(e,"failed",void 0,t)}markTaskAsConsumed(e){return this.updateTaskStatus(e,"consumed")}getTask(e){return this.activeTasks.get(e)||null}hasTask(e){return this.activeTasks.has(e)}getTaskStatus(e){let t=this.activeTasks.get(e);return t?t.status:null}getTasksByStatus(e){return Array.from(this.activeTasks.values()).filter(t=>t.status===e)}getTasksByTool(e){return Array.from(this.activeTasks.values()).filter(t=>t.toolName===e)}getTaskExecutionTime(e){let t=this.activeTasks.get(e);if(!t||!t.endTime)return null;let r=new Date(t.startTime).getTime();return new Date(t.endTime).getTime()-r}isTaskTimeout(e,t=8e3){let r=this.activeTasks.get(e);if(!r)return!1;let s=new Date(r.startTime).getTime();return Date.now()-s>t}getTimeoutTasks(e=8e3){let t=Date.now();return Array.from(this.activeTasks.values()).filter(r=>{let s=new Date(r.startTime).getTime();return t-s>e&&r.status==="pending"})}removeTask(e){let t=this.activeTasks.get(e);return t?(this.recordStateTransition(e,t.status,"deleted","\u4EFB\u52A1\u88AB\u79FB\u9664"),this.activeTasks.delete(e),this.logger.info(`[TaskState] \u79FB\u9664\u4EFB\u52A1: ${e}`),!0):!1}cleanupCompletedTasks(e=3e5){let t=Date.now(),r=0;for(let[s,n]of this.activeTasks.entries())if(n.status==="completed"||n.status==="failed"){let i=n.endTime?new Date(n.endTime).getTime():t;t-i>e&&(this.removeTask(s),r++)}return r>0&&this.logger.info(`[TaskState] \u6E05\u7406\u5DF2\u5B8C\u6210\u4EFB\u52A1: ${r}\u4E2A`),r}getTaskStatistics(){let e=Array.from(this.activeTasks.values()),t=e.length,r=e.filter(g=>g.status==="pending").length,s=e.filter(g=>g.status==="completed").length,n=e.filter(g=>g.status==="failed").length,i=e.filter(g=>g.status==="consumed").length,a=e.filter(g=>g.status==="completed"&&g.endTime),l=a.length>0?a.reduce((g,u)=>{let p=this.getTaskExecutionTime(u.taskId)||0;return g+p},0)/a.length:0;return{total:t,pending:r,completed:s,failed:n,consumed:i,averageExecutionTime:l}}getTaskHistory(e){return e?this.taskHistory.filter(t=>t.taskId===e):[...this.taskHistory]}recordStateTransition(e,t,r,s){let n={from:t,to:r,reason:s,timestamp:new Date().toISOString(),taskId:e};this.taskHistory.push(n),this.taskHistory.length>1e3&&(this.taskHistory=this.taskHistory.slice(-500))}getStatusChangeReason(e,t,r){if(r)return`\u6267\u884C\u5931\u8D25: ${r}`;let s={"none->pending":"\u4EFB\u52A1\u5F00\u59CB\u6267\u884C","pending->completed":"\u4EFB\u52A1\u6267\u884C\u6210\u529F","pending->failed":"\u4EFB\u52A1\u6267\u884C\u5931\u8D25","completed->consumed":"\u7ED3\u679C\u88AB\u6D88\u8D39","failed->consumed":"\u5931\u8D25\u7ED3\u679C\u88AB\u5904\u7406","consumed->deleted":"\u4EFB\u52A1\u88AB\u6E05\u7406"},n=`${e}->${t}`;return s[n]||"\u72B6\u6001\u66F4\u65B0"}validateTaskIntegrity(){let e=[];for(let[t,r]of this.activeTasks.entries())(!r.taskId||!r.toolName||!r.status||!r.startTime)&&e.push(`\u4EFB\u52A1\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${t}`),Number.isNaN(new Date(r.startTime).getTime())&&e.push(`\u65E0\u6548\u7684\u5F00\u59CB\u65F6\u95F4: ${t}`),r.endTime&&Number.isNaN(new Date(r.endTime).getTime())&&e.push(`\u65E0\u6548\u7684\u7ED3\u675F\u65F6\u95F4: ${t}`),r.status==="completed"&&!r.endTime&&e.push(`\u5DF2\u5B8C\u6210\u4EFB\u52A1\u7F3A\u5C11\u7ED3\u675F\u65F6\u95F4: ${t}`),r.status==="failed"&&!r.error&&e.push(`\u5931\u8D25\u4EFB\u52A1\u7F3A\u5C11\u9519\u8BEF\u4FE1\u606F: ${t}`);return{isValid:e.length===0,issues:e}}restartStalledTasks(e=3e4){let t=this.getTimeoutTasks(e),r=0;for(let s of t){this.logger.warn(`[TaskState] \u68C0\u6D4B\u5230\u505C\u6EDE\u4EFB\u52A1: ${s.taskId}`),this.markTaskAsFailed(s.taskId,"\u4EFB\u52A1\u6267\u884C\u8D85\u65F6");let n=this.generateTaskId(s.toolName,s.arguments);this.createTask(n,s.toolName,s.arguments,"pending"),r++}return r>0&&this.logger.info(`[TaskState] \u91CD\u542F\u505C\u6EDE\u4EFB\u52A1: ${r}\u4E2A`),r}cleanup(){this.activeTasks.clear(),this.taskHistory=[],this.logger.info("[TaskState] \u6E05\u7406\u4EFB\u52A1\u72B6\u6001\u7BA1\u7406\u5668\u8D44\u6E90")}}});function fn(o,e){return{content:[{type:"text",text:e?za(e,o):Cn(o)}],isError:!1,taskId:o,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 za(o,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
16
16
 
17
17
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
18
18
  - \u4EFB\u52A1ID: ${e}
@@ -33,12 +33,12 @@ data: /messages?sessionId=${s}
33
33
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
34
34
  1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
35
35
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
36
- 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var St,vn=C(()=>{"use strict";St=class o extends Error{static{c(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,o)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};c(fn,"createTimeoutResponse");c(za,"getToolSpecificTimeoutMessage");c(Cn,"getDefaultTimeoutMessage")});import{createHash as Ua}from"crypto";import{existsSync as Et,mkdirSync as Fa,readFileSync as Sn,renameSync as Va,writeFileSync as En}from"fs";import{dirname as Wa,resolve as yn}from"path";import Ba from"dayjs";var Ie,Gt=C(()=>{"use strict";P();Wt();Ie=class{static{c(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION="1.0.0";CACHE_ENTRY_VERSION="1.0.0";cleanupInterval;CLEANUP_INTERVAL=6e4;constructor(e){this.logger=p,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ba().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return yn(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return yn(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!Et(this.cachePath)){let e=Wa(this.cachePath);Et(e)||(Fa(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 s=await this.loadExistingCache(),n=this.generateConfigHash(r),i={tools:t.map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:n,version:this.CACHE_ENTRY_VERSION};s.mcpServers[e]=i,s.metadata.lastGlobalUpdate=this.formatTimestamp(),s.metadata.totalWrites+=1,await this.saveCache(s),this.logger.info(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(s){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)}}async loadExistingCache(){try{if(!Et(this.cachePath))return await this.createInitialCache();let e=Sn(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{En(r,t,"utf8"),Va(r,e)}catch(s){try{Et(r)&&En(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return Ua("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{return e&&typeof e=="object"&&typeof e.version=="string"&&typeof e.mcpServers=="object"&&e.metadata&&typeof e.metadata=="object"&&typeof e.metadata.lastGlobalUpdate=="string"&&typeof e.metadata.totalWrites=="number"&&typeof e.metadata.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:Et(this.cachePath)?Sn(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,s]of Object.entries(e.mcpServers))for(let n of s.tools)t.push({...n,name:`${r}__${n.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,s="completed",n,i=3e5){try{let a=await this.loadExtendedCache(),l=Ne(e,t),g={result:r,timestamp:new Date().toISOString(),ttl:i,status:s,consumed:!1,taskId:n,retryCount:0};a.customMCPResults||(a.customMCPResults={}),a.customMCPResults[l]=g,await this.saveExtendedCache(a),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${s}`)}catch(a){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),s=Ne(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return null;let n=r.customMCPResults[s],i=Date.now(),a=new Date(n.timestamp).getTime();return i-a>n.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):n}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,s,n){try{let i=await this.loadExtendedCache(),a=Ne(e,t);if(!i.customMCPResults||!i.customMCPResults[a])return!1;let l=i.customMCPResults[a],g=l.status;return l.status=r,l.timestamp=new Date().toISOString(),s&&(l.result=s),n&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},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(),s=Ne(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return!1;let n=r.customMCPResults[s];return n.consumed||(n.consumed=!0,n.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(),s=Ne(e,t);return!r.customMCPResults||!r.customMCPResults[s]?!1:(delete r.customMCPResults[s],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[s,n]of t)je(n)&&(delete e.customMCPResults[s],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,s=t.filter(u=>u.status==="pending").length,n=t.filter(u=>u.status==="completed").length,i=t.filter(u=>u.status==="failed").length,a=t.filter(u=>u.consumed).length,l=n>0?a/n*100:0,g=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:s,completedTasks:n,failedTasks:i,consumedEntries:a,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 Xt,Tn=C(()=>{"use strict";P();se();dn();mn();Wt();vn();z();Gt();Xt=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;cacheLifecycleManager;taskStateManager;mcpServiceManager;TIMEOUT=De.TIMEOUT;CACHE_TTL=De.CACHE_TTL;CLEANUP_INTERVAL=De.CLEANUP_INTERVAL;cleanupTimer;activeTasks=new Map;eventBus=w();constructor(e,t){this.logger=p,this.cacheManager=e||new Ie,this.mcpServiceManager=t,this.cacheLifecycleManager=new Bt(this.logger),this.taskStateManager=new qt(this.logger),this.startCleanupTimer(),this.cacheLifecycleManager.startAutoCleanup(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",async e=>{await this.handleConfigUpdated(e)})}async handleConfigUpdated(e){this.logger.info("[CustomMCP] \u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u662F\u5426\u9700\u8981\u91CD\u65B0\u521D\u59CB\u5316");try{e.type==="customMCP"?(this.logger.info("[CustomMCP] customMCP \u914D\u7F6E\u5DF2\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316\u5904\u7406\u5668"),await this.reinitialize()):e.type==="serverTools"&&(this.logger.info("[CustomMCP] serverTools \u914D\u7F6E\u5DF2\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316\u5904\u7406\u5668"),await this.reinitialize())}catch(t){this.logger.error("[CustomMCP] \u914D\u7F6E\u66F4\u65B0\u5904\u7406\u5931\u8D25:",t)}}async reinitialize(){try{this.logger.info("[CustomMCP] \u5F00\u59CB\u91CD\u65B0\u521D\u59CB\u5316\u5904\u7406\u5668"),this.tools.clear();let e=d.getCustomMCPTools();for(let t of e)this.tools.set(t.name,t),this.logger.info(`[CustomMCP] \u91CD\u65B0\u52A0\u8F7D\u5DE5\u5177: ${t.name} (${t.handler.type})`);this.logger.info(`[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A\u5DE5\u5177`)}catch(e){throw this.logger.error("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25:",e),e}}initialize(e){this.logger.info("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||d.getCustomMCPTools();this.tools.clear();for(let r of t)this.tools.set(r.name,r),this.logger.info(`[CustomMCP] \u5DF2\u52A0\u8F7D\u5DE5\u5177: ${r.name} (${r.handler.type})`);this.logger.info(`[CustomMCP] \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A\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:e.inputSchema}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}async callTool(e,t,r){let s=this.tools.get(e);if(!s)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);this.logger.info(`[CustomMCP] \u8C03\u7528\u5DE5\u5177: ${e}`,{handler:s.handler.type,arguments:t});let n=await this.getCompletedResult(e,t);if(n)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),n;try{let i=await Promise.race([this.executeToolWithBackgroundProcessing(e,t),this.createTimeoutPromise(e,t)]);return await this.cacheResult(e,t,i),i}catch(i){if(i instanceof St){let a=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${a}`),fn(a,e)}throw i}}async executeToolWithBackgroundProcessing(e,t){let r=this.tools.get(e);if(!r)throw new Error(`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`);let s=await this.generateTaskId(e,t);await this.markTaskAsPending(s,e,t);try{let n=await this.callToolByType(r,t);return await this.markTaskAsCompleted(s,n),n}catch(n){throw await this.markTaskAsFailed(s,n),n}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new St(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},this.TIMEOUT)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(!s.customMCPResults||!s.customMCPResults[r])return null;let n=s.customMCPResults[r];return n.status==="completed"&&!n.consumed&&!Qe(n.timestamp,n.ttl)?n.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}async callToolByType(e,t){switch(e.handler.type){case"proxy":return await this.callProxyTool(e,t);case"function":return await this.callFunctionTool(e,t);case"http":return await this.callHttpTool(e,t);case"script":return await this.callScriptTool(e,t);case"chain":return await this.callChainTool(e,t);case"mcp":try{return await this.forwardToMCPServiceManager(e,t)}catch(r){this.logger.error(`[CustomMCP] MCP \u7C7B\u578B\u5DE5\u5177\u8DEF\u7531\u5931\u8D25: ${e.name}`,r);let s=r instanceof Error?r.message:"MCP \u7C7B\u578B\u5DE5\u5177\u8DEF\u7531\u9519\u8BEF";return{content:[{type:"text",text:s.includes("MCPServiceManager \u672A\u521D\u59CB\u5316")?s:"\u5185\u90E8\u9519\u8BEF\uFF1AMCP \u7C7B\u578B\u5DE5\u5177\u8DEF\u7531\u9519\u8BEF"}],isError:!0}}default:throw new Error(`\u4E0D\u652F\u6301\u7684\u5904\u7406\u5668\u7C7B\u578B: ${e.handler.type}`)}}async forwardToMCPServiceManager(e,t){if(!this.mcpServiceManager)throw this.logger.error(`[CustomMCP] MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u65E0\u6CD5\u8F6C\u53D1\u5DE5\u5177 ${e.name} \u7684\u8C03\u7528`),new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");let r=e.handler;this.logger.info(`[CustomMCP] \u8F6C\u53D1MCP\u5DE5\u5177\u8C03\u7528: ${e.name}`,{serviceName:r.config.serviceName,toolName:r.config.toolName});try{let s=await this.mcpServiceManager.callTool(r.config.toolName,t);return this.logger.info(`[CustomMCP] MCP\u5DE5\u5177\u8F6C\u53D1\u6210\u529F: ${e.name}`),s}catch(s){return this.logger.error(`[CustomMCP] MCP\u5DE5\u5177\u8F6C\u53D1\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`MCP\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async callProxyTool(e,t){let r=e.handler;if(this.logger.info(`[CustomMCP] \u8C03\u7528\u4EE3\u7406\u5DE5\u5177: ${e.name}`,{platform:r.platform,config:r.config}),r.platform==="coze")return await this.callCozeWorkflow(e,t);throw new Error(`\u4E0D\u652F\u6301\u7684\u4EE3\u7406\u5E73\u53F0: ${r.platform}`)}async callCozeWorkflow(e,t){let s=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:s.workflow_id,bot_id:s.bot_id});try{let n=this.buildCozeRequest(s,t),i=await this.sendCozeRequest(s,n);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`,{response:i}),this.processCozeResponse(e.name,i)}catch(n){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,n),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`}],isError:!0}}}buildCozeRequest(e,t){return{workflow_id:e.workflow_id,parameters:{...t}}}async sendCozeRequest(e,t){let r=e.base_url||"https://api.coze.cn",s="",n=d.getConfig().platforms?.coze?.token;if(!n)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");if(e.workflow_id)s="/v1/workflow/run",t.workflow_id=e.workflow_id;else if(e.bot_id)s="/v3/chat",t.bot_id=e.bot_id;else throw new Error("Coze \u914D\u7F6E\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id");let i=`${r}${s}`,a=e.timeout||3e5,l={"Content-Type":"application/json",Authorization:`Bearer ${n}`,...e.headers};this.logger.debug(`[CustomMCP] \u53D1\u9001 Coze \u8BF7\u6C42\u5230: ${i}`,{headers:{...l},body:t});let g=new AbortController,u=setTimeout(()=>g.abort(),a);try{let h=await fetch(i,{method:"POST",headers:l,body:JSON.stringify(t)});if(clearTimeout(u),!h.ok){let m=await h.text();throw new Error(`Coze API \u8BF7\u6C42\u5931\u8D25 (${h.status}): ${m}`)}let f=await h.json();return this.logger.debug("[CustomMCP] Coze API \u54CD\u5E94:",f),f}catch(h){throw clearTimeout(u),h instanceof Error&&h.name==="AbortError"?new Error(`Coze API \u8BF7\u6C42\u8D85\u65F6 (${a}ms)`):h}}processCozeResponse(e,t){try{return t.data?{content:[{type:"text",text:t.data}],isError:!1}:{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406 Coze \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 callFunctionTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528\u51FD\u6570\u5DE5\u5177: ${e.name}`,{module:r.module,function:r.function});try{let s=await this.loadModule(r.module),n=this.getFunction(s,r.function),i=await this.executeFunction(n,t,r);return{content:[{type:"text",text:typeof i=="string"?i:JSON.stringify(i,null,2)}],isError:!1}}catch(s){return this.logger.error(`[CustomMCP] \u51FD\u6570\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`\u51FD\u6570\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async loadModule(e){try{let t=e;return!e.startsWith("/")&&!e.startsWith("file://")&&(t=new URL(e,`file://${process.cwd()}/`).href),this.logger.debug(`[CustomMCP] \u52A0\u8F7D\u6A21\u5757: ${t}`),await import(t)}catch(t){throw new Error(`\u65E0\u6CD5\u52A0\u8F7D\u6A21\u5757 ${e}: ${t instanceof Error?t.message:String(t)}`)}}getFunction(e,t){let r;if(e.default&&typeof e.default=="function"&&(t==="default"?r=e.default:e.default[t]&&typeof e.default[t]=="function"&&(r=e.default[t])),!r&&e[t]&&typeof e[t]=="function"&&(r=e[t]),!r)throw new Error(`\u5728\u6A21\u5757\u4E2D\u627E\u4E0D\u5230\u51FD\u6570: ${t}`);return r}async executeFunction(e,t,r){let s=r.timeout||3e4,n={...r.context,logger:this.logger,arguments:t},i=Promise.resolve().then(()=>e.length>1?e(t,n):e(t)),a=new Promise((l,g)=>{setTimeout(()=>g(new Error(`\u51FD\u6570\u6267\u884C\u8D85\u65F6 (${s}ms)`)),s)});return Promise.race([i,a])}async callHttpTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528 HTTP \u5DE5\u5177: ${e.name}`,{url:r.url,method:r.method||"POST"});try{let{url:s,requestOptions:n}=this.buildHttpRequest(r,t),i=await this.sendHttpRequest(s,n,r);return this.processHttpResponse(e.name,i,r)}catch(s){return this.logger.error(`[CustomMCP] HTTP \u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`HTTP \u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}buildHttpRequest(e,t){let r=e.method||"POST",s={"Content-Type":"application/json","User-Agent":"xiaozhi-client/1.0",...e.headers};if(e.auth)switch(e.auth.type){case"bearer":e.auth.token&&(s.Authorization=`Bearer ${e.auth.token}`);break;case"basic":if(e.auth.username&&e.auth.password){let l=btoa(`${e.auth.username}:${e.auth.password}`);s.Authorization=`Basic ${l}`}break;case"api_key":e.auth.api_key&&e.auth.api_key_header&&(s[e.auth.api_key_header]=e.auth.api_key);break}let n,i=e.url;if(r!=="GET")e.body_template?n=this.replaceTemplateVariables(e.body_template,t):n=JSON.stringify(t);else{let l=new URLSearchParams;for(let[u,h]of Object.entries(t))h!=null&&l.append(u,String(h));let g=l.toString();g&&(i+=(i.includes("?")?"&":"?")+g)}return{url:i,requestOptions:{method:r,headers:s,body:n}}}async sendHttpRequest(e,t,r){let s=r.timeout||3e4,n=r.retry_count||0,i=r.retry_delay||1e3,a=null;for(let l=0;l<=n;l++){try{this.logger.debug(`[CustomMCP] \u53D1\u9001 HTTP \u8BF7\u6C42 (\u5C1D\u8BD5 ${l+1}/${n+1}): ${e}`,{method:t.method,headers:t.headers});let g=new AbortController,u=setTimeout(()=>g.abort(),s),h=await fetch(e,{...t,signal:g.signal});if(clearTimeout(u),h.ok||l===n)return h;this.logger.warn(`[CustomMCP] HTTP \u8BF7\u6C42\u5931\u8D25 (${h.status}), \u5C06\u5728 ${i}ms \u540E\u91CD\u8BD5`),a=new Error(`HTTP \u8BF7\u6C42\u5931\u8D25: ${h.status} ${h.statusText}`)}catch(g){if(a=g instanceof Error?g:new Error(String(g)),g instanceof Error&&g.name==="AbortError"&&(a=new Error(`HTTP \u8BF7\u6C42\u8D85\u65F6 (${s}ms)`)),this.logger.warn(`[CustomMCP] HTTP \u8BF7\u6C42\u5F02\u5E38 (\u5C1D\u8BD5 ${l+1}/${n+1}):`,a.message),l===n)throw a}l<n&&await new Promise(g=>setTimeout(g,i))}throw a||new Error("HTTP \u8BF7\u6C42\u5931\u8D25")}async processHttpResponse(e,t,r){try{let s=t.headers.get("content-type")||"",n;if(s.includes("application/json")?n=await t.json():n=await t.text(),!t.ok)return{content:[{type:"text",text:`HTTP \u8BF7\u6C42\u5931\u8D25 (${t.status}): ${typeof n=="string"?n:JSON.stringify(n)}`}],isError:!0};let i=n;return r.response_mapping&&(i=this.extractResponseData(n,r.response_mapping)),{content:[{type:"text",text:typeof i=="string"?i:JSON.stringify(i,null,2)}],isError:!1}}catch(s){return this.logger.error(`[CustomMCP] \u5904\u7406 HTTP \u54CD\u5E94\u5931\u8D25: ${e}`,s),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}replaceTemplateVariables(e,t){let r=e;for(let[s,n]of Object.entries(t)){let i=`{{${s}}}`,a=typeof n=="string"?n:JSON.stringify(n);r=r.replace(new RegExp(i.replace(/[{}]/g,"\\$&"),"g"),a)}return r}extractResponseData(e,t){if(!t)return e;let r=c((s,n)=>{if(!n)return s;let i=n.split("."),a=s;for(let l of i)if(a&&typeof a=="object"&&l in a)a=a[l];else return;return a},"extractByPath");if(t.success_path){let s=r(e,t.success_path);if(s!==void 0)return t.data_path?r(s,t.data_path):s}if(t.data_path){let s=r(e,t.data_path);if(s!==void 0)return s}return e}async callScriptTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528\u811A\u672C\u5DE5\u5177: ${e.name}`,{script:r.script.substring(0,100)+(r.script.length>100?"...":""),interpreter:r.interpreter||"node"});try{let s=await this.executeScript(r,t);return{content:[{type:"text",text:typeof s=="string"?s:JSON.stringify(s,null,2)}],isError:!1}}catch(s){return this.logger.error(`[CustomMCP] \u811A\u672C\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`\u811A\u672C\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async executeScript(e,t){let{spawn:r}=await import("child_process"),{promisify:s}=await import("util"),n=await import("fs/promises"),i=await import("path"),a=await import("os"),l=e.timeout||3e4,g=e.interpreter||"node",u,h=!1;try{if(e.script.includes(`
37
- `)||e.script.length>200){let A=await n.mkdtemp(i.join(a.tmpdir(),"xiaozhi-script-")),ie=this.getScriptExtension(g);u=i.join(A,`script${ie}`),await n.writeFile(u,e.script,"utf8"),h=!0}else{u=e.script;try{await n.access(u)}catch{throw new Error(`\u811A\u672C\u6587\u4EF6\u4E0D\u5B58\u5728: ${u}`)}}let f={...process.env,...e.env,XIAOZHI_ARGUMENTS:JSON.stringify(t)},m=this.buildScriptCommand(g,u);return this.logger.debug(`[CustomMCP] \u6267\u884C\u811A\u672C\u547D\u4EE4: ${m.join(" ")}`),new Promise((A,ie)=>{let te=r(m[0],m.slice(1),{env:f,stdio:["pipe","pipe","pipe"]}),Nt="",j="";te.stdout?.on("data",me=>{Nt+=me.toString()}),te.stderr?.on("data",me=>{j+=me.toString()});let Dt=setTimeout(()=>{te.kill("SIGTERM"),ie(new Error(`\u811A\u672C\u6267\u884C\u8D85\u65F6 (${l}ms)`))},l);te.on("close",me=>{clearTimeout(Dt),me===0?A(Nt.trim()):ie(new Error(`\u811A\u672C\u6267\u884C\u5931\u8D25 (\u9000\u51FA\u7801: ${me}): ${j.trim()}`))}),te.on("error",me=>{clearTimeout(Dt),ie(new Error(`\u811A\u672C\u6267\u884C\u9519\u8BEF: ${me.message}`))}),t&&Object.keys(t).length>0&&(te.stdin?.write(JSON.stringify(t)),te.stdin?.end())})}finally{if(h&&u)try{await n.unlink(u),await n.rmdir(i.dirname(u))}catch{}}}getScriptExtension(e){switch(e){case"node":return".js";case"python":return".py";case"bash":return".sh";default:return".txt"}}buildScriptCommand(e,t){switch(e){case"node":return["node",t];case"python":return["python3",t];case"bash":return["bash",t];default:throw new Error(`\u4E0D\u652F\u6301\u7684\u811A\u672C\u89E3\u91CA\u5668: ${e}`)}}async callChainTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528\u94FE\u5F0F\u5DE5\u5177: ${e.name}`,{tools:r.tools,mode:r.mode,error_handling:r.error_handling});try{let s;r.mode==="sequential"?s=await this.executeSequentialChain(r,t):s=await this.executeParallelChain(r,t);let n=s.flatMap(a=>a.content),i=s.some(a=>a.isError);return{content:n,isError:i}}catch(s){return this.logger.error(`[CustomMCP] \u94FE\u5F0F\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`\u94FE\u5F0F\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}delay(e){return new Promise(t=>setTimeout(t,e))}getToolInfo(e){return this.tools.get(e)}async executeSequentialChain(e,t){let r=[],s=t;for(let n of e.tools)try{this.logger.debug(`[CustomMCP] \u6267\u884C\u94FE\u5F0F\u5DE5\u5177\u4E2D\u7684: ${n}`);let i=await this.callToolRecursive(n,s);if(r.push(i),i.isError){if(e.error_handling==="stop")break;if(e.error_handling==="retry"){this.logger.warn(`[CustomMCP] \u5DE5\u5177 ${n} \u6267\u884C\u5931\u8D25\uFF0C\u5C1D\u8BD5\u91CD\u8BD5`);let a=await this.callToolRecursive(n,s);if(r[r.length-1]=a,a.isError)break}}if(!i.isError&&i.content.length>0){let a=i.content.filter(l=>l.type==="text").map(l=>l.text).join(`
38
- `);if(a)try{s=JSON.parse(a)}catch{s={input:a,...t}}}}catch(i){let a={content:[{type:"text",text:`\u5DE5\u5177 ${n} \u6267\u884C\u5F02\u5E38: ${i instanceof Error?i.message:String(i)}`}],isError:!0};if(r.push(a),e.error_handling==="stop")break}return r}async executeParallelChain(e,t){let r=e.tools.map(async s=>{try{return this.logger.debug(`[CustomMCP] \u5E76\u884C\u6267\u884C\u94FE\u5F0F\u5DE5\u5177\u4E2D\u7684: ${s}`),await this.callToolRecursive(s,t)}catch(n){return{content:[{type:"text",text:`\u5DE5\u5177 ${s} \u6267\u884C\u5F02\u5E38: ${n instanceof Error?n.message:String(n)}`}],isError:!0}}});return Promise.all(r)}async callToolRecursive(e,t){if(this.tools.get(e))return this.callTool(e,t);throw new Error(`\u94FE\u5F0F\u5DE5\u5177\u4E2D\u5F15\u7528\u7684\u5DE5\u5177 ${e} \u4E0D\u5B58\u5728\u4E8E\u5F53\u524D CustomMCP \u5DE5\u5177\u96C6\u4E2D`)}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(s.customMCPResults?.[r]){s.customMCPResults[r].consumed=!0;let n=s.customMCPResults[r];je(n)&&delete s.customMCPResults[r],await this.saveCache(s),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 this.taskStateManager.generateTaskId(e,t)}async markTaskAsPending(e,t,r){try{let s=this.generateCacheKey(t,r),n={result:{content:[{type:"text",text:"\u5904\u7406\u4E2D..."}]},timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"pending",consumed:!1,taskId:e,retryCount:0};await this.updateCacheWithResult(s,n),this.taskStateManager.markTaskAsPending(e,t,r),this.activeTasks.set(e,{taskId:e,status:"pending",startTime:Date.now()}),this.logger.debug(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u4E3A\u5904\u7406\u4E2D: ${e}`)}catch(s){this.logger.warn(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: ${s}`)}}async markTaskAsCompleted(e,t){try{let r=this.activeTasks.get(e);r&&(r.status="completed",r.endTime=new Date().toISOString(),r.result=t);let s=await this.loadExtendedCache();for(let[n,i]of Object.entries(s.customMCPResults||{}))if(i.taskId===e){i.status="completed",i.result=t,i.timestamp=new Date().toISOString(),i.consumed=!1;break}await this.saveCache(s),this.taskStateManager.markTaskAsCompleted(e,t),this.logger.debug(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u4E3A\u5DF2\u5B8C\u6210: ${e}`)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: ${r}`)}}async markTaskAsFailed(e,t){try{let r=await this.loadExtendedCache();for(let[n,i]of Object.entries(r.customMCPResults||{}))if(i.taskId===e){i.status="failed",i.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${t.message}`}]},i.timestamp=new Date().toISOString(),i.consumed=!0;break}await this.saveCache(r),this.taskStateManager.markTaskAsFailed(e,t.message);let s=this.activeTasks.get(e);s&&(s.status="failed",s.endTime=new Date().toISOString(),s.error=t.message),this.logger.debug(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u4E3A\u5931\u8D25: ${e}`)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: ${r}`)}}startCleanupTimer(){this.cleanupTimer=setInterval(()=>{this.cleanupExpiredCache().catch(e=>{this.logger.warn(`[CustomMCP] \u7F13\u5B58\u6E05\u7406\u5931\u8D25: ${e}`)})},this.CLEANUP_INTERVAL),this.logger.info(`[CustomMCP] \u542F\u52A8\u7F13\u5B58\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${this.CLEANUP_INTERVAL}ms`)}async cleanupExpiredCache(){try{let e=await this.loadExtendedCache(),t=!1,r=0;for(let[s,n]of Object.entries(e.customMCPResults||{}))je(n)&&(e.customMCPResults?.[s]&&delete e.customMCPResults[s],t=!0,r++,n.taskId&&this.activeTasks.delete(n.taskId));t&&(await this.saveCache(e),this.logger.debug(`[CustomMCP] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58\u5B8C\u6210\uFF0C\u6E05\u7406\u4E86 ${r} \u4E2A\u6761\u76EE`))}catch(e){this.logger.warn(`[CustomMCP] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58\u5931\u8D25: ${e}`)}}generateCacheKey(e,t){return Ne(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 s=this.generateCacheKey(e,t),n={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(s,n),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(s){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${s}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}stopCleanupTimer(){this.cleanupTimer&&(clearInterval(this.cleanupTimer),this.cleanupTimer=void 0,this.logger.info("[CustomMCP] \u505C\u6B62\u7F13\u5B58\u6E05\u7406\u5B9A\u65F6\u5668"))}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.stopCleanupTimer(),this.cacheLifecycleManager.stopAutoCleanup(),this.cacheLifecycleManager.cleanup(),this.taskStateManager.cleanup(),this.cacheManager.cleanup(),this.tools.clear(),this.activeTasks.clear()}getCacheLifecycleManager(){return this.cacheLifecycleManager}getTaskStateManager(){return this.taskStateManager}async getCacheStatistics(){return this.cacheManager.getCustomMCPStatistics()}getTaskStatistics(){return this.taskStateManager.getTaskStatistics()}getTaskStatus(e){return this.taskStateManager.getTaskStatus(e)}validateTaskId(e){return this.taskStateManager.validateTaskId(e)}restartStalledTasks(e=3e4){return this.taskStateManager.restartStalledTasks(e)}async manualCleanupCache(){return this.cacheManager.cleanupCustomMCPResults()}async validateSystemIntegrity(){let e=await this.cacheManager.loadExtendedCache(),t=this.cacheLifecycleManager.validateCacheIntegrity(e),r=this.taskStateManager.validateTaskIntegrity();return{cacheValid:t.isValid,taskValid:r.isValid,issues:[...t.issues,...r.issues]}}}});import{SSEClientTransport as qa}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Ga}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Xa}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as Ja}from"eventsource";function Ka(){return p}function Ya(o){switch(Ka().info(`[TransportFactory] \u521B\u5EFA ${o.type} transport for ${o.name}`),o.type){case"stdio":return Za(o);case"sse":return Qa(o);case"streamable-http":return ec(o);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}function Za(o){if(!o.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new Ga({command:o.command,args:o.args||[],env:o.env})}function Qa(o){if(!o.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(o.url),t=tc(o);return new qa(e,t)}function ec(o){if(!o.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(o.url),t=rc(o);return new Xa(e,t)}function tc(o){let e={};return o.apiKey?e.headers={Authorization:`Bearer ${o.apiKey}`,...o.headers}:o.headers&&(e.headers=o.headers),e}function rc(o){let e={};return o.apiKey?e.headers={Authorization:`Bearer ${o.apiKey}`,...o.headers}:o.headers&&(e.headers=o.headers),e}function sc(o){if(!o.name||typeof o.name!="string")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(o.type&&!Object.values(et).includes(o.type))throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`);if(!o.type)throw new Error("\u4F20\u8F93\u7C7B\u578B\u672A\u8BBE\u7F6E\uFF0C\u8FD9\u5E94\u8BE5\u5728 inferTransportType \u4E2D\u5904\u7406");switch(o.type){case"stdio":if(!o.command)throw new Error("stdio \u7C7B\u578B\u9700\u8981 command \u5B57\u6BB5");break;case"sse":if(o.url===void 0||o.url===null)throw new Error(`${o.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;case"streamable-http":if(o.url===void 0||o.url===null)throw new Error(`${o.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}function nc(){return["stdio","sse","streamable-http"]}var ts,Mn=C(()=>{"use strict";P();Jt();typeof global<"u"&&!global.EventSource&&(global.EventSource=Ja);c(Ka,"getLogger");c(Ya,"createTransport");c(Za,"createStdioTransport");c(Qa,"createSSETransport");c(ec,"createStreamableHTTPTransport");c(tc,"createSSEOptions");c(rc,"createStreamableHTTPOptions");c(sc,"validateConfig");c(nc,"getSupportedTypes");ts={create:Ya,validateConfig:sc,getSupportedTypes:nc}});import{Client as oc}from"@modelcontextprotocol/sdk/client/index.js";var et,Kt,Jt=C(()=>{"use strict";P();z();Mn();et=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(et||{}),Kt=class{static{c(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";reconnectOptions;reconnectState;logger;connectionTimeout=null;initialized=!1;eventBus=w();pingOptions;pingTimer=null;pingFailureCount=0;lastPingTime=null;isPinging=!1;constructor(e,t){this.logger=p;let r=this.inferTransportType(e);this.config=r,this.validateConfig(),this.reconnectOptions={enabled:!0,maxAttempts:10,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0,...t?.reconnect,...e.reconnect},this.pingOptions={enabled:!0,interval:3e4,timeout:5e3,maxFailures:3,startDelay:5e3,...e.ping},this.reconnectState={attempts:0,nextInterval:this.reconnectOptions.initialInterval,timer:null,lastError:null,isManualDisconnect:!1}}logWithTag(e,t,...r){let s=`[MCP-${this.config.name}] ${t}`;this.logger[e](s,...r)}inferTransportType(e){if(e.type)return e;this.logger.debug(`[MCP-${e.name}] \u81EA\u52A8\u63A8\u65AD\u4F20\u8F93\u7C7B\u578B...`);let t;if(e.command)t="stdio",this.logger.debug(`[MCP-${e.name}] \u68C0\u6D4B\u5230 command \u5B57\u6BB5\uFF0C\u63A8\u65AD\u4E3A stdio \u7C7B\u578B`);else if(e.url!==void 0&&e.url!==null)t=this.inferTransportTypeFromUrl(e.url,e.name);else throw new Error(`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${e.name} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`);return{type:t,...e}}inferTransportTypeFromUrl(e,t){try{let s=new URL(e).pathname;return s.endsWith("/sse")?(this.logger.info(`[MCP-${t}] \u68C0\u6D4B\u5230 URL \u8DEF\u5F84\u4EE5 /sse \u7ED3\u5C3E\uFF0C\u63A8\u65AD\u4E3A sse \u7C7B\u578B`),"sse"):s.endsWith("/mcp")?(this.logger.info(`[MCP-${t}] \u68C0\u6D4B\u5230 URL \u8DEF\u5F84\u4EE5 /mcp \u7ED3\u5C3E\uFF0C\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`),"streamable-http"):(this.logger.info(`[MCP-${t}] URL \u8DEF\u5F84 ${s} \u4E0D\u5339\u914D\u7279\u5B9A\u89C4\u5219\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`),"streamable-http")}catch(r){return this.logger.warn(`[MCP-${t}] URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`,r),"streamable-http"}}validateConfig(){ts.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.reconnectState.isManualDisconnect=!1,this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",this.logWithTag("info",`\u6B63\u5728\u8FDE\u63A5 MCP \u670D\u52A1: ${this.config.name} (\u5C1D\u8BD5 ${this.reconnectState.attempts+1}/${this.reconnectOptions.maxAttempts})`),new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.reconnectOptions.timeout}ms)`);this.handleConnectionError(r),t(r)},this.reconnectOptions.timeout);try{this.client=new oc({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{tools:{}}}),this.transport=ts.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,this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.resetPingState(),this.logWithTag("info",`MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5\u5DF2\u5EFA\u7ACB`),this.startPingMonitoring()}handleConnectionError(e){this.connectionState="disconnected",this.initialized=!1,this.reconnectState.lastError=e,this.logger.error(`MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5\u9519\u8BEF:`,e.message),this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection(),this.eventBus.emitEvent("mcp:service:connection:failed",{serviceName:this.config.name,error:e,attempt:this.reconnectState.attempts}),this.shouldReconnect()?this.scheduleReconnect():(this.connectionState="failed",this.logger.warn(`${this.config.name} \u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u6B21\u6570 (${this.reconnectOptions.maxAttempts})\uFF0C\u505C\u6B62\u91CD\u8FDE`))}shouldReconnect(){return this.reconnectOptions.enabled&&this.reconnectState.attempts<this.reconnectOptions.maxAttempts&&!this.reconnectState.isManualDisconnect}scheduleReconnect(){this.connectionState="reconnecting",this.reconnectState.attempts++,this.calculateNextInterval(),this.logger.info(`${this.config.name} \u5C06\u5728 ${this.reconnectState.nextInterval}ms \u540E\u8FDB\u884C\u7B2C ${this.reconnectState.attempts} \u6B21\u91CD\u8FDE`),this.reconnectState.timer&&clearTimeout(this.reconnectState.timer),this.reconnectState.timer=setTimeout(async()=>{try{await this.attemptConnection()}catch{}},this.reconnectState.nextInterval)}calculateNextInterval(){let e;switch(this.reconnectOptions.backoffStrategy){case"fixed":e=this.reconnectOptions.initialInterval;break;case"linear":e=this.reconnectOptions.initialInterval+this.reconnectState.attempts*this.reconnectOptions.backoffMultiplier*1e3;break;case"exponential":e=this.reconnectOptions.initialInterval*this.reconnectOptions.backoffMultiplier**(this.reconnectState.attempts-1);break;default:e=this.reconnectOptions.initialInterval}if(e=Math.min(e,this.reconnectOptions.maxInterval),this.reconnectOptions.jitter){let t=e*.1,r=(Math.random()-.5)*2*t;e+=r}this.reconnectState.nextInterval=Math.max(e,1e3)}cleanupConnection(){if(this.stopPingMonitoring(),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}stopReconnect(){this.reconnectState.timer&&(clearTimeout(this.reconnectState.timer),this.reconnectState.timer=null)}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);this.logger.info(`${this.config.name} \u670D\u52A1\u52A0\u8F7D\u4E86 ${t.length} \u4E2A\u5DE5\u5177: ${t.map(r=>r.name).join(", ")}`)}catch(e){throw this.logger.error(`${this.config.name} \u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:`,e instanceof Error?e.message:String(e)),e}}async disconnect(){this.logger.info(`\u4E3B\u52A8\u65AD\u5F00 MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5`),this.reconnectState.isManualDisconnect=!0,this.stopPingMonitoring(),this.stopReconnect(),this.cleanupConnection(),this.connectionState="disconnected",this.eventBus.emitEvent("mcp:service:disconnected",{serviceName:this.config.name,reason:"\u624B\u52A8\u65AD\u5F00",disconnectionTime:new Date})}async reconnect(){this.logger.info(`\u624B\u52A8\u91CD\u8FDE MCP \u670D\u52A1 ${this.config.name}`),this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.isManualDisconnect=!1,this.cleanupConnection(),await this.connect()}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`);this.logger.info(`\u8C03\u7528 ${this.config.name} \u670D\u52A1\u7684\u5DE5\u5177 ${e}\uFF0C\u53C2\u6570:`,JSON.stringify(t));try{let r=await this.client.callTool({name:e,arguments:t||{}});return this.logger.info(`\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,`${JSON.stringify(r).substring(0,500)}...`),r}catch(r){throw this.logger.error(`\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,r instanceof Error?r.message:String(r)),r}}getConfig(){return this.config}getStatus(){return{name:this.config.name,connected:this.connectionState==="connected",initialized:this.initialized,transportType:this.config.type,toolCount:this.tools.size,lastError:this.reconnectState.lastError?.message,reconnectAttempts:this.reconnectState.attempts,connectionState:this.connectionState,pingEnabled:this.pingOptions.enabled,lastPingTime:this.lastPingTime||void 0,pingFailureCount:this.pingFailureCount,isPinging:this.isPinging}}isConnected(){return this.connectionState==="connected"&&this.initialized}enableReconnect(){this.reconnectOptions.enabled=!0,this.logger.info(`${this.config.name} \u81EA\u52A8\u91CD\u8FDE\u5DF2\u542F\u7528`)}disableReconnect(){this.reconnectOptions.enabled=!1,this.stopReconnect(),this.logger.info(`${this.config.name} \u81EA\u52A8\u91CD\u8FDE\u5DF2\u7981\u7528`)}updateReconnectOptions(e){this.reconnectOptions={...this.reconnectOptions,...e},this.logger.info(`${this.config.name} \u91CD\u8FDE\u914D\u7F6E\u5DF2\u66F4\u65B0`,e)}getReconnectOptions(){return{...this.reconnectOptions}}resetReconnectState(){this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.logger.info(`${this.config.name} \u91CD\u8FDE\u72B6\u6001\u5DF2\u91CD\u7F6E`)}startPingMonitoring(){!this.pingOptions.enabled||this.pingTimer||!this.isConnected()||(this.logger.info(`${this.config.name} \u542F\u52A8ping\u76D1\u63A7\uFF0C\u95F4\u9694: ${this.pingOptions.interval}ms`),setTimeout(()=>{this.isConnected()&&!this.pingTimer&&(this.pingTimer=setInterval(()=>{this.performPing()},this.pingOptions.interval))},this.pingOptions.startDelay))}stopPingMonitoring(){this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null,this.logger.debug(`${this.config.name} \u505C\u6B62ping\u76D1\u63A7`))}async performPing(){if(!this.client||this.isPinging||!this.isConnected())return;this.isPinging=!0;let e=performance.now();try{this.logger.debug(`${this.config.name} \u53D1\u9001ping\u8BF7\u6C42\uFF08\u901A\u8FC7listTools\u68C0\u6D4B\u8FDE\u63A5\uFF09`);let t=this.client.listTools(),r=new Promise((n,i)=>{setTimeout(()=>{i(new Error(`Ping\u8D85\u65F6 (${this.pingOptions.timeout}ms)`))},this.pingOptions.timeout)});await Promise.race([t,r]);let s=performance.now()-e;this.handlePingSuccess(s)}catch(t){let r=performance.now()-e;this.handlePingFailure(t,r)}finally{this.isPinging=!1}}handlePingSuccess(e){this.pingFailureCount=0,this.lastPingTime=new Date,this.logger.debug(`${this.config.name} ping\u6210\u529F\uFF0C\u5EF6\u8FDF: ${e.toFixed(2)}ms`)}handlePingFailure(e,t){if(this.pingFailureCount++,this.logger.warn(`${this.config.name} ping\u5931\u8D25 (${this.pingFailureCount}/${this.pingOptions.maxFailures})\uFF0C\u5EF6\u8FDF: ${t.toFixed(2)}ms\uFF0C\u9519\u8BEF: ${e.message}`),this.pingFailureCount>=this.pingOptions.maxFailures){this.logger.error(`${this.config.name} \u8FDE\u7EEDping\u5931\u8D25\u8FBE\u5230\u9608\u503C\uFF0C\u89E6\u53D1\u91CD\u8FDE\u673A\u5236`),this.stopPingMonitoring();let r=new Error(`Ping\u68C0\u6D4B\u5931\u8D25\uFF0C\u8FDE\u7EED\u5931\u8D25${this.pingFailureCount}\u6B21\uFF0C\u8FDE\u63A5\u53EF\u80FD\u5DF2\u65AD\u5F00`);this.handleConnectionError(r)}}resetPingState(){this.pingFailureCount=0,this.lastPingTime=null,this.isPinging=!1}enablePing(){this.pingOptions.enabled=!0,this.logger.info(`${this.config.name} ping\u76D1\u63A7\u5DF2\u542F\u7528`),this.isConnected()&&this.startPingMonitoring()}disablePing(){this.pingOptions.enabled=!1,this.stopPingMonitoring(),this.logger.info(`${this.config.name} ping\u76D1\u63A7\u5DF2\u7981\u7528`)}updatePingOptions(e){let t=this.pingOptions.enabled;this.pingOptions={...this.pingOptions,...e},this.logger.info(`${this.config.name} ping\u914D\u7F6E\u5DF2\u66F4\u65B0`,e),t!==this.pingOptions.enabled&&(this.pingOptions.enabled&&this.isConnected()?this.startPingMonitoring():this.pingOptions.enabled||this.stopPingMonitoring())}getPingOptions(){return{...this.pingOptions}}}});var Yt,Pn=C(()=>{"use strict";P();z();Yt=class{static{c(this,"ToolSyncManager")}configManager;logger;syncLocks=new Map;eventBus=w();constructor(e,t=p){this.configManager=e,this.logger=t.withTag("ToolSync"),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",async e=>{await this.handleConfigUpdated(e)}),this.eventBus.onEvent("mcp:server:added",async e=>{await this.handleMCPServerAdded(e)}),this.eventBus.onEvent("mcp:server:removed",async e=>{await this.handleMCPServerRemoved(e)})}async handleConfigUpdated(e){this.logger.info("\u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u5DE5\u5177\u540C\u6B65\u72B6\u6001");try{e.type==="customMCP"?this.logger.debug("customMCP\u914D\u7F6E\u5DF2\u66F4\u65B0\uFF0CCustomMCPHandler\u5C06\u81EA\u52A8\u5904\u7406"):e.type==="serverTools"&&e.serviceName?await this.handleServerToolsConfigUpdated(e.serviceName):await this.handleGeneralConfigUpdated()}catch(t){this.logger.error("\u914D\u7F6E\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u540C\u6B65\u5931\u8D25:",t)}}async handleServerToolsConfigUpdated(e){this.logger.info(`\u5904\u7406\u670D\u52A1 ${e} \u7684serverTools\u914D\u7F6E\u66F4\u65B0`);try{this.eventBus.emitEvent("tool-sync:server-tools-updated",{serviceName:e,timestamp:new Date})}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e} \u914D\u7F6E\u66F4\u65B0\u5931\u8D25:`,t)}}async handleGeneralConfigUpdated(){this.logger.info("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u6240\u6709\u670D\u52A1\u540C\u6B65\u72B6\u6001");try{this.eventBus.emitEvent("tool-sync:general-config-updated",{timestamp:new Date})}catch(e){this.logger.error("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",e)}}async handleMCPServerAdded(e){this.logger.info(`\u5904\u7406MCP\u670D\u52A1\u6DFB\u52A0\u4E8B\u4EF6: ${e.serverName}`);try{setTimeout(async()=>{await this.triggerServiceToolSync(e.serverName)},1e3)}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e.serverName} \u6DFB\u52A0\u4E8B\u4EF6\u5931\u8D25:`,t)}}async triggerServiceToolSync(e){this.logger.info(`\u89E6\u53D1\u670D\u52A1 ${e} \u7684\u5DE5\u5177\u540C\u6B65`);try{this.eventBus.emitEvent("tool-sync:request-service-tools",{serviceName:e,timestamp:new Date})}catch(t){this.logger.error(`\u89E6\u53D1\u670D\u52A1 ${e} \u5DE5\u5177\u540C\u6B65\u5931\u8D25:`,t)}}async handleMCPServerRemoved(e){this.logger.info(`\u5904\u7406MCP\u670D\u52A1\u79FB\u9664\u4E8B\u4EF6: ${e.serverName}`);try{await this.removeServiceToolsFromCustomMCP(e.serverName,e.affectedTools)}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e.serverName} \u79FB\u9664\u4E8B\u4EF6\u5931\u8D25:`,t)}}async removeServiceToolsFromCustomMCP(e,t){this.logger.info(`\u4ECEcustomMCP\u4E2D\u79FB\u9664\u670D\u52A1 ${e} \u7684\u5DE5\u5177`);try{let r=this.configManager.getCustomMCPTools(),s=r.filter(i=>!i.name.startsWith(`${e}__`));if(s.length===r.length){this.logger.debug(`\u670D\u52A1 ${e} \u7684\u5DE5\u5177\u4E0D\u5728customMCP\u4E2D\uFF0C\u65E0\u9700\u79FB\u9664`);return}await this.configManager.updateCustomMCPTools(s);let n=r.length-s.length;this.logger.info(`\u6210\u529F\u4ECEcustomMCP\u4E2D\u79FB\u9664\u670D\u52A1 ${e} \u7684 ${n} \u4E2A\u5DE5\u5177`),this.eventBus.emitEvent("tool-sync:service-tools-removed",{serviceName:e,removedCount:n,timestamp:new Date})}catch(r){throw this.logger.error(`\u79FB\u9664\u670D\u52A1 ${e} \u5DE5\u5177\u5931\u8D25:`,r),r}}async syncToolsAfterConnection(e,t){if(this.syncLocks.has(e)){this.logger.debug(`\u670D\u52A1 ${e} \u6B63\u5728\u540C\u6B65\u4E2D\uFF0C\u8DF3\u8FC7`);return}let r=this.doSyncTools(e,t).finally(()=>{this.syncLocks.delete(e)});this.syncLocks.set(e,r),await r}async doSyncTools(e,t){try{this.logger.info(`\u5F00\u59CB\u540C\u6B65\u670D\u52A1 ${e} \u7684\u5DE5\u5177`);let r=this.configManager.getServerToolsConfig(e);if(!r){this.logger.debug(`\u670D\u52A1 ${e} \u65E0 mcpServerConfig \u914D\u7F6E\uFF0C\u8DF3\u8FC7\u540C\u6B65`);return}let s=this.getEnabledTools(r,t);if(s.length===0){this.logger.debug(`\u670D\u52A1 ${e} \u65E0\u542F\u7528\u5DE5\u5177\uFF0C\u8DF3\u8FC7\u540C\u6B65`);return}let n=this.configManager.getCustomMCPTools(),i=new Set(n.map(l=>l.name)),a=s.filter(l=>!i.has(`${e}__${l.name}`));if(a.length===0){this.logger.info(`\u670D\u52A1 ${e} \u7684\u542F\u7528\u5DE5\u5177\u5DF2\u5B58\u5728\u4E8E customMCP \u4E2D\uFF0C\u8DF3\u8FC7\u540C\u6B65`);return}await this.addToolsToCustomMCP(e,a),this.logger.info(`\u6210\u529F\u540C\u6B65\u670D\u52A1 ${e} \u7684 ${a.length} \u4E2A\u5DE5\u5177\u5230 customMCP`)}catch(r){this.logger.error(`\u540C\u6B65\u670D\u52A1 ${e} \u5DE5\u5177\u5931\u8D25:`,r),this.recordSyncError(e,r)}}getEnabledTools(e,t){let r=[];for(let s of t){let n=e[s.name];n&&n.enable!==!1&&r.push(s)}return r}async addToolsToCustomMCP(e,t){let r=t.map(s=>({name:`${e}__${s.name}`,description:s.description||"",inputSchema:s.inputSchema||{},handler:{type:"mcp",config:{serviceName:e,toolName:s.name}}}));await this.configManager.addCustomMCPTools(r),await this.syncToolStats(e,t)}recordSyncError(e,t){let r={serviceName:e,error:t instanceof Error?t.message:String(t),timestamp:new Date().toISOString(),type:t instanceof Error?t.constructor.name:"UnknownError"};this.logger.error("\u540C\u6B65\u9519\u8BEF\u8BB0\u5F55:",r)}getSyncLocks(){return Array.from(this.syncLocks.keys())}clearSyncLocks(){this.syncLocks.clear(),this.logger.debug("\u5DF2\u6E05\u7406\u6240\u6709\u540C\u6B65\u9501")}async syncToolStats(e,t){try{let r=this.configManager.getServerToolsConfig(e);if(!r){this.logger.debug(`\u670D\u52A1 ${e} \u65E0 mcpServerConfig \u914D\u7F6E\uFF0C\u8DF3\u8FC7\u7EDF\u8BA1\u4FE1\u606F\u540C\u6B65`);return}let s=this.configManager.getCustomMCPTools(),n=new Map(s.map(i=>[i.name,i]));for(let i of t){let a=`${e}__${i.name}`,l=n.get(a),g=r[i.name];if(l&&g&&(!l.stats||!l.stats.usageCount&&!l.stats.lastUsedTime)){let u={};g.usageCount!==void 0&&(u.usageCount=g.usageCount),g.lastUsedTime&&(u.lastUsedTime=g.lastUsedTime),Object.keys(u).length>0&&(await this.updateCustomMCPToolStats(a,u),this.logger.debug(`\u5DF2\u540C\u6B65\u5DE5\u5177 ${a} \u7684\u7EDF\u8BA1\u4FE1\u606F: ${JSON.stringify(u)}`))}}}catch(r){this.logger.error(`\u540C\u6B65\u670D\u52A1 ${e} \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,r instanceof Error?r.message:String(r))}}async updateCustomMCPToolStats(e,t){try{let r=this.configManager.getCustomMCPTools(),s=r.findIndex(a=>a.name===e);if(s===-1){this.logger.warn(`\u5DE5\u5177 ${e} \u4E0D\u5B58\u5728\u4E8E customMCP \u4E2D`);return}let n=[...r],i=n[s];i.stats||(i.stats={}),t.usageCount!==void 0&&(i.stats.usageCount=t.usageCount),t.lastUsedTime!==void 0&&(i.stats.lastUsedTime=t.lastUsedTime),await this.configManager.updateCustomMCPTools(n)}catch(r){throw this.logger.error(`\u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,r instanceof Error?r.message:String(r)),r}}}});var yt,wn,rs=C(()=>{"use strict";P();se();Tn();z();Gt();Jt();Pn();yt=class{static{c(this,"MCPServiceManager")}services=new Map;configs={};logger;tools=new Map;customMCPHandler;cacheManager;toolSyncManager;eventBus=w();constructor(e){this.logger=p,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 Ie(r),this.customMCPHandler=new Xt,this.toolSyncManager=new Yt(d,this.logger),this.setupEventListeners()}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)}),this.eventBus.onEvent("tool-sync:server-tools-updated",async e=>{await this.handleServerToolsUpdated(e)}),this.eventBus.onEvent("tool-sync:general-config-updated",async e=>{await this.handleGeneralConfigUpdated(e)})}async handleServiceConnected(e){this.logger.info(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u6210\u529F\uFF0C\u5F00\u59CB\u5DE5\u5177\u540C\u6B65`);try{let t=this.services.get(e.serviceName);if(t){let r=t.getTools();this.toolSyncManager&&await this.toolSyncManager.syncToolsAfterConnection(e.serviceName,r),await this.refreshCustomMCPHandlerPublic(),this.logger.info(`\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u540C\u6B65\u5B8C\u6210`)}}catch(t){this.logger.error(`\u540C\u6B65\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u5931\u8D25:`,t)}}async handleServiceDisconnected(e){this.logger.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\uFF0C\u539F\u56E0: ${e.reason||"\u672A\u77E5"}`);try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic(),this.logger.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5B8C\u6210`)}catch(t){this.logger.error(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5931\u8D25:`,t)}}async handleServiceConnectionFailed(e){this.logger.warn(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u5931\u8D25 (\u5C1D\u8BD5 ${e.attempt})\uFF0C\u9519\u8BEF: ${e.error.message}`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){this.logger.error("\u5237\u65B0CustomMCPHandler\u5931\u8D25:",t)}}async handleServerToolsUpdated(e){this.logger.info(`\u5904\u7406\u670D\u52A1 ${e.serviceName} \u7684serverTools\u914D\u7F6E\u66F4\u65B0`);try{let t=this.services.get(e.serviceName);if(t?.isConnected()){let r=t.getTools();this.toolSyncManager&&await this.toolSyncManager.syncToolsAfterConnection(e.serviceName,r),await this.refreshCustomMCPHandlerPublic(),this.logger.info(`\u670D\u52A1 ${e.serviceName} \u914D\u7F6E\u66F4\u65B0\u540C\u6B65\u5B8C\u6210`)}}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e.serviceName} \u914D\u7F6E\u66F4\u65B0\u5931\u8D25:`,t)}}async handleGeneralConfigUpdated(e){this.logger.info("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u6240\u6709\u5DF2\u8FDE\u63A5\u670D\u52A1");try{for(let[t,r]of this.services)if(r.isConnected()){let s=r.getTools();this.toolSyncManager&&await this.toolSyncManager.syncToolsAfterConnection(t,s)}await this.refreshCustomMCPHandlerPublic(),this.logger.info("\u901A\u7528\u914D\u7F6E\u66F4\u65B0\u540C\u6B65\u5B8C\u6210")}catch(t){this.logger.error("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t)}}async startAllServices(){this.logger.info("[MCPManager] \u6B63\u5728\u542F\u52A8\u6240\u6709 MCP \u670D\u52A1...");try{this.customMCPHandler.initialize(),this.logger.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(t){this.logger.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t)}let e=Object.entries(this.configs);if(e.length===0){this.logger.warn("[MCPManager] \u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\uFF0C\u8BF7\u4F7F\u7528 addServiceConfig() \u6DFB\u52A0\u670D\u52A1\u914D\u7F6E");return}for(let[t]of e)await this.startService(t);this.logger.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5B8C\u6210")}async startService(e){this.logger.info(`[MCPManager] \u542F\u52A8 MCP \u670D\u52A1: ${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 Kt(t);await r.connect(),this.services.set(e,r),await this.refreshToolsCache();let s=r.getTools();this.logger.info(`[MCPManager] ${e} \u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u52A0\u8F7D\u4E86 ${s.length} \u4E2A\u5DE5\u5177:`,s.map(n=>n.name).join(", "))}catch(r){throw this.logger.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25:`,r.message),r}}async stopService(e){this.logger.info(`[MCPManager] \u505C\u6B62 MCP \u670D\u52A1: ${e}`);let t=this.services.get(e);if(!t){this.logger.warn(`[MCPManager] \u670D\u52A1 ${e} \u4E0D\u5B58\u5728\u6216\u672A\u542F\u52A8`);return}try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache(),this.logger.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){throw this.logger.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25:`,r.message),r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),s=this.configs[e];s&&this.cacheManager.writeCacheEntry(e,r,s).then(()=>{this.logger.debug(`[MCPManager] \u5DF2\u5C06 ${e} \u5DE5\u5177\u5217\u8868\u5199\u5165\u7F13\u5B58`)}).catch(n=>{this.logger.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${n instanceof Error?n.message:String(n)}`)});for(let n of r){let i=`${e}__${n.name}`;this.tools.set(i,{serviceName:e,originalName:n.name,tool:n})}}await this.syncToolsConfigToFile()}getAllTools(){let e=[];for(let[r,s]of this.services)if(s.isConnected()){let n=s.getTools();for(let i of n){if(!d.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})}}let t=[];try{t=this.customMCPHandler.getTools(),this.logger.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${t.length} \u4E2A customMCP \u5DE5\u5177`)}catch(r){this.logger.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5931\u8D25\uFF0C\u5C06\u53EA\u8FD4\u56DE\u6807\u51C6 MCP \u5DE5\u5177:",r),t=[]}for(let r of t)e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name});return this.logger.info(`[MCPManager] \u8FD4\u56DE ${e.length} \u4E2A\u5DE5\u5177 (\u670D\u52A1\u5DE5\u5177: ${e.length-t.length}, customMCP\u5DE5\u5177: ${t.length})`),e}getServiceNameForTool(e){return e.handler?.type==="mcp"?e.handler.config.serviceName:"customMCP"}async callTool(e,t){if(this.logger.info(`[MCPManager] \u8C03\u7528\u5DE5\u5177: ${e}\uFF0C\u53C2\u6570:`,t),this.customMCPHandler.hasTool(e)){let n=this.customMCPHandler.getToolInfo(e);if(n?.handler?.type==="mcp")try{let i=await this.callMCPTool(e,n.handler.config,t);return this.updateToolStats(e,n.handler.config.serviceName,n.handler.config.toolName,!0).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),i}catch(i){throw this.updateToolStatsForFailedCall(e,n.handler.config.serviceName,n.handler.config.toolName,i).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),i}try{let i=await this.customMCPHandler.callTool(e,t);return this.updateToolStats(e,"customMCP",e,!0).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),this.logger.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),i}catch(i){throw this.updateToolStatsForFailedCall(e,"customMCP",e,i).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),this.logger.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,i.message),i}}let r=this.tools.get(e);if(!r)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let s=this.services.get(r.serviceName);if(!s)throw new Error(`\u670D\u52A1 ${r.serviceName} \u4E0D\u53EF\u7528`);if(!s.isConnected())throw new Error(`\u670D\u52A1 ${r.serviceName} \u672A\u8FDE\u63A5`);try{let n=await s.callTool(r.originalName,t||{});return this.updateToolStats(e,r.serviceName,r.originalName,!0).catch(i=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,i)}),this.logger.info(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,n),n}catch(n){throw this.updateToolStatsForFailedCall(e,r.serviceName,r.originalName,n).catch(i=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,i)}),this.logger.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,n.message),n}}async updateToolStats(e,t,r,s){try{if(!s)return;let n=new Date().toISOString();await this.updateCustomMCPToolStats(e,n),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,n),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)}catch(n){throw this.logger.error(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,n),n}}async updateToolStatsForFailedCall(e,t,r,s){try{let n=new Date().toISOString();await this.updateCustomMCPToolLastUsedTime(e,n),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,n),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F`)}catch(n){throw this.logger.error(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,n),n}}async updateCustomMCPToolStats(e,t){try{await d.updateToolUsageStatsWithLock(e,!0),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u7EDF\u8BA1`)}catch(r){throw this.logger.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u5931\u8D25:`,r),r}}async updateCustomMCPToolLastUsedTime(e,t){try{await d.updateToolUsageStatsWithLock(e,!1),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(r){throw this.logger.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25:`,r),r}}async updateMCPServerToolStats(e,t,r){try{await d.updateMCPServerToolStatsWithLock(e,t,r,!0),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1`)}catch(s){throw this.logger.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u5931\u8D25:`,s),s}}async updateMCPServerToolLastUsedTime(e,t,r){try{await d.updateMCPServerToolStatsWithLock(e,t,r,!1),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(s){throw this.logger.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25:`,s),s}}async callMCPTool(e,t,r){let{serviceName:s,toolName:n}=t;this.logger.info(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${s}.${n}`);let i=this.services.get(s);if(!i)throw new Error(`\u670D\u52A1 ${s} \u4E0D\u53EF\u7528`);if(!i.isConnected())throw new Error(`\u670D\u52A1 ${s} \u672A\u8FDE\u63A5`);try{let a=await i.callTool(n,r||{});return this.logger.info(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),a}catch(a){throw this.logger.error(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,a.message),a}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.logger.info("[MCPManager] \u6B63\u5728\u505C\u6B62\u6240\u6709 MCP \u670D\u52A1...");for(let[e,t]of this.services)try{await t.disconnect(),this.logger.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){this.logger.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25:`,r.message)}try{this.customMCPHandler.cleanup(),this.logger.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){this.logger.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u6E05\u7406\u5931\u8D25:",e)}try{d.clearAllStatsUpdateLocks(),this.logger.info("[MCPManager] \u7EDF\u8BA1\u66F4\u65B0\u9501\u5DF2\u6E05\u7406")}catch(e){this.logger.error("[MCPManager] \u6E05\u7406\u7EDF\u8BA1\u66F4\u65B0\u9501\u5931\u8D25:",e)}this.services.clear(),this.tools.clear(),this.logger.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u5DF2\u505C\u6B62")}getStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames(),this.logger.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 customMCP \u72B6\u6001: ${e} \u4E2A\u5DE5\u5177`)}catch(a){this.logger.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u72B6\u6001\u5931\u8D25\uFF0C\u5C06\u53EA\u5305\u542B\u6807\u51C6 MCP \u5DE5\u5177:",a),e=0,t=[]}let r=this.tools.size+e,n=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:n};for(let[a,l]of this.services){let g=l.getStatus();i.services[a]={connected:g.connected,clientName:`xiaozhi-${a}-client`}}return e>0&&(i.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),i}getStatsUpdateInfo(){try{let e=d.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch(e){return this.logger.warn("[MCPManager] \u83B7\u53D6\u7EDF\u8BA1\u66F4\u65B0\u76D1\u63A7\u4FE1\u606F\u5931\u8D25:",e),{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.logger.info("\u91CD\u65B0\u521D\u59CB\u5316CustomMCPHandler"),await this.customMCPHandler.reinitialize(),this.logger.info("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25:",e),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(t){return this.logger.warn(`[MCPManager] \u68C0\u67E5 CustomMCP \u5DE5\u5177 ${e} \u662F\u5426\u5B58\u5728\u5931\u8D25:`,t),!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch(e){return this.logger.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5217\u8868\u5931\u8D25\uFF0C\u8FD4\u56DE\u7A7A\u6570\u7EC4:",e),[]}}enhanceServiceConfig(e){let t={...e};try{if(e.type==="sse"&&e.url&&e.url.includes("modelscope")){let r=d.getModelScopeApiKey();if(r)t.apiKey=r,this.logger.info(`[MCPManager] \u4E3A ${e.name} \u670D\u52A1\u6DFB\u52A0 ModelScope API Key`);else throw this.logger.warn(`[MCPManager] ${e.name} \u670D\u52A1\u9700\u8981 ModelScope API Key\uFF0C\u4F46\u672A\u5728\u914D\u7F6E\u4E2D\u627E\u5230`),new Error(`ModelScope SSE \u670D\u52A1 ${e.name} \u9700\u8981 API Key\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E modelscope.apiKey`)}return t}catch(r){throw this.logger.error(`[MCPManager] \u914D\u7F6E\u589E\u5F3A\u5931\u8D25: ${e.name}`,r),r}}addServiceConfig(e,t){let r,s;if(typeof e=="string"&&t)s=e,r=t;else if(typeof e=="object")s=e.name,r=e;else throw new Error("Invalid arguments for addServiceConfig");let n=this.enhanceServiceConfig(r);this.configs[s]=n,this.logger.info(`[MCPManager] \u5DF2\u6DFB\u52A0\u670D\u52A1\u914D\u7F6E: ${s}`)}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(t);this.configs[e]=r,this.logger.info(`[MCPManager] \u5DF2\u66F4\u65B0\u5E76\u589E\u5F3A\u670D\u52A1\u914D\u7F6E: ${e}`)}removeServiceConfig(e){delete this.configs[e],this.logger.info(`[MCPManager] \u5DF2\u79FB\u9664\u670D\u52A1\u914D\u7F6E: ${e}`)}async syncToolsConfigToFile(){try{this.logger.debug("[MCPManager] \u5F00\u59CB\u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6");let e=d.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let s=r.getTools();if(s.length===0)continue;let n=e[t]?.tools||{},i={};for(let h of s){let f=n[h.name];f?i[h.name]={...f,description:h.description||f.description||""}:i[h.name]={description:h.description||"",enable:!0}}let a=s.map(h=>h.name),g=Object.keys(n).filter(h=>!a.includes(h));if(g.length>0&&this.logger.info(`[MCPManager] \u68C0\u6D4B\u5230\u670D\u52A1 ${t} \u79FB\u9664\u4E86 ${g.length} \u4E2A\u5DE5\u5177: ${g.join(", ")}`),this.hasToolsConfigChanged(n,i)){d.updateServerToolsConfig(t,i);let h=Object.keys(i).filter(m=>!n[m]),f=Object.keys(i).filter(m=>{let A=n[m],ie=i[m];return A&&A.description!==ie.description});this.logger.info(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),h.length>0&&this.logger.info(` - \u65B0\u589E\u5DE5\u5177: ${h.join(", ")}`),f.length>0&&this.logger.info(` - \u66F4\u65B0\u5DE5\u5177: ${f.join(", ")}`),g.length>0&&this.logger.info(` - \u79FB\u9664\u5DE5\u5177: ${g.join(", ")}`)}}this.logger.debug("[MCPManager] \u5DE5\u5177\u914D\u7F6E\u540C\u6B65\u5B8C\u6210")}catch(e){this.logger.error("[MCPManager] \u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:",e)}}hasToolsConfigChanged(e,t){let r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!0;let n=s.filter(a=>!r.includes(a)),i=r.filter(a=>!s.includes(a));if(n.length>0||i.length>0)return!0;for(let a of r){let l=e[a],g=t[a];if(l.description!==g.description)return!0}return!1}},wn=yt});var tt,ss=C(()=>{"use strict";P();tt=class{static{c(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=p}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case"initialize":return await this.handleInitialize(e.params,e.id);case"notifications/initialized":return await this.handleInitializedNotification(e.params);case"tools/list":return await this.handleToolsList(e.id);case"tools/call":return await this.handleToolCall(e.params,e.id);case"resources/list":return await this.handleResourcesList(e.id);case"prompts/list":return await this.handlePromptsList(e.id);case"ping":return await this.handlePing(e.id);default:if(t)return this.logger.warn(`\u6536\u5230\u672A\u77E5\u7684\u901A\u77E5\u6D88\u606F: ${e.method}`,e),null;throw new Error(`\u672A\u77E5\u7684\u65B9\u6CD5: ${e.method}`)}}catch(t){return this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t),e.id===void 0?null:this.createErrorResponse(t,e.id)}}async handleInitialize(e,t){this.logger.info("\u5904\u7406 initialize \u8BF7\u6C42",e);let r=["2024-11-05","2025-06-18"],s=e.protocolVersion,n=r.includes(s)?s:"2024-11-05";return this.logger.info(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${s}, \u670D\u52A1\u5668\u54CD\u5E94=${n}`),{jsonrpc:"2.0",result:{serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"},capabilities:{tools:{},logging:{}},protocolVersion:n},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.info("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.info("\u5904\u7406 tools/list \u8BF7\u6C42");try{let r=this.serviceManager.getAllTools().map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}));return this.logger.info(`\u8FD4\u56DE ${r.length} \u4E2A\u5DE5\u5177`),{jsonrpc:"2.0",result:{tools:r},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){this.logger.info(`\u5904\u7406 tools/call \u8BF7\u6C42: ${e.name}`,e);try{if(!e.name)throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let r=await this.serviceManager.callTool(e.name,e.arguments||{});return this.logger.info(`\u5DE5\u5177 ${e.name} \u8C03\u7528\u6210\u529F`),{jsonrpc:"2.0",result:{content:r.content,isError:r.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.info("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.info(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.info("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.info(`\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}}});import{EventEmitter as Rn}from"events";var ns,os,Zt,bn=C(()=>{"use strict";P();rs();vt();ss();ns=class{static{c(this,"ToolRegistry")}serviceManager;logger;constructor(e){this.serviceManager=e,this.logger=p}async initialize(){this.logger.info("\u521D\u59CB\u5316\u5DE5\u5177\u6CE8\u518C\u8868")}getAllTools(){return this.serviceManager.getAllTools().map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,serviceName:e.serviceName,originalName:e.originalName}))}findTool(e){return this.getAllTools().find(r=>r.name===e)||null}hasTool(e){return this.findTool(e)!==null}},os=class extends Rn{static{c(this,"ConnectionManager")}connections=new Map;logger;constructor(){super(),this.logger=p}async initialize(){this.logger.info("\u521D\u59CB\u5316\u8FDE\u63A5\u7BA1\u7406\u5668")}registerConnection(e,t,r){let s={id:e,transportName:t,state:r,connectedAt:new Date,lastActivity:new Date};this.connections.set(e,s),this.emit("connectionRegistered",s),this.logger.debug(`\u8FDE\u63A5\u5DF2\u6CE8\u518C: ${e} (${t})`)}updateConnectionState(e,t){let r=this.connections.get(e);r&&(r.state=t,r.lastActivity=new Date,this.emit("connectionStateChanged",r),this.logger.debug(`\u8FDE\u63A5\u72B6\u6001\u66F4\u65B0: ${e} -> ${t}`))}removeConnection(e){let t=this.connections.get(e);t&&(this.connections.delete(e),this.emit("connectionRemoved",t),this.logger.debug(`\u8FDE\u63A5\u5DF2\u79FB\u9664: ${e}`))}getAllConnections(){return Array.from(this.connections.values())}getActiveConnectionCount(){return Array.from(this.connections.values()).filter(e=>e.state==="connected").length}async closeAllConnections(){this.logger.info("\u5173\u95ED\u6240\u6709\u8FDE\u63A5"),this.connections.clear(),this.emit("allConnectionsClosed")}},Zt=class extends Rn{static{c(this,"UnifiedMCPServer")}serviceManager;messageHandler;transportAdapters=new Map;toolRegistry;connectionManager;isRunning=!1;logger;config;constructor(e={}){super(),this.config={name:"UnifiedMCPServer",enableLogging:!0,logLevel:"info",maxConnections:100,connectionTimeout:3e4,...e},this.logger=p,this.serviceManager=new yt,this.messageHandler=new tt(this.serviceManager),this.toolRegistry=new ns(this.serviceManager),this.connectionManager=new os,this.setupEventListeners()}setupEventListeners(){this.connectionManager.on("connectionRegistered",e=>{this.emit("connectionRegistered",e)}),this.connectionManager.on("connectionStateChanged",e=>{this.emit("connectionStateChanged",e)}),this.connectionManager.on("connectionRemoved",e=>{this.emit("connectionRemoved",e)})}async initialize(){this.logger.info("\u521D\u59CB\u5316\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{await this.serviceManager.startAllServices(),await this.toolRegistry.initialize(),await this.connectionManager.initialize(),this.logger.info("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210"),this.emit("initialized")}catch(e){throw this.logger.error("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5931\u8D25",e),e}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);this.logger.info(`\u6CE8\u518C\u4F20\u8F93\u9002\u914D\u5668: ${e}`);try{await t.initialize(),this.transportAdapters.set(e,t),this.connectionManager.registerConnection(t.getConnectionId(),e,t.getState()),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u6CE8\u518C\u6210\u529F`),this.emit("transportRegistered",{name:e,adapter:t})}catch(r){throw this.logger.error(`\u6CE8\u518C\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5931\u8D25`,r),r}}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");this.logger.info("\u542F\u52A8\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{for(let[e,t]of this.transportAdapters)try{await t.start(),this.connectionManager.updateConnectionState(t.getConnectionId(),t.getState()),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u542F\u52A8\u6210\u529F`)}catch(r){throw this.logger.error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u542F\u52A8\u5931\u8D25`,r),r}this.isRunning=!0,this.logger.info("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw this.logger.error("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25",e),e}}async stop(){if(this.isRunning){this.logger.info("\u505C\u6B62\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{for(let[e,t]of this.transportAdapters)try{await t.stop(),this.connectionManager.updateConnectionState(t.getConnectionId(),t.getState()),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u505C\u6B62\u6210\u529F`)}catch(r){this.logger.error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u505C\u6B62\u5931\u8D25`,r)}await this.connectionManager.closeAllConnections(),await this.serviceManager.stopAllServices(),this.isRunning=!1,this.logger.info("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw this.logger.error("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u505C\u6B62\u5931\u8D25",e),e}}}getServiceManager(){return this.serviceManager}getToolRegistry(){return this.toolRegistry}getConnectionManager(){return this.connectionManager}getMessageHandler(){return this.messageHandler}getStatus(){return{isRunning:this.isRunning,transportCount:this.transportAdapters.size,activeConnections:this.connectionManager.getActiveConnectionCount(),toolCount:this.toolRegistry.getAllTools().length,config:this.config}}getTransportAdapters(){return new Map(this.transportAdapters)}isServerRunning(){return this.isRunning}}});async function In(o={name:"http"}){p.info("\u521B\u5EFA HTTP \u6A21\u5F0F\u670D\u52A1\u5668");let e=new Zt;await e.initialize();let t=e.getMessageHandler(),r=new Vt(t,o);return await e.registerTransport("http",r),p.info("HTTP \u6A21\u5F0F\u670D\u52A1\u5668\u521B\u5EFA\u6210\u529F"),e}var $n=C(()=>{"use strict";P();un();hn();pn();bn();c(In,"createHTTPServer")});var On={};re(On,{MCPServer:()=>is});import{EventEmitter as ic}from"events";var W,is,An=C(()=>{"use strict";P();Ft();se();$n();W=new ht,is=class extends ic{static{c(this,"MCPServer")}unifiedServer=null;proxyMCPServer=null;port;isStarted=!1;constructor(e=3e3){super(),this.port=e}async initializeUnifiedServer(){if(!this.unifiedServer){W.info("\u521D\u59CB\u5316\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{let e={name:"http",port:this.port,host:"0.0.0.0",enableSSE:!0,enableRPC:!0};this.unifiedServer=await In(e),this.unifiedServer.on("started",()=>this.emit("started")),this.unifiedServer.on("stopped",()=>this.emit("stopped")),this.unifiedServer.on("connectionRegistered",t=>{this.emit("connectionRegistered",t)}),W.info("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw W.error("\u521D\u59CB\u5316\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u5931\u8D25",e),e}}}async initializeMCPClient(){try{let e=null;try{d.configExists()&&(e=d.getMcpEndpoints().find(r=>r&&!r.includes("<\u8BF7\u586B\u5199"))||null)}catch(t){W.warn("\u4ECE\u914D\u7F6E\u4E2D\u8BFB\u53D6\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25:",t)}e?(this.proxyMCPServer=new be(e),this.unifiedServer&&this.proxyMCPServer.setServiceManager(this.unifiedServer.getServiceManager()),await this.proxyMCPServer.connect(),W.info("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")):W.info("\u672A\u914D\u7F6E\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\uFF0C\u8DF3\u8FC7\u8FDE\u63A5")}catch(e){W.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}}async start(){if(this.isStarted){W.warn("\u670D\u52A1\u5668\u5DF2\u542F\u52A8");return}try{W.info("\u542F\u52A8 MCP \u670D\u52A1\u5668"),await this.initializeUnifiedServer(),this.unifiedServer&&await this.unifiedServer.start(),this.initializeMCPClient().catch(e=>{W.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}),this.isStarted=!0,this.emit("started"),W.info("MCP \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F")}catch(e){throw W.error("\u542F\u52A8 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}async stop(){if(!this.isStarted){W.warn("\u670D\u52A1\u5668\u672A\u542F\u52A8");return}try{W.info("\u505C\u6B62 MCP \u670D\u52A1\u5668"),this.unifiedServer&&await this.unifiedServer.stop(),this.proxyMCPServer&&(this.proxyMCPServer.disconnect(),this.proxyMCPServer=null),this.isStarted=!1,this.emit("stopped"),W.info("MCP \u670D\u52A1\u5668\u5DF2\u505C\u6B62")}catch(e){throw W.error("\u505C\u6B62 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}getServiceManager(){return this.unifiedServer?.getServiceManager()||null}getMessageHandler(){return this.unifiedServer?.getMessageHandler()||null}getStatus(){return this.unifiedServer?{...this.unifiedServer.getStatus(),port:this.port,mode:"mcp-server",proxyConnected:this.proxyMCPServer!==null}:{isRunning:!1,port:this.port,mode:"mcp-server"}}isRunning(){return this.isStarted&&(this.unifiedServer?.isServerRunning()||!1)}}});import{isAbsolute as ac,resolve as cc}from"path";function Dn(o){try{let t=new URL(o).pathname;return t.endsWith("/sse")?"sse":t.endsWith("/mcp")?"streamable-http":"streamable-http"}catch(e){return rt.warn(`URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B: ${o}`,e),"streamable-http"}}function Ln(o,e){rt.debug(`\u8F6C\u6362\u914D\u7F6E: ${o}`,e);try{if(!o||typeof o!="string")throw new k("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new k("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",o);let t=lc(o,e);return dc(t),rt.info(`\u914D\u7F6E\u8F6C\u6362\u6210\u529F: ${o} -> ${t.type}`),t}catch(t){throw rt.error(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${o}`,t),t instanceof k?t:new k(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,o)}}function lc(o,e){if(hc(e))return gc(o,e);if("type"in e)switch(e.type){case"sse":return xn(o,e);case"streamable-http":return Nn(o,e);default:throw new k(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${e.type}`,o)}if("url"in e){if(e.url===void 0||e.url===null)throw new k("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",o);if(Dn(e.url||"")==="sse"){let s={...e,type:"sse"};return xn(o,s)}let r={...e,type:"streamable-http"};return Nn(o,r)}throw new k("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",o)}function gc(o,e){if(!e.command)throw new k("\u672C\u5730\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5",o);let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=(e.args||[]).map(s=>{if(uc(s)){let n=cc(t,s);return rt.debug(`\u89E3\u6790\u76F8\u5BF9\u8DEF\u5F84: ${s} -> ${n}`),n}return s});return{name:o,type:"stdio",command:e.command,args:r,env:e.env,reconnect:{enabled:!0,maxAttempts:5,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0},ping:{enabled:!0,interval:3e4,timeout:5e3,maxFailures:3,startDelay:5e3},timeout:3e4}}function xn(o,e){if(e.url===void 0||e.url===null)throw new k("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",o);let t=e.type==="sse"?"sse":Dn(e.url||""),r=e.url?pc(e.url):!1,s={name:o,type:t,url:e.url,reconnect:{enabled:!0,maxAttempts:10,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:15e3,jitter:!0},ping:t==="sse"?{enabled:!0,interval:3e4,timeout:5e3,maxFailures:3,startDelay:5e3}:{enabled:!1,interval:6e4,timeout:1e4,maxFailures:3,startDelay:1e4},timeout:3e4};return r&&(s.modelScopeAuth=!0),rt.info(`[ConfigAdapter] \u670D\u52A1 ${o} URL: ${e.url}\uFF0C\u63A8\u65AD\u7C7B\u578B: ${t}${r?" (ModelScope)":""}`),s}function Nn(o,e){if(e.url===void 0||e.url===null)throw new k("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",o);let t=e.url||"";return{name:o,type:"streamable-http",url:t,reconnect:{enabled:!0,maxAttempts:5,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:15e3,jitter:!0},ping:{enabled:!1,interval:6e4,timeout:1e4,maxFailures:3,startDelay:1e4},timeout:3e4}}function uc(o){return ac(o)?!1:!!(o.startsWith("./")||o.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(o))}function hc(o){return"command"in o&&typeof o.command=="string"}function pc(o){return o.includes("modelscope.net")||o.includes("modelscope.cn")}function dc(o){if(!o.name||typeof o.name!="string")throw new k("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(o.type&&!Object.values(et).includes(o.type))throw new k(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`);if(!o.type)throw new k("\u4F20\u8F93\u7C7B\u578B\u672A\u6307\u5B9A\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6216\u542F\u7528\u81EA\u52A8\u63A8\u65AD");switch(o.type){case"stdio":if(!o.command)throw new k("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(o.url===void 0||o.url===null)throw new k("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(o.url===void 0||o.url===null)throw new k("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new k(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}var rt,k,_n=C(()=>{"use strict";P();Jt();rt=p.withTag("ConfigAdapter");c(Dn,"inferTransportTypeFromUrl");k=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{c(this,"ConfigValidationError")}};c(Ln,"convertLegacyToNew");c(lc,"convertByConfigType");c(gc,"convertLocalConfig");c(xn,"convertSSEConfig");c(Nn,"convertStreamableHTTPConfig");c(uc,"isRelativePath");c(hc,"isLocalConfig");c(pc,"isModelScopeURL");c(dc,"validateNewConfig")});async function mc(){return console.log("\u{1F680} \u6B63\u5728\u521D\u59CB\u5316 MCPServiceManager \u5355\u4F8B..."),new wn}async function kn(){if(ye&&Z==="initialized")return ye;if(de&&Z==="initializing")return de;Z==="failed"&&as(),Z="initializing",de=mc();try{return ye=await de,Z="initialized",st=`mcp-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,Tt=null,console.log(`\u2705 MCPServiceManager \u5355\u4F8B\u521D\u59CB\u5316\u6210\u529F\uFF0C\u5B9E\u4F8BID: ${st}`),ye}catch(o){throw Z="failed",Tt=o,de=null,console.error("\u274C MCPServiceManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",o.message),o}}async function jn(){if(Z==="cleanup"){console.log("\u26A0\uFE0F MCPServiceManager \u5355\u4F8B\u5DF2\u5728\u6E05\u7406\u4E2D\uFF0C\u8DF3\u8FC7\u91CD\u590D\u6E05\u7406");return}console.log("\u{1F9F9} \u6B63\u5728\u6E05\u7406 MCPServiceManager \u5355\u4F8B\u8D44\u6E90..."),Z="cleanup";try{if(de){try{await(await de).stopAllServices()}catch(o){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",o.message)}de=null}ye&&(await ye.stopAllServices(),ye=null),Z="not_initialized",Tt=null,st=null,console.log("\u2705 MCPServiceManager \u5355\u4F8B\u8D44\u6E90\u6E05\u7406\u5B8C\u6210")}catch(o){throw console.error("\u274C MCPServiceManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",o.message),as(),o}}function as(){console.log("\u{1F504} \u91CD\u7F6E MCPServiceManager \u5355\u4F8B\u72B6\u6001"),ye=null,de=null,Z="not_initialized",Tt=null,st=null}function fc(){return Z==="initialized"&&ye!==null}function Cc(){return{state:Z,initializationTime:st?new Date:void 0,lastError:Tt||void 0,instanceId:st||void 0}}async function vc(){return console.log("\u{1F504} \u5F3A\u5236\u91CD\u65B0\u521D\u59CB\u5316 MCPServiceManager \u5355\u4F8B..."),await jn(),kn()}function Sc(){return ye}async function Ec(){if(Z==="initialized")return!0;if(Z==="initializing"&&de)try{return await de,!0}catch{return!1}return!1}var ye,de,Z,Tt,st,oe,Qt=C(()=>{"use strict";rs();ye=null,de=null,Z="not_initialized",Tt=null,st=null;c(mc,"createInstance");c(kn,"getInstance");c(jn,"cleanup");c(as,"reset");c(fc,"isInitialized");c(Cc,"getStatus");c(vc,"forceReinitialize");c(Sc,"getCurrentInstance");c(Ec,"waitForInitialization");oe={getInstance:kn,cleanup:jn,reset:as,isInitialized:fc,getStatus:Cc,forceReinitialize:vc,getCurrentInstance:Sc,waitForInitialization:Ec};process.on("exit",()=>{oe.isInitialized()&&(console.log("\u{1F504} \u8FDB\u7A0B\u9000\u51FA\uFF0C\u6B63\u5728\u6E05\u7406 MCPServiceManager \u5355\u4F8B..."),oe.reset())});process.on("uncaughtException",async o=>{console.error("\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF0C\u6E05\u7406 MCPServiceManager \u5355\u4F8B:",o);try{await oe.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}});process.on("unhandledRejection",async o=>{console.error("\u{1F4A5} \u672A\u5904\u7406\u7684Promise\u62D2\u7EDD\uFF0C\u6E05\u7406 MCPServiceManager \u5355\u4F8B:",o);try{await oe.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});import{EventEmitter as yc}from"events";import{z as $e}from"zod";var Tc,Mc,er,Hn=C(()=>{"use strict";P();Ft();z();Lt();Tc={reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4,errorRecoveryEnabled:!0,errorNotificationEnabled:!0,serviceAddedDelayMs:2e3,serviceRemovedDelayMs:2e3,batchAddedDelayMs:3e3},Mc=$e.object({reconnectInterval:$e.number().min(100,"reconnectInterval \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 100 \u7684\u6570\u5B57").optional(),maxReconnectAttempts:$e.number().min(0,"maxReconnectAttempts \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),connectionTimeout:$e.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),errorRecoveryEnabled:$e.boolean().optional(),errorNotificationEnabled:$e.boolean().optional(),serviceAddedDelayMs:$e.number().min(0,"serviceAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),serviceRemovedDelayMs:$e.number().min(0,"serviceRemovedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),batchAddedDelayMs:$e.number().min(0,"batchAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional()}).strict(),er=class extends yc{static{c(this,"IndependentXiaozhiConnectionManager")}connections=new Map;connectionStates=new Map;mcpServiceManager=null;configManager;logger;eventBus;isInitialized=!1;isConnecting=!1;options;reconnectTimers=new Map;constructor(e,t){super(),this.configManager=e,this.logger=p,this.eventBus=w(),this.options={...Tc,...t},this.logger.debug("[IndependentXiaozhiConnectionManager] \u5B9E\u4F8B\u5DF2\u521B\u5EFA"),this.logger.debug("[IndependentXiaozhiConnectionManager] \u914D\u7F6E\u9009\u9879:",this.options),this.setupMCPServerEventListeners()}async initialize(e,t){if(!this.isInitialized){this.logger.debug(`\u5F00\u59CB\u521D\u59CB\u5316 IndependentXiaozhiConnectionManager\uFF0C\u5C0F\u667A\u63A5\u5165\u70B9\u6570\u91CF: ${e.length}`);try{this.validateInitializeParams(e,t),await this.cleanup();for(let r of e)await this.createConnection(r,t);this.isInitialized=!0,this.logger.debug(`IndependentXiaozhiConnectionManager \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${this.connections.size} \u4E2A\u8FDE\u63A5`)}catch(r){throw this.logger.error("IndependentXiaozhiConnectionManager \u521D\u59CB\u5316\u5931\u8D25:",r),await this.cleanup(),r}}}async connect(){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");if(!this.isConnecting){this.isConnecting=!0,this.logger.debug(`\u5F00\u59CB\u8FDE\u63A5\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\uFF0C\u603B\u6570: ${this.connections.size}`);try{let e=[];for(let[n,i]of this.connections)e.push(this.connectSingleEndpoint(n,i));let t=await Promise.allSettled(e),r=t.filter(n=>n.status==="fulfilled").length,s=t.length-r;if(this.logger.info(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5B8C\u6210 - \u6210\u529F: ${r}, \u5931\u8D25: ${s}`),r===0)throw new Error("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25")}finally{this.isConnecting=!1}}}async disconnect(){this.logger.debug("\u5F00\u59CB\u65AD\u5F00\u6240\u6709\u8FDE\u63A5"),this.clearAllReconnectTimers();let e=[];for(let[t,r]of this.connections)e.push(this.disconnectSingleEndpoint(t,r));await Promise.allSettled(e),this.logger.info("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u5DF2\u65AD\u5F00\u8FDE\u63A5")}async addEndpoint(e){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316");if(this.connections.has(e)){this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u5B58\u5728\u4E8E\u8FDE\u63A5\u7BA1\u7406\u5668\u4E2D\uFF0C\u8DF3\u8FC7\u6DFB\u52A0`);return}if(this.checkConfigDuplicate(e))throw new Error(`\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D`);this.logger.debug(`\u52A8\u6001\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9: ${E(e)}`);try{this.configManager.addMcpEndpoint(e);try{let t=this.getCurrentTools();await this.createConnection(e,t);let r=this.connections.get(e);await this.connectSingleEndpoint(e,r),this.logger.info(`\u6DFB\u52A0\u63A5\u5165\u70B9\u6210\u529F\uFF1A ${E(e)}`)}catch(t){try{this.configManager.removeMcpEndpoint(e),this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u6210\u529F: ${E(e)}`)}catch(r){this.logger.error(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u5931\u8D25: ${E(e)}`,r)}throw this.connections.delete(e),this.connectionStates.delete(e),this.logger.error(`\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${E(e)}`,t),t}}catch(t){throw this.logger.error(`\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF08\u914D\u7F6E\u6587\u4EF6\u64CD\u4F5C\uFF09\uFF1A ${E(e)}`,t),t}}async removeEndpoint(e){if(!this.connections.has(e)){this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u4E0D\u5B58\u5728\u4E8E\u8FDE\u63A5\u7BA1\u7406\u5668\u4E2D\uFF0C\u8DF3\u8FC7\u79FB\u9664`);return}this.logger.debug(`\u52A8\u6001\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9: ${E(e)}`);try{let t=this.connections.get(e);this.configManager.removeMcpEndpoint(e);try{await this.disconnectSingleEndpoint(e,t),this.connections.delete(e),this.connectionStates.delete(e);let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e)),this.logger.info(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u6210\u529F\uFF1A${E(e)}`)}catch(r){try{this.configManager.addMcpEndpoint(e),this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u6210\u529F: ${E(e)}`)}catch(s){this.logger.error(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u5931\u8D25: ${E(e)}`,s)}throw this.logger.error(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${E(e)}`,r),r}}catch(t){throw this.logger.error(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF08\u914D\u7F6E\u6587\u4EF6\u64CD\u4F5C\uFF09\uFF1A ${E(e)}`,t),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){this.logger.debug(`\u63A5\u5165\u70B9\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u65AD\u5F00: ${E(e)}`);return}this.logger.info(`\u65AD\u5F00\u8FDE\u63A5\u63A5\u5165\u70B9: ${E(e)}`);try{await this.disconnectSingleEndpoint(e,t)}catch(r){throw this.logger.error(`\u65AD\u5F00\u8FDE\u63A5\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${E(e)}`,r),r}}async clearEndpoints(){this.logger.debug("\u6E05\u9664\u6240\u6709\u63A5\u5165\u70B9");let e=Array.from(this.connections.keys()).map(t=>this.removeEndpoint(t));await Promise.allSettled(e),this.logger.info("\u6240\u6709\u63A5\u5165\u70B9\u5DF2\u6E05\u9664")}getConnectionStatus(){return Array.from(this.connectionStates.values())}isAnyConnected(){for(let e of this.connectionStates.values())if(e.connected)return!0;return!1}setServiceManager(e){this.mcpServiceManager=e,this.logger.debug("\u5DF2\u8BBE\u7F6E MCPServiceManager"),this.connections.size>0&&this.syncToolsToAllConnections()}async triggerReconnect(e){let t=this.connectionStates.get(e);if(!t)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9 ${e} \u4E0D\u5B58\u5728`);if(t.connected){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u8FDE\u63A5\uFF0C\u65E0\u9700\u91CD\u8FDE`);return}this.logger.info(`\u624B\u52A8\u89E6\u53D1\u91CD\u8FDE: ${E(e)}`);let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e)),await this.performReconnect(e)}stopReconnect(e){let t=this.connectionStates.get(e);if(!t){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u4E0D\u5B58\u5728`);return}let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e),t.isReconnecting=!1,t.nextReconnectTime=void 0,this.logger.info(`\u5DF2\u505C\u6B62\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u7684\u91CD\u8FDE`))}stopAllReconnects(){this.logger.info("\u505C\u6B62\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u7684\u91CD\u8FDE");for(let[e]of this.reconnectTimers)this.stopReconnect(e)}emitEndpointStatusChanged(e,t,r,s,n,i="connection-manager"){this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:t,operation:r,success:s,message:n,timestamp:Date.now(),source:i})}async connectExistingEndpoint(e){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${E(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);if(this.connectionStates.get(e)?.connected){this.logger.debug(`\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u8FDE\u63A5\uFF0C\u8DF3\u8FC7\u8FDE\u63A5`);return}this.logger.info(`\u8FDE\u63A5\u5DF2\u5B58\u5728\u7684\u63A5\u5165\u70B9: ${E(e)}`),await this.connectSingleEndpoint(e,t)}async sleep(e){return new Promise(t=>setTimeout(t,e))}getReconnectStats(){let e={};for(let[t,r]of this.connectionStates)e[t]={endpoint:t,reconnectAttempts:r.reconnectAttempts,isReconnecting:r.isReconnecting,nextReconnectTime:r.nextReconnectTime,lastReconnectAttempt:r.lastReconnectAttempt,reconnectDelay:r.reconnectDelay};return e}validateEndpoints(e){let t=[],r=[];for(let s of e){if(!s||typeof s!="string"){r.push(s);continue}if(!s.startsWith("ws://")&&!s.startsWith("wss://")){r.push(s);continue}try{new URL(s),t.push(s)}catch{r.push(s)}}return{valid:t,invalid:r}}validateOptions(e){let t=Mc.safeParse(e);return t.success?{valid:!0,errors:[]}:{valid:!1,errors:t.error.errors.map(s=>s.message)}}async updateEndpoints(e,t=[]){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316");this.logger.info(`\u66F4\u65B0\u5C0F\u667A\u63A5\u5165\u70B9\u914D\u7F6E\uFF0C\u65B0\u5C0F\u667A\u63A5\u5165\u70B9\u6570\u91CF: ${e.length}`);let{valid:r,invalid:s}=this.validateEndpoints(e);if(s.length>0&&this.logger.warn(`\u53D1\u73B0\u65E0\u6548\u5C0F\u667A\u63A5\u5165\u70B9: ${s.join(", ")}`),r.length===0)throw new Error("\u6CA1\u6709\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9");let n=Array.from(this.connections.keys()),i=r.filter(g=>!n.includes(g)),a=n.filter(g=>!r.includes(g)),l=n.filter(g=>r.includes(g));this.logger.info(`\u5C0F\u667A\u63A5\u5165\u70B9\u53D8\u66F4 - \u6DFB\u52A0: ${i.length}, \u79FB\u9664: ${a.length}, \u4FDD\u6301: ${l.length}`);try{for(let u of a)await this.removeEndpoint(u);for(let u of i)await this.addEndpoint(u);let g={type:i.length>0&&a.length>0?"endpoints_updated":i.length>0?"endpoints_added":"endpoints_removed",data:{added:i.length>0?i:void 0,removed:a.length>0?a:void 0,updated:i.length>0&&a.length>0?r:void 0},timestamp:new Date};this.emit("configChange",g),this.logger.info("\u5C0F\u667A\u63A5\u5165\u70B9\u914D\u7F6E\u66F4\u65B0\u5B8C\u6210")}catch(g){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",g),g}}updateOptions(e){this.logger.info("\u66F4\u65B0\u8FDE\u63A5\u9009\u9879");let{valid:t,errors:r}=this.validateOptions(e);if(!t)throw new Error(`\u65E0\u6548\u7684\u8FDE\u63A5\u9009\u9879: ${r.join(", ")}`);let s={...this.options};this.options={...this.options,...e};let n={type:"options_updated",data:{oldOptions:s,newOptions:e},timestamp:new Date};this.emit("configChange",n),this.logger.info("\u8FDE\u63A5\u9009\u9879\u66F4\u65B0\u5B8C\u6210"),this.logger.debug("\u65B0\u7684\u914D\u7F6E\u9009\u9879:",this.options)}getCurrentConfig(){return{endpoints:Array.from(this.connections.keys()),options:{...this.options}}}async reloadConfig(e){this.logger.info("\u5F00\u59CB\u70ED\u91CD\u8F7D\u914D\u7F6E");try{e.options&&this.updateOptions(e.options),e.endpoints&&await this.updateEndpoints(e.endpoints,e.tools||[]),this.logger.info("\u914D\u7F6E\u70ED\u91CD\u8F7D\u5B8C\u6210")}catch(t){throw this.logger.error("\u914D\u7F6E\u70ED\u91CD\u8F7D\u5931\u8D25:",t),t}}async prewarmConnections(e=[]){let t=e.length>0?e:Array.from(this.connections.keys());this.logger.info(`\u5F00\u59CB\u9884\u70ED\u8FDE\u63A5\uFF0C\u5C0F\u667A\u63A5\u5165\u70B9\u6570\u91CF: ${t.length}`);let r=t.map(async s=>{try{this.connections.get(s)&&this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(s)} \u9884\u70ED\u5B8C\u6210`)}catch(n){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(s)} \u9884\u70ED\u5931\u8D25:`,n)}});await Promise.all(r),this.logger.info("\u8FDE\u63A5\u9884\u70ED\u5B8C\u6210")}async cleanup(){this.logger.info("\u5F00\u59CB\u6E05\u7406 IndependentXiaozhiConnectionManager \u8D44\u6E90");try{await this.disconnect(),this.connections.clear(),this.connectionStates.clear(),this.isInitialized=!1,this.isConnecting=!1,this.logger.info("IndependentXiaozhiConnectionManager \u8D44\u6E90\u6E05\u7406\u5B8C\u6210")}catch(e){throw this.logger.error("IndependentXiaozhiConnectionManager \u8D44\u6E90\u6E05\u7406\u5931\u8D25:",e),e}}checkConfigDuplicate(e){try{return this.configManager.getMcpEndpoints().includes(e)}catch(t){return this.logger.error(`\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u91CD\u590D\u6027\u5931\u8D25: ${t}`),!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){this.logger.debug(`\u521B\u5EFA\u8FDE\u63A5\u5B9E\u4F8B: ${E(e)}`);try{let r=new be(e);this.mcpServiceManager&&r.setServiceManager(this.mcpServiceManager),this.connections.set(e,r),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1,isReconnecting:!1,lastReconnectAttempt:void 0,reconnectDelay:this.options.reconnectInterval,reconnectAttempts:0,nextReconnectTime:void 0}),this.logger.debug(`\u8FDE\u63A5\u5B9E\u4F8B\u521B\u5EFA\u6210\u529F: ${E(e)}`)}catch(r){throw this.logger.error(`\u521B\u5EFA\u8FDE\u63A5\u5B9E\u4F8B\u5931\u8D25 ${E(e)}:`,r),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: ${E(e)}`);this.logger.debug(`\u8FDE\u63A5\u5C0F\u667A\u63A5\u5165\u70B9: ${E(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,r.reconnectAttempts=0,this.emitEndpointStatusChanged(e,!0,"connect",!0,"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F","connection-manager"),this.logger.info(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${E(e)}`)}catch(s){throw r.connected=!1,r.initialized=!1,r.lastError=s instanceof Error?s.message:String(s),r.reconnectAttempts++,this.emitEndpointStatusChanged(e,!1,"connect",!1,s instanceof Error?s.message:"\u8FDE\u63A5\u5931\u8D25","connection-manager"),this.logger.error(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25 ${E(e)}:`,s),this.scheduleReconnect(e),s}}async disconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(r){this.logger.debug(`\u65AD\u5F00\u5C0F\u667A\u63A5\u5165\u70B9: ${E(e)}`);try{t.disconnect(),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!0,"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F","connection-manager"),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F: ${E(e)}`)}catch(s){this.logger.error(`\u5C0F\u667A\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25 ${E(e)}:`,s),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!1,s instanceof Error?s.message:"\u65AD\u5F00\u5931\u8D25","connection-manager")}}}getCurrentTools(){if(!this.mcpServiceManager)return[];try{return this.mcpServiceManager.getAllTools()}catch(e){return this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",e),[]}}syncToolsToAllConnections(){if(this.mcpServiceManager){this.logger.debug("\u540C\u6B65\u5DE5\u5177\u5230\u6240\u6709\u8FDE\u63A5");for(let[e,t]of this.connections)try{t.setServiceManager(this.mcpServiceManager),this.logger.debug(`\u5DE5\u5177\u540C\u6B65\u6210\u529F: ${E(e)}`)}catch(r){this.logger.error(`\u5DE5\u5177\u540C\u6B65\u5931\u8D25 ${E(e)}:`,r)}}}scheduleReconnect(e){let t=this.connectionStates.get(e);if(!t)return;if(t.reconnectAttempts>=this.options.maxReconnectAttempts){this.logger.warn(`\u505C\u6B62\u91CD\u8FDE ${E(e)}: \u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u6B21\u6570`);return}let r=setTimeout(()=>{this.reconnectTimers.delete(e),this.performReconnect(e)},this.options.reconnectInterval);this.reconnectTimers.set(e,r)}async performReconnect(e){let t=this.connectionStates.get(e);if(!t)return;let r=this.connections.get(e);if(!r){this.logger.warn(`\u91CD\u8FDE\u65F6\u627E\u4E0D\u5230\u4EE3\u7406\u670D\u52A1\u5668: ${E(e)}`);return}try{t.isReconnecting=!0,t.lastReconnectAttempt=new Date;try{await r.disconnect()}catch(s){this.logger.debug(`\u65AD\u5F00\u8FDE\u63A5\u5931\u8D25\uFF08\u7EE7\u7EED\u91CD\u8FDE\uFF09: ${E(e)}:`,s)}await r.connect(),t.connected=!0,t.initialized=!0,t.lastConnected=new Date,t.lastError=void 0,t.reconnectAttempts=0,t.isReconnecting=!1,this.emitEndpointStatusChanged(e,!0,"reconnect",!0,"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F","connection-manager"),this.logger.info(`\u91CD\u8FDE\u6210\u529F ${E(e)}`)}catch(s){t.connected=!1,t.initialized=!1,t.lastError=s instanceof Error?s.message:String(s),t.reconnectAttempts++,t.isReconnecting=!1,this.emitEndpointStatusChanged(e,!1,"reconnect",!1,s instanceof Error?s.message:"\u91CD\u8FDE\u5931\u8D25","connection-manager"),this.logger.error(`\u91CD\u8FDE\u5931\u8D25 ${E(e)}:`,s),this.scheduleReconnect(e)}}clearAllReconnectTimers(){for(let[,e]of this.reconnectTimers)clearTimeout(e);this.reconnectTimers.clear()}setupMCPServerEventListeners(){this.eventBus.onEvent("mcp:server:added",async e=>{await this.handleMCPServerAdded(e)}),this.eventBus.onEvent("mcp:server:removed",async e=>{await this.handleMCPServerRemoved(e)}),this.eventBus.onEvent("mcp:server:batch_added",async e=>{await this.handleMCPServerBatchAdded(e)})}async handleMCPServerAdded(e){this.logger.info(`\u68C0\u6D4B\u5230MCP\u670D\u52A1\u6DFB\u52A0: ${e.serverName}\uFF0C\u51C6\u5907\u91CD\u8FDE\u63A5\u5165\u70B9`);try{await this.reconnectAllEndpoints({reason:"server_added",delayMs:this.options.serviceAddedDelayMs,serverName:e.serverName})}catch(t){this.logger.error(`\u5904\u7406MCP\u670D\u52A1\u6DFB\u52A0\u4E8B\u4EF6\u5931\u8D25: ${e.serverName}`,t)}}async handleMCPServerRemoved(e){this.logger.info(`\u68C0\u6D4B\u5230MCP\u670D\u52A1\u5220\u9664: ${e.serverName}\uFF0C\u51C6\u5907\u91CD\u8FDE\u63A5\u5165\u70B9`);try{await this.reconnectAllEndpoints({reason:"server_removed",delayMs:this.options.serviceRemovedDelayMs,serverName:e.serverName})}catch(t){this.logger.error(`\u5904\u7406MCP\u670D\u52A1\u5220\u9664\u4E8B\u4EF6\u5931\u8D25: ${e.serverName}`,t)}}async handleMCPServerBatchAdded(e){this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CFMCP\u670D\u52A1\u6DFB\u52A0: ${e.addedCount}\u4E2A\u670D\u52A1\uFF0C\u51C6\u5907\u91CD\u8FDE\u63A5\u5165\u70B9`);try{await this.reconnectAllEndpoints({reason:"batch_server_added",delayMs:this.options.batchAddedDelayMs,serverNames:e.successfullyAddedServers})}catch(t){this.logger.error("\u5904\u7406\u6279\u91CFMCP\u670D\u52A1\u6DFB\u52A0\u4E8B\u4EF6\u5931\u8D25",t)}}async reconnectAllEndpoints(e){this.logger.info(`\u5F00\u59CB\u91CD\u8FDE\u6240\u6709\u63A5\u5165\u70B9\uFF0C\u539F\u56E0: ${e.reason}`);let t=Array.from(this.connections.keys());if(t.length===0){this.logger.debug("\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u63A5\u5165\u70B9\u9700\u8981\u91CD\u8FDE");return}this.logger.debug(`\u627E\u5230 ${t.length} \u4E2A\u5DF2\u8FDE\u63A5\u7684\u63A5\u5165\u70B9\u9700\u8981\u91CD\u8FDE`),e.delayMs>0&&(this.logger.debug(`\u7B49\u5F85 ${e.delayMs}ms \u540E\u5F00\u59CB\u91CD\u8FDE`),await new Promise(s=>setTimeout(s,e.delayMs)));for(let s of t)await this.disconnectEndpointForReconnect(s);let r=t.map(async s=>{try{await this.connectToEndpoint(s),this.logger.debug(`\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F: ${E(s)}`)}catch(n){this.logger.error(`\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25: ${E(s)}`,n)}});await Promise.all(r),this.logger.info(`\u6240\u6709\u63A5\u5165\u70B9\u91CD\u8FDE\u5B8C\u6210\uFF0C\u539F\u56E0: ${e.reason}`),this.eventBus.emitEvent("connection:reconnect:completed",{success:!0,reason:e.reason,timestamp:new Date})}async disconnectEndpointForReconnect(e){let t=this.connections.get(e);if(!t){this.logger.warn(`\u63A5\u5165\u70B9\u672A\u627E\u5230: ${e}`);return}try{await t.disconnect(),this.connections.delete(e),this.connectionStates.delete(e);let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e)),this.logger.debug(`\u63A5\u5165\u70B9\u5DF2\u65AD\u5F00: ${E(e)}`),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:!1,operation:"disconnect",success:!0,message:"MCP\u670D\u52A1\u53D8\u66F4\u5BFC\u81F4\u91CD\u8FDE",timestamp:Date.now(),source:"ConnectionManager"})}catch(r){throw this.logger.error(`\u65AD\u5F00\u63A5\u5165\u70B9\u5931\u8D25: ${E(e)}`,r),r}}async connectToEndpoint(e){if(this.connections.has(e)){this.logger.debug(`\u63A5\u5165\u70B9\u5DF2\u5B58\u5728\u8FDE\u63A5: ${E(e)}`);return}this.logger.debug(`\u8FDE\u63A5\u63A5\u5165\u70B9: ${E(e)}`);try{let t=new be(e);this.mcpServiceManager&&t.setServiceManager(this.mcpServiceManager),this.connections.set(e,t),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1,isReconnecting:!1,lastReconnectAttempt:void 0,reconnectDelay:this.options.reconnectInterval,reconnectAttempts:0,nextReconnectTime:void 0}),await this.connectSingleEndpoint(e,t),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${E(e)}`)}catch(t){throw this.connections.delete(e),this.connectionStates.delete(e),this.logger.error(`\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25: ${E(e)}`,t),t}}}});async function Pc(o){if(console.log("\u{1F680} \u6B63\u5728\u521D\u59CB\u5316 IndependentXiaozhiConnectionManager \u5355\u4F8B..."),o){let r=["loadBalanceStrategy","reconnectStrategy","maxReconnectDelay","reconnectBackoffMultiplier","jitterEnabled"].filter(s=>s in o);r.length>0&&(console.warn(`\u26A0\uFE0F \u68C0\u6D4B\u5230\u5E9F\u5F03\u7684\u914D\u7F6E\u9009\u9879: ${r.join(", ")}`),console.warn("\u8FD9\u4E9B\u914D\u7F6E\u9879\u5728\u72EC\u7ACB\u67B6\u6784\u4E2D\u5DF2\u88AB\u5FFD\u7565\uFF0C\u5EFA\u8BAE\u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664"))}return new er(d,o)}async function zn(o){if(Te&&Q==="initialized")return Te;if(ge&&Q==="initializing")return ge;Q==="failed"&&cs(),Q="initializing",ge=Pc(o);try{return Te=await ge,Q="initialized",nt=`xiaozhi-connection-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,Mt=null,console.log(`\u2705 IndependentXiaozhiConnectionManager \u5355\u4F8B\u521D\u59CB\u5316\u6210\u529F\uFF0C\u5B9E\u4F8BID: ${nt}`),Te}catch(e){throw Q="failed",Mt=e,ge=null,console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",e.message),e}}async function Un(){if(Q==="cleanup"){console.log("\u26A0\uFE0F IndependentXiaozhiConnectionManager \u5355\u4F8B\u5DF2\u5728\u6E05\u7406\u4E2D\uFF0C\u8DF3\u8FC7\u91CD\u590D\u6E05\u7406");return}console.log("\u{1F9F9} \u6B63\u5728\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B\u8D44\u6E90..."),Q="cleanup";try{if(ge){try{await(await ge).cleanup()}catch(o){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",o.message)}ge=null}Te&&(await Te.cleanup(),Te=null),Q="not_initialized",Mt=null,nt=null,console.log("\u2705 IndependentXiaozhiConnectionManager \u5355\u4F8B\u8D44\u6E90\u6E05\u7406\u5B8C\u6210")}catch(o){throw console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",o.message),cs(),o}}function cs(){console.log("\u{1F504} \u91CD\u7F6E IndependentXiaozhiConnectionManager \u5355\u4F8B\u72B6\u6001..."),ge&&(ge=null),Te=null,Q="not_initialized",Mt=null,nt=null,console.log("\u2705 IndependentXiaozhiConnectionManager \u5355\u4F8B\u72B6\u6001\u5DF2\u91CD\u7F6E")}function wc(){return Q==="initialized"&&Te!==null}function Rc(){return{state:Q,initializationTime:nt?new Date:void 0,lastError:Mt||void 0,instanceId:nt||void 0}}async function bc(o){return console.log("\u{1F504} \u5F3A\u5236\u91CD\u65B0\u521D\u59CB\u5316 IndependentXiaozhiConnectionManager \u5355\u4F8B..."),await Un(),zn(o)}function Ic(){return Te}async function $c(){if(Q==="initialized")return!0;if(Q==="initializing"&&ge)try{return await ge,!0}catch{return!1}return!1}var Te,ge,Q,Mt,nt,ot,Fn=C(()=>{"use strict";se();Hn();Te=null,ge=null,Q="not_initialized",Mt=null,nt=null;c(Pc,"createInstance");c(zn,"getInstance");c(Un,"cleanup");c(cs,"reset");c(wc,"isInitialized");c(Rc,"getStatus");c(bc,"forceReinitialize");c(Ic,"getCurrentInstance");c($c,"waitForInitialization");ot={getInstance:zn,cleanup:Un,reset:cs,isInitialized:wc,getStatus:Rc,forceReinitialize:bc,getCurrentInstance:Ic,waitForInitialization:$c};process.on("exit",()=>{ot.isInitialized()&&(console.log("\u{1F504} \u8FDB\u7A0B\u9000\u51FA\uFF0C\u6B63\u5728\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B..."),ot.reset())});process.on("uncaughtException",async o=>{console.error("\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF0C\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B:",o);try{await ot.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}});process.on("unhandledRejection",async o=>{console.error("\u{1F4A5} \u672A\u5904\u7406\u7684Promise\u62D2\u7EDD\uFF0C\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B:",o);try{await ot.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});var Me,Pt=C(()=>{"use strict";P();se();z();Me=class{static{c(this,"ConfigService")}logger;eventBus;constructor(){this.logger=p.withTag("ConfigService"),this.eventBus=w()}async getConfig(){try{let e=d.getConfig();return this.logger.debug("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e}catch(e){throw this.logger.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",e),this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"getConfig"}),e}}async updateConfig(e,t="unknown"){try{this.logger.info(`\u5F00\u59CB\u66F4\u65B0\u914D\u7F6E\uFF0C\u6765\u6E90: ${t}`),this.validateConfig(e),e.mcpEndpoint!==d.getMcpEndpoint()&&d.updateMcpEndpoint(e.mcpEndpoint);let r=d.getMcpServers();for(let[s,n]of Object.entries(e.mcpServers))JSON.stringify(r[s])!==JSON.stringify(n)&&d.updateMcpServer(s,n);for(let s of Object.keys(r))s in e.mcpServers||(d.removeMcpServer(s),d.removeServerToolsConfig(s));if(e.connection&&d.updateConnectionConfig(e.connection),e.modelscope&&d.updateModelScopeConfig(e.modelscope),e.webUI&&d.updateWebUIConfig(e.webUI),e.mcpServerConfig)for(let[s,n]of Object.entries(e.mcpServerConfig))for(let[i,a]of Object.entries(n.tools))d.setToolEnabled(s,i,a.enable);if(e?.platforms)for(let[s,n]of Object.entries(e.platforms))d.updatePlatformConfig(s,n);this.logger.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date})}catch(r){throw this.logger.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r),this.eventBus.emitEvent("config:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateConfig"}),r}}getMcpEndpoint(){try{return d.getMcpEndpoint()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",e),e}}getMcpEndpoints(){try{return d.getMcpEndpoints()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",e),e}}getMcpServers(){try{return d.getMcpServers()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",e),e}}getConnectionConfig(){try{return d.getConnectionConfig()}catch(e){throw this.logger.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",e),e}}getWebUIPort(){try{return d.getWebUIPort()||9999}catch(e){return this.logger.error("\u83B7\u53D6 Web UI \u7AEF\u53E3\u5931\u8D25:",e),9999}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.mcpEndpoint&&e.mcpEndpoint!=="")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B mcpEndpoint");if(!e.mcpServers||typeof e.mcpServers!="object")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 mcpServers")}configExists(){return d.configExists()}async reloadConfig(){try{this.logger.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E"),d.reloadConfig();let e=await this.getConfig();return this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date}),e}catch(e){throw this.logger.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",e),this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"reloadConfig"}),e}}getConfigPath(){return d.getConfigPath()}}});var tr,Vn=C(()=>{"use strict";P();Pt();tr=class{static{c(this,"ConfigApiHandler")}logger;configService;constructor(){this.logger=p.withTag("ConfigApiHandler"),this.configService=new Me}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getConfig(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let t=await this.configService.getConfig();return this.logger.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async updateConfig(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\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\u914D\u7F6E\u5BF9\u8C61");return e.json(r,400)}return await this.configService.updateConfig(t,"http-api"),this.logger.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_UPDATE_ERROR",t instanceof Error?t.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25");return e.json(r,400)}}async getMcpEndpoint(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let t=this.configService.getMcpEndpoint();return this.logger.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(this.createSuccessResponse({endpoint:t}))}catch(t){this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",t);let r=this.createErrorResponse("MCP_ENDPOINT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25");return e.json(r,500)}}async getMcpEndpoints(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let t=this.configService.getMcpEndpoints();return this.logger.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(this.createSuccessResponse({endpoints:t}))}catch(t){this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("MCP_ENDPOINTS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getMcpServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let t=this.configService.getMcpServers();return this.logger.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async getConnectionConfig(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let t=this.configService.getConnectionConfig();return this.logger.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse({connection:t}))}catch(t){this.logger.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("CONNECTION_CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async reloadConfig(e){try{this.logger.info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42");let t=await this.configService.reloadConfig();return this.logger.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(t,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_RELOAD_ERROR",t instanceof Error?t.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async getConfigPath(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let t=this.configService.getConfigPath();return this.logger.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(this.createSuccessResponse({path:t}))}catch(t){this.logger.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_PATH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25");return e.json(r,500)}}async checkConfigExists(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let t=this.configService.configExists();return this.logger.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.json(this.createSuccessResponse({exists:t}))}catch(t){this.logger.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25");return e.json(r,500)}}}});async function Oc(o,e=3,t=1e3){for(let r=1;r<=e;r++)try{return await o()}catch(s){if(r===e)throw s;let n=t*2**(r-1);p.warn(`\u6263\u5B50 API \u8C03\u7528\u5931\u8D25\uFF0C${n}ms \u540E\u91CD\u8BD5 (${r}/${e})`,s),await new Promise(i=>setTimeout(i,n))}throw new Error("Max retry attempts exceeded")}function Ac(o,e){let t=o.status;return t===401?new Pe("\u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6263\u5B50 API Token \u914D\u7F6E","AUTH_FAILED",401,e):t===429?new Pe("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED",429,e):t>=500?new Pe("\u6263\u5B50\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","SERVER_ERROR",t,e):new Pe(e?.msg||`API \u8C03\u7528\u5931\u8D25: ${o.statusText}`,"API_ERROR",t,e)}var ls,Pe,rr,Wn=C(()=>{"use strict";P();ls=class{static{c(this,"CozeApiCache")}cache=new Map;TTL={workspaces:1800*1e3,workflows:300*1e3};set(e,t,r){this.cache.set(e,{data:t,timestamp:Date.now(),ttl:this.TTL[r]})}get(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>t.ttl?(this.cache.delete(e),null):t.data:null}clear(e){if(!e){this.cache.clear();return}for(let t of this.cache.keys())t.includes(e)&&this.cache.delete(t)}getStats(){return{size:this.cache.size,keys:Array.from(this.cache.keys())}}},Pe=class extends Error{static{c(this,"CozeApiErrorImpl")}code;statusCode;response;constructor(e,t,r,s){super(e),this.name="CozeApiError",this.code=t,this.statusCode=r,this.response=s}};c(Oc,"retryWithBackoff");c(Ac,"handleCozeApiError");rr=class{static{c(this,"CozeApiService")}cache=new ls;token;API_BASE_URL="https://api.coze.cn";TIMEOUT=1e4;RETRY_ATTEMPTS=3;constructor(e){if(!e||typeof e!="string"||e.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.token=e.trim()}async getWorkspaces(){let e="workspaces",t=this.cache.get(e);if(t)return p.debug("\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868"),t;p.info("\u83B7\u53D6\u6263\u5B50\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await this.request("/v1/workspaces");if(r.code!==0)throw new Pe(r.msg||"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25","API_ERROR",void 0,r);let s=r.data.workspaces;return this.cache.set(e,s,"workspaces"),p.info(`\u6210\u529F\u83B7\u53D6 ${s.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),s}async getWorkflows(e){let{workspace_id:t,page_num:r=1,page_size:s=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let n=`workflows:${t}:${r}:${s}`,i=this.cache.get(n);if(i)return p.debug(`\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868: ${t}`),i;p.info(`\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868 (\u9875\u7801: ${r}, \u6BCF\u9875: ${s})`);let a=new URLSearchParams({workspace_id:t,page_num:r.toString(),page_size:s.toString(),workflow_mode:"workflow"}),l=await this.request(`/v1/workflows?${a}`);if(l.code!==0)throw new Pe(l.msg||"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25","API_ERROR",void 0,l);let g={items:l.data.items,hasMore:l.data.has_more};return this.cache.set(n,g,"workflows"),p.info(`\u6210\u529F\u83B7\u53D6 ${g.items.length} \u4E2A\u5DE5\u4F5C\u6D41\uFF0ChasMore: ${g.hasMore}`),g}async request(e){return Oc(async()=>{let t=`${this.API_BASE_URL}${e}`;p.debug(`\u53D1\u8D77\u6263\u5B50 API \u8BF7\u6C42: ${t}`);let r=new AbortController,s=setTimeout(()=>r.abort(),this.TIMEOUT);try{let n=await fetch(t,{headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},signal:r.signal});clearTimeout(s);let i;try{i=await n.json()}catch(a){throw p.error("\u89E3\u6790\u54CD\u5E94 JSON \u5931\u8D25:",a),new Pe("\u54CD\u5E94\u6570\u636E\u683C\u5F0F\u9519\u8BEF","PARSE_ERROR",n.status)}if(!n.ok)throw Ac(n,i);return i}catch(n){throw clearTimeout(s),n instanceof Error&&n.name==="AbortError"?new Pe(`\u8BF7\u6C42\u8D85\u65F6 (${this.TIMEOUT}ms)`,"TIMEOUT",void 0):n}},this.RETRY_ATTEMPTS)}clearCache(e){this.cache.clear(e),p.info(`\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58${e?` (\u6A21\u5F0F: ${e})`:""}`)}getCacheStats(){return this.cache.getStats()}}});function sr(o,e){return{success:!0,data:o,message:e}}function F(o,e,t){return{success:!1,message:o,error:e?{code:e,details:t}:void 0}}function nr(){let o=d.getCozeToken();if(!o)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 rr(o)}var He,Bn=C(()=>{"use strict";P();se();Wn();c(sr,"createSuccessResponse");c(F,"createErrorResponse");c(nr,"getCozeApiService");He=class{static{c(this,"CozeApiHandler")}static async getWorkspaces(e){try{if(p.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!d.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=await nr().getWorkspaces();return p.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(sr({workspaces:r}))}catch(t){return p.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),t instanceof Error&&t.code==="AUTH_FAILED"?e.json(F("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):t instanceof Error&&t.code==="RATE_LIMITED"?e.json(F("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):t instanceof Error&&t.code==="TIMEOUT"?e.json(F("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(F(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)}}static async getWorkflows(e){try{if(p.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!d.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\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),s=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return p.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(F("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(F("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(s<1||s>100)return e.json(F("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let n={workspace_id:t,page_num:r,page_size:s},a=await nr().getWorkflows(n);p.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${a.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=d.getCustomMCPTools(),g=a.items.map(u=>{let h=l.find(f=>f.handler.type==="proxy"&&f.handler.platform==="coze"&&f.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!h,toolName:h?.name||null}});return p.info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${g.filter(u=>u.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.json(sr({items:g,has_more:a.hasMore,page_num:r,page_size:s,total_count:a.items.length}))}catch(t){return p.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),t instanceof Error&&t.code==="AUTH_FAILED"?e.json(F("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):t instanceof Error&&t.code==="RATE_LIMITED"?e.json(F("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):t instanceof Error&&t.code==="TIMEOUT"?e.json(F("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(F(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)}}static async clearCache(e){try{if(p.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!d.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\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=nr(),s=r.getCacheStats();r.clearCache(t);let n=r.getCacheStats();return p.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${s.size} \u9879\uFF0C\u6E05\u9664\u540E: ${n.size} \u9879`),e.json(sr({cleared:s.size-n.size,remaining:n.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return p.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(F(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)}}static async getCacheStats(e){try{if(p.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!d.isCozeConfigValid())return p.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=nr().getCacheStats();return e.json(sr(r))}catch(t){return p.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(F(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 or,qn=C(()=>{"use strict";P();Pt();or=class{static{c(this,"HeartbeatHandler")}logger;statusService;notificationService;configService;constructor(e,t){this.logger=p.withTag("HeartbeatHandler"),this.statusService=e,this.notificationService=t,this.configService=new Me}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let s={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(s,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(s){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,s),this.sendError(e,"CLIENT_STATUS_ERROR",s instanceof Error?s.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25")}}async sendLatestConfig(e,t){try{let s={type:"configUpdate",data:await this.configService.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(s)),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 s={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(s))}catch(s){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",s)}}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.info("\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"}}});var Oe,Gn=C(()=>{"use strict";P();z();Oe=class{static{c(this,"MCPEndpointApiHandler")}logger;xiaozhiConnectionManager;configManager;eventBus;constructor(e,t){this.logger=p.withTag("MCPEndpointApiHandler"),this.xiaozhiConnectionManager=e,this.configManager=t,this.eventBus=w()}createErrorResponse(e,t,r,s){return{error:{code:e,message:t,details:r?{endpoint:r,...s}:s}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(n){this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",n);let i=this.createErrorResponse(t,n instanceof Error?n.message:"JSON\u89E3\u6790\u5931\u8D25");return{ok:!1,response:e.json(i,500)}}let s=r.endpoint;if(!s||typeof s!="string"){let n=this.createErrorResponse("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",s);return{ok:!1,response:e.json(n,400)}}return{ok:!0,endpoint:s}}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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(i=>i.endpoint===r);if(!n){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(n))}catch(s){this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_STATUS_READ_ERROR",s instanceof Error?s.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",r);return e.json(n,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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!n){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(n.connected){let g=this.createErrorResponse("ENDPOINT_ALREADY_CONNECTED","\u7AEF\u70B9\u5DF2\u8FDE\u63A5",r);return e.json(g,409)}await this.xiaozhiConnectionManager.connectExistingEndpoint(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!a){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(a);return e.json(l)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_CONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",r);return e.json(n,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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(u=>u.endpoint===r);if(!n){let u=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(u,404)}if(!n.connected){let u=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(u,409)}await this.xiaozhiConnectionManager.disconnectEndpoint(r);let a=this.xiaozhiConnectionManager.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,isReconnecting:!1,reconnectAttempts:0,nextReconnectTime:void 0,reconnectDelay:0},g=this.createSuccessResponse(a||l);return e.json(g)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_DISCONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",r);return e.json(n,500)}}async reconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_RECONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u91CD\u8FDE\u8BF7\u6C42: ${r}`);try{let n=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!n){let g=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(g,404)}n.connected&&await this.xiaozhiConnectionManager.disconnectEndpoint(r),await this.xiaozhiConnectionManager.triggerReconnect(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!a){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:"reconnect",success:!0,message:"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F: ${r}`);let l=this.createSuccessResponse(a);return e.json(l)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_RECONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25",r);return e.json(n,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.xiaozhiConnectionManager.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.xiaozhiConnectionManager.addEndpoint(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!a){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(a);return e.json(l)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25:",s);let n="ENDPOINT_ADD_ERROR",i=500;s instanceof Error&&(s.message.includes("\u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D")?(n="ENDPOINT_ALREADY_IN_CONFIG",i=409):s.message.includes("\u5DF2\u5B58\u5728")?(n="ENDPOINT_ALREADY_EXISTS",i=409):s.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(n="INVALID_ENDPOINT",i=400));let a=this.createErrorResponse(n,s instanceof Error?s.message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25",void 0);return e.json(a,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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(a=>a.endpoint===r);if(!n){let a=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(a,404)}n.connected&&await this.xiaozhiConnectionManager.disconnectEndpoint(r),await this.xiaozhiConnectionManager.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(s){this.logger.error("\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25:",s);let n="ENDPOINT_REMOVE_ERROR",i=500;s instanceof Error&&(s.message.includes("\u4E0D\u5B58\u5728")?(n="ENDPOINT_NOT_FOUND",i=404):s.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(n="INVALID_ENDPOINT",i=400));let a=this.createErrorResponse(n,s instanceof Error?s.message:"\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25",r);return e.json(a,i)}}}});import{randomUUID as xc}from"crypto";var ir,Xn=C(()=>{"use strict";P();ss();Qt();ir=class{static{c(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=p.withTag("MCPRouteHandler"),this.config={maxClients:e.maxClients??100,connectionTimeout:e.connectionTimeout??3e5,heartbeatInterval:e.heartbeatInterval??3e4,maxMessageSize:e.maxMessageSize??1024*1024,enableMetrics:e.enableMetrics??!0},this.metrics={totalConnections:0,activeConnections:0,totalMessages:0,errorCount:0,averageResponseTime:0,uptime:0},this.startTime=new Date,this.startCleanupTask(),this.logger.info("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,s]of this.clients.entries())(e.getTime()-s.lastActivity.getTime()>this.config.connectionTimeout||!s.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}))}async initializeMessageHandler(){if(!this.mcpMessageHandler)try{let e=await oe.getInstance();this.mcpMessageHandler=new tt(e),this.logger.info("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(e){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",e),this.metrics.errorCount++,e}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let s=e.req.query("sessionId");if(s)return await this.handleSSEMessage(e,s);let n=e.req.header("content-length");if(n&&Number.parseInt(n)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Request too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);if(!e.req.header("content-type")?.includes("application/json"))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Content-Type must be application/json",null);let a=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"];a&&!l.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${l.join(", ")}`);let g;try{let f=await e.req.text();if(f.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(f),r=g.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON",null)}if(!this.validateMessage(g))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",r);await this.initializeMessageHandler();let u=await this.mcpMessageHandler.handleMessage(g);this.metrics.totalMessages++;let h=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+h)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:g.method,messageId:r,responseTime:h,isNotification:u===null}),u===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":h.toString()}}):e.json(u,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":h.toString()})}catch(s){this.metrics.errorCount++;let n=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:s instanceof Error?s.message:String(s),messageId:r,responseTime:n,stack:s instanceof Error?s.stack:void 0});let i=s instanceof Error?s.message:String(s);return this.createErrorResponse(-32603,`Internal error: ${i}`,r)}}async handleSSEMessage(e,t){let r=Date.now(),s=null;try{this.logger.debug(`\u5904\u7406 SSE \u6D88\u606F (\u4F1A\u8BDD: ${t})`);let n=this.clients.get(t);if(!n)return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Invalid or missing sessionId",null);n.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`,null);let a;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);a=JSON.parse(u),s=a.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON",null)}if(!this.validateMessage(a))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",s);await this.initializeMessageHandler();let l=await this.mcpMessageHandler.handleMessage(a);if(n.messageCount++,this.metrics.totalMessages++,l!==null&&n.writer&&n.isAlive)try{await this.sendSSEEvent(n.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),n.isAlive=!1}let g=Date.now()-r;return this.logger.debug(`SSE \u6D88\u606F\u5904\u7406\u5B8C\u6210 (\u4F1A\u8BDD: ${t})`,{method:a.method,messageId:s,responseTime:g,messageCount:n.messageCount,isNotification:l===null}),new Response(null,{status:202,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":g.toString()}})}catch(n){this.metrics.errorCount++;let i=Date.now()-r;this.logger.error(`\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519 (\u4F1A\u8BDD: ${t}):`,{error:n instanceof Error?n.message:String(n),messageId:s,responseTime:i,stack:n instanceof Error?n.stack:void 0});let a=n instanceof Error?n.message:String(n);return this.createErrorResponse(-32603,`Internal error: ${a}`,s)}}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(),s=new Date,n=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:n,remoteAddress:i});let{readable:a,writable:l}=new TransformStream,g=l.getWriter(),u=new AbortController,h={id:t,sessionId:r,response:new Response(a),connectedAt:s,lastActivity:s,writer:g,abortController:u,isAlive:!0,messageCount:0,userAgent:n,remoteAddress:i};this.clients.set(r,h),this.metrics.totalConnections++,this.metrics.activeConnections=this.clients.size;try{await this.sendSSEEvent(g,"connected",JSON.stringify({sessionId:r,endpoint:`/mcp?sessionId=${r}`,timestamp:s.toISOString(),protocolVersion:"2024-11-05"}))}catch(A){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,A),h.isAlive=!1}this.startHeartbeat(h);let f=new Response(a,{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"}}),m=c(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",m),u.signal.addEventListener("abort",m),f}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 s=`event: ${t}
36
+ 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var Ct,vn=C(()=>{"use strict";Ct=class o extends Error{static{c(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,o)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};c(fn,"createTimeoutResponse");c(za,"getToolSpecificTimeoutMessage");c(Cn,"getDefaultTimeoutMessage")});import{createHash as Ua}from"crypto";import{existsSync as vt,mkdirSync as Fa,readFileSync as Sn,renameSync as Va,writeFileSync as En}from"fs";import{dirname as Wa,resolve as yn}from"path";import Ba from"dayjs";var Ie,Gt=C(()=>{"use strict";M();Wt();Ie=class{static{c(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION="1.0.0";CACHE_ENTRY_VERSION="1.0.0";cleanupInterval;CLEANUP_INTERVAL=6e4;constructor(e){this.logger=h,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ba().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return yn(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return yn(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!vt(this.cachePath)){let e=Wa(this.cachePath);vt(e)||(Fa(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 s=await this.loadExistingCache(),n=this.generateConfigHash(r),i={tools:t.map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:n,version:this.CACHE_ENTRY_VERSION};s.mcpServers[e]=i,s.metadata.lastGlobalUpdate=this.formatTimestamp(),s.metadata.totalWrites+=1,await this.saveCache(s),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(s){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)}}async loadExistingCache(){try{if(!vt(this.cachePath))return await this.createInitialCache();let e=Sn(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{En(r,t,"utf8"),Va(r,e)}catch(s){try{vt(r)&&En(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return Ua("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{return e&&typeof e=="object"&&typeof e.version=="string"&&typeof e.mcpServers=="object"&&e.metadata&&typeof e.metadata=="object"&&typeof e.metadata.lastGlobalUpdate=="string"&&typeof e.metadata.totalWrites=="number"&&typeof e.metadata.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:vt(this.cachePath)?Sn(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,s]of Object.entries(e.mcpServers))for(let n of s.tools)t.push({...n,name:`${r}__${n.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,s="completed",n,i=3e5){try{let a=await this.loadExtendedCache(),l=Ne(e,t),g={result:r,timestamp:new Date().toISOString(),ttl:i,status:s,consumed:!1,taskId:n,retryCount:0};a.customMCPResults||(a.customMCPResults={}),a.customMCPResults[l]=g,await this.saveExtendedCache(a),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${s}`)}catch(a){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),s=Ne(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return null;let n=r.customMCPResults[s],i=Date.now(),a=new Date(n.timestamp).getTime();return i-a>n.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):n}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,s,n){try{let i=await this.loadExtendedCache(),a=Ne(e,t);if(!i.customMCPResults||!i.customMCPResults[a])return!1;let l=i.customMCPResults[a],g=l.status;return l.status=r,l.timestamp=new Date().toISOString(),s&&(l.result=s),n&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},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(),s=Ne(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return!1;let n=r.customMCPResults[s];return n.consumed||(n.consumed=!0,n.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(),s=Ne(e,t);return!r.customMCPResults||!r.customMCPResults[s]?!1:(delete r.customMCPResults[s],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[s,n]of t)je(n)&&(delete e.customMCPResults[s],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,s=t.filter(u=>u.status==="pending").length,n=t.filter(u=>u.status==="completed").length,i=t.filter(u=>u.status==="failed").length,a=t.filter(u=>u.consumed).length,l=n>0?a/n*100:0,g=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:s,completedTasks:n,failedTasks:i,consumedEntries:a,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 Xt,Tn=C(()=>{"use strict";M();se();dn();mn();Wt();vn();z();Gt();Xt=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;cacheLifecycleManager;taskStateManager;mcpServiceManager;TIMEOUT=De.TIMEOUT;CACHE_TTL=De.CACHE_TTL;CLEANUP_INTERVAL=De.CLEANUP_INTERVAL;cleanupTimer;activeTasks=new Map;eventBus=w();constructor(e,t){this.logger=h,this.cacheManager=e||new Ie,this.mcpServiceManager=t,this.cacheLifecycleManager=new Bt(this.logger),this.taskStateManager=new qt(this.logger),this.startCleanupTimer(),this.cacheLifecycleManager.startAutoCleanup(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",async e=>{await this.handleConfigUpdated(e)})}async handleConfigUpdated(e){this.logger.debug("[CustomMCP] \u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u662F\u5426\u9700\u8981\u91CD\u65B0\u521D\u59CB\u5316");try{e.type==="customMCP"?(this.logger.debug("[CustomMCP] customMCP \u914D\u7F6E\u5DF2\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316\u5904\u7406\u5668"),await this.reinitialize()):e.type==="serverTools"&&(this.logger.debug("[CustomMCP] serverTools \u914D\u7F6E\u5DF2\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316\u5904\u7406\u5668"),await this.reinitialize())}catch(t){this.logger.error("[CustomMCP] \u914D\u7F6E\u66F4\u65B0\u5904\u7406\u5931\u8D25:",t)}}async reinitialize(){try{this.logger.debug("[CustomMCP] \u5F00\u59CB\u91CD\u65B0\u521D\u59CB\u5316\u5904\u7406\u5668"),this.tools.clear();let e=d.getCustomMCPTools();for(let t of e)this.tools.set(t.name,t),this.logger.debug(`[CustomMCP] \u91CD\u65B0\u52A0\u8F7D\u5DE5\u5177: ${t.name} (${t.handler.type})`);this.logger.debug(`[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A\u5DE5\u5177`)}catch(e){throw this.logger.error("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25:",e),e}}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||d.getCustomMCPTools();this.tools.clear();for(let r of t)this.tools.set(r.name,r),this.logger.debug(`[CustomMCP] \u5DF2\u52A0\u8F7D\u5DE5\u5177: ${r.name} (${r.handler.type})`);this.logger.debug(`[CustomMCP] \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A\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:e.inputSchema}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}async callTool(e,t,r){if(!this.tools.get(e))throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let n=await this.getCompletedResult(e,t);if(n)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),n;try{let i=await Promise.race([this.executeToolWithBackgroundProcessing(e,t),this.createTimeoutPromise(e,t)]);return await this.cacheResult(e,t,i),i}catch(i){if(i instanceof Ct){let a=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${a}`),fn(a,e)}throw i}}async executeToolWithBackgroundProcessing(e,t){let r=this.tools.get(e);if(!r)throw new Error(`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`);let s=await this.generateTaskId(e,t);await this.markTaskAsPending(s,e,t);try{let n=await this.callToolByType(r,t);return await this.markTaskAsCompleted(s,n),n}catch(n){throw await this.markTaskAsFailed(s,n),n}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new Ct(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},this.TIMEOUT)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(!s.customMCPResults||!s.customMCPResults[r])return null;let n=s.customMCPResults[r];return n.status==="completed"&&!n.consumed&&!Qe(n.timestamp,n.ttl)?n.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}async callToolByType(e,t){switch(e.handler.type){case"proxy":return await this.callProxyTool(e,t);case"function":return await this.callFunctionTool(e,t);case"http":return await this.callHttpTool(e,t);case"script":return await this.callScriptTool(e,t);case"chain":return await this.callChainTool(e,t);case"mcp":try{return await this.forwardToMCPServiceManager(e,t)}catch(r){this.logger.error(`[CustomMCP] MCP \u7C7B\u578B\u5DE5\u5177\u8DEF\u7531\u5931\u8D25: ${e.name}`,r);let s=r instanceof Error?r.message:"MCP \u7C7B\u578B\u5DE5\u5177\u8DEF\u7531\u9519\u8BEF";return{content:[{type:"text",text:s.includes("MCPServiceManager \u672A\u521D\u59CB\u5316")?s:"\u5185\u90E8\u9519\u8BEF\uFF1AMCP \u7C7B\u578B\u5DE5\u5177\u8DEF\u7531\u9519\u8BEF"}],isError:!0}}default:throw new Error(`\u4E0D\u652F\u6301\u7684\u5904\u7406\u5668\u7C7B\u578B: ${e.handler.type}`)}}async forwardToMCPServiceManager(e,t){if(!this.mcpServiceManager)throw this.logger.error(`[CustomMCP] MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u65E0\u6CD5\u8F6C\u53D1\u5DE5\u5177 ${e.name} \u7684\u8C03\u7528`),new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");let r=e.handler;this.logger.info(`[CustomMCP] \u8F6C\u53D1MCP\u5DE5\u5177\u8C03\u7528: ${e.name}`,{serviceName:r.config.serviceName,toolName:r.config.toolName});try{let s=await this.mcpServiceManager.callTool(r.config.toolName,t);return this.logger.info(`[CustomMCP] MCP\u5DE5\u5177\u8F6C\u53D1\u6210\u529F: ${e.name}`),s}catch(s){return this.logger.error(`[CustomMCP] MCP\u5DE5\u5177\u8F6C\u53D1\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`MCP\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async callProxyTool(e,t){let r=e.handler;if(this.logger.info(`[CustomMCP] \u8C03\u7528\u4EE3\u7406\u5DE5\u5177: ${e.name}`,{platform:r.platform,config:r.config}),r.platform==="coze")return await this.callCozeWorkflow(e,t);throw new Error(`\u4E0D\u652F\u6301\u7684\u4EE3\u7406\u5E73\u53F0: ${r.platform}`)}async callCozeWorkflow(e,t){let s=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:s.workflow_id,bot_id:s.bot_id});try{let n=this.buildCozeRequest(s,t),i=await this.sendCozeRequest(s,n);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`,{response:i}),this.processCozeResponse(e.name,i)}catch(n){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,n),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`}],isError:!0}}}buildCozeRequest(e,t){return{workflow_id:e.workflow_id,parameters:{...t}}}async sendCozeRequest(e,t){let r=e.base_url||"https://api.coze.cn",s="",n=d.getConfig().platforms?.coze?.token;if(!n)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");if(e.workflow_id)s="/v1/workflow/run",t.workflow_id=e.workflow_id;else if(e.bot_id)s="/v3/chat",t.bot_id=e.bot_id;else throw new Error("Coze \u914D\u7F6E\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id");let i=`${r}${s}`,a=e.timeout||3e5,l={"Content-Type":"application/json",Authorization:`Bearer ${n}`,...e.headers};this.logger.debug(`[CustomMCP] \u53D1\u9001 Coze \u8BF7\u6C42\u5230: ${i}`,{headers:{...l},body:t});let g=new AbortController,u=setTimeout(()=>g.abort(),a);try{let p=await fetch(i,{method:"POST",headers:l,body:JSON.stringify(t)});if(clearTimeout(u),!p.ok){let m=await p.text();throw new Error(`Coze API \u8BF7\u6C42\u5931\u8D25 (${p.status}): ${m}`)}let f=await p.json();return this.logger.debug("[CustomMCP] Coze API \u54CD\u5E94:",f),f}catch(p){throw clearTimeout(u),p instanceof Error&&p.name==="AbortError"?new Error(`Coze API \u8BF7\u6C42\u8D85\u65F6 (${a}ms)`):p}}processCozeResponse(e,t){try{return t.data?{content:[{type:"text",text:t.data}],isError:!1}:{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406 Coze \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 callFunctionTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528\u51FD\u6570\u5DE5\u5177: ${e.name}`,{module:r.module,function:r.function});try{let s=await this.loadModule(r.module),n=this.getFunction(s,r.function),i=await this.executeFunction(n,t,r);return{content:[{type:"text",text:typeof i=="string"?i:JSON.stringify(i,null,2)}],isError:!1}}catch(s){return this.logger.error(`[CustomMCP] \u51FD\u6570\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`\u51FD\u6570\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async loadModule(e){try{let t=e;return!e.startsWith("/")&&!e.startsWith("file://")&&(t=new URL(e,`file://${process.cwd()}/`).href),this.logger.debug(`[CustomMCP] \u52A0\u8F7D\u6A21\u5757: ${t}`),await import(t)}catch(t){throw new Error(`\u65E0\u6CD5\u52A0\u8F7D\u6A21\u5757 ${e}: ${t instanceof Error?t.message:String(t)}`)}}getFunction(e,t){let r;if(e.default&&typeof e.default=="function"&&(t==="default"?r=e.default:e.default[t]&&typeof e.default[t]=="function"&&(r=e.default[t])),!r&&e[t]&&typeof e[t]=="function"&&(r=e[t]),!r)throw new Error(`\u5728\u6A21\u5757\u4E2D\u627E\u4E0D\u5230\u51FD\u6570: ${t}`);return r}async executeFunction(e,t,r){let s=r.timeout||3e4,n={...r.context,logger:this.logger,arguments:t},i=Promise.resolve().then(()=>e.length>1?e(t,n):e(t)),a=new Promise((l,g)=>{setTimeout(()=>g(new Error(`\u51FD\u6570\u6267\u884C\u8D85\u65F6 (${s}ms)`)),s)});return Promise.race([i,a])}async callHttpTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528 HTTP \u5DE5\u5177: ${e.name}`,{url:r.url,method:r.method||"POST"});try{let{url:s,requestOptions:n}=this.buildHttpRequest(r,t),i=await this.sendHttpRequest(s,n,r);return this.processHttpResponse(e.name,i,r)}catch(s){return this.logger.error(`[CustomMCP] HTTP \u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`HTTP \u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}buildHttpRequest(e,t){let r=e.method||"POST",s={"Content-Type":"application/json","User-Agent":"xiaozhi-client/1.0",...e.headers};if(e.auth)switch(e.auth.type){case"bearer":e.auth.token&&(s.Authorization=`Bearer ${e.auth.token}`);break;case"basic":if(e.auth.username&&e.auth.password){let l=btoa(`${e.auth.username}:${e.auth.password}`);s.Authorization=`Basic ${l}`}break;case"api_key":e.auth.api_key&&e.auth.api_key_header&&(s[e.auth.api_key_header]=e.auth.api_key);break}let n,i=e.url;if(r!=="GET")e.body_template?n=this.replaceTemplateVariables(e.body_template,t):n=JSON.stringify(t);else{let l=new URLSearchParams;for(let[u,p]of Object.entries(t))p!=null&&l.append(u,String(p));let g=l.toString();g&&(i+=(i.includes("?")?"&":"?")+g)}return{url:i,requestOptions:{method:r,headers:s,body:n}}}async sendHttpRequest(e,t,r){let s=r.timeout||3e4,n=r.retry_count||0,i=r.retry_delay||1e3,a=null;for(let l=0;l<=n;l++){try{this.logger.debug(`[CustomMCP] \u53D1\u9001 HTTP \u8BF7\u6C42 (\u5C1D\u8BD5 ${l+1}/${n+1}): ${e}`,{method:t.method,headers:t.headers});let g=new AbortController,u=setTimeout(()=>g.abort(),s),p=await fetch(e,{...t,signal:g.signal});if(clearTimeout(u),p.ok||l===n)return p;this.logger.warn(`[CustomMCP] HTTP \u8BF7\u6C42\u5931\u8D25 (${p.status}), \u5C06\u5728 ${i}ms \u540E\u91CD\u8BD5`),a=new Error(`HTTP \u8BF7\u6C42\u5931\u8D25: ${p.status} ${p.statusText}`)}catch(g){if(a=g instanceof Error?g:new Error(String(g)),g instanceof Error&&g.name==="AbortError"&&(a=new Error(`HTTP \u8BF7\u6C42\u8D85\u65F6 (${s}ms)`)),this.logger.warn(`[CustomMCP] HTTP \u8BF7\u6C42\u5F02\u5E38 (\u5C1D\u8BD5 ${l+1}/${n+1}):`,a.message),l===n)throw a}l<n&&await new Promise(g=>setTimeout(g,i))}throw a||new Error("HTTP \u8BF7\u6C42\u5931\u8D25")}async processHttpResponse(e,t,r){try{let s=t.headers.get("content-type")||"",n;if(s.includes("application/json")?n=await t.json():n=await t.text(),!t.ok)return{content:[{type:"text",text:`HTTP \u8BF7\u6C42\u5931\u8D25 (${t.status}): ${typeof n=="string"?n:JSON.stringify(n)}`}],isError:!0};let i=n;return r.response_mapping&&(i=this.extractResponseData(n,r.response_mapping)),{content:[{type:"text",text:typeof i=="string"?i:JSON.stringify(i,null,2)}],isError:!1}}catch(s){return this.logger.error(`[CustomMCP] \u5904\u7406 HTTP \u54CD\u5E94\u5931\u8D25: ${e}`,s),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}replaceTemplateVariables(e,t){let r=e;for(let[s,n]of Object.entries(t)){let i=`{{${s}}}`,a=typeof n=="string"?n:JSON.stringify(n);r=r.replace(new RegExp(i.replace(/[{}]/g,"\\$&"),"g"),a)}return r}extractResponseData(e,t){if(!t)return e;let r=c((s,n)=>{if(!n)return s;let i=n.split("."),a=s;for(let l of i)if(a&&typeof a=="object"&&l in a)a=a[l];else return;return a},"extractByPath");if(t.success_path){let s=r(e,t.success_path);if(s!==void 0)return t.data_path?r(s,t.data_path):s}if(t.data_path){let s=r(e,t.data_path);if(s!==void 0)return s}return e}async callScriptTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528\u811A\u672C\u5DE5\u5177: ${e.name}`,{script:r.script.substring(0,100)+(r.script.length>100?"...":""),interpreter:r.interpreter||"node"});try{let s=await this.executeScript(r,t);return{content:[{type:"text",text:typeof s=="string"?s:JSON.stringify(s,null,2)}],isError:!1}}catch(s){return this.logger.error(`[CustomMCP] \u811A\u672C\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`\u811A\u672C\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async executeScript(e,t){let{spawn:r}=await import("child_process"),{promisify:s}=await import("util"),n=await import("fs/promises"),i=await import("path"),a=await import("os"),l=e.timeout||3e4,g=e.interpreter||"node",u,p=!1;try{if(e.script.includes(`
37
+ `)||e.script.length>200){let A=await n.mkdtemp(i.join(a.tmpdir(),"xiaozhi-script-")),ie=this.getScriptExtension(g);u=i.join(A,`script${ie}`),await n.writeFile(u,e.script,"utf8"),p=!0}else{u=e.script;try{await n.access(u)}catch{throw new Error(`\u811A\u672C\u6587\u4EF6\u4E0D\u5B58\u5728: ${u}`)}}let f={...process.env,...e.env,XIAOZHI_ARGUMENTS:JSON.stringify(t)},m=this.buildScriptCommand(g,u);return this.logger.debug(`[CustomMCP] \u6267\u884C\u811A\u672C\u547D\u4EE4: ${m.join(" ")}`),new Promise((A,ie)=>{let te=r(m[0],m.slice(1),{env:f,stdio:["pipe","pipe","pipe"]}),Nt="",j="";te.stdout?.on("data",me=>{Nt+=me.toString()}),te.stderr?.on("data",me=>{j+=me.toString()});let Dt=setTimeout(()=>{te.kill("SIGTERM"),ie(new Error(`\u811A\u672C\u6267\u884C\u8D85\u65F6 (${l}ms)`))},l);te.on("close",me=>{clearTimeout(Dt),me===0?A(Nt.trim()):ie(new Error(`\u811A\u672C\u6267\u884C\u5931\u8D25 (\u9000\u51FA\u7801: ${me}): ${j.trim()}`))}),te.on("error",me=>{clearTimeout(Dt),ie(new Error(`\u811A\u672C\u6267\u884C\u9519\u8BEF: ${me.message}`))}),t&&Object.keys(t).length>0&&(te.stdin?.write(JSON.stringify(t)),te.stdin?.end())})}finally{if(p&&u)try{await n.unlink(u),await n.rmdir(i.dirname(u))}catch{}}}getScriptExtension(e){switch(e){case"node":return".js";case"python":return".py";case"bash":return".sh";default:return".txt"}}buildScriptCommand(e,t){switch(e){case"node":return["node",t];case"python":return["python3",t];case"bash":return["bash",t];default:throw new Error(`\u4E0D\u652F\u6301\u7684\u811A\u672C\u89E3\u91CA\u5668: ${e}`)}}async callChainTool(e,t){let r=e.handler;this.logger.info(`[CustomMCP] \u8C03\u7528\u94FE\u5F0F\u5DE5\u5177: ${e.name}`,{tools:r.tools,mode:r.mode,error_handling:r.error_handling});try{let s;r.mode==="sequential"?s=await this.executeSequentialChain(r,t):s=await this.executeParallelChain(r,t);let n=s.flatMap(a=>a.content),i=s.some(a=>a.isError);return{content:n,isError:i}}catch(s){return this.logger.error(`[CustomMCP] \u94FE\u5F0F\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`\u94FE\u5F0F\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}delay(e){return new Promise(t=>setTimeout(t,e))}getToolInfo(e){return this.tools.get(e)}async executeSequentialChain(e,t){let r=[],s=t;for(let n of e.tools)try{this.logger.debug(`[CustomMCP] \u6267\u884C\u94FE\u5F0F\u5DE5\u5177\u4E2D\u7684: ${n}`);let i=await this.callToolRecursive(n,s);if(r.push(i),i.isError){if(e.error_handling==="stop")break;if(e.error_handling==="retry"){this.logger.warn(`[CustomMCP] \u5DE5\u5177 ${n} \u6267\u884C\u5931\u8D25\uFF0C\u5C1D\u8BD5\u91CD\u8BD5`);let a=await this.callToolRecursive(n,s);if(r[r.length-1]=a,a.isError)break}}if(!i.isError&&i.content.length>0){let a=i.content.filter(l=>l.type==="text").map(l=>l.text).join(`
38
+ `);if(a)try{s=JSON.parse(a)}catch{s={input:a,...t}}}}catch(i){let a={content:[{type:"text",text:`\u5DE5\u5177 ${n} \u6267\u884C\u5F02\u5E38: ${i instanceof Error?i.message:String(i)}`}],isError:!0};if(r.push(a),e.error_handling==="stop")break}return r}async executeParallelChain(e,t){let r=e.tools.map(async s=>{try{return this.logger.debug(`[CustomMCP] \u5E76\u884C\u6267\u884C\u94FE\u5F0F\u5DE5\u5177\u4E2D\u7684: ${s}`),await this.callToolRecursive(s,t)}catch(n){return{content:[{type:"text",text:`\u5DE5\u5177 ${s} \u6267\u884C\u5F02\u5E38: ${n instanceof Error?n.message:String(n)}`}],isError:!0}}});return Promise.all(r)}async callToolRecursive(e,t){if(this.tools.get(e))return this.callTool(e,t);throw new Error(`\u94FE\u5F0F\u5DE5\u5177\u4E2D\u5F15\u7528\u7684\u5DE5\u5177 ${e} \u4E0D\u5B58\u5728\u4E8E\u5F53\u524D CustomMCP \u5DE5\u5177\u96C6\u4E2D`)}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(s.customMCPResults?.[r]){s.customMCPResults[r].consumed=!0;let n=s.customMCPResults[r];je(n)&&delete s.customMCPResults[r],await this.saveCache(s),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 this.taskStateManager.generateTaskId(e,t)}async markTaskAsPending(e,t,r){try{let s=this.generateCacheKey(t,r),n={result:{content:[{type:"text",text:"\u5904\u7406\u4E2D..."}]},timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"pending",consumed:!1,taskId:e,retryCount:0};await this.updateCacheWithResult(s,n),this.taskStateManager.markTaskAsPending(e,t,r),this.activeTasks.set(e,{taskId:e,status:"pending",startTime:Date.now()}),this.logger.debug(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u4E3A\u5904\u7406\u4E2D: ${e}`)}catch(s){this.logger.warn(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: ${s}`)}}async markTaskAsCompleted(e,t){try{let r=this.activeTasks.get(e);r&&(r.status="completed",r.endTime=new Date().toISOString(),r.result=t);let s=await this.loadExtendedCache();for(let[n,i]of Object.entries(s.customMCPResults||{}))if(i.taskId===e){i.status="completed",i.result=t,i.timestamp=new Date().toISOString(),i.consumed=!1;break}await this.saveCache(s),this.taskStateManager.markTaskAsCompleted(e,t),this.logger.debug(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u4E3A\u5DF2\u5B8C\u6210: ${e}`)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: ${r}`)}}async markTaskAsFailed(e,t){try{let r=await this.loadExtendedCache();for(let[n,i]of Object.entries(r.customMCPResults||{}))if(i.taskId===e){i.status="failed",i.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${t.message}`}]},i.timestamp=new Date().toISOString(),i.consumed=!0;break}await this.saveCache(r),this.taskStateManager.markTaskAsFailed(e,t.message);let s=this.activeTasks.get(e);s&&(s.status="failed",s.endTime=new Date().toISOString(),s.error=t.message),this.logger.debug(`[CustomMCP] \u6807\u8BB0\u4EFB\u52A1\u4E3A\u5931\u8D25: ${e}`)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u4EFB\u52A1\u72B6\u6001\u5931\u8D25: ${r}`)}}startCleanupTimer(){this.cleanupTimer=setInterval(()=>{this.cleanupExpiredCache().catch(e=>{this.logger.warn(`[CustomMCP] \u7F13\u5B58\u6E05\u7406\u5931\u8D25: ${e}`)})},this.CLEANUP_INTERVAL),this.logger.debug(`[CustomMCP] \u542F\u52A8\u7F13\u5B58\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${this.CLEANUP_INTERVAL}ms`)}async cleanupExpiredCache(){try{let e=await this.loadExtendedCache(),t=!1,r=0;for(let[s,n]of Object.entries(e.customMCPResults||{}))je(n)&&(e.customMCPResults?.[s]&&delete e.customMCPResults[s],t=!0,r++,n.taskId&&this.activeTasks.delete(n.taskId));t&&(await this.saveCache(e),this.logger.debug(`[CustomMCP] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58\u5B8C\u6210\uFF0C\u6E05\u7406\u4E86 ${r} \u4E2A\u6761\u76EE`))}catch(e){this.logger.warn(`[CustomMCP] \u6E05\u7406\u8FC7\u671F\u7F13\u5B58\u5931\u8D25: ${e}`)}}generateCacheKey(e,t){return Ne(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 s=this.generateCacheKey(e,t),n={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(s,n),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(s){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${s}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}stopCleanupTimer(){this.cleanupTimer&&(clearInterval(this.cleanupTimer),this.cleanupTimer=void 0,this.logger.info("[CustomMCP] \u505C\u6B62\u7F13\u5B58\u6E05\u7406\u5B9A\u65F6\u5668"))}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.stopCleanupTimer(),this.cacheLifecycleManager.stopAutoCleanup(),this.cacheLifecycleManager.cleanup(),this.taskStateManager.cleanup(),this.cacheManager.cleanup(),this.tools.clear(),this.activeTasks.clear()}getCacheLifecycleManager(){return this.cacheLifecycleManager}getTaskStateManager(){return this.taskStateManager}async getCacheStatistics(){return this.cacheManager.getCustomMCPStatistics()}getTaskStatistics(){return this.taskStateManager.getTaskStatistics()}getTaskStatus(e){return this.taskStateManager.getTaskStatus(e)}validateTaskId(e){return this.taskStateManager.validateTaskId(e)}restartStalledTasks(e=3e4){return this.taskStateManager.restartStalledTasks(e)}async manualCleanupCache(){return this.cacheManager.cleanupCustomMCPResults()}async validateSystemIntegrity(){let e=await this.cacheManager.loadExtendedCache(),t=this.cacheLifecycleManager.validateCacheIntegrity(e),r=this.taskStateManager.validateTaskIntegrity();return{cacheValid:t.isValid,taskValid:r.isValid,issues:[...t.issues,...r.issues]}}}});import{SSEClientTransport as qa}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Ga}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Xa}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as Ja}from"eventsource";function Ka(){return h}function Ya(o){switch(Ka().debug(`[TransportFactory] \u521B\u5EFA ${o.type} transport for ${o.name}`),o.type){case"stdio":return Za(o);case"sse":return Qa(o);case"streamable-http":return ec(o);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}function Za(o){if(!o.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new Ga({command:o.command,args:o.args||[],env:o.env})}function Qa(o){if(!o.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(o.url),t=tc(o);return new qa(e,t)}function ec(o){if(!o.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(o.url),t=rc(o);return new Xa(e,t)}function tc(o){let e={};return o.apiKey?e.headers={Authorization:`Bearer ${o.apiKey}`,...o.headers}:o.headers&&(e.headers=o.headers),e}function rc(o){let e={};return o.apiKey?e.headers={Authorization:`Bearer ${o.apiKey}`,...o.headers}:o.headers&&(e.headers=o.headers),e}function sc(o){if(!o.name||typeof o.name!="string")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(o.type&&!Object.values(et).includes(o.type))throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`);if(!o.type)throw new Error("\u4F20\u8F93\u7C7B\u578B\u672A\u8BBE\u7F6E\uFF0C\u8FD9\u5E94\u8BE5\u5728 inferTransportType \u4E2D\u5904\u7406");switch(o.type){case"stdio":if(!o.command)throw new Error("stdio \u7C7B\u578B\u9700\u8981 command \u5B57\u6BB5");break;case"sse":if(o.url===void 0||o.url===null)throw new Error(`${o.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;case"streamable-http":if(o.url===void 0||o.url===null)throw new Error(`${o.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}function nc(){return["stdio","sse","streamable-http"]}var ts,Pn=C(()=>{"use strict";M();Jt();typeof global<"u"&&!global.EventSource&&(global.EventSource=Ja);c(Ka,"getLogger");c(Ya,"createTransport");c(Za,"createStdioTransport");c(Qa,"createSSETransport");c(ec,"createStreamableHTTPTransport");c(tc,"createSSEOptions");c(rc,"createStreamableHTTPOptions");c(sc,"validateConfig");c(nc,"getSupportedTypes");ts={create:Ya,validateConfig:sc,getSupportedTypes:nc}});import{Client as oc}from"@modelcontextprotocol/sdk/client/index.js";var et,Kt,Jt=C(()=>{"use strict";M();z();Pn();et=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(et||{}),Kt=class{static{c(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";reconnectOptions;reconnectState;logger;connectionTimeout=null;initialized=!1;eventBus=w();pingOptions;pingTimer=null;pingFailureCount=0;lastPingTime=null;isPinging=!1;constructor(e,t){this.logger=h;let r=this.inferTransportType(e);this.config=r,this.validateConfig(),this.reconnectOptions={enabled:!0,maxAttempts:10,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0,...t?.reconnect,...e.reconnect},this.pingOptions={enabled:!0,interval:3e4,timeout:5e3,maxFailures:3,startDelay:5e3,...e.ping},this.reconnectState={attempts:0,nextInterval:this.reconnectOptions.initialInterval,timer:null,lastError:null,isManualDisconnect:!1}}logWithTag(e,t,...r){let s=`[MCP-${this.config.name}] ${t}`;this.logger[e](s,...r)}inferTransportType(e){if(e.type)return e;this.logger.debug(`[MCP-${e.name}] \u81EA\u52A8\u63A8\u65AD\u4F20\u8F93\u7C7B\u578B...`);let t;if(e.command)t="stdio",this.logger.debug(`[MCP-${e.name}] \u68C0\u6D4B\u5230 command \u5B57\u6BB5\uFF0C\u63A8\u65AD\u4E3A stdio \u7C7B\u578B`);else if(e.url!==void 0&&e.url!==null)t=this.inferTransportTypeFromUrl(e.url,e.name);else throw new Error(`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${e.name} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`);return{type:t,...e}}inferTransportTypeFromUrl(e,t){try{let s=new URL(e).pathname;return s.endsWith("/sse")?(this.logger.info(`[MCP-${t}] \u68C0\u6D4B\u5230 URL \u8DEF\u5F84\u4EE5 /sse \u7ED3\u5C3E\uFF0C\u63A8\u65AD\u4E3A sse \u7C7B\u578B`),"sse"):s.endsWith("/mcp")?(this.logger.info(`[MCP-${t}] \u68C0\u6D4B\u5230 URL \u8DEF\u5F84\u4EE5 /mcp \u7ED3\u5C3E\uFF0C\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`),"streamable-http"):(this.logger.info(`[MCP-${t}] URL \u8DEF\u5F84 ${s} \u4E0D\u5339\u914D\u7279\u5B9A\u89C4\u5219\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`),"streamable-http")}catch(r){return this.logger.warn(`[MCP-${t}] URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`,r),"streamable-http"}}validateConfig(){ts.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.reconnectState.isManualDisconnect=!1,this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",this.logWithTag("debug",`\u6B63\u5728\u8FDE\u63A5 MCP \u670D\u52A1: ${this.config.name} (\u5C1D\u8BD5 ${this.reconnectState.attempts+1}/${this.reconnectOptions.maxAttempts})`),new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.reconnectOptions.timeout}ms)`);this.handleConnectionError(r),t(r)},this.reconnectOptions.timeout);try{this.client=new oc({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{tools:{}}}),this.transport=ts.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,this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.resetPingState(),this.logWithTag("info",`MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5\u5DF2\u5EFA\u7ACB`),this.startPingMonitoring()}handleConnectionError(e){this.connectionState="disconnected",this.initialized=!1,this.reconnectState.lastError=e,this.logger.debug(`MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5\u9519\u8BEF:`,e.message),this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection(),this.eventBus.emitEvent("mcp:service:connection:failed",{serviceName:this.config.name,error:e,attempt:this.reconnectState.attempts}),this.shouldReconnect()?this.scheduleReconnect():(this.connectionState="failed",this.logger.warn(`${this.config.name} \u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u6B21\u6570 (${this.reconnectOptions.maxAttempts})\uFF0C\u505C\u6B62\u91CD\u8FDE`))}shouldReconnect(){return this.reconnectOptions.enabled&&this.reconnectState.attempts<this.reconnectOptions.maxAttempts&&!this.reconnectState.isManualDisconnect}scheduleReconnect(){this.connectionState="reconnecting",this.reconnectState.attempts++,this.calculateNextInterval(),this.logger.debug(`${this.config.name} \u5C06\u5728 ${this.reconnectState.nextInterval}ms \u540E\u8FDB\u884C\u7B2C ${this.reconnectState.attempts} \u6B21\u91CD\u8FDE`),this.reconnectState.timer&&clearTimeout(this.reconnectState.timer),this.reconnectState.timer=setTimeout(async()=>{try{await this.attemptConnection()}catch{}},this.reconnectState.nextInterval)}calculateNextInterval(){let e;switch(this.reconnectOptions.backoffStrategy){case"fixed":e=this.reconnectOptions.initialInterval;break;case"linear":e=this.reconnectOptions.initialInterval+this.reconnectState.attempts*this.reconnectOptions.backoffMultiplier*1e3;break;case"exponential":e=this.reconnectOptions.initialInterval*this.reconnectOptions.backoffMultiplier**(this.reconnectState.attempts-1);break;default:e=this.reconnectOptions.initialInterval}if(e=Math.min(e,this.reconnectOptions.maxInterval),this.reconnectOptions.jitter){let t=e*.1,r=(Math.random()-.5)*2*t;e+=r}this.reconnectState.nextInterval=Math.max(e,1e3)}cleanupConnection(){if(this.stopPingMonitoring(),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}stopReconnect(){this.reconnectState.timer&&(clearTimeout(this.reconnectState.timer),this.reconnectState.timer=null)}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);this.logger.debug(`${this.config.name} \u670D\u52A1\u52A0\u8F7D\u4E86 ${t.length} \u4E2A\u5DE5\u5177: ${t.map(r=>r.name).join(", ")}`)}catch(e){throw this.logger.error(`${this.config.name} \u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:`,e instanceof Error?e.message:String(e)),e}}async disconnect(){this.logger.info(`\u4E3B\u52A8\u65AD\u5F00 MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5`),this.reconnectState.isManualDisconnect=!0,this.stopPingMonitoring(),this.stopReconnect(),this.cleanupConnection(),this.connectionState="disconnected",this.eventBus.emitEvent("mcp:service:disconnected",{serviceName:this.config.name,reason:"\u624B\u52A8\u65AD\u5F00",disconnectionTime:new Date})}async reconnect(){this.logger.info(`\u624B\u52A8\u91CD\u8FDE MCP \u670D\u52A1 ${this.config.name}`),this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.isManualDisconnect=!1,this.cleanupConnection(),await this.connect()}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`);this.logger.debug(`\u8C03\u7528 ${this.config.name} \u670D\u52A1\u7684\u5DE5\u5177 ${e}\uFF0C\u53C2\u6570:`,JSON.stringify(t));try{let r=await this.client.callTool({name:e,arguments:t||{}});return this.logger.debug(`\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,`${JSON.stringify(r).substring(0,500)}...`),r}catch(r){throw this.logger.error(`\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,r instanceof Error?r.message:String(r)),r}}getConfig(){return this.config}getStatus(){return{name:this.config.name,connected:this.connectionState==="connected",initialized:this.initialized,transportType:this.config.type,toolCount:this.tools.size,lastError:this.reconnectState.lastError?.message,reconnectAttempts:this.reconnectState.attempts,connectionState:this.connectionState,pingEnabled:this.pingOptions.enabled,lastPingTime:this.lastPingTime||void 0,pingFailureCount:this.pingFailureCount,isPinging:this.isPinging}}isConnected(){return this.connectionState==="connected"&&this.initialized}enableReconnect(){this.reconnectOptions.enabled=!0,this.logger.info(`${this.config.name} \u81EA\u52A8\u91CD\u8FDE\u5DF2\u542F\u7528`)}disableReconnect(){this.reconnectOptions.enabled=!1,this.stopReconnect(),this.logger.info(`${this.config.name} \u81EA\u52A8\u91CD\u8FDE\u5DF2\u7981\u7528`)}updateReconnectOptions(e){this.reconnectOptions={...this.reconnectOptions,...e},this.logger.info(`${this.config.name} \u91CD\u8FDE\u914D\u7F6E\u5DF2\u66F4\u65B0`,e)}getReconnectOptions(){return{...this.reconnectOptions}}resetReconnectState(){this.stopReconnect(),this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null,this.logger.info(`${this.config.name} \u91CD\u8FDE\u72B6\u6001\u5DF2\u91CD\u7F6E`)}startPingMonitoring(){!this.pingOptions.enabled||this.pingTimer||!this.isConnected()||(this.logger.debug(`${this.config.name} \u542F\u52A8ping\u76D1\u63A7\uFF0C\u95F4\u9694: ${this.pingOptions.interval}ms`),setTimeout(()=>{this.isConnected()&&!this.pingTimer&&(this.pingTimer=setInterval(()=>{this.performPing()},this.pingOptions.interval))},this.pingOptions.startDelay))}stopPingMonitoring(){this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null,this.logger.debug(`${this.config.name} \u505C\u6B62ping\u76D1\u63A7`))}async performPing(){if(!this.client||this.isPinging||!this.isConnected())return;this.isPinging=!0;let e=performance.now();try{this.logger.debug(`${this.config.name} \u53D1\u9001ping\u8BF7\u6C42\uFF08\u901A\u8FC7listTools\u68C0\u6D4B\u8FDE\u63A5\uFF09`);let t=this.client.listTools(),r=new Promise((n,i)=>{setTimeout(()=>{i(new Error(`Ping\u8D85\u65F6 (${this.pingOptions.timeout}ms)`))},this.pingOptions.timeout)});await Promise.race([t,r]);let s=performance.now()-e;this.handlePingSuccess(s)}catch(t){let r=performance.now()-e;this.handlePingFailure(t,r)}finally{this.isPinging=!1}}handlePingSuccess(e){this.pingFailureCount=0,this.lastPingTime=new Date,this.logger.debug(`${this.config.name} ping\u6210\u529F\uFF0C\u5EF6\u8FDF: ${e.toFixed(2)}ms`)}handlePingFailure(e,t){if(this.pingFailureCount++,this.logger.warn(`${this.config.name} ping\u5931\u8D25 (${this.pingFailureCount}/${this.pingOptions.maxFailures})\uFF0C\u5EF6\u8FDF: ${t.toFixed(2)}ms\uFF0C\u9519\u8BEF: ${e.message}`),this.pingFailureCount>=this.pingOptions.maxFailures){this.logger.error(`${this.config.name} \u8FDE\u7EEDping\u5931\u8D25\u8FBE\u5230\u9608\u503C\uFF0C\u89E6\u53D1\u91CD\u8FDE\u673A\u5236`),this.stopPingMonitoring();let r=new Error(`Ping\u68C0\u6D4B\u5931\u8D25\uFF0C\u8FDE\u7EED\u5931\u8D25${this.pingFailureCount}\u6B21\uFF0C\u8FDE\u63A5\u53EF\u80FD\u5DF2\u65AD\u5F00`);this.handleConnectionError(r)}}resetPingState(){this.pingFailureCount=0,this.lastPingTime=null,this.isPinging=!1}enablePing(){this.pingOptions.enabled=!0,this.logger.info(`${this.config.name} ping\u76D1\u63A7\u5DF2\u542F\u7528`),this.isConnected()&&this.startPingMonitoring()}disablePing(){this.pingOptions.enabled=!1,this.stopPingMonitoring(),this.logger.info(`${this.config.name} ping\u76D1\u63A7\u5DF2\u7981\u7528`)}updatePingOptions(e){let t=this.pingOptions.enabled;this.pingOptions={...this.pingOptions,...e},this.logger.info(`${this.config.name} ping\u914D\u7F6E\u5DF2\u66F4\u65B0`,e),t!==this.pingOptions.enabled&&(this.pingOptions.enabled&&this.isConnected()?this.startPingMonitoring():this.pingOptions.enabled||this.stopPingMonitoring())}getPingOptions(){return{...this.pingOptions}}}});var Yt,Mn=C(()=>{"use strict";M();z();Yt=class{static{c(this,"ToolSyncManager")}configManager;logger;syncLocks=new Map;eventBus=w();constructor(e,t=h){this.configManager=e,this.logger=t.withTag("ToolSync"),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",async e=>{await this.handleConfigUpdated(e)}),this.eventBus.onEvent("mcp:server:added",async e=>{await this.handleMCPServerAdded(e)}),this.eventBus.onEvent("mcp:server:removed",async e=>{await this.handleMCPServerRemoved(e)})}async handleConfigUpdated(e){this.logger.debug("\u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u5DE5\u5177\u540C\u6B65\u72B6\u6001");try{e.type==="customMCP"?this.logger.debug("customMCP\u914D\u7F6E\u5DF2\u66F4\u65B0\uFF0CCustomMCPHandler\u5C06\u81EA\u52A8\u5904\u7406"):e.type==="serverTools"&&e.serviceName?await this.handleServerToolsConfigUpdated(e.serviceName):await this.handleGeneralConfigUpdated()}catch(t){this.logger.error("\u914D\u7F6E\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u540C\u6B65\u5931\u8D25:",t)}}async handleServerToolsConfigUpdated(e){this.logger.debug(`\u5904\u7406\u670D\u52A1 ${e} \u7684serverTools\u914D\u7F6E\u66F4\u65B0`);try{this.eventBus.emitEvent("tool-sync:server-tools-updated",{serviceName:e,timestamp:new Date})}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e} \u914D\u7F6E\u66F4\u65B0\u5931\u8D25:`,t)}}async handleGeneralConfigUpdated(){this.logger.info("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u6240\u6709\u670D\u52A1\u540C\u6B65\u72B6\u6001");try{this.eventBus.emitEvent("tool-sync:general-config-updated",{timestamp:new Date})}catch(e){this.logger.error("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",e)}}async handleMCPServerAdded(e){this.logger.info(`\u5904\u7406MCP\u670D\u52A1\u6DFB\u52A0\u4E8B\u4EF6: ${e.serverName}`);try{setTimeout(async()=>{await this.triggerServiceToolSync(e.serverName)},1e3)}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e.serverName} \u6DFB\u52A0\u4E8B\u4EF6\u5931\u8D25:`,t)}}async triggerServiceToolSync(e){this.logger.info(`\u89E6\u53D1\u670D\u52A1 ${e} \u7684\u5DE5\u5177\u540C\u6B65`);try{this.eventBus.emitEvent("tool-sync:request-service-tools",{serviceName:e,timestamp:new Date})}catch(t){this.logger.error(`\u89E6\u53D1\u670D\u52A1 ${e} \u5DE5\u5177\u540C\u6B65\u5931\u8D25:`,t)}}async handleMCPServerRemoved(e){this.logger.info(`\u5904\u7406MCP\u670D\u52A1\u79FB\u9664\u4E8B\u4EF6: ${e.serverName}`);try{await this.removeServiceToolsFromCustomMCP(e.serverName,e.affectedTools)}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e.serverName} \u79FB\u9664\u4E8B\u4EF6\u5931\u8D25:`,t)}}async removeServiceToolsFromCustomMCP(e,t){this.logger.info(`\u4ECEcustomMCP\u4E2D\u79FB\u9664\u670D\u52A1 ${e} \u7684\u5DE5\u5177`);try{let r=this.configManager.getCustomMCPTools(),s=r.filter(i=>!i.name.startsWith(`${e}__`));if(s.length===r.length){this.logger.debug(`\u670D\u52A1 ${e} \u7684\u5DE5\u5177\u4E0D\u5728customMCP\u4E2D\uFF0C\u65E0\u9700\u79FB\u9664`);return}await this.configManager.updateCustomMCPTools(s);let n=r.length-s.length;this.logger.info(`\u6210\u529F\u4ECEcustomMCP\u4E2D\u79FB\u9664\u670D\u52A1 ${e} \u7684 ${n} \u4E2A\u5DE5\u5177`),this.eventBus.emitEvent("tool-sync:service-tools-removed",{serviceName:e,removedCount:n,timestamp:new Date})}catch(r){throw this.logger.error(`\u79FB\u9664\u670D\u52A1 ${e} \u5DE5\u5177\u5931\u8D25:`,r),r}}async syncToolsAfterConnection(e,t){if(this.syncLocks.has(e)){this.logger.debug(`\u670D\u52A1 ${e} \u6B63\u5728\u540C\u6B65\u4E2D\uFF0C\u8DF3\u8FC7`);return}let r=this.doSyncTools(e,t).finally(()=>{this.syncLocks.delete(e)});this.syncLocks.set(e,r),await r}async doSyncTools(e,t){try{this.logger.info(`\u5F00\u59CB\u540C\u6B65\u670D\u52A1 ${e} \u7684\u5DE5\u5177`);let r=this.configManager.getServerToolsConfig(e);if(!r){this.logger.debug(`\u670D\u52A1 ${e} \u65E0 mcpServerConfig \u914D\u7F6E\uFF0C\u8DF3\u8FC7\u540C\u6B65`);return}let s=this.getEnabledTools(r,t);if(s.length===0){this.logger.debug(`\u670D\u52A1 ${e} \u65E0\u542F\u7528\u5DE5\u5177\uFF0C\u8DF3\u8FC7\u540C\u6B65`);return}let n=this.configManager.getCustomMCPTools(),i=new Set(n.map(l=>l.name)),a=s.filter(l=>!i.has(`${e}__${l.name}`));if(a.length===0){this.logger.info(`\u670D\u52A1 ${e} \u7684\u542F\u7528\u5DE5\u5177\u5DF2\u5B58\u5728\u4E8E customMCP \u4E2D\uFF0C\u8DF3\u8FC7\u540C\u6B65`);return}await this.addToolsToCustomMCP(e,a),this.logger.info(`\u6210\u529F\u540C\u6B65\u670D\u52A1 ${e} \u7684 ${a.length} \u4E2A\u5DE5\u5177\u5230 customMCP`)}catch(r){this.logger.error(`\u540C\u6B65\u670D\u52A1 ${e} \u5DE5\u5177\u5931\u8D25:`,r),this.recordSyncError(e,r)}}getEnabledTools(e,t){let r=[];for(let s of t){let n=e[s.name];n&&n.enable!==!1&&r.push(s)}return r}async addToolsToCustomMCP(e,t){let r=t.map(s=>({name:`${e}__${s.name}`,description:s.description||"",inputSchema:s.inputSchema||{},handler:{type:"mcp",config:{serviceName:e,toolName:s.name}}}));await this.configManager.addCustomMCPTools(r),await this.syncToolStats(e,t)}recordSyncError(e,t){let r={serviceName:e,error:t instanceof Error?t.message:String(t),timestamp:new Date().toISOString(),type:t instanceof Error?t.constructor.name:"UnknownError"};this.logger.error("\u540C\u6B65\u9519\u8BEF\u8BB0\u5F55:",r)}getSyncLocks(){return Array.from(this.syncLocks.keys())}clearSyncLocks(){this.syncLocks.clear(),this.logger.debug("\u5DF2\u6E05\u7406\u6240\u6709\u540C\u6B65\u9501")}async syncToolStats(e,t){try{let r=this.configManager.getServerToolsConfig(e);if(!r){this.logger.debug(`\u670D\u52A1 ${e} \u65E0 mcpServerConfig \u914D\u7F6E\uFF0C\u8DF3\u8FC7\u7EDF\u8BA1\u4FE1\u606F\u540C\u6B65`);return}let s=this.configManager.getCustomMCPTools(),n=new Map(s.map(i=>[i.name,i]));for(let i of t){let a=`${e}__${i.name}`,l=n.get(a),g=r[i.name];if(l&&g&&(!l.stats||!l.stats.usageCount&&!l.stats.lastUsedTime)){let u={};g.usageCount!==void 0&&(u.usageCount=g.usageCount),g.lastUsedTime&&(u.lastUsedTime=g.lastUsedTime),Object.keys(u).length>0&&(await this.updateCustomMCPToolStats(a,u),this.logger.debug(`\u5DF2\u540C\u6B65\u5DE5\u5177 ${a} \u7684\u7EDF\u8BA1\u4FE1\u606F: ${JSON.stringify(u)}`))}}}catch(r){this.logger.error(`\u540C\u6B65\u670D\u52A1 ${e} \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,r instanceof Error?r.message:String(r))}}async updateCustomMCPToolStats(e,t){try{let r=this.configManager.getCustomMCPTools(),s=r.findIndex(a=>a.name===e);if(s===-1){this.logger.warn(`\u5DE5\u5177 ${e} \u4E0D\u5B58\u5728\u4E8E customMCP \u4E2D`);return}let n=[...r],i=n[s];i.stats||(i.stats={}),t.usageCount!==void 0&&(i.stats.usageCount=t.usageCount),t.lastUsedTime!==void 0&&(i.stats.lastUsedTime=t.lastUsedTime),await this.configManager.updateCustomMCPTools(n)}catch(r){throw this.logger.error(`\u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,r instanceof Error?r.message:String(r)),r}}}});var St,wn,rs=C(()=>{"use strict";M();se();Tn();z();Gt();Jt();Mn();St=class{static{c(this,"MCPServiceManager")}services=new Map;configs={};logger;tools=new Map;customMCPHandler;cacheManager;toolSyncManager;eventBus=w();constructor(e){this.logger=h,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 Ie(r),this.customMCPHandler=new Xt,this.toolSyncManager=new Yt(d,this.logger),this.setupEventListeners()}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)}),this.eventBus.onEvent("tool-sync:server-tools-updated",async e=>{await this.handleServerToolsUpdated(e)}),this.eventBus.onEvent("tool-sync:general-config-updated",async e=>{await this.handleGeneralConfigUpdated(e)})}async handleServiceConnected(e){this.logger.debug(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u6210\u529F\uFF0C\u5F00\u59CB\u5DE5\u5177\u540C\u6B65`);try{let t=this.services.get(e.serviceName);if(t){let r=t.getTools();this.toolSyncManager&&await this.toolSyncManager.syncToolsAfterConnection(e.serviceName,r),await this.refreshCustomMCPHandlerPublic(),this.logger.info(`\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u540C\u6B65\u5B8C\u6210`)}}catch(t){this.logger.error(`\u540C\u6B65\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u5931\u8D25:`,t)}}async handleServiceDisconnected(e){this.logger.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\uFF0C\u539F\u56E0: ${e.reason||"\u672A\u77E5"}`);try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic(),this.logger.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5B8C\u6210`)}catch(t){this.logger.error(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5931\u8D25:`,t)}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch(t){this.logger.error("\u5237\u65B0CustomMCPHandler\u5931\u8D25:",t)}}async handleServerToolsUpdated(e){this.logger.debug(`\u5904\u7406\u670D\u52A1 ${e.serviceName} \u7684serverTools\u914D\u7F6E\u66F4\u65B0`);try{let t=this.services.get(e.serviceName);if(t?.isConnected()){let r=t.getTools();this.toolSyncManager&&await this.toolSyncManager.syncToolsAfterConnection(e.serviceName,r),await this.refreshCustomMCPHandlerPublic(),this.logger.info(`\u670D\u52A1 ${e.serviceName} \u914D\u7F6E\u66F4\u65B0\u540C\u6B65\u5B8C\u6210`)}}catch(t){this.logger.error(`\u5904\u7406\u670D\u52A1 ${e.serviceName} \u914D\u7F6E\u66F4\u65B0\u5931\u8D25:`,t)}}async handleGeneralConfigUpdated(e){this.logger.info("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\uFF0C\u68C0\u67E5\u6240\u6709\u5DF2\u8FDE\u63A5\u670D\u52A1");try{for(let[t,r]of this.services)if(r.isConnected()){let s=r.getTools();this.toolSyncManager&&await this.toolSyncManager.syncToolsAfterConnection(t,s)}await this.refreshCustomMCPHandlerPublic(),this.logger.info("\u901A\u7528\u914D\u7F6E\u66F4\u65B0\u540C\u6B65\u5B8C\u6210")}catch(t){this.logger.error("\u5904\u7406\u901A\u7528\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t)}}async startAllServices(){this.logger.debug("[MCPManager] \u6B63\u5728\u542F\u52A8\u6240\u6709 MCP \u670D\u52A1...");try{this.customMCPHandler.initialize(),this.logger.debug("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(t){this.logger.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t)}let e=Object.entries(this.configs);if(e.length===0){this.logger.warn("[MCPManager] \u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\uFF0C\u8BF7\u4F7F\u7528 addServiceConfig() \u6DFB\u52A0\u670D\u52A1\u914D\u7F6E");return}for(let[t]of e)await this.startService(t)}async startService(e){this.logger.debug(`[MCPManager] \u542F\u52A8 MCP \u670D\u52A1: ${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 Kt(t);await r.connect(),this.services.set(e,r),await this.refreshToolsCache();let s=r.getTools();this.logger.debug(`[MCPManager] ${e} \u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u52A0\u8F7D\u4E86 ${s.length} \u4E2A\u5DE5\u5177:`,s.map(n=>n.name).join(", "))}catch(r){throw this.logger.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25:`,r.message),r}}async stopService(e){this.logger.info(`[MCPManager] \u505C\u6B62 MCP \u670D\u52A1: ${e}`);let t=this.services.get(e);if(!t){this.logger.warn(`[MCPManager] \u670D\u52A1 ${e} \u4E0D\u5B58\u5728\u6216\u672A\u542F\u52A8`);return}try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache(),this.logger.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){throw this.logger.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25:`,r.message),r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),s=this.configs[e];s&&this.cacheManager.writeCacheEntry(e,r,s).then(()=>{this.logger.debug(`[MCPManager] \u5DF2\u5C06 ${e} \u5DE5\u5177\u5217\u8868\u5199\u5165\u7F13\u5B58`)}).catch(n=>{this.logger.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${n instanceof Error?n.message:String(n)}`)});for(let n of r){let i=`${e}__${n.name}`;this.tools.set(i,{serviceName:e,originalName:n.name,tool:n})}}await this.syncToolsConfigToFile()}getAllTools(){let e=[];for(let[r,s]of this.services)if(s.isConnected()){let n=s.getTools();for(let i of n){if(!d.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})}}let t=[];try{t=this.customMCPHandler.getTools(),this.logger.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${t.length} \u4E2A customMCP \u5DE5\u5177`)}catch(r){this.logger.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5931\u8D25\uFF0C\u5C06\u53EA\u8FD4\u56DE\u6807\u51C6 MCP \u5DE5\u5177:",r),t=[]}for(let r of t)e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name});return e}getServiceNameForTool(e){return e.handler?.type==="mcp"?e.handler.config.serviceName:"customMCP"}async callTool(e,t){if(this.customMCPHandler.hasTool(e)){let n=this.customMCPHandler.getToolInfo(e);if(n?.handler?.type==="mcp")try{let i=await this.callMCPTool(e,n.handler.config,t);return this.updateToolStats(e,n.handler.config.serviceName,n.handler.config.toolName,!0).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),i}catch(i){throw this.updateToolStatsForFailedCall(e,n.handler.config.serviceName,n.handler.config.toolName,i).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),i}try{let i=await this.customMCPHandler.callTool(e,t);return this.updateToolStats(e,"customMCP",e,!0).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),this.logger.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),i}catch(i){throw this.updateToolStatsForFailedCall(e,"customMCP",e,i).catch(a=>{this.logger.warn(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,a)}),this.logger.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,i.message),i}}let r=this.tools.get(e);if(!r)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let s=this.services.get(r.serviceName);if(!s)throw new Error(`\u670D\u52A1 ${r.serviceName} \u4E0D\u53EF\u7528`);if(!s.isConnected())throw new Error(`\u670D\u52A1 ${r.serviceName} \u672A\u8FDE\u63A5`);try{let n=await s.callTool(r.originalName,t||{});return this.updateToolStats(e,r.serviceName,r.originalName,!0).catch(i=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,i)}),this.logger.debug(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,n),n}catch(n){throw this.updateToolStatsForFailedCall(e,r.serviceName,r.originalName,n).catch(i=>{this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,i)}),this.logger.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,n.message),n}}async updateToolStats(e,t,r,s){try{if(!s)return;let n=new Date().toISOString();await this.updateCustomMCPToolStats(e,n),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,n),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)}catch(n){throw this.logger.error(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,n),n}}async updateToolStatsForFailedCall(e,t,r,s){try{let n=new Date().toISOString();await this.updateCustomMCPToolLastUsedTime(e,n),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,n),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F`)}catch(n){throw this.logger.error(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,n),n}}async updateCustomMCPToolStats(e,t){try{await d.updateToolUsageStatsWithLock(e,!0),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u7EDF\u8BA1`)}catch(r){throw this.logger.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u5931\u8D25:`,r),r}}async updateCustomMCPToolLastUsedTime(e,t){try{await d.updateToolUsageStatsWithLock(e,!1),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(r){throw this.logger.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25:`,r),r}}async updateMCPServerToolStats(e,t,r){try{await d.updateMCPServerToolStatsWithLock(e,t,r,!0),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1`)}catch(s){throw this.logger.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u5931\u8D25:`,s),s}}async updateMCPServerToolLastUsedTime(e,t,r){try{await d.updateMCPServerToolStatsWithLock(e,t,r,!1),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(s){throw this.logger.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25:`,s),s}}async callMCPTool(e,t,r){let{serviceName:s,toolName:n}=t;this.logger.debug(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${s}.${n}`);let i=this.services.get(s);if(!i)throw new Error(`\u670D\u52A1 ${s} \u4E0D\u53EF\u7528`);if(!i.isConnected())throw new Error(`\u670D\u52A1 ${s} \u672A\u8FDE\u63A5`);try{let a=await i.callTool(n,r||{});return this.logger.debug(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),a}catch(a){throw this.logger.error(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,a.message),a}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.logger.info("[MCPManager] \u6B63\u5728\u505C\u6B62\u6240\u6709 MCP \u670D\u52A1...");for(let[e,t]of this.services)try{await t.disconnect(),this.logger.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){this.logger.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25:`,r.message)}try{this.customMCPHandler.cleanup(),this.logger.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){this.logger.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u6E05\u7406\u5931\u8D25:",e)}try{d.clearAllStatsUpdateLocks(),this.logger.info("[MCPManager] \u7EDF\u8BA1\u66F4\u65B0\u9501\u5DF2\u6E05\u7406")}catch(e){this.logger.error("[MCPManager] \u6E05\u7406\u7EDF\u8BA1\u66F4\u65B0\u9501\u5931\u8D25:",e)}this.services.clear(),this.tools.clear(),this.logger.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u5DF2\u505C\u6B62")}getStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames(),this.logger.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 customMCP \u72B6\u6001: ${e} \u4E2A\u5DE5\u5177`)}catch(a){this.logger.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u72B6\u6001\u5931\u8D25\uFF0C\u5C06\u53EA\u5305\u542B\u6807\u51C6 MCP \u5DE5\u5177:",a),e=0,t=[]}let r=this.tools.size+e,n=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:n};for(let[a,l]of this.services){let g=l.getStatus();i.services[a]={connected:g.connected,clientName:`xiaozhi-${a}-client`}}return e>0&&(i.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),i}getStatsUpdateInfo(){try{let e=d.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch(e){return this.logger.warn("[MCPManager] \u83B7\u53D6\u7EDF\u8BA1\u66F4\u65B0\u76D1\u63A7\u4FE1\u606F\u5931\u8D25:",e),{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.logger.debug("\u91CD\u65B0\u521D\u59CB\u5316CustomMCPHandler"),await this.customMCPHandler.reinitialize(),this.logger.debug("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25:",e),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(t){return this.logger.warn(`[MCPManager] \u68C0\u67E5 CustomMCP \u5DE5\u5177 ${e} \u662F\u5426\u5B58\u5728\u5931\u8D25:`,t),!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch(e){return this.logger.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5217\u8868\u5931\u8D25\uFF0C\u8FD4\u56DE\u7A7A\u6570\u7EC4:",e),[]}}enhanceServiceConfig(e){let t={...e};try{if(e.type==="sse"&&e.url&&e.url.includes("modelscope")){let r=d.getModelScopeApiKey();if(r)t.apiKey=r,this.logger.info(`[MCPManager] \u4E3A ${e.name} \u670D\u52A1\u6DFB\u52A0 ModelScope API Key`);else throw this.logger.warn(`[MCPManager] ${e.name} \u670D\u52A1\u9700\u8981 ModelScope API Key\uFF0C\u4F46\u672A\u5728\u914D\u7F6E\u4E2D\u627E\u5230`),new Error(`ModelScope SSE \u670D\u52A1 ${e.name} \u9700\u8981 API Key\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E modelscope.apiKey`)}return t}catch(r){throw this.logger.error(`[MCPManager] \u914D\u7F6E\u589E\u5F3A\u5931\u8D25: ${e.name}`,r),r}}addServiceConfig(e,t){let r,s;if(typeof e=="string"&&t)s=e,r=t;else if(typeof e=="object")s=e.name,r=e;else throw new Error("Invalid arguments for addServiceConfig");let n=this.enhanceServiceConfig(r);this.configs[s]=n,this.logger.debug(`[MCPManager] \u5DF2\u6DFB\u52A0\u670D\u52A1\u914D\u7F6E: ${s}`)}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(t);this.configs[e]=r,this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5E76\u589E\u5F3A\u670D\u52A1\u914D\u7F6E: ${e}`)}removeServiceConfig(e){delete this.configs[e],this.logger.debug(`[MCPManager] \u5DF2\u79FB\u9664\u670D\u52A1\u914D\u7F6E: ${e}`)}async syncToolsConfigToFile(){try{this.logger.debug("[MCPManager] \u5F00\u59CB\u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6");let e=d.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let s=r.getTools();if(s.length===0)continue;let n=e[t]?.tools||{},i={};for(let p of s){let f=n[p.name];f?i[p.name]={...f,description:p.description||f.description||""}:i[p.name]={description:p.description||"",enable:!0}}let a=s.map(p=>p.name),g=Object.keys(n).filter(p=>!a.includes(p));if(g.length>0&&this.logger.info(`[MCPManager] \u68C0\u6D4B\u5230\u670D\u52A1 ${t} \u79FB\u9664\u4E86 ${g.length} \u4E2A\u5DE5\u5177: ${g.join(", ")}`),this.hasToolsConfigChanged(n,i)){d.updateServerToolsConfig(t,i);let p=Object.keys(i).filter(m=>!n[m]),f=Object.keys(i).filter(m=>{let A=n[m],ie=i[m];return A&&A.description!==ie.description});this.logger.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),p.length>0&&this.logger.debug(` - \u65B0\u589E\u5DE5\u5177: ${p.join(", ")}`),f.length>0&&this.logger.debug(` - \u66F4\u65B0\u5DE5\u5177: ${f.join(", ")}`),g.length>0&&this.logger.debug(` - \u79FB\u9664\u5DE5\u5177: ${g.join(", ")}`)}}this.logger.debug("[MCPManager] \u5DE5\u5177\u914D\u7F6E\u540C\u6B65\u5B8C\u6210")}catch(e){this.logger.error("[MCPManager] \u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:",e)}}hasToolsConfigChanged(e,t){let r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!0;let n=s.filter(a=>!r.includes(a)),i=r.filter(a=>!s.includes(a));if(n.length>0||i.length>0)return!0;for(let a of r){let l=e[a],g=t[a];if(l.description!==g.description)return!0}return!1}},wn=St});var tt,ss=C(()=>{"use strict";M();tt=class{static{c(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=h}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"],s=e.protocolVersion,n=r.includes(s)?s:"2024-11-05";return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${s}, \u670D\u52A1\u5668\u54CD\u5E94=${n}`),{jsonrpc:"2.0",result:{serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"},capabilities:{tools:{},logging:{}},protocolVersion:n},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(s=>({name:s.name,description:s.description,inputSchema:s.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){let r=`\u8C03\u7528MCP\u5DE5\u5177: ${e.name}`;try{if(!e.name)throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let s=await this.serviceManager.callTool(e.name,e.arguments||{});return this.logger.info(r,"\u8C03\u7528\u53C2\u6570:",JSON.stringify(e.arguments)),this.logger.info(r,"\u54CD\u5E94\u7ED3\u679C:",JSON.stringify(s)),{jsonrpc:"2.0",result:{content:s.content,isError:s.isError||!1},id:t!==void 0?t:1}}catch(s){throw this.logger.info(r,"\u8C03\u7528\u53C2\u6570:",JSON.stringify(e.arguments)),this.logger.error(r,"\u8C03\u7528\u5931\u8D25:",s),s}}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}}});import{EventEmitter as Rn}from"events";var ns,os,Zt,bn=C(()=>{"use strict";M();rs();ft();ss();ns=class{static{c(this,"ToolRegistry")}serviceManager;logger;constructor(e){this.serviceManager=e,this.logger=h}async initialize(){this.logger.info("\u521D\u59CB\u5316\u5DE5\u5177\u6CE8\u518C\u8868")}getAllTools(){return this.serviceManager.getAllTools().map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,serviceName:e.serviceName,originalName:e.originalName}))}findTool(e){return this.getAllTools().find(r=>r.name===e)||null}hasTool(e){return this.findTool(e)!==null}},os=class extends Rn{static{c(this,"ConnectionManager")}connections=new Map;logger;constructor(){super(),this.logger=h}async initialize(){this.logger.info("\u521D\u59CB\u5316\u8FDE\u63A5\u7BA1\u7406\u5668")}registerConnection(e,t,r){let s={id:e,transportName:t,state:r,connectedAt:new Date,lastActivity:new Date};this.connections.set(e,s),this.emit("connectionRegistered",s),this.logger.debug(`\u8FDE\u63A5\u5DF2\u6CE8\u518C: ${e} (${t})`)}updateConnectionState(e,t){let r=this.connections.get(e);r&&(r.state=t,r.lastActivity=new Date,this.emit("connectionStateChanged",r),this.logger.debug(`\u8FDE\u63A5\u72B6\u6001\u66F4\u65B0: ${e} -> ${t}`))}removeConnection(e){let t=this.connections.get(e);t&&(this.connections.delete(e),this.emit("connectionRemoved",t),this.logger.debug(`\u8FDE\u63A5\u5DF2\u79FB\u9664: ${e}`))}getAllConnections(){return Array.from(this.connections.values())}getActiveConnectionCount(){return Array.from(this.connections.values()).filter(e=>e.state==="connected").length}async closeAllConnections(){this.logger.info("\u5173\u95ED\u6240\u6709\u8FDE\u63A5"),this.connections.clear(),this.emit("allConnectionsClosed")}},Zt=class extends Rn{static{c(this,"UnifiedMCPServer")}serviceManager;messageHandler;transportAdapters=new Map;toolRegistry;connectionManager;isRunning=!1;logger;config;constructor(e={}){super(),this.config={name:"UnifiedMCPServer",enableLogging:!0,logLevel:"info",maxConnections:100,connectionTimeout:3e4,...e},this.logger=h,this.serviceManager=new St,this.messageHandler=new tt(this.serviceManager),this.toolRegistry=new ns(this.serviceManager),this.connectionManager=new os,this.setupEventListeners()}setupEventListeners(){this.connectionManager.on("connectionRegistered",e=>{this.emit("connectionRegistered",e)}),this.connectionManager.on("connectionStateChanged",e=>{this.emit("connectionStateChanged",e)}),this.connectionManager.on("connectionRemoved",e=>{this.emit("connectionRemoved",e)})}async initialize(){this.logger.info("\u521D\u59CB\u5316\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{await this.serviceManager.startAllServices(),await this.toolRegistry.initialize(),await this.connectionManager.initialize(),this.logger.debug("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210"),this.emit("initialized")}catch(e){throw this.logger.error("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5931\u8D25",e),e}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);this.logger.info(`\u6CE8\u518C\u4F20\u8F93\u9002\u914D\u5668: ${e}`);try{await t.initialize(),this.transportAdapters.set(e,t),this.connectionManager.registerConnection(t.getConnectionId(),e,t.getState()),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u6CE8\u518C\u6210\u529F`),this.emit("transportRegistered",{name:e,adapter:t})}catch(r){throw this.logger.error(`\u6CE8\u518C\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5931\u8D25`,r),r}}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");this.logger.info("\u542F\u52A8\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{for(let[e,t]of this.transportAdapters)try{await t.start(),this.connectionManager.updateConnectionState(t.getConnectionId(),t.getState()),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u542F\u52A8\u6210\u529F`)}catch(r){throw this.logger.error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u542F\u52A8\u5931\u8D25`,r),r}this.isRunning=!0,this.logger.info("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw this.logger.error("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25",e),e}}async stop(){if(this.isRunning){this.logger.info("\u505C\u6B62\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{for(let[e,t]of this.transportAdapters)try{await t.stop(),this.connectionManager.updateConnectionState(t.getConnectionId(),t.getState()),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u505C\u6B62\u6210\u529F`)}catch(r){this.logger.error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u505C\u6B62\u5931\u8D25`,r)}await this.connectionManager.closeAllConnections(),await this.serviceManager.stopAllServices(),this.isRunning=!1,this.logger.info("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw this.logger.error("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u505C\u6B62\u5931\u8D25",e),e}}}getServiceManager(){return this.serviceManager}getToolRegistry(){return this.toolRegistry}getConnectionManager(){return this.connectionManager}getMessageHandler(){return this.messageHandler}getStatus(){return{isRunning:this.isRunning,transportCount:this.transportAdapters.size,activeConnections:this.connectionManager.getActiveConnectionCount(),toolCount:this.toolRegistry.getAllTools().length,config:this.config}}getTransportAdapters(){return new Map(this.transportAdapters)}isServerRunning(){return this.isRunning}}});async function In(o={name:"http"}){h.info("\u521B\u5EFA HTTP \u6A21\u5F0F\u670D\u52A1\u5668");let e=new Zt;await e.initialize();let t=e.getMessageHandler(),r=new Vt(t,o);return await e.registerTransport("http",r),h.info("HTTP \u6A21\u5F0F\u670D\u52A1\u5668\u521B\u5EFA\u6210\u529F"),e}var $n=C(()=>{"use strict";M();un();pn();hn();bn();c(In,"createHTTPServer")});var On={};re(On,{MCPServer:()=>is});import{EventEmitter as ic}from"events";var X,is,An=C(()=>{"use strict";M();Ft();se();$n();X=new gt,is=class extends ic{static{c(this,"MCPServer")}unifiedServer=null;proxyMCPServer=null;port;isStarted=!1;constructor(e=3e3){super(),this.port=e}async initializeUnifiedServer(){if(!this.unifiedServer){X.info("\u521D\u59CB\u5316\u7EDF\u4E00 MCP \u670D\u52A1\u5668");try{let e={name:"http",port:this.port,host:"0.0.0.0",enableSSE:!0,enableRPC:!0};this.unifiedServer=await In(e),this.unifiedServer.on("started",()=>this.emit("started")),this.unifiedServer.on("stopped",()=>this.emit("stopped")),this.unifiedServer.on("connectionRegistered",t=>{this.emit("connectionRegistered",t)}),X.debug("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw X.error("\u521D\u59CB\u5316\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u5931\u8D25",e),e}}}async initializeMCPClient(){try{let e=null;try{d.configExists()&&(e=d.getMcpEndpoints().find(r=>r&&!r.includes("<\u8BF7\u586B\u5199"))||null)}catch(t){X.warn("\u4ECE\u914D\u7F6E\u4E2D\u8BFB\u53D6\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25:",t)}e?(this.proxyMCPServer=new be(e),this.unifiedServer&&this.proxyMCPServer.setServiceManager(this.unifiedServer.getServiceManager()),await this.proxyMCPServer.connect(),X.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")):X.debug("\u672A\u914D\u7F6E\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\uFF0C\u8DF3\u8FC7\u8FDE\u63A5")}catch(e){X.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}}async start(){if(this.isStarted){X.warn("\u670D\u52A1\u5668\u5DF2\u542F\u52A8");return}try{await this.initializeUnifiedServer(),this.unifiedServer&&await this.unifiedServer.start(),this.initializeMCPClient().catch(e=>{X.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}),this.isStarted=!0,this.emit("started"),X.info("MCP \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F")}catch(e){throw X.error("\u542F\u52A8 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}async stop(){if(!this.isStarted){X.warn("\u670D\u52A1\u5668\u672A\u542F\u52A8");return}try{X.info("\u505C\u6B62 MCP \u670D\u52A1\u5668"),this.unifiedServer&&await this.unifiedServer.stop(),this.proxyMCPServer&&(this.proxyMCPServer.disconnect(),this.proxyMCPServer=null),this.isStarted=!1,this.emit("stopped"),X.info("MCP \u670D\u52A1\u5668\u5DF2\u505C\u6B62")}catch(e){throw X.error("\u505C\u6B62 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}getServiceManager(){return this.unifiedServer?.getServiceManager()||null}getMessageHandler(){return this.unifiedServer?.getMessageHandler()||null}getStatus(){return this.unifiedServer?{...this.unifiedServer.getStatus(),port:this.port,mode:"mcp-server",proxyConnected:this.proxyMCPServer!==null}:{isRunning:!1,port:this.port,mode:"mcp-server"}}isRunning(){return this.isStarted&&(this.unifiedServer?.isServerRunning()||!1)}}});import{isAbsolute as ac,resolve as cc}from"path";function Dn(o){try{let t=new URL(o).pathname;return t.endsWith("/sse")?"sse":t.endsWith("/mcp")?"streamable-http":"streamable-http"}catch(e){return rt.warn(`URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B: ${o}`,e),"streamable-http"}}function Ln(o,e){rt.debug(`\u8F6C\u6362\u914D\u7F6E: ${o}`,e);try{if(!o||typeof o!="string")throw new k("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new k("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",o);let t=lc(o,e);return dc(t),rt.debug(`\u914D\u7F6E\u8F6C\u6362\u6210\u529F: ${o} -> ${t.type}`),t}catch(t){throw rt.error(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${o}`,t),t instanceof k?t:new k(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,o)}}function lc(o,e){if(pc(e))return gc(o,e);if("type"in e)switch(e.type){case"sse":return xn(o,e);case"streamable-http":return Nn(o,e);default:throw new k(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${e.type}`,o)}if("url"in e){if(e.url===void 0||e.url===null)throw new k("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",o);if(Dn(e.url||"")==="sse"){let s={...e,type:"sse"};return xn(o,s)}let r={...e,type:"streamable-http"};return Nn(o,r)}throw new k("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",o)}function gc(o,e){if(!e.command)throw new k("\u672C\u5730\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5",o);let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=(e.args||[]).map(s=>{if(uc(s)){let n=cc(t,s);return rt.debug(`\u89E3\u6790\u76F8\u5BF9\u8DEF\u5F84: ${s} -> ${n}`),n}return s});return{name:o,type:"stdio",command:e.command,args:r,env:e.env,reconnect:{enabled:!0,maxAttempts:5,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0},ping:{enabled:!0,interval:3e4,timeout:5e3,maxFailures:3,startDelay:5e3},timeout:3e4}}function xn(o,e){if(e.url===void 0||e.url===null)throw new k("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",o);let t=e.type==="sse"?"sse":Dn(e.url||""),r=e.url?hc(e.url):!1,s={name:o,type:t,url:e.url,reconnect:{enabled:!0,maxAttempts:10,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:15e3,jitter:!0},ping:t==="sse"?{enabled:!0,interval:3e4,timeout:5e3,maxFailures:3,startDelay:5e3}:{enabled:!1,interval:6e4,timeout:1e4,maxFailures:3,startDelay:1e4},timeout:3e4};return r&&(s.modelScopeAuth=!0),rt.info(`[ConfigAdapter] \u670D\u52A1 ${o} URL: ${e.url}\uFF0C\u63A8\u65AD\u7C7B\u578B: ${t}${r?" (ModelScope)":""}`),s}function Nn(o,e){if(e.url===void 0||e.url===null)throw new k("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",o);let t=e.url||"";return{name:o,type:"streamable-http",url:t,reconnect:{enabled:!0,maxAttempts:5,initialInterval:3e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:15e3,jitter:!0},ping:{enabled:!1,interval:6e4,timeout:1e4,maxFailures:3,startDelay:1e4},timeout:3e4}}function uc(o){return ac(o)?!1:!!(o.startsWith("./")||o.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(o))}function pc(o){return"command"in o&&typeof o.command=="string"}function hc(o){return o.includes("modelscope.net")||o.includes("modelscope.cn")}function dc(o){if(!o.name||typeof o.name!="string")throw new k("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(o.type&&!Object.values(et).includes(o.type))throw new k(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`);if(!o.type)throw new k("\u4F20\u8F93\u7C7B\u578B\u672A\u6307\u5B9A\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6216\u542F\u7528\u81EA\u52A8\u63A8\u65AD");switch(o.type){case"stdio":if(!o.command)throw new k("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(o.url===void 0||o.url===null)throw new k("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(o.url===void 0||o.url===null)throw new k("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new k(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}var rt,k,_n=C(()=>{"use strict";M();Jt();rt=h.withTag("ConfigAdapter");c(Dn,"inferTransportTypeFromUrl");k=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{c(this,"ConfigValidationError")}};c(Ln,"convertLegacyToNew");c(lc,"convertByConfigType");c(gc,"convertLocalConfig");c(xn,"convertSSEConfig");c(Nn,"convertStreamableHTTPConfig");c(uc,"isRelativePath");c(pc,"isLocalConfig");c(hc,"isModelScopeURL");c(dc,"validateNewConfig")});async function mc(){return new wn}async function kn(){if(ye&&Z==="initialized")return ye;if(de&&Z==="initializing")return de;Z==="failed"&&as(),Z="initializing",de=mc();try{return ye=await de,Z="initialized",yt=`mcp-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,Et=null,ye}catch(o){throw Z="failed",Et=o,de=null,console.error("\u274C MCPServiceManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",o.message),o}}async function jn(){if(Z==="cleanup"){console.log("\u26A0\uFE0F MCPServiceManager \u5355\u4F8B\u5DF2\u5728\u6E05\u7406\u4E2D\uFF0C\u8DF3\u8FC7\u91CD\u590D\u6E05\u7406");return}console.log("\u{1F9F9} \u6B63\u5728\u6E05\u7406 MCPServiceManager \u5355\u4F8B\u8D44\u6E90..."),Z="cleanup";try{if(de){try{await(await de).stopAllServices()}catch(o){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",o.message)}de=null}ye&&(await ye.stopAllServices(),ye=null),Z="not_initialized",Et=null,yt=null}catch(o){throw console.error("\u274C MCPServiceManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",o.message),as(),o}}function as(){console.log("\u{1F504} \u91CD\u7F6E MCPServiceManager \u5355\u4F8B\u72B6\u6001"),ye=null,de=null,Z="not_initialized",Et=null,yt=null}function fc(){return Z==="initialized"&&ye!==null}function Cc(){return{state:Z,initializationTime:yt?new Date:void 0,lastError:Et||void 0,instanceId:yt||void 0}}async function vc(){return console.log("\u{1F504} \u5F3A\u5236\u91CD\u65B0\u521D\u59CB\u5316 MCPServiceManager \u5355\u4F8B..."),await jn(),kn()}function Sc(){return ye}async function Ec(){if(Z==="initialized")return!0;if(Z==="initializing"&&de)try{return await de,!0}catch{return!1}return!1}var ye,de,Z,Et,yt,oe,Qt=C(()=>{"use strict";rs();ye=null,de=null,Z="not_initialized",Et=null,yt=null;c(mc,"createInstance");c(kn,"getInstance");c(jn,"cleanup");c(as,"reset");c(fc,"isInitialized");c(Cc,"getStatus");c(vc,"forceReinitialize");c(Sc,"getCurrentInstance");c(Ec,"waitForInitialization");oe={getInstance:kn,cleanup:jn,reset:as,isInitialized:fc,getStatus:Cc,forceReinitialize:vc,getCurrentInstance:Sc,waitForInitialization:Ec};process.on("exit",()=>{oe.isInitialized()&&(console.log("\u{1F504} \u8FDB\u7A0B\u9000\u51FA\uFF0C\u6B63\u5728\u6E05\u7406 MCPServiceManager \u5355\u4F8B..."),oe.reset())});process.on("uncaughtException",async o=>{console.error("\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF0C\u6E05\u7406 MCPServiceManager \u5355\u4F8B:",o);try{await oe.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}});process.on("unhandledRejection",async o=>{console.error("\u{1F4A5} \u672A\u5904\u7406\u7684Promise\u62D2\u7EDD\uFF0C\u6E05\u7406 MCPServiceManager \u5355\u4F8B:",o);try{await oe.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});import{EventEmitter as yc}from"events";import{z as $e}from"zod";var Tc,Pc,er,Hn=C(()=>{"use strict";M();Ft();z();Lt();Tc={reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4,errorRecoveryEnabled:!0,errorNotificationEnabled:!0,serviceAddedDelayMs:2e3,serviceRemovedDelayMs:2e3,batchAddedDelayMs:3e3},Pc=$e.object({reconnectInterval:$e.number().min(100,"reconnectInterval \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 100 \u7684\u6570\u5B57").optional(),maxReconnectAttempts:$e.number().min(0,"maxReconnectAttempts \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),connectionTimeout:$e.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),errorRecoveryEnabled:$e.boolean().optional(),errorNotificationEnabled:$e.boolean().optional(),serviceAddedDelayMs:$e.number().min(0,"serviceAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),serviceRemovedDelayMs:$e.number().min(0,"serviceRemovedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),batchAddedDelayMs:$e.number().min(0,"batchAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional()}).strict(),er=class extends yc{static{c(this,"IndependentXiaozhiConnectionManager")}connections=new Map;connectionStates=new Map;mcpServiceManager=null;configManager;logger;eventBus;isInitialized=!1;isConnecting=!1;options;reconnectTimers=new Map;constructor(e,t){super(),this.configManager=e,this.logger=h,this.eventBus=w(),this.options={...Tc,...t},this.logger.debug("[IndependentXiaozhiConnectionManager] \u5B9E\u4F8B\u5DF2\u521B\u5EFA"),this.logger.debug("[IndependentXiaozhiConnectionManager] \u914D\u7F6E\u9009\u9879:",this.options),this.setupMCPServerEventListeners()}async initialize(e,t){if(!this.isInitialized){this.logger.debug(`\u5F00\u59CB\u521D\u59CB\u5316 IndependentXiaozhiConnectionManager\uFF0C\u5C0F\u667A\u63A5\u5165\u70B9\u6570\u91CF: ${e.length}`);try{this.validateInitializeParams(e,t),await this.cleanup();for(let r of e)await this.createConnection(r,t);this.isInitialized=!0,this.logger.debug(`IndependentXiaozhiConnectionManager \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${this.connections.size} \u4E2A\u8FDE\u63A5`)}catch(r){throw this.logger.error("IndependentXiaozhiConnectionManager \u521D\u59CB\u5316\u5931\u8D25:",r),await this.cleanup(),r}}}async connect(){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");if(!this.isConnecting){this.isConnecting=!0,this.logger.debug(`\u5F00\u59CB\u8FDE\u63A5\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\uFF0C\u603B\u6570: ${this.connections.size}`);try{let e=[];for(let[s,n]of this.connections)e.push(this.connectSingleEndpoint(s,n));if((await Promise.allSettled(e)).filter(s=>s.status==="fulfilled").length===0)throw new Error("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25")}finally{this.isConnecting=!1}}}async disconnect(){this.logger.debug("\u5F00\u59CB\u65AD\u5F00\u6240\u6709\u8FDE\u63A5"),this.clearAllReconnectTimers();let e=[];for(let[t,r]of this.connections)e.push(this.disconnectSingleEndpoint(t,r));await Promise.allSettled(e),this.logger.debug("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u5DF2\u65AD\u5F00\u8FDE\u63A5")}async addEndpoint(e){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316");if(this.connections.has(e)){this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u5B58\u5728\u4E8E\u8FDE\u63A5\u7BA1\u7406\u5668\u4E2D\uFF0C\u8DF3\u8FC7\u6DFB\u52A0`);return}if(this.checkConfigDuplicate(e))throw new Error(`\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D`);this.logger.debug(`\u52A8\u6001\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9: ${E(e)}`);try{this.configManager.addMcpEndpoint(e);try{let t=this.getCurrentTools();await this.createConnection(e,t);let r=this.connections.get(e);await this.connectSingleEndpoint(e,r),this.logger.info(`\u6DFB\u52A0\u63A5\u5165\u70B9\u6210\u529F\uFF1A ${E(e)}`)}catch(t){try{this.configManager.removeMcpEndpoint(e),this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u6210\u529F: ${E(e)}`)}catch(r){this.logger.error(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u5931\u8D25: ${E(e)}`,r)}throw this.connections.delete(e),this.connectionStates.delete(e),this.logger.error(`\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${E(e)}`,t),t}}catch(t){throw this.logger.error(`\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF08\u914D\u7F6E\u6587\u4EF6\u64CD\u4F5C\uFF09\uFF1A ${E(e)}`,t),t}}async removeEndpoint(e){if(!this.connections.has(e)){this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u4E0D\u5B58\u5728\u4E8E\u8FDE\u63A5\u7BA1\u7406\u5668\u4E2D\uFF0C\u8DF3\u8FC7\u79FB\u9664`);return}this.logger.debug(`\u52A8\u6001\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9: ${E(e)}`);try{let t=this.connections.get(e);this.configManager.removeMcpEndpoint(e);try{await this.disconnectSingleEndpoint(e,t),this.connections.delete(e),this.connectionStates.delete(e);let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e)),this.logger.info(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u6210\u529F\uFF1A${E(e)}`)}catch(r){try{this.configManager.addMcpEndpoint(e),this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u6210\u529F: ${E(e)}`)}catch(s){this.logger.error(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u5931\u8D25: ${E(e)}`,s)}throw this.logger.error(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${E(e)}`,r),r}}catch(t){throw this.logger.error(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF08\u914D\u7F6E\u6587\u4EF6\u64CD\u4F5C\uFF09\uFF1A ${E(e)}`,t),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){this.logger.debug(`\u63A5\u5165\u70B9\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u65AD\u5F00: ${E(e)}`);return}this.logger.info(`\u65AD\u5F00\u8FDE\u63A5\u63A5\u5165\u70B9: ${E(e)}`);try{await this.disconnectSingleEndpoint(e,t)}catch(r){throw this.logger.error(`\u65AD\u5F00\u8FDE\u63A5\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${E(e)}`,r),r}}async clearEndpoints(){this.logger.debug("\u6E05\u9664\u6240\u6709\u63A5\u5165\u70B9");let e=Array.from(this.connections.keys()).map(t=>this.removeEndpoint(t));await Promise.allSettled(e),this.logger.info("\u6240\u6709\u63A5\u5165\u70B9\u5DF2\u6E05\u9664")}getConnectionStatus(){return Array.from(this.connectionStates.values())}isAnyConnected(){for(let e of this.connectionStates.values())if(e.connected)return!0;return!1}setServiceManager(e){this.mcpServiceManager=e,this.logger.debug("\u5DF2\u8BBE\u7F6E MCPServiceManager"),this.connections.size>0&&this.syncToolsToAllConnections()}async triggerReconnect(e){let t=this.connectionStates.get(e);if(!t)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9 ${e} \u4E0D\u5B58\u5728`);if(t.connected){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u8FDE\u63A5\uFF0C\u65E0\u9700\u91CD\u8FDE`);return}this.logger.info(`\u624B\u52A8\u89E6\u53D1\u91CD\u8FDE: ${E(e)}`);let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e)),await this.performReconnect(e)}stopReconnect(e){let t=this.connectionStates.get(e);if(!t){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u4E0D\u5B58\u5728`);return}let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e),t.isReconnecting=!1,t.nextReconnectTime=void 0,this.logger.info(`\u5DF2\u505C\u6B62\u5C0F\u667A\u63A5\u5165\u70B9 ${E(e)} \u7684\u91CD\u8FDE`))}stopAllReconnects(){this.logger.info("\u505C\u6B62\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u7684\u91CD\u8FDE");for(let[e]of this.reconnectTimers)this.stopReconnect(e)}emitEndpointStatusChanged(e,t,r,s,n,i="connection-manager"){this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:t,operation:r,success:s,message:n,timestamp:Date.now(),source:i})}async connectExistingEndpoint(e){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${E(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);if(this.connectionStates.get(e)?.connected){this.logger.debug(`\u63A5\u5165\u70B9 ${E(e)} \u5DF2\u8FDE\u63A5\uFF0C\u8DF3\u8FC7\u8FDE\u63A5`);return}this.logger.info(`\u8FDE\u63A5\u5DF2\u5B58\u5728\u7684\u63A5\u5165\u70B9: ${E(e)}`),await this.connectSingleEndpoint(e,t)}async sleep(e){return new Promise(t=>setTimeout(t,e))}getReconnectStats(){let e={};for(let[t,r]of this.connectionStates)e[t]={endpoint:t,reconnectAttempts:r.reconnectAttempts,isReconnecting:r.isReconnecting,nextReconnectTime:r.nextReconnectTime,lastReconnectAttempt:r.lastReconnectAttempt,reconnectDelay:r.reconnectDelay};return e}validateEndpoints(e){let t=[],r=[];for(let s of e){if(!s||typeof s!="string"){r.push(s);continue}if(!s.startsWith("ws://")&&!s.startsWith("wss://")){r.push(s);continue}try{new URL(s),t.push(s)}catch{r.push(s)}}return{valid:t,invalid:r}}validateOptions(e){let t=Pc.safeParse(e);return t.success?{valid:!0,errors:[]}:{valid:!1,errors:t.error.errors.map(s=>s.message)}}async updateEndpoints(e,t=[]){if(!this.isInitialized)throw new Error("IndependentXiaozhiConnectionManager \u672A\u521D\u59CB\u5316");this.logger.info(`\u66F4\u65B0\u5C0F\u667A\u63A5\u5165\u70B9\u914D\u7F6E\uFF0C\u65B0\u5C0F\u667A\u63A5\u5165\u70B9\u6570\u91CF: ${e.length}`);let{valid:r,invalid:s}=this.validateEndpoints(e);if(s.length>0&&this.logger.warn(`\u53D1\u73B0\u65E0\u6548\u5C0F\u667A\u63A5\u5165\u70B9: ${s.join(", ")}`),r.length===0)throw new Error("\u6CA1\u6709\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9");let n=Array.from(this.connections.keys()),i=r.filter(g=>!n.includes(g)),a=n.filter(g=>!r.includes(g)),l=n.filter(g=>r.includes(g));this.logger.info(`\u5C0F\u667A\u63A5\u5165\u70B9\u53D8\u66F4 - \u6DFB\u52A0: ${i.length}, \u79FB\u9664: ${a.length}, \u4FDD\u6301: ${l.length}`);try{for(let u of a)await this.removeEndpoint(u);for(let u of i)await this.addEndpoint(u);let g={type:i.length>0&&a.length>0?"endpoints_updated":i.length>0?"endpoints_added":"endpoints_removed",data:{added:i.length>0?i:void 0,removed:a.length>0?a:void 0,updated:i.length>0&&a.length>0?r:void 0},timestamp:new Date};this.emit("configChange",g),this.logger.info("\u5C0F\u667A\u63A5\u5165\u70B9\u914D\u7F6E\u66F4\u65B0\u5B8C\u6210")}catch(g){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",g),g}}updateOptions(e){this.logger.info("\u66F4\u65B0\u8FDE\u63A5\u9009\u9879");let{valid:t,errors:r}=this.validateOptions(e);if(!t)throw new Error(`\u65E0\u6548\u7684\u8FDE\u63A5\u9009\u9879: ${r.join(", ")}`);let s={...this.options};this.options={...this.options,...e};let n={type:"options_updated",data:{oldOptions:s,newOptions:e},timestamp:new Date};this.emit("configChange",n),this.logger.info("\u8FDE\u63A5\u9009\u9879\u66F4\u65B0\u5B8C\u6210"),this.logger.debug("\u65B0\u7684\u914D\u7F6E\u9009\u9879:",this.options)}getCurrentConfig(){return{endpoints:Array.from(this.connections.keys()),options:{...this.options}}}async reloadConfig(e){this.logger.info("\u5F00\u59CB\u70ED\u91CD\u8F7D\u914D\u7F6E");try{e.options&&this.updateOptions(e.options),e.endpoints&&await this.updateEndpoints(e.endpoints,e.tools||[]),this.logger.info("\u914D\u7F6E\u70ED\u91CD\u8F7D\u5B8C\u6210")}catch(t){throw this.logger.error("\u914D\u7F6E\u70ED\u91CD\u8F7D\u5931\u8D25:",t),t}}async prewarmConnections(e=[]){let t=e.length>0?e:Array.from(this.connections.keys());this.logger.info(`\u5F00\u59CB\u9884\u70ED\u8FDE\u63A5\uFF0C\u5C0F\u667A\u63A5\u5165\u70B9\u6570\u91CF: ${t.length}`);let r=t.map(async s=>{try{this.connections.get(s)&&this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(s)} \u9884\u70ED\u5B8C\u6210`)}catch(n){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(s)} \u9884\u70ED\u5931\u8D25:`,n)}});await Promise.all(r),this.logger.info("\u8FDE\u63A5\u9884\u70ED\u5B8C\u6210")}async cleanup(){this.logger.debug("\u5F00\u59CB\u6E05\u7406 IndependentXiaozhiConnectionManager \u8D44\u6E90");try{await this.disconnect(),this.connections.clear(),this.connectionStates.clear(),this.isInitialized=!1,this.isConnecting=!1,this.logger.debug("IndependentXiaozhiConnectionManager \u8D44\u6E90\u6E05\u7406\u5B8C\u6210")}catch(e){throw this.logger.error("IndependentXiaozhiConnectionManager \u8D44\u6E90\u6E05\u7406\u5931\u8D25:",e),e}}checkConfigDuplicate(e){try{return this.configManager.getMcpEndpoints().includes(e)}catch(t){return this.logger.error(`\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u91CD\u590D\u6027\u5931\u8D25: ${t}`),!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){this.logger.debug(`\u521B\u5EFA\u8FDE\u63A5\u5B9E\u4F8B: ${E(e)}`);try{let r=new be(e);this.mcpServiceManager&&r.setServiceManager(this.mcpServiceManager),this.connections.set(e,r),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1,isReconnecting:!1,lastReconnectAttempt:void 0,reconnectDelay:this.options.reconnectInterval,reconnectAttempts:0,nextReconnectTime:void 0}),this.logger.debug(`\u8FDE\u63A5\u5B9E\u4F8B\u521B\u5EFA\u6210\u529F: ${E(e)}`)}catch(r){throw this.logger.error(`\u521B\u5EFA\u8FDE\u63A5\u5B9E\u4F8B\u5931\u8D25 ${E(e)}:`,r),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: ${E(e)}`);this.logger.debug(`\u8FDE\u63A5\u5C0F\u667A\u63A5\u5165\u70B9: ${E(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,r.reconnectAttempts=0,this.emitEndpointStatusChanged(e,!0,"connect",!0,"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F","connection-manager"),this.logger.info(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${E(e)}`)}catch(s){throw r.connected=!1,r.initialized=!1,r.lastError=s instanceof Error?s.message:String(s),r.reconnectAttempts++,this.emitEndpointStatusChanged(e,!1,"connect",!1,s instanceof Error?s.message:"\u8FDE\u63A5\u5931\u8D25","connection-manager"),this.logger.error(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25 ${E(e)}:`,s),this.scheduleReconnect(e),s}}async disconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(r){this.logger.debug(`\u65AD\u5F00\u5C0F\u667A\u63A5\u5165\u70B9: ${E(e)}`);try{t.disconnect(),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!0,"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F","connection-manager"),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F: ${E(e)}`)}catch(s){this.logger.error(`\u5C0F\u667A\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25 ${E(e)}:`,s),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!1,s instanceof Error?s.message:"\u65AD\u5F00\u5931\u8D25","connection-manager")}}}getCurrentTools(){if(!this.mcpServiceManager)return[];try{return this.mcpServiceManager.getAllTools()}catch(e){return this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",e),[]}}syncToolsToAllConnections(){if(this.mcpServiceManager){this.logger.debug("\u540C\u6B65\u5DE5\u5177\u5230\u6240\u6709\u8FDE\u63A5");for(let[e,t]of this.connections)try{t.setServiceManager(this.mcpServiceManager),this.logger.debug(`\u5DE5\u5177\u540C\u6B65\u6210\u529F: ${E(e)}`)}catch(r){this.logger.error(`\u5DE5\u5177\u540C\u6B65\u5931\u8D25 ${E(e)}:`,r)}}}scheduleReconnect(e){let t=this.connectionStates.get(e);if(!t)return;if(t.reconnectAttempts>=this.options.maxReconnectAttempts){this.logger.warn(`\u505C\u6B62\u91CD\u8FDE ${E(e)}: \u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u6B21\u6570`);return}let r=setTimeout(()=>{this.reconnectTimers.delete(e),this.performReconnect(e)},this.options.reconnectInterval);this.reconnectTimers.set(e,r)}async performReconnect(e){let t=this.connectionStates.get(e);if(!t)return;let r=this.connections.get(e);if(!r){this.logger.warn(`\u91CD\u8FDE\u65F6\u627E\u4E0D\u5230\u4EE3\u7406\u670D\u52A1\u5668: ${E(e)}`);return}try{t.isReconnecting=!0,t.lastReconnectAttempt=new Date;try{await r.disconnect()}catch(s){this.logger.debug(`\u65AD\u5F00\u8FDE\u63A5\u5931\u8D25\uFF08\u7EE7\u7EED\u91CD\u8FDE\uFF09: ${E(e)}:`,s)}await r.connect(),t.connected=!0,t.initialized=!0,t.lastConnected=new Date,t.lastError=void 0,t.reconnectAttempts=0,t.isReconnecting=!1,this.emitEndpointStatusChanged(e,!0,"reconnect",!0,"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F","connection-manager"),this.logger.info(`\u91CD\u8FDE\u6210\u529F ${E(e)}`)}catch(s){t.connected=!1,t.initialized=!1,t.lastError=s instanceof Error?s.message:String(s),t.reconnectAttempts++,t.isReconnecting=!1,this.emitEndpointStatusChanged(e,!1,"reconnect",!1,s instanceof Error?s.message:"\u91CD\u8FDE\u5931\u8D25","connection-manager"),this.logger.error(`\u91CD\u8FDE\u5931\u8D25 ${E(e)}:`,s),this.scheduleReconnect(e)}}clearAllReconnectTimers(){for(let[,e]of this.reconnectTimers)clearTimeout(e);this.reconnectTimers.clear()}setupMCPServerEventListeners(){this.eventBus.onEvent("mcp:server:added",async e=>{await this.handleMCPServerAdded(e)}),this.eventBus.onEvent("mcp:server:removed",async e=>{await this.handleMCPServerRemoved(e)}),this.eventBus.onEvent("mcp:server:batch_added",async e=>{await this.handleMCPServerBatchAdded(e)})}async handleMCPServerAdded(e){this.logger.info(`\u68C0\u6D4B\u5230MCP\u670D\u52A1\u6DFB\u52A0: ${e.serverName}\uFF0C\u51C6\u5907\u91CD\u8FDE\u63A5\u5165\u70B9`);try{await this.reconnectAllEndpoints({reason:"server_added",delayMs:this.options.serviceAddedDelayMs,serverName:e.serverName})}catch(t){this.logger.error(`\u5904\u7406MCP\u670D\u52A1\u6DFB\u52A0\u4E8B\u4EF6\u5931\u8D25: ${e.serverName}`,t)}}async handleMCPServerRemoved(e){this.logger.info(`\u68C0\u6D4B\u5230MCP\u670D\u52A1\u5220\u9664: ${e.serverName}\uFF0C\u51C6\u5907\u91CD\u8FDE\u63A5\u5165\u70B9`);try{await this.reconnectAllEndpoints({reason:"server_removed",delayMs:this.options.serviceRemovedDelayMs,serverName:e.serverName})}catch(t){this.logger.error(`\u5904\u7406MCP\u670D\u52A1\u5220\u9664\u4E8B\u4EF6\u5931\u8D25: ${e.serverName}`,t)}}async handleMCPServerBatchAdded(e){this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CFMCP\u670D\u52A1\u6DFB\u52A0: ${e.addedCount}\u4E2A\u670D\u52A1\uFF0C\u51C6\u5907\u91CD\u8FDE\u63A5\u5165\u70B9`);try{await this.reconnectAllEndpoints({reason:"batch_server_added",delayMs:this.options.batchAddedDelayMs,serverNames:e.successfullyAddedServers})}catch(t){this.logger.error("\u5904\u7406\u6279\u91CFMCP\u670D\u52A1\u6DFB\u52A0\u4E8B\u4EF6\u5931\u8D25",t)}}async reconnectAllEndpoints(e){this.logger.info(`\u5F00\u59CB\u91CD\u8FDE\u6240\u6709\u63A5\u5165\u70B9\uFF0C\u539F\u56E0: ${e.reason}`);let t=Array.from(this.connections.keys());if(t.length===0){this.logger.debug("\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u63A5\u5165\u70B9\u9700\u8981\u91CD\u8FDE");return}this.logger.debug(`\u627E\u5230 ${t.length} \u4E2A\u5DF2\u8FDE\u63A5\u7684\u63A5\u5165\u70B9\u9700\u8981\u91CD\u8FDE`),e.delayMs>0&&(this.logger.debug(`\u7B49\u5F85 ${e.delayMs}ms \u540E\u5F00\u59CB\u91CD\u8FDE`),await new Promise(s=>setTimeout(s,e.delayMs)));for(let s of t)await this.disconnectEndpointForReconnect(s);let r=t.map(async s=>{try{await this.connectToEndpoint(s),this.logger.debug(`\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F: ${E(s)}`)}catch(n){this.logger.error(`\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25: ${E(s)}`,n)}});await Promise.all(r),this.logger.info(`\u6240\u6709\u63A5\u5165\u70B9\u91CD\u8FDE\u5B8C\u6210\uFF0C\u539F\u56E0: ${e.reason}`),this.eventBus.emitEvent("connection:reconnect:completed",{success:!0,reason:e.reason,timestamp:new Date})}async disconnectEndpointForReconnect(e){let t=this.connections.get(e);if(!t){this.logger.warn(`\u63A5\u5165\u70B9\u672A\u627E\u5230: ${e}`);return}try{await t.disconnect(),this.connections.delete(e),this.connectionStates.delete(e);let r=this.reconnectTimers.get(e);r&&(clearTimeout(r),this.reconnectTimers.delete(e)),this.logger.debug(`\u63A5\u5165\u70B9\u5DF2\u65AD\u5F00: ${E(e)}`),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:!1,operation:"disconnect",success:!0,message:"MCP\u670D\u52A1\u53D8\u66F4\u5BFC\u81F4\u91CD\u8FDE",timestamp:Date.now(),source:"ConnectionManager"})}catch(r){throw this.logger.error(`\u65AD\u5F00\u63A5\u5165\u70B9\u5931\u8D25: ${E(e)}`,r),r}}async connectToEndpoint(e){if(this.connections.has(e)){this.logger.debug(`\u63A5\u5165\u70B9\u5DF2\u5B58\u5728\u8FDE\u63A5: ${E(e)}`);return}this.logger.debug(`\u8FDE\u63A5\u63A5\u5165\u70B9: ${E(e)}`);try{let t=new be(e);this.mcpServiceManager&&t.setServiceManager(this.mcpServiceManager),this.connections.set(e,t),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1,isReconnecting:!1,lastReconnectAttempt:void 0,reconnectDelay:this.options.reconnectInterval,reconnectAttempts:0,nextReconnectTime:void 0}),await this.connectSingleEndpoint(e,t),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${E(e)}`)}catch(t){throw this.connections.delete(e),this.connectionStates.delete(e),this.logger.error(`\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25: ${E(e)}`,t),t}}}});async function Mc(o){if(o){let r=["loadBalanceStrategy","reconnectStrategy","maxReconnectDelay","reconnectBackoffMultiplier","jitterEnabled"].filter(s=>s in o);r.length>0&&(console.warn(`\u26A0\uFE0F \u68C0\u6D4B\u5230\u5E9F\u5F03\u7684\u914D\u7F6E\u9009\u9879: ${r.join(", ")}`),console.warn("\u8FD9\u4E9B\u914D\u7F6E\u9879\u5728\u72EC\u7ACB\u67B6\u6784\u4E2D\u5DF2\u88AB\u5FFD\u7565\uFF0C\u5EFA\u8BAE\u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664"))}return new er(d,o)}async function zn(o){if(Te&&Q==="initialized")return Te;if(ge&&Q==="initializing")return ge;Q==="failed"&&cs(),Q="initializing",ge=Mc(o);try{return Te=await ge,Q="initialized",Pt=`xiaozhi-connection-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,Tt=null,Te}catch(e){throw Q="failed",Tt=e,ge=null,console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",e.message),e}}async function Un(){if(Q!=="cleanup"){Q="cleanup";try{if(ge){try{await(await ge).cleanup()}catch(o){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",o.message)}ge=null}Te&&(await Te.cleanup(),Te=null),Q="not_initialized",Tt=null,Pt=null}catch(o){throw console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",o.message),cs(),o}}}function cs(){ge&&(ge=null),Te=null,Q="not_initialized",Tt=null,Pt=null}function wc(){return Q==="initialized"&&Te!==null}function Rc(){return{state:Q,initializationTime:Pt?new Date:void 0,lastError:Tt||void 0,instanceId:Pt||void 0}}async function bc(o){return await Un(),zn(o)}function Ic(){return Te}async function $c(){if(Q==="initialized")return!0;if(Q==="initializing"&&ge)try{return await ge,!0}catch{return!1}return!1}var Te,ge,Q,Tt,Pt,st,Fn=C(()=>{"use strict";se();Hn();Te=null,ge=null,Q="not_initialized",Tt=null,Pt=null;c(Mc,"createInstance");c(zn,"getInstance");c(Un,"cleanup");c(cs,"reset");c(wc,"isInitialized");c(Rc,"getStatus");c(bc,"forceReinitialize");c(Ic,"getCurrentInstance");c($c,"waitForInitialization");st={getInstance:zn,cleanup:Un,reset:cs,isInitialized:wc,getStatus:Rc,forceReinitialize:bc,getCurrentInstance:Ic,waitForInitialization:$c};process.on("exit",()=>{st.isInitialized()&&st.reset()});process.on("uncaughtException",async o=>{console.error("\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF0C\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B:",o);try{await st.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}});process.on("unhandledRejection",async o=>{console.error("\u{1F4A5} \u672A\u5904\u7406\u7684Promise\u62D2\u7EDD\uFF0C\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B:",o);try{await st.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});var Pe,Mt=C(()=>{"use strict";M();se();z();Pe=class{static{c(this,"ConfigService")}logger;eventBus;constructor(){this.logger=h.withTag("ConfigService"),this.eventBus=w()}async getConfig(){try{let e=d.getConfig();return this.logger.debug("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e}catch(e){throw this.logger.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",e),this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"getConfig"}),e}}async updateConfig(e,t="unknown"){try{this.logger.info(`\u5F00\u59CB\u66F4\u65B0\u914D\u7F6E\uFF0C\u6765\u6E90: ${t}`),this.validateConfig(e),e.mcpEndpoint!==d.getMcpEndpoint()&&d.updateMcpEndpoint(e.mcpEndpoint);let r=d.getMcpServers();for(let[s,n]of Object.entries(e.mcpServers))JSON.stringify(r[s])!==JSON.stringify(n)&&d.updateMcpServer(s,n);for(let s of Object.keys(r))s in e.mcpServers||(d.removeMcpServer(s),d.removeServerToolsConfig(s));if(e.connection&&d.updateConnectionConfig(e.connection),e.modelscope&&d.updateModelScopeConfig(e.modelscope),e.webUI&&d.updateWebUIConfig(e.webUI),e.mcpServerConfig)for(let[s,n]of Object.entries(e.mcpServerConfig))for(let[i,a]of Object.entries(n.tools))d.setToolEnabled(s,i,a.enable);if(e?.platforms)for(let[s,n]of Object.entries(e.platforms))d.updatePlatformConfig(s,n);this.logger.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date})}catch(r){throw this.logger.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r),this.eventBus.emitEvent("config:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateConfig"}),r}}getMcpEndpoint(){try{return d.getMcpEndpoint()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",e),e}}getMcpEndpoints(){try{return d.getMcpEndpoints()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",e),e}}getMcpServers(){try{return d.getMcpServers()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",e),e}}getConnectionConfig(){try{return d.getConnectionConfig()}catch(e){throw this.logger.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",e),e}}getWebUIPort(){try{return d.getWebUIPort()||9999}catch(e){return this.logger.error("\u83B7\u53D6 Web UI \u7AEF\u53E3\u5931\u8D25:",e),9999}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.mcpEndpoint&&e.mcpEndpoint!=="")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B mcpEndpoint");if(!e.mcpServers||typeof e.mcpServers!="object")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 mcpServers")}configExists(){return d.configExists()}async reloadConfig(){try{this.logger.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E"),d.reloadConfig();let e=await this.getConfig();return this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date}),e}catch(e){throw this.logger.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",e),this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"reloadConfig"}),e}}getConfigPath(){return d.getConfigPath()}}});var tr,Vn=C(()=>{"use strict";M();Mt();tr=class{static{c(this,"ConfigApiHandler")}logger;configService;constructor(){this.logger=h.withTag("ConfigApiHandler"),this.configService=new Pe}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getConfig(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let t=await this.configService.getConfig();return this.logger.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async updateConfig(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\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\u914D\u7F6E\u5BF9\u8C61");return e.json(r,400)}return await this.configService.updateConfig(t,"http-api"),this.logger.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_UPDATE_ERROR",t instanceof Error?t.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25");return e.json(r,400)}}async getMcpEndpoint(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let t=this.configService.getMcpEndpoint();return this.logger.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(this.createSuccessResponse({endpoint:t}))}catch(t){this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",t);let r=this.createErrorResponse("MCP_ENDPOINT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25");return e.json(r,500)}}async getMcpEndpoints(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let t=this.configService.getMcpEndpoints();return this.logger.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(this.createSuccessResponse({endpoints:t}))}catch(t){this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("MCP_ENDPOINTS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getMcpServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let t=this.configService.getMcpServers();return this.logger.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async getConnectionConfig(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let t=this.configService.getConnectionConfig();return this.logger.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse({connection:t}))}catch(t){this.logger.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("CONNECTION_CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async reloadConfig(e){try{this.logger.info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42");let t=await this.configService.reloadConfig();return this.logger.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(t,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_RELOAD_ERROR",t instanceof Error?t.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25");return e.json(r,500)}}async getConfigPath(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let t=this.configService.getConfigPath();return this.logger.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(this.createSuccessResponse({path:t}))}catch(t){this.logger.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_PATH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25");return e.json(r,500)}}async checkConfigExists(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let t=this.configService.configExists();return this.logger.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.json(this.createSuccessResponse({exists:t}))}catch(t){this.logger.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t);let r=this.createErrorResponse("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25");return e.json(r,500)}}}});async function Oc(o,e=3,t=1e3){for(let r=1;r<=e;r++)try{return await o()}catch(s){if(r===e)throw s;let n=t*2**(r-1);h.warn(`\u6263\u5B50 API \u8C03\u7528\u5931\u8D25\uFF0C${n}ms \u540E\u91CD\u8BD5 (${r}/${e})`,s),await new Promise(i=>setTimeout(i,n))}throw new Error("Max retry attempts exceeded")}function Ac(o,e){let t=o.status;return t===401?new Me("\u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6263\u5B50 API Token \u914D\u7F6E","AUTH_FAILED",401,e):t===429?new Me("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED",429,e):t>=500?new Me("\u6263\u5B50\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","SERVER_ERROR",t,e):new Me(e?.msg||`API \u8C03\u7528\u5931\u8D25: ${o.statusText}`,"API_ERROR",t,e)}var ls,Me,rr,Wn=C(()=>{"use strict";M();ls=class{static{c(this,"CozeApiCache")}cache=new Map;TTL={workspaces:1800*1e3,workflows:300*1e3};set(e,t,r){this.cache.set(e,{data:t,timestamp:Date.now(),ttl:this.TTL[r]})}get(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>t.ttl?(this.cache.delete(e),null):t.data:null}clear(e){if(!e){this.cache.clear();return}for(let t of this.cache.keys())t.includes(e)&&this.cache.delete(t)}getStats(){return{size:this.cache.size,keys:Array.from(this.cache.keys())}}},Me=class extends Error{static{c(this,"CozeApiErrorImpl")}code;statusCode;response;constructor(e,t,r,s){super(e),this.name="CozeApiError",this.code=t,this.statusCode=r,this.response=s}};c(Oc,"retryWithBackoff");c(Ac,"handleCozeApiError");rr=class{static{c(this,"CozeApiService")}cache=new ls;token;API_BASE_URL="https://api.coze.cn";TIMEOUT=1e4;RETRY_ATTEMPTS=3;constructor(e){if(!e||typeof e!="string"||e.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.token=e.trim()}async getWorkspaces(){let e="workspaces",t=this.cache.get(e);if(t)return h.debug("\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868"),t;h.info("\u83B7\u53D6\u6263\u5B50\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await this.request("/v1/workspaces");if(r.code!==0)throw new Me(r.msg||"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25","API_ERROR",void 0,r);let s=r.data.workspaces;return this.cache.set(e,s,"workspaces"),h.info(`\u6210\u529F\u83B7\u53D6 ${s.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),s}async getWorkflows(e){let{workspace_id:t,page_num:r=1,page_size:s=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let n=`workflows:${t}:${r}:${s}`,i=this.cache.get(n);if(i)return h.debug(`\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868: ${t}`),i;h.info(`\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868 (\u9875\u7801: ${r}, \u6BCF\u9875: ${s})`);let a=new URLSearchParams({workspace_id:t,page_num:r.toString(),page_size:s.toString(),workflow_mode:"workflow"}),l=await this.request(`/v1/workflows?${a}`);if(l.code!==0)throw new Me(l.msg||"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25","API_ERROR",void 0,l);let g={items:l.data.items,hasMore:l.data.has_more};return this.cache.set(n,g,"workflows"),h.info(`\u6210\u529F\u83B7\u53D6 ${g.items.length} \u4E2A\u5DE5\u4F5C\u6D41\uFF0ChasMore: ${g.hasMore}`),g}async request(e){return Oc(async()=>{let t=`${this.API_BASE_URL}${e}`;h.debug(`\u53D1\u8D77\u6263\u5B50 API \u8BF7\u6C42: ${t}`);let r=new AbortController,s=setTimeout(()=>r.abort(),this.TIMEOUT);try{let n=await fetch(t,{headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},signal:r.signal});clearTimeout(s);let i;try{i=await n.json()}catch(a){throw h.error("\u89E3\u6790\u54CD\u5E94 JSON \u5931\u8D25:",a),new Me("\u54CD\u5E94\u6570\u636E\u683C\u5F0F\u9519\u8BEF","PARSE_ERROR",n.status)}if(!n.ok)throw Ac(n,i);return i}catch(n){throw clearTimeout(s),n instanceof Error&&n.name==="AbortError"?new Me(`\u8BF7\u6C42\u8D85\u65F6 (${this.TIMEOUT}ms)`,"TIMEOUT",void 0):n}},this.RETRY_ATTEMPTS)}clearCache(e){this.cache.clear(e),h.info(`\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58${e?` (\u6A21\u5F0F: ${e})`:""}`)}getCacheStats(){return this.cache.getStats()}}});function sr(o,e){return{success:!0,data:o,message:e}}function F(o,e,t){return{success:!1,message:o,error:e?{code:e,details:t}:void 0}}function nr(){let o=d.getCozeToken();if(!o)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 rr(o)}var He,Bn=C(()=>{"use strict";M();se();Wn();c(sr,"createSuccessResponse");c(F,"createErrorResponse");c(nr,"getCozeApiService");He=class{static{c(this,"CozeApiHandler")}static async getWorkspaces(e){try{if(h.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!d.isCozeConfigValid())return h.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=await nr().getWorkspaces();return h.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(sr({workspaces:r}))}catch(t){return h.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),t instanceof Error&&t.code==="AUTH_FAILED"?e.json(F("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):t instanceof Error&&t.code==="RATE_LIMITED"?e.json(F("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):t instanceof Error&&t.code==="TIMEOUT"?e.json(F("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(F(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)}}static async getWorkflows(e){try{if(h.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!d.isCozeConfigValid())return h.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\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),s=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return h.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(F("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(F("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(s<1||s>100)return e.json(F("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let n={workspace_id:t,page_num:r,page_size:s},a=await nr().getWorkflows(n);h.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${a.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=d.getCustomMCPTools(),g=a.items.map(u=>{let p=l.find(f=>f.handler.type==="proxy"&&f.handler.platform==="coze"&&f.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!p,toolName:p?.name||null}});return h.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(sr({items:g,has_more:a.hasMore,page_num:r,page_size:s,total_count:a.items.length}))}catch(t){return h.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),t instanceof Error&&t.code==="AUTH_FAILED"?e.json(F("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):t instanceof Error&&t.code==="RATE_LIMITED"?e.json(F("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):t instanceof Error&&t.code==="TIMEOUT"?e.json(F("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(F(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)}}static async clearCache(e){try{if(h.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!d.isCozeConfigValid())return h.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\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=nr(),s=r.getCacheStats();r.clearCache(t);let n=r.getCacheStats();return h.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${s.size} \u9879\uFF0C\u6E05\u9664\u540E: ${n.size} \u9879`),e.json(sr({cleared:s.size-n.size,remaining:n.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return h.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(F(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)}}static async getCacheStats(e){try{if(h.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!d.isCozeConfigValid())return h.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(F("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=nr().getCacheStats();return e.json(sr(r))}catch(t){return h.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(F(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 or,qn=C(()=>{"use strict";M();Mt();or=class{static{c(this,"HeartbeatHandler")}logger;statusService;notificationService;configService;constructor(e,t){this.logger=h.withTag("HeartbeatHandler"),this.statusService=e,this.notificationService=t,this.configService=new Pe}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let s={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(s,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(s){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,s),this.sendError(e,"CLIENT_STATUS_ERROR",s instanceof Error?s.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25")}}async sendLatestConfig(e,t){try{let s={type:"configUpdate",data:await this.configService.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(s)),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 s={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(s))}catch(s){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",s)}}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"}}});var Oe,Gn=C(()=>{"use strict";M();z();Oe=class{static{c(this,"MCPEndpointApiHandler")}logger;xiaozhiConnectionManager;configManager;eventBus;constructor(e,t){this.logger=h.withTag("MCPEndpointApiHandler"),this.xiaozhiConnectionManager=e,this.configManager=t,this.eventBus=w()}createErrorResponse(e,t,r,s){return{error:{code:e,message:t,details:r?{endpoint:r,...s}:s}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(n){this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",n);let i=this.createErrorResponse(t,n instanceof Error?n.message:"JSON\u89E3\u6790\u5931\u8D25");return{ok:!1,response:e.json(i,500)}}let s=r.endpoint;if(!s||typeof s!="string"){let n=this.createErrorResponse("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",s);return{ok:!1,response:e.json(n,400)}}return{ok:!0,endpoint:s}}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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(i=>i.endpoint===r);if(!n){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(n))}catch(s){this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_STATUS_READ_ERROR",s instanceof Error?s.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",r);return e.json(n,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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!n){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(n.connected){let g=this.createErrorResponse("ENDPOINT_ALREADY_CONNECTED","\u7AEF\u70B9\u5DF2\u8FDE\u63A5",r);return e.json(g,409)}await this.xiaozhiConnectionManager.connectExistingEndpoint(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!a){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(a);return e.json(l)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_CONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",r);return e.json(n,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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(u=>u.endpoint===r);if(!n){let u=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(u,404)}if(!n.connected){let u=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(u,409)}await this.xiaozhiConnectionManager.disconnectEndpoint(r);let a=this.xiaozhiConnectionManager.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,isReconnecting:!1,reconnectAttempts:0,nextReconnectTime:void 0,reconnectDelay:0},g=this.createSuccessResponse(a||l);return e.json(g)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_DISCONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",r);return e.json(n,500)}}async reconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_RECONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u91CD\u8FDE\u8BF7\u6C42: ${r}`);try{let n=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!n){let g=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(g,404)}n.connected&&await this.xiaozhiConnectionManager.disconnectEndpoint(r),await this.xiaozhiConnectionManager.triggerReconnect(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!a){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:"reconnect",success:!0,message:"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F: ${r}`);let l=this.createSuccessResponse(a);return e.json(l)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",s);let n=this.createErrorResponse("ENDPOINT_RECONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25",r);return e.json(n,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.xiaozhiConnectionManager.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.xiaozhiConnectionManager.addEndpoint(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!a){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(a);return e.json(l)}catch(s){this.logger.error("\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25:",s);let n="ENDPOINT_ADD_ERROR",i=500;s instanceof Error&&(s.message.includes("\u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D")?(n="ENDPOINT_ALREADY_IN_CONFIG",i=409):s.message.includes("\u5DF2\u5B58\u5728")?(n="ENDPOINT_ALREADY_EXISTS",i=409):s.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(n="INVALID_ENDPOINT",i=400));let a=this.createErrorResponse(n,s instanceof Error?s.message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25",void 0);return e.json(a,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 n=this.xiaozhiConnectionManager.getConnectionStatus().find(a=>a.endpoint===r);if(!n){let a=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(a,404)}n.connected&&await this.xiaozhiConnectionManager.disconnectEndpoint(r),await this.xiaozhiConnectionManager.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(s){this.logger.error("\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25:",s);let n="ENDPOINT_REMOVE_ERROR",i=500;s instanceof Error&&(s.message.includes("\u4E0D\u5B58\u5728")?(n="ENDPOINT_NOT_FOUND",i=404):s.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(n="INVALID_ENDPOINT",i=400));let a=this.createErrorResponse(n,s instanceof Error?s.message:"\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25",r);return e.json(a,i)}}}});import{randomUUID as xc}from"crypto";var ir,Xn=C(()=>{"use strict";M();ss();Qt();ir=class{static{c(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=h.withTag("MCPRouteHandler"),this.config={maxClients:e.maxClients??100,connectionTimeout:e.connectionTimeout??3e5,heartbeatInterval:e.heartbeatInterval??3e4,maxMessageSize:e.maxMessageSize??1024*1024,enableMetrics:e.enableMetrics??!0},this.metrics={totalConnections:0,activeConnections:0,totalMessages:0,errorCount:0,averageResponseTime:0,uptime:0},this.startTime=new Date,this.startCleanupTask(),this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval})}startCleanupTask(){this.cleanupInterval=setInterval(()=>{this.cleanupStaleConnections(),this.updateMetrics()},6e4)}stopCleanupTask(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null)}cleanupStaleConnections(){let e=new Date,t=[];for(let[r,s]of this.clients.entries())(e.getTime()-s.lastActivity.getTime()>this.config.connectionTimeout||!s.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}))}async initializeMessageHandler(){if(!this.mcpMessageHandler)try{let e=await oe.getInstance();this.mcpMessageHandler=new tt(e),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(e){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",e),this.metrics.errorCount++,e}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let s=e.req.query("sessionId");if(s)return await this.handleSSEMessage(e,s);let n=e.req.header("content-length");if(n&&Number.parseInt(n)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Request too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);if(!e.req.header("content-type")?.includes("application/json"))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Content-Type must be application/json",null);let a=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"];a&&!l.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${l.join(", ")}`);let g;try{let f=await e.req.text();if(f.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(f),r=g.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON",null)}if(!this.validateMessage(g))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",r);await this.initializeMessageHandler();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(s){this.metrics.errorCount++;let n=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:s instanceof Error?s.message:String(s),messageId:r,responseTime:n,stack:s instanceof Error?s.stack:void 0});let i=s instanceof Error?s.message:String(s);return this.createErrorResponse(-32603,`Internal error: ${i}`,r)}}async handleSSEMessage(e,t){let r=Date.now(),s=null;try{this.logger.debug(`\u5904\u7406 SSE \u6D88\u606F (\u4F1A\u8BDD: ${t})`);let n=this.clients.get(t);if(!n)return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Invalid or missing sessionId",null);n.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`,null);let a;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);a=JSON.parse(u),s=a.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON",null)}if(!this.validateMessage(a))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",s);await this.initializeMessageHandler();let l=await this.mcpMessageHandler.handleMessage(a);if(n.messageCount++,this.metrics.totalMessages++,l!==null&&n.writer&&n.isAlive)try{await this.sendSSEEvent(n.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),n.isAlive=!1}let g=Date.now()-r;return this.logger.debug(`SSE \u6D88\u606F\u5904\u7406\u5B8C\u6210 (\u4F1A\u8BDD: ${t})`,{method:a.method,messageId:s,responseTime:g,messageCount:n.messageCount,isNotification:l===null}),new Response(null,{status:202,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":g.toString()}})}catch(n){this.metrics.errorCount++;let i=Date.now()-r;this.logger.error(`\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519 (\u4F1A\u8BDD: ${t}):`,{error:n instanceof Error?n.message:String(n),messageId:s,responseTime:i,stack:n instanceof Error?n.stack:void 0});let a=n instanceof Error?n.message:String(n);return this.createErrorResponse(-32603,`Internal error: ${a}`,s)}}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(),s=new Date,n=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:n,remoteAddress:i});let{readable:a,writable:l}=new TransformStream,g=l.getWriter(),u=new AbortController,p={id:t,sessionId:r,response:new Response(a),connectedAt:s,lastActivity:s,writer:g,abortController:u,isAlive:!0,messageCount:0,userAgent:n,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:s.toISOString(),protocolVersion:"2024-11-05"}))}catch(A){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,A),p.isAlive=!1}this.startHeartbeat(p);let f=new Response(a,{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"}}),m=c(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",m),u.signal.addEventListener("abort",m),f}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 s=`event: ${t}
39
39
  data: ${r}
40
40
 
41
- `;await e.write(new TextEncoder().encode(s))}catch(s){throw this.logger.error("\u53D1\u9001 SSE \u4E8B\u4EF6\u5931\u8D25:",s),s}}handleClientDisconnect(e,t){let r=this.clients.get(e);if(!r)return;let s=Date.now()-r.connectedAt.getTime();this.logger.info(`SSE \u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${r.id} (\u4F1A\u8BDD: ${e})`,{reason:t,duration:s,messageCount:r.messageCount,userAgent:r.userAgent,remoteAddress:r.remoteAddress}),this.stopHeartbeat(r),r.abortController&&r.abortController.abort();try{r.writer&&r.writer.close()}catch(n){this.logger.debug("\u5173\u95ED SSE writer \u65F6\u51FA\u9519:",n)}this.clients.delete(e),this.metrics.activeConnections=this.clients.size}validateMessage(e){return!e||typeof e!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1):e.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:e.jsonrpc}),!1):!e.method||typeof e.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:e.method}),!1):e.id!==void 0&&typeof e.id!="string"&&typeof e.id!="number"&&e.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:e.id}),!1):e.params!==void 0&&typeof e.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:e.params}),!1):!0}createErrorResponse(e,t,r){let s={jsonrpc:"2.0",error:{code:e,message:t},id:r};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=JSON.stringify(t),s=[];for(let[n,i]of this.clients.entries()){if(!i.isAlive||!i.writer){s.push(n);continue}try{await this.sendSSEEvent(i.writer,e,r)}catch(a){this.logger.warn(`\u5E7F\u64AD\u6D88\u606F\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${n}`,a),i.isAlive=!1,s.push(n)}}for(let n of s)this.handleClientDisconnect(n,"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 D,ar,gs,us,hs,df,Jn=C(()=>{"use strict";D=class o extends Error{static{c(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",s="system",n={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=s,this.timestamp=new Date().toISOString(),this.details={...n,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,o)}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 o(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new o(e,t,"high","connection",r)}static operationError(e,t,r={}){return new o(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new o(e,t,"high","system",r)}static validationError(e,t,r={}){return new o(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new o(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},ar=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof D)}handle(e,t){return D.fromError(e,"INTERNAL_ERROR","system")}},gs=class{static{c(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 D.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},us=class{static{c(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 D.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},hs=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new gs),this.registerHandler(new us),this.registerHandler(new ar)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof D)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new ar().handle(e,t)}},df=new hs});var cr,ue,Kn=C(()=>{"use strict";P();Jn();z();cr=class{static{c(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=p.withTag("MCPServerApiHandler"),this.mcpServiceManager=e,this.configManager=t}createErrorResponse(e,t,r,s){return{error:{code:e,message:t,details:r?{serverName:r,...s}:s}}}handleError(e,t,r){if(e instanceof D)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let n;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?n=D.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?n=D.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?n=D.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?n=D.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):n=D.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:n,operation:t,context:r}),n}let s=D.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:s,operation:t,context:r}),s}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,h=await this.addMCPServersBatch(u),f=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:h.addedCount,failedCount:h.failedCount,duration:f}),e.json(this.createSuccessResponse(h,h.message),201)}let s=r,{name:n,config:i}=s,a=await this.addMCPServerSingle(n,i),l=Date.now()-t;this.logger.info("addMCPServer",{serverName:n,toolsCount:a.tools?.length||0,duration:l,status:a.status});let g=this.createSuccessResponse(a,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F");return e.json(g,201)}catch(s){let n=this.handleError(s,"addMCPServer",{requestData:r}),i=this.createErrorResponse(n.code,n.message,void 0,{error:n.details}),a=500;return n.category==="validation"?a=400:n.category==="configuration"?n.code==="SERVER_ALREADY_EXISTS"?a=409:a=400:n.category==="connection"&&(a=500),e.json(i,a)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});try{let r=ue.validateServiceName(e);if(!r.isValid){let l=D.validationError("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:e,errors:r.errors});throw this.logger.error("addMCPServerSingle",{validationError:l,serverName:e,phase:"name_validation"}),l}if(ue.checkServiceExists(e,this.configManager)){let l=D.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:l,serverName:e,phase:"existence_check"}),l}let s=ue.validateConfig(t);if(!s.isValid){let l=D.configError("INVALID_CONFIG",s.errors.join(", "),{serverName:e,config:t,errors:s.errors});throw this.logger.error("addMCPServerSingle",{configError:l,serverName:e,phase:"config_validation"}),l}this.configManager.updateMcpServer(e,t),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let n=this.createMCPServiceConfig(e,t);this.mcpServiceManager.addServiceConfig(n),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let i=this.getServiceStatus(e),a=this.getServiceTools(e);return w().emitEvent("mcp:server:added",{serverName:e,config:t,tools:a.map(l=>l.name),timestamp:new Date}),{...i,tools:a.map(l=>l.name)}}catch(r){let s=this.handleError(r,"addMCPServerSingle",{serverName:e,config:t});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 a=i.getTools().map(g=>g.name),l={name:e,status:"connected",connected:!0,tools:a,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(n){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,n)}let s={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,s),s}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}`),w().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 s=t.tools.filter(i=>!r.tools.includes(i)),n=r.tools.filter(i=>!t.tools.includes(i));(s.length>0||n.length>0)&&w().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:s,removedTools:n,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){return this.statusCache||(this.statusCache=new Map),this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache||(this.statusCache=new Map),this.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=ue.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!ue.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let s=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),w().emitEvent("mcp:server:removed",{serverName:t,affectedTools:s,timestamp:new Date});let n=this.createSuccessResponse({name:t,operation:"removed",affectedTools:s},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F");return e.json(n,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 s=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(s,404)}if(t.message.includes("\u914D\u7F6E\u66F4\u65B0")){let s=this.createErrorResponse("CONFIG_UPDATE_FAILED",t.message);return e.json(s,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=ue.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!ue.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let s=this.getServiceStatus(t),n=this.createSuccessResponse(s,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F");return e.json(n,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 s=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(s,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||{},s=[];for(let[a,l]of Object.entries(r)){let g=this.getServiceStatus(a);s.push(g)}let n={servers:s,total:s.length},i=this.createSuccessResponse(n,"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 D.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let s=[],n=[],i=this.validateBatchServers(t);if(!i.isValid)throw D.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,h]of Object.entries(t))try{let f=await this.addMCPServerSingle(u,h);s.push({name:u,success:!0,config:h,tools:f.tools,status:f.status}),n.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:f.tools?.length||0})}catch(f){let m=this.handleError(f,"addMCPServersBatch",{serverName:u,serverConfig:h});s.push({name:u,success:!1,error:m.message,config:h}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:m.message})}let a=n.length,l=r.length-a;if(a===0)throw D.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");w().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:a,failedCount:l,successfullyAddedServers:n,results:s,timestamp:new Date});let g={success:a>0,message:a===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:s,addedCount:a,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:a,failedCount:l}),g}catch(a){throw n.length>0&&await this.rollbackBatchAdd(n),a instanceof D?a:D.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${a instanceof Error?a.message:String(a)}`)}}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[s,n]of Object.entries(e)){let i=ue.validateServiceName(s);if(!i.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(ue.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let a=ue.validateConfig(n);a.isValid||t.push(`\u670D\u52A1 "${s}" \u914D\u7F6E\u65E0\u6548: ${a.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 s of e)try{try{await this.mcpServiceManager.stopService(s)}catch(n){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${s} \u5931\u8D25:`,n)}this.mcpServiceManager.removeServiceConfig(s),this.configManager.removeMcpServer(s),t.push(s),w().emitEvent("mcp:server:rollback",{serverName:s,timestamp:new Date})}catch(n){let i=this.handleError(n,"rollbackBatchAdd",{serverName:s});r.push(s),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${s} \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})}},ue=class{static{c(this,"MCPServerConfigValidator")}static validateConfig(e){let t=[];if(!e||typeof e!="object")return t.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};if("command"in e)(!e.command||typeof e.command!="string")&&t.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),e.args&&!Array.isArray(e.args)&&t.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),e.env&&typeof e.env!="object"&&t.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in e){(!e.url||typeof e.url!="string")&&t.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(e.url)}catch{t.push("URL \u683C\u5F0F\u65E0\u6548")}}else t.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:t.length===0,errors:t}}static validateServiceName(e){let t=[];return!e||typeof e!="string"?(t.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:t}):((e.length<1||e.length>50)&&t.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(e)||t.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:t.length===0,errors:t})}static checkServiceExists(e,t){let r=t.getConfig();return r.mcpServers&&e in r.mcpServers}}});var lr,Yn=C(()=>{"use strict";P();Pt();z();lr=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;configService;statusService;eventBus;constructor(e,t){this.logger=p.withTag("RealtimeNotificationHandler"),this.notificationService=e,this.configService=new Me,this.statusService=t,this.eventBus=w()}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(s){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,s),this.sendError(e,"MESSAGE_PROCESSING_ERROR",s instanceof Error?s.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25")}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=await this.configService.getConfig();this.logger.debug("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t}),e.send(JSON.stringify({type:"config",data:r}))}catch(r){this.logger.error("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25")}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{await this.configService.updateConfig(t,`websocket-${r}`),this.logger.debug("WebSocket: updateConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:r})}catch(s){this.logger.error("WebSocket: updateConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",s),this.sendError(e,"CONFIG_UPDATE_ERROR",s instanceof Error?s.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25")}}async handleRestartService(e,t){this.logDeprecationWarning("WebSocket restartService","POST /api/services/restart");try{this.logger.info("WebSocket: \u6536\u5230\u670D\u52A1\u91CD\u542F\u8BF7\u6C42",{clientId:t}),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:`websocket-${t}`,delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting")}catch(r){this.logger.error("WebSocket: \u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",r),this.sendError(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25")}}sendError(e,t,r){try{let s={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(s))}catch(s){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",s)}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}async sendInitialData(e,t){try{this.logger.debug("\u53D1\u9001\u521D\u59CB\u6570\u636E\u7ED9\u5BA2\u6237\u7AEF",{clientId:t});let r=await this.configService.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let s=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:s.client})),s.restart&&e.send(JSON.stringify({type:"restartStatus",data:s.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),this.sendError(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25")}}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{spawn as gr}from"child_process";var ur,Zn=C(()=>{"use strict";P();ps();z();ur=class{static{c(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=p.withTag("ServiceApiHandler"),this.statusService=e,this.eventBus=w()}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 ze()).get("serviceManager").getStatus();if(!r.running){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),gr("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 s=r.mode==="daemon",n=["restart"];s&&n.push("--daemon"),gr("xiaozhi",n,{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"),gr("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"),gr("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 s=await(await ze()).get("serviceManager").getStatus();return this.logger.debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(s))}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 hr}from"fs";import{readFile as Nc}from"fs/promises";import{dirname as Dc,join as Le}from"path";import{fileURLToPath as Lc}from"url";var pr,Qn=C(()=>{"use strict";P();pr=class{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=p.withTag("StaticFileHandler"),this.initializeWebPath()}initializeWebPath(){try{let e=Dc(Lc(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[Le(e,"..","..","web","dist"),Le(e,"..","web","dist"),Le(e,"..","..","web"),Le(e,"..","web"),Le(e,"..","..","..","web","dist"),Le(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=hr(r);return this.logger.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${s?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),s})||null,this.webPath?this.logger.info(`\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 s=Le(this.webPath,r);if(!hr(s)){let i=Le(this.webPath,"index.html");return hr(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: ${s}`),e.text("Not Found",404))}let n=this.getContentType(s);return this.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${s}, Content-Type: ${n}`),this.serveFile(e,s,n)}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 s=await Nc(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(s.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(s),200,{"Content-Type":r})}catch(s){throw this.logger.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,s),s}}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=`
41
+ `;await e.write(new TextEncoder().encode(s))}catch(s){throw this.logger.error("\u53D1\u9001 SSE \u4E8B\u4EF6\u5931\u8D25:",s),s}}handleClientDisconnect(e,t){let r=this.clients.get(e);if(!r)return;let s=Date.now()-r.connectedAt.getTime();this.logger.info(`SSE \u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${r.id} (\u4F1A\u8BDD: ${e})`,{reason:t,duration:s,messageCount:r.messageCount,userAgent:r.userAgent,remoteAddress:r.remoteAddress}),this.stopHeartbeat(r),r.abortController&&r.abortController.abort();try{r.writer&&r.writer.close()}catch(n){this.logger.debug("\u5173\u95ED SSE writer \u65F6\u51FA\u9519:",n)}this.clients.delete(e),this.metrics.activeConnections=this.clients.size}validateMessage(e){return!e||typeof e!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1):e.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:e.jsonrpc}),!1):!e.method||typeof e.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:e.method}),!1):e.id!==void 0&&typeof e.id!="string"&&typeof e.id!="number"&&e.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:e.id}),!1):e.params!==void 0&&typeof e.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:e.params}),!1):!0}createErrorResponse(e,t,r){let s={jsonrpc:"2.0",error:{code:e,message:t},id:r};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=JSON.stringify(t),s=[];for(let[n,i]of this.clients.entries()){if(!i.isAlive||!i.writer){s.push(n);continue}try{await this.sendSSEEvent(i.writer,e,r)}catch(a){this.logger.warn(`\u5E7F\u64AD\u6D88\u606F\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${n}`,a),i.isAlive=!1,s.push(n)}}for(let n of s)this.handleClientDisconnect(n,"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 D,ar,gs,us,ps,df,Jn=C(()=>{"use strict";D=class o extends Error{static{c(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",s="system",n={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=s,this.timestamp=new Date().toISOString(),this.details={...n,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,o)}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 o(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new o(e,t,"high","connection",r)}static operationError(e,t,r={}){return new o(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new o(e,t,"high","system",r)}static validationError(e,t,r={}){return new o(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new o(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},ar=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof D)}handle(e,t){return D.fromError(e,"INTERNAL_ERROR","system")}},gs=class{static{c(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 D.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},us=class{static{c(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 D.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},ps=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new gs),this.registerHandler(new us),this.registerHandler(new ar)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof D)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new ar().handle(e,t)}},df=new ps});var cr,ue,Kn=C(()=>{"use strict";M();Jn();z();cr=class{static{c(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=h.withTag("MCPServerApiHandler"),this.mcpServiceManager=e,this.configManager=t}createErrorResponse(e,t,r,s){return{error:{code:e,message:t,details:r?{serverName:r,...s}:s}}}handleError(e,t,r){if(e instanceof D)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let n;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?n=D.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?n=D.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?n=D.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?n=D.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):n=D.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:n,operation:t,context:r}),n}let s=D.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:s,operation:t,context:r}),s}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),f=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:p.addedCount,failedCount:p.failedCount,duration:f}),e.json(this.createSuccessResponse(p,p.message),201)}let s=r,{name:n,config:i}=s,a=await this.addMCPServerSingle(n,i),l=Date.now()-t;this.logger.info("addMCPServer",{serverName:n,toolsCount:a.tools?.length||0,duration:l,status:a.status});let g=this.createSuccessResponse(a,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F");return e.json(g,201)}catch(s){let n=this.handleError(s,"addMCPServer",{requestData:r}),i=this.createErrorResponse(n.code,n.message,void 0,{error:n.details}),a=500;return n.category==="validation"?a=400:n.category==="configuration"?n.code==="SERVER_ALREADY_EXISTS"?a=409:a=400:n.category==="connection"&&(a=500),e.json(i,a)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});try{let r=ue.validateServiceName(e);if(!r.isValid){let l=D.validationError("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:e,errors:r.errors});throw this.logger.error("addMCPServerSingle",{validationError:l,serverName:e,phase:"name_validation"}),l}if(ue.checkServiceExists(e,this.configManager)){let l=D.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:l,serverName:e,phase:"existence_check"}),l}let s=ue.validateConfig(t);if(!s.isValid){let l=D.configError("INVALID_CONFIG",s.errors.join(", "),{serverName:e,config:t,errors:s.errors});throw this.logger.error("addMCPServerSingle",{configError:l,serverName:e,phase:"config_validation"}),l}this.configManager.updateMcpServer(e,t),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let n=this.createMCPServiceConfig(e,t);this.mcpServiceManager.addServiceConfig(n),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let i=this.getServiceStatus(e),a=this.getServiceTools(e);return w().emitEvent("mcp:server:added",{serverName:e,config:t,tools:a.map(l=>l.name),timestamp:new Date}),{...i,tools:a.map(l=>l.name)}}catch(r){let s=this.handleError(r,"addMCPServerSingle",{serverName:e,config:t});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 a=i.getTools().map(g=>g.name),l={name:e,status:"connected",connected:!0,tools:a,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(n){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,n)}let s={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,s),s}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}`),w().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 s=t.tools.filter(i=>!r.tools.includes(i)),n=r.tools.filter(i=>!t.tools.includes(i));(s.length>0||n.length>0)&&w().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:s,removedTools:n,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){return this.statusCache||(this.statusCache=new Map),this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache||(this.statusCache=new Map),this.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=ue.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!ue.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let s=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),w().emitEvent("mcp:server:removed",{serverName:t,affectedTools:s,timestamp:new Date});let n=this.createSuccessResponse({name:t,operation:"removed",affectedTools:s},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F");return e.json(n,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 s=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(s,404)}if(t.message.includes("\u914D\u7F6E\u66F4\u65B0")){let s=this.createErrorResponse("CONFIG_UPDATE_FAILED",t.message);return e.json(s,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=ue.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!ue.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let s=this.getServiceStatus(t),n=this.createSuccessResponse(s,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F");return e.json(n,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 s=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(s,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||{},s=[];for(let[a,l]of Object.entries(r)){let g=this.getServiceStatus(a);s.push(g)}let n={servers:s,total:s.length},i=this.createSuccessResponse(n,"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 D.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let s=[],n=[],i=this.validateBatchServers(t);if(!i.isValid)throw D.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,p]of Object.entries(t))try{let f=await this.addMCPServerSingle(u,p);s.push({name:u,success:!0,config:p,tools:f.tools,status:f.status}),n.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:f.tools?.length||0})}catch(f){let m=this.handleError(f,"addMCPServersBatch",{serverName:u,serverConfig:p});s.push({name:u,success:!1,error:m.message,config:p}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:m.message})}let a=n.length,l=r.length-a;if(a===0)throw D.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");w().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:a,failedCount:l,successfullyAddedServers:n,results:s,timestamp:new Date});let g={success:a>0,message:a===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:s,addedCount:a,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:a,failedCount:l}),g}catch(a){throw n.length>0&&await this.rollbackBatchAdd(n),a instanceof D?a:D.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${a instanceof Error?a.message:String(a)}`)}}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[s,n]of Object.entries(e)){let i=ue.validateServiceName(s);if(!i.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(ue.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let a=ue.validateConfig(n);a.isValid||t.push(`\u670D\u52A1 "${s}" \u914D\u7F6E\u65E0\u6548: ${a.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 s of e)try{try{await this.mcpServiceManager.stopService(s)}catch(n){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${s} \u5931\u8D25:`,n)}this.mcpServiceManager.removeServiceConfig(s),this.configManager.removeMcpServer(s),t.push(s),w().emitEvent("mcp:server:rollback",{serverName:s,timestamp:new Date})}catch(n){let i=this.handleError(n,"rollbackBatchAdd",{serverName:s});r.push(s),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${s} \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})}},ue=class{static{c(this,"MCPServerConfigValidator")}static validateConfig(e){let t=[];if(!e||typeof e!="object")return t.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};if("command"in e)(!e.command||typeof e.command!="string")&&t.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),e.args&&!Array.isArray(e.args)&&t.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),e.env&&typeof e.env!="object"&&t.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in e){(!e.url||typeof e.url!="string")&&t.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(e.url)}catch{t.push("URL \u683C\u5F0F\u65E0\u6548")}}else t.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:t.length===0,errors:t}}static validateServiceName(e){let t=[];return!e||typeof e!="string"?(t.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:t}):((e.length<1||e.length>50)&&t.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(e)||t.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:t.length===0,errors:t})}static checkServiceExists(e,t){let r=t.getConfig();return r.mcpServers&&e in r.mcpServers}}});var lr,Yn=C(()=>{"use strict";M();Mt();z();lr=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;configService;statusService;eventBus;constructor(e,t){this.logger=h.withTag("RealtimeNotificationHandler"),this.notificationService=e,this.configService=new Pe,this.statusService=t,this.eventBus=w()}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(s){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,s),this.sendError(e,"MESSAGE_PROCESSING_ERROR",s instanceof Error?s.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25")}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=await this.configService.getConfig();this.logger.debug("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t}),e.send(JSON.stringify({type:"config",data:r}))}catch(r){this.logger.error("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25")}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{await this.configService.updateConfig(t,`websocket-${r}`),this.logger.debug("WebSocket: updateConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:r})}catch(s){this.logger.error("WebSocket: updateConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",s),this.sendError(e,"CONFIG_UPDATE_ERROR",s instanceof Error?s.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25")}}async handleRestartService(e,t){this.logDeprecationWarning("WebSocket restartService","POST /api/services/restart");try{this.logger.info("WebSocket: \u6536\u5230\u670D\u52A1\u91CD\u542F\u8BF7\u6C42",{clientId:t}),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:`websocket-${t}`,delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting")}catch(r){this.logger.error("WebSocket: \u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",r),this.sendError(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25")}}sendError(e,t,r){try{let s={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(s))}catch(s){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",s)}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}async sendInitialData(e,t){try{this.logger.debug("\u53D1\u9001\u521D\u59CB\u6570\u636E\u7ED9\u5BA2\u6237\u7AEF",{clientId:t});let r=await this.configService.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let s=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:s.client})),s.restart&&e.send(JSON.stringify({type:"restartStatus",data:s.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),this.sendError(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25")}}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{spawn as gr}from"child_process";var ur,Zn=C(()=>{"use strict";M();hs();z();ur=class{static{c(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=h.withTag("ServiceApiHandler"),this.statusService=e,this.eventBus=w()}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 ze()).get("serviceManager").getStatus();if(!r.running){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),gr("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 s=r.mode==="daemon",n=["restart"];s&&n.push("--daemon"),gr("xiaozhi",n,{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"),gr("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"),gr("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 s=await(await ze()).get("serviceManager").getStatus();return this.logger.debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(s))}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 pr}from"fs";import{readFile as Nc}from"fs/promises";import{dirname as Dc,join as Le}from"path";import{fileURLToPath as Lc}from"url";var hr,Qn=C(()=>{"use strict";M();hr=class{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=h.withTag("StaticFileHandler"),this.initializeWebPath()}initializeWebPath(){try{let e=Dc(Lc(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[Le(e,"..","..","web","dist"),Le(e,"..","web","dist"),Le(e,"..","..","web"),Le(e,"..","web"),Le(e,"..","..","..","web","dist"),Le(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=pr(r);return this.logger.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${s?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),s})||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 s=Le(this.webPath,r);if(!pr(s)){let i=Le(this.webPath,"index.html");return pr(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: ${s}`),e.text("Not Found",404))}let n=this.getContentType(s);return this.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${s}, Content-Type: ${n}`),this.serveFile(e,s,n)}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 s=await Nc(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(s.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(s),200,{"Content-Type":r})}catch(s){throw this.logger.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,s),s}}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=`
42
42
  <!DOCTYPE html>
43
43
  <html>
44
44
  <head>
@@ -93,7 +93,7 @@ data: ${r}
93
93
  </div>
94
94
  </body>
95
95
  </html>
96
- `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&hr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var dr,eo=C(()=>{"use strict";P();dr=class{static{c(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=p.withTag("StatusApiHandler"),this.statusService=e}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return this.logger.debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getClientStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return this.logger.debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getRestartStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return this.logger.debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async checkClientConnected(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.json(this.createSuccessResponse({connected:t}))}catch(t){this.logger.error("\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_CONNECTION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25");return e.json(r,500)}}async getLastHeartbeat(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return this.logger.debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.json(this.createSuccessResponse({lastHeartbeat:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25:",t);let r=this.createErrorResponse("HEARTBEAT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25");return e.json(r,500)}}async getActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return this.logger.debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,500)}}async updateClientStatus(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object"){let r=this.createErrorResponse("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return e.json(r,400)}return this.statusService.updateClientInfo(t,"http-api"),this.logger.info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,400)}}async setActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await e.req.json();if(!Array.isArray(t)){let r=this.createErrorResponse("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");return e.json(r,400)}return this.statusService.setActiveMCPServers(t),this.logger.info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_UPDATE_ERROR",t instanceof Error?t.message:"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,400)}}async resetStatus(e){try{return this.logger.info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),this.logger.info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u7F6E\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_RESET_ERROR",t instanceof Error?t.message:"\u91CD\u7F6E\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}}});var it,to=C(()=>{"use strict";it=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(it||{})});import _c from"ajv";import mr from"dayjs";var fr,ro=C(()=>{"use strict";P();se();Gt();Qt();to();fr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=p.withTag("ToolApiHandler"),this.ajv=new _c({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:s,args:n}=t;if(!r||!s){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}if(this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${s}\uFF0C\u53C2\u6570:`,JSON.stringify(n)),!oe.isInitialized()){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}let i=await oe.getInstance();await this.validateServiceAndTool(i,r,s),r==="customMCP"&&await this.validateCustomMCPArguments(i,s,n||{});let a;if(r==="customMCP")a=await i.callTool(s,n||{});else{let l=`${r}__${s}`;a=await i.callTool(l,n||{})}return e.json(this.createSuccessResponse(a,"\u5DE5\u5177\u8C03\u7528\u6210\u529F"))}catch(t){this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),s="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?s="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?s="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?s="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?s="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?s="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?s="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(s="TIMEOUT_ERROR");let n=this.createErrorResponse(s,r);return e.json(n,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!d.configExists()){let n=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(n,404)}let t=[],r="";try{t=d.getCustomMCPTools(),r=d.getConfigPath()}catch(n){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",n);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!d.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let n=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(n,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let s={list:r,total:r.length};return e.json(this.createSuccessResponse(s,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`))}catch(t){this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getDisabledTools(){try{let e=d.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),s=await new Ie().getAllCachedTools(),n=d.getConfig(),i=new Set(Object.keys(n.mcpServers||{})),a=[];for(let l of s){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("__")}}};a.push(u)}return this.logger.debug(`\u4ECE ${s.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${a.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),a}catch(e){return this.logger.error("\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\u5931\u8D25:",e),[]}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let s=e.getCustomMCPTools().map(n=>n.name);throw s.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: ${s.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let n=e.getCustomMCPTools().find(i=>i.name===r);n&&!n.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),n&&!n.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(s){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,s),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 n=e.getCustomMCPTools().find(l=>l.name===t);if(!n)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!n.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(n.inputSchema);if(!i(r)){let u=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(h=>{let f=h.instancePath||h.schemaPath||"",m=h.message||"\u672A\u77E5\u9519\u8BEF";if(h.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${h.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(h.keyword==="type"){let A=h.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${f} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${A}`}if(h.keyword==="enum"){let A=h.params?.allowedValues||[];return`\u53C2\u6570 ${f} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${A.join(", ")}`}return`\u53C2\u6570 ${f} ${m}`}).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(s){throw s instanceof Error&&s.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?s:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,s),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${s instanceof Error?s.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:s}=this.handleAddToolError(t);return e.json(s,r)}}isNewFormatRequest(e){return e&&typeof e=="object"&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:s}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(it).includes(r)){let n=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(it).join(", ")}`);return e.json(n,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,s);case"coze":return await this.handleAddCozeTool(e,s);case"http":case"function":{let n=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(n,501)}default:{let n=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(n,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:s,customDescription:n,parameterConfig:i}=t,a=this.performPreChecks(r,s,n);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,s,n,i);return d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:s,customName:n,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${s}`),!r||!s){let j=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(j,400)}if(!oe.isInitialized()){let j=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(j,503)}let a=await oe.getInstance();try{await this.validateServiceAndTool(a,r,s)}catch(j){let Dt=j instanceof Error?j.message:String(j),me=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Dt);return e.json(me,404)}let g=await new Ie().getAllCachedTools(),u=`${r}__${s}`,h=g.find(j=>j.name===u);if(!h){let j=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`);return e.json(j,404)}let f=n||u,m=d.getCustomMCPTools();if(new Set(m.map(j=>j.name)).has(f)){let j=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${f}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(j,409)}let ie={name:f,description:i||h.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:h.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:mr().format("YYYY-MM-DD HH:mm:ss")}};d.addCustomMCPTool(ie),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`);let te=d.getServerToolsConfig(r);te?.toolName&&(te[s].enable=!0,d.updateServerToolsConfig(r,te),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${f}`);let Nt={tool:ie,toolName:f,toolType:"mcp",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(Nt,`MCP \u5DE5\u5177 "${f}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:s,customDescription:n,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,s,n);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,s,n,i);d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(g,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t){let n=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(n,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 n=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(n,400)}if(this.isNewFormatRequest(r))return await this.handleNewFormatUpdateTool(e,t,r);let s=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(s,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:s}=this.handleUpdateToolError(t);return e.json(s,r)}}async handleNewFormatUpdateTool(e,t,r){let{type:s,data:n}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${s}`),!Object.values(it).includes(s)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${s}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(it).join(", ")}`);return e.json(i,400)}switch(s){case"coze":return await this.handleUpdateCozeTool(e,t,n);case"mcp":case"http":case"function":{let i=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${s} \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: ${s}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:s,customName:n,customDescription:i,parameterConfig:a}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=d.getCustomMCPTools().find(m=>m.name===t);if(!g){let m=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(m,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let m=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(m,400)}!s.workflow_id&&g.handler?.config?.workflow_id&&(s.workflow_id=g.handler.config.workflow_id),!s.workflow_id&&s.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(s);let u=this.generateInputSchema(s,a),h={...g,description:i||g.description,inputSchema:u};d.updateCustomMCPTool(t,h),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let f={tool:h,toolName:t,toolType:"coze",updatedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(f,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`))}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`)}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("UPDATE_CUSTOM_TOOL_ERROR",`\u66F4\u65B0\u5DE5\u5177\u914D\u7F6E\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t){let n=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(n,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let s=d.getCustomMCPTools().find(n=>n.name===t);if(s&&s.handler.type==="mcp"){let n=s.handler.config;if(n.serviceName&&n.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`);let i=d.getServerToolsConfig(n.serviceName);i?.[n.toolName]&&(i[n.toolName].enable=!1,d.updateServerToolsConfig(n.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`))}}return d.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:s}=this.handleRemoveToolError(t);return e.json(s,r)}}convertWorkflowToTool(e,t,r,s){this.validateWorkflowData(e);let n=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(n),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,s),g=this.createHttpHandler(e),u={name:i,description:a,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[s,n]of Object.entries(t))r=r.replace(new RegExp(s,"g"),n);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:s}of t){let n=e[r];if(!n||typeof n!="string"||n.trim()==="")throw new Error(`${s}\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:s,max:n}of t){let i=e[r];if(i&&i.length>n)throw new Error(`${s}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${n}\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 s of t)if(r.includes(s))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${s}`)}resolveToolNameConflict(e){let t=d.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),s=e,n=1;for(;r.has(s);)if(s=`${e}_${n}`,n++,n>999)throw new Error(`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return s}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=d.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!d.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),this.validateProxyHandler(e.handler)}validateToolStructure(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");let t=["name","description","inputSchema","handler"];for(let r of t)if(!(r in e)||e[r]==null)throw new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\u8BA4\u8BC1\u7C7B\u578B\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E4B\u4E00: ${t.join(", ")}`);if(e.type==="bearer"){if(!e.token||typeof e.token!="string")throw new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let s=r.slice(2,-2).trim();if(!s||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s))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 s of e.parameters)t[s.fieldName]={type:s.type,description:s.description},s.required&&r.push(s.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,s]of Object.entries(t))if(e.includes(r))return s;return e}performPreChecks(e,t,r){let s=this.checkBasicParameters(e,t,r);if(s)return s;let n=this.checkSystemStatus();if(n)return n;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570")};if(typeof e!="object")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B")};if(!e.workflow_id||typeof e.workflow_id!="string"||!e.workflow_id.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(!e.workflow_name||typeof e.workflow_name!="string"||!e.workflow_name.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(t!==void 0){if(typeof t!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(t.trim()==="")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32")};if(t.length>50)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}if(r!==void 0){if(typeof r!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(r.length>200)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26")}}return null}checkSystemStatus(){try{let e=d.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=d.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,s=1024*1024;if(r>s)return{statusCode:413,errorResponse:this.createErrorResponse("PAYLOAD_TOO_LARGE","\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4")}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}}});var wt=T((tC,so)=>{"use strict";var kc="2.0.0",jc=Number.MAX_SAFE_INTEGER||9007199254740991,Hc=16,zc=250,Uc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];so.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Hc,MAX_SAFE_BUILD_LENGTH:zc,MAX_SAFE_INTEGER:jc,RELEASE_TYPES:Uc,SEMVER_SPEC_VERSION:kc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Rt=T((rC,no)=>{"use strict";var Fc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...o)=>console.error("SEMVER",...o):()=>{};no.exports=Fc});var at=T((we,oo)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:ds,MAX_SAFE_BUILD_LENGTH:Vc,MAX_LENGTH:Wc}=wt(),Bc=Rt();we=oo.exports={};var qc=we.re=[],Gc=we.safeRe=[],v=we.src=[],Xc=we.safeSrc=[],S=we.t={},Jc=0,ms="[a-zA-Z0-9-]",Kc=[["\\s",1],["\\d",Wc],[ms,Vc]],Yc=c(o=>{for(let[e,t]of Kc)o=o.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return o},"makeSafeRegex"),M=c((o,e,t)=>{let r=Yc(e),s=Jc++;Bc(o,s,e),S[o]=s,v[s]=e,Xc[s]=r,qc[s]=new RegExp(e,t?"g":void 0),Gc[s]=new RegExp(r,t?"g":void 0)},"createToken");M("NUMERICIDENTIFIER","0|[1-9]\\d*");M("NUMERICIDENTIFIERLOOSE","\\d+");M("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${ms}*`);M("MAINVERSION",`(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})`);M("MAINVERSIONLOOSE",`(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASEIDENTIFIER",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIER]})`);M("PRERELEASEIDENTIFIERLOOSE",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASE",`(?:-(${v[S.PRERELEASEIDENTIFIER]}(?:\\.${v[S.PRERELEASEIDENTIFIER]})*))`);M("PRERELEASELOOSE",`(?:-?(${v[S.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${v[S.PRERELEASEIDENTIFIERLOOSE]})*))`);M("BUILDIDENTIFIER",`${ms}+`);M("BUILD",`(?:\\+(${v[S.BUILDIDENTIFIER]}(?:\\.${v[S.BUILDIDENTIFIER]})*))`);M("FULLPLAIN",`v?${v[S.MAINVERSION]}${v[S.PRERELEASE]}?${v[S.BUILD]}?`);M("FULL",`^${v[S.FULLPLAIN]}$`);M("LOOSEPLAIN",`[v=\\s]*${v[S.MAINVERSIONLOOSE]}${v[S.PRERELEASELOOSE]}?${v[S.BUILD]}?`);M("LOOSE",`^${v[S.LOOSEPLAIN]}$`);M("GTLT","((?:<|>)?=?)");M("XRANGEIDENTIFIERLOOSE",`${v[S.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);M("XRANGEIDENTIFIER",`${v[S.NUMERICIDENTIFIER]}|x|X|\\*`);M("XRANGEPLAIN",`[v=\\s]*(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:${v[S.PRERELEASE]})?${v[S.BUILD]}?)?)?`);M("XRANGEPLAINLOOSE",`[v=\\s]*(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:${v[S.PRERELEASELOOSE]})?${v[S.BUILD]}?)?)?`);M("XRANGE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAIN]}$`);M("XRANGELOOSE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAINLOOSE]}$`);M("COERCEPLAIN",`(^|[^\\d])(\\d{1,${ds}})(?:\\.(\\d{1,${ds}}))?(?:\\.(\\d{1,${ds}}))?`);M("COERCE",`${v[S.COERCEPLAIN]}(?:$|[^\\d])`);M("COERCEFULL",v[S.COERCEPLAIN]+`(?:${v[S.PRERELEASE]})?(?:${v[S.BUILD]})?(?:$|[^\\d])`);M("COERCERTL",v[S.COERCE],!0);M("COERCERTLFULL",v[S.COERCEFULL],!0);M("LONETILDE","(?:~>?)");M("TILDETRIM",`(\\s*)${v[S.LONETILDE]}\\s+`,!0);we.tildeTrimReplace="$1~";M("TILDE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAIN]}$`);M("TILDELOOSE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAINLOOSE]}$`);M("LONECARET","(?:\\^)");M("CARETTRIM",`(\\s*)${v[S.LONECARET]}\\s+`,!0);we.caretTrimReplace="$1^";M("CARET",`^${v[S.LONECARET]}${v[S.XRANGEPLAIN]}$`);M("CARETLOOSE",`^${v[S.LONECARET]}${v[S.XRANGEPLAINLOOSE]}$`);M("COMPARATORLOOSE",`^${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]})$|^$`);M("COMPARATOR",`^${v[S.GTLT]}\\s*(${v[S.FULLPLAIN]})$|^$`);M("COMPARATORTRIM",`(\\s*)${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]}|${v[S.XRANGEPLAIN]})`,!0);we.comparatorTrimReplace="$1$2$3";M("HYPHENRANGE",`^\\s*(${v[S.XRANGEPLAIN]})\\s+-\\s+(${v[S.XRANGEPLAIN]})\\s*$`);M("HYPHENRANGELOOSE",`^\\s*(${v[S.XRANGEPLAINLOOSE]})\\s+-\\s+(${v[S.XRANGEPLAINLOOSE]})\\s*$`);M("STAR","(<|>)?=?\\s*\\*");M("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");M("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Cr=T((nC,io)=>{"use strict";var Zc=Object.freeze({loose:!0}),Qc=Object.freeze({}),el=c(o=>o?typeof o!="object"?Zc:o:Qc,"parseOptions");io.exports=el});var fs=T((iC,lo)=>{"use strict";var ao=/^[0-9]+$/,co=c((o,e)=>{if(typeof o=="number"&&typeof e=="number")return o===e?0:o<e?-1:1;let t=ao.test(o),r=ao.test(e);return t&&r&&(o=+o,e=+e),o===e?0:t&&!r?-1:r&&!t?1:o<e?-1:1},"compareIdentifiers"),tl=c((o,e)=>co(e,o),"rcompareIdentifiers");lo.exports={compareIdentifiers:co,rcompareIdentifiers:tl}});var B=T((cC,uo)=>{"use strict";var vr=Rt(),{MAX_LENGTH:go,MAX_SAFE_INTEGER:Sr}=wt(),{safeRe:Er,t:yr}=at(),rl=Cr(),{compareIdentifiers:Cs}=fs(),vs=class o{static{c(this,"SemVer")}constructor(e,t){if(t=rl(t),e instanceof o){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>go)throw new TypeError(`version is longer than ${go} characters`);vr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Er[yr.LOOSE]:Er[yr.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>Sr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Sr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Sr||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(s=>{if(/^[0-9]+$/.test(s)){let n=+s;if(n>=0&&n<Sr)return n}return s}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(vr("SemVer.compare",this.version,this.options,e),!(e instanceof o)){if(typeof e=="string"&&e===this.version)return 0;e=new o(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof o||(e=new o(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof o||(e=new o(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],s=e.prerelease[t];if(vr("prerelease compare",t,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return Cs(r,s)}while(++t)}compareBuild(e){e instanceof o||(e=new o(e,this.options));let t=0;do{let r=this.build[t],s=e.build[t];if(vr("build compare",t,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return Cs(r,s)}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 s=`-${t}`.match(this.options.loose?Er[yr.PRERELEASELOOSE]:Er[yr.PRERELEASE]);if(!s||s[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 s=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[s];else{let n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(s)}}if(t){let n=[t,s];r===!1&&(n=[t]),Cs(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};uo.exports=vs});var Ue=T((gC,po)=>{"use strict";var ho=B(),sl=c((o,e,t=!1)=>{if(o instanceof ho)return o;try{return new ho(o,e)}catch(r){if(!t)return null;throw r}},"parse");po.exports=sl});var fo=T((hC,mo)=>{"use strict";var nl=Ue(),ol=c((o,e)=>{let t=nl(o,e);return t?t.version:null},"valid");mo.exports=ol});var vo=T((dC,Co)=>{"use strict";var il=Ue(),al=c((o,e)=>{let t=il(o.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Co.exports=al});var yo=T((fC,Eo)=>{"use strict";var So=B(),cl=c((o,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new So(o instanceof So?o.version:o,t).inc(e,r,s).version}catch{return null}},"inc");Eo.exports=cl});var Po=T((vC,Mo)=>{"use strict";var To=Ue(),ll=c((o,e)=>{let t=To(o,null,!0),r=To(e,null,!0),s=t.compare(r);if(s===0)return null;let n=s>0,i=n?t:r,a=n?r:t,l=!!i.prerelease.length;if(!!a.prerelease.length&&!l){if(!a.patch&&!a.minor)return"major";if(a.compareMain(i)===0)return a.minor&&!a.patch?"minor":"patch"}let u=l?"pre":"";return t.major!==r.major?u+"major":t.minor!==r.minor?u+"minor":t.patch!==r.patch?u+"patch":"prerelease"},"diff");Mo.exports=ll});var Ro=T((EC,wo)=>{"use strict";var gl=B(),ul=c((o,e)=>new gl(o,e).major,"major");wo.exports=ul});var Io=T((TC,bo)=>{"use strict";var hl=B(),pl=c((o,e)=>new hl(o,e).minor,"minor");bo.exports=pl});var Oo=T((PC,$o)=>{"use strict";var dl=B(),ml=c((o,e)=>new dl(o,e).patch,"patch");$o.exports=ml});var xo=T((RC,Ao)=>{"use strict";var fl=Ue(),Cl=c((o,e)=>{let t=fl(o,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Ao.exports=Cl});var he=T((IC,Do)=>{"use strict";var No=B(),vl=c((o,e,t)=>new No(o,t).compare(new No(e,t)),"compare");Do.exports=vl});var _o=T((OC,Lo)=>{"use strict";var Sl=he(),El=c((o,e,t)=>Sl(e,o,t),"rcompare");Lo.exports=El});var jo=T((xC,ko)=>{"use strict";var yl=he(),Tl=c((o,e)=>yl(o,e,!0),"compareLoose");ko.exports=Tl});var Tr=T((DC,zo)=>{"use strict";var Ho=B(),Ml=c((o,e,t)=>{let r=new Ho(o,t),s=new Ho(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");zo.exports=Ml});var Fo=T((_C,Uo)=>{"use strict";var Pl=Tr(),wl=c((o,e)=>o.sort((t,r)=>Pl(t,r,e)),"sort");Uo.exports=wl});var Wo=T((jC,Vo)=>{"use strict";var Rl=Tr(),bl=c((o,e)=>o.sort((t,r)=>Rl(r,t,e)),"rsort");Vo.exports=bl});var bt=T((zC,Bo)=>{"use strict";var Il=he(),$l=c((o,e,t)=>Il(o,e,t)>0,"gt");Bo.exports=$l});var Mr=T((FC,qo)=>{"use strict";var Ol=he(),Al=c((o,e,t)=>Ol(o,e,t)<0,"lt");qo.exports=Al});var Ss=T((WC,Go)=>{"use strict";var xl=he(),Nl=c((o,e,t)=>xl(o,e,t)===0,"eq");Go.exports=Nl});var Es=T((qC,Xo)=>{"use strict";var Dl=he(),Ll=c((o,e,t)=>Dl(o,e,t)!==0,"neq");Xo.exports=Ll});var Pr=T((XC,Jo)=>{"use strict";var _l=he(),kl=c((o,e,t)=>_l(o,e,t)>=0,"gte");Jo.exports=kl});var wr=T((KC,Ko)=>{"use strict";var jl=he(),Hl=c((o,e,t)=>jl(o,e,t)<=0,"lte");Ko.exports=Hl});var ys=T((ZC,Yo)=>{"use strict";var zl=Ss(),Ul=Es(),Fl=bt(),Vl=Pr(),Wl=Mr(),Bl=wr(),ql=c((o,e,t,r)=>{switch(e){case"===":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o===t;case"!==":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o!==t;case"":case"=":case"==":return zl(o,t,r);case"!=":return Ul(o,t,r);case">":return Fl(o,t,r);case">=":return Vl(o,t,r);case"<":return Wl(o,t,r);case"<=":return Bl(o,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Yo.exports=ql});var Qo=T((ev,Zo)=>{"use strict";var Gl=B(),Xl=Ue(),{safeRe:Rr,t:br}=at(),Jl=c((o,e)=>{if(o instanceof Gl)return o;if(typeof o=="number"&&(o=String(o)),typeof o!="string")return null;e=e||{};let t=null;if(!e.rtl)t=o.match(e.includePrerelease?Rr[br.COERCEFULL]:Rr[br.COERCE]);else{let l=e.includePrerelease?Rr[br.COERCERTLFULL]:Rr[br.COERCERTL],g;for(;(g=l.exec(o))&&(!t||t.index+t[0].length!==o.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],s=t[3]||"0",n=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Xl(`${r}.${s}.${n}${i}${a}`,e)},"coerce");Zo.exports=Jl});var ti=T((rv,ei)=>{"use strict";var Ts=class{static{c(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let s=this.map.keys().next().value;this.delete(s)}this.map.set(e,t)}return this}};ei.exports=Ts});var pe=T((nv,oi)=>{"use strict";var Kl=/\s+/g,Ms=class o{static{c(this,"Range")}constructor(e,t){if(t=Zl(t),e instanceof o)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new o(e.raw,t);if(e instanceof Ps)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e.trim().replace(Kl," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(s=>!si(s[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let s of this.set)if(s.length===1&&og(s[0])){this.set=[s];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&&ng))+":"+e,s=ri.get(r);if(s)return s;let n=this.options.loose,i=n?J[q.HYPHENRANGELOOSE]:J[q.HYPHENRANGE];e=e.replace(i,mg(this.options.includePrerelease)),O("hyphen replace",e),e=e.replace(J[q.COMPARATORTRIM],eg),O("comparator trim",e),e=e.replace(J[q.TILDETRIM],tg),O("tilde trim",e),e=e.replace(J[q.CARETTRIM],rg),O("caret trim",e);let a=e.split(" ").map(h=>ig(h,this.options)).join(" ").split(/\s+/).map(h=>dg(h,this.options));n&&(a=a.filter(h=>(O("loose invalid filter",h,this.options),!!h.match(J[q.COMPARATORLOOSE])))),O("range list",a);let l=new Map,g=a.map(h=>new Ps(h,this.options));for(let h of g){if(si(h))return[h];l.set(h.value,h)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return ri.set(r,u),u}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Range is required");return this.set.some(r=>ni(r,t)&&e.set.some(s=>ni(s,t)&&r.every(n=>s.every(i=>n.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Ql(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(fg(this.set[t],e,this.options))return!0;return!1}};oi.exports=Ms;var Yl=ti(),ri=new Yl,Zl=Cr(),Ps=It(),O=Rt(),Ql=B(),{safeRe:J,t:q,comparatorTrimReplace:eg,tildeTrimReplace:tg,caretTrimReplace:rg}=at(),{FLAG_INCLUDE_PRERELEASE:sg,FLAG_LOOSE:ng}=wt(),si=c(o=>o.value==="<0.0.0-0","isNullSet"),og=c(o=>o.value==="","isAny"),ni=c((o,e)=>{let t=!0,r=o.slice(),s=r.pop();for(;t&&r.length;)t=r.every(n=>s.intersects(n,e)),s=r.pop();return t},"isSatisfiable"),ig=c((o,e)=>(o=o.replace(J[q.BUILD],""),O("comp",o,e),o=lg(o,e),O("caret",o),o=ag(o,e),O("tildes",o),o=ug(o,e),O("xrange",o),o=pg(o,e),O("stars",o),o),"parseComparator"),K=c(o=>!o||o.toLowerCase()==="x"||o==="*","isX"),ag=c((o,e)=>o.trim().split(/\s+/).map(t=>cg(t,e)).join(" "),"replaceTildes"),cg=c((o,e)=>{let t=e.loose?J[q.TILDELOOSE]:J[q.TILDE];return o.replace(t,(r,s,n,i,a)=>{O("tilde",o,r,s,n,i,a);let l;return K(s)?l="":K(n)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:K(i)?l=`>=${s}.${n}.0 <${s}.${+n+1}.0-0`:a?(O("replaceTilde pr",a),l=`>=${s}.${n}.${i}-${a} <${s}.${+n+1}.0-0`):l=`>=${s}.${n}.${i} <${s}.${+n+1}.0-0`,O("tilde return",l),l})},"replaceTilde"),lg=c((o,e)=>o.trim().split(/\s+/).map(t=>gg(t,e)).join(" "),"replaceCarets"),gg=c((o,e)=>{O("caret",o,e);let t=e.loose?J[q.CARETLOOSE]:J[q.CARET],r=e.includePrerelease?"-0":"";return o.replace(t,(s,n,i,a,l)=>{O("caret",o,s,n,i,a,l);let g;return K(n)?g="":K(i)?g=`>=${n}.0.0${r} <${+n+1}.0.0-0`:K(a)?n==="0"?g=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:l?(O("replaceCaret pr",l),n==="0"?i==="0"?g=`>=${n}.${i}.${a}-${l} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}-${l} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a}-${l} <${+n+1}.0.0-0`):(O("no pr"),n==="0"?i==="0"?g=`>=${n}.${i}.${a}${r} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a} <${+n+1}.0.0-0`),O("caret return",g),g})},"replaceCaret"),ug=c((o,e)=>(O("replaceXRanges",o,e),o.split(/\s+/).map(t=>hg(t,e)).join(" ")),"replaceXRanges"),hg=c((o,e)=>{o=o.trim();let t=e.loose?J[q.XRANGELOOSE]:J[q.XRANGE];return o.replace(t,(r,s,n,i,a,l)=>{O("xRange",o,r,s,n,i,a,l);let g=K(n),u=g||K(i),h=u||K(a),f=h;return s==="="&&f&&(s=""),l=e.includePrerelease?"-0":"",g?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&f?(u&&(i=0),a=0,s===">"?(s=">=",u?(n=+n+1,i=0,a=0):(i=+i+1,a=0)):s==="<="&&(s="<",u?n=+n+1:i=+i+1),s==="<"&&(l="-0"),r=`${s+n}.${i}.${a}${l}`):u?r=`>=${n}.0.0${l} <${+n+1}.0.0-0`:h&&(r=`>=${n}.${i}.0${l} <${n}.${+i+1}.0-0`),O("xRange return",r),r})},"replaceXRange"),pg=c((o,e)=>(O("replaceStars",o,e),o.trim().replace(J[q.STAR],"")),"replaceStars"),dg=c((o,e)=>(O("replaceGTE0",o,e),o.trim().replace(J[e.includePrerelease?q.GTE0PRE:q.GTE0],"")),"replaceGTE0"),mg=c(o=>(e,t,r,s,n,i,a,l,g,u,h,f)=>(K(r)?t="":K(s)?t=`>=${r}.0.0${o?"-0":""}`:K(n)?t=`>=${r}.${s}.0${o?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${o?"-0":""}`,K(g)?l="":K(u)?l=`<${+g+1}.0.0-0`:K(h)?l=`<${g}.${+u+1}.0-0`:f?l=`<=${g}.${u}.${h}-${f}`:o?l=`<${g}.${u}.${+h+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),fg=c((o,e,t)=>{for(let r=0;r<o.length;r++)if(!o[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<o.length;r++)if(O(o[r].semver),o[r].semver!==Ps.ANY&&o[r].semver.prerelease.length>0){let s=o[r].semver;if(s.major===e.major&&s.minor===e.minor&&s.patch===e.patch)return!0}return!1}return!0},"testSet")});var It=T((iv,ui)=>{"use strict";var $t=Symbol("SemVer ANY"),bs=class o{static{c(this,"Comparator")}static get ANY(){return $t}constructor(e,t){if(t=ii(t),e instanceof o){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Rs("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===$t?this.value="":this.value=this.operator+this.semver.version,Rs("comp",this)}parse(e){let t=this.options.loose?ai[ci.COMPARATORLOOSE]:ai[ci.COMPARATOR],r=e.match(t);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new li(r[2],this.options.loose):this.semver=$t}toString(){return this.value}test(e){if(Rs("Comparator.test",e,this.options.loose),this.semver===$t||e===$t)return!0;if(typeof e=="string")try{e=new li(e,this.options)}catch{return!1}return ws(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new gi(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new gi(this.value,t).test(e.semver):(t=ii(t),t.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!t.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||ws(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||ws(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};ui.exports=bs;var ii=Cr(),{safeRe:ai,t:ci}=at(),ws=ys(),Rs=Rt(),li=B(),gi=pe()});var Ot=T((cv,hi)=>{"use strict";var Cg=pe(),vg=c((o,e,t)=>{try{e=new Cg(e,t)}catch{return!1}return e.test(o)},"satisfies");hi.exports=vg});var di=T((gv,pi)=>{"use strict";var Sg=pe(),Eg=c((o,e)=>new Sg(o,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");pi.exports=Eg});var fi=T((hv,mi)=>{"use strict";var yg=B(),Tg=pe(),Mg=c((o,e,t)=>{let r=null,s=null,n=null;try{n=new Tg(e,t)}catch{return null}return o.forEach(i=>{n.test(i)&&(!r||s.compare(i)===-1)&&(r=i,s=new yg(r,t))}),r},"maxSatisfying");mi.exports=Mg});var vi=T((dv,Ci)=>{"use strict";var Pg=B(),wg=pe(),Rg=c((o,e,t)=>{let r=null,s=null,n=null;try{n=new wg(e,t)}catch{return null}return o.forEach(i=>{n.test(i)&&(!r||s.compare(i)===1)&&(r=i,s=new Pg(r,t))}),r},"minSatisfying");Ci.exports=Rg});var yi=T((fv,Ei)=>{"use strict";var Is=B(),bg=pe(),Si=bt(),Ig=c((o,e)=>{o=new bg(o,e);let t=new Is("0.0.0");if(o.test(t)||(t=new Is("0.0.0-0"),o.test(t)))return t;t=null;for(let r=0;r<o.set.length;++r){let s=o.set[r],n=null;s.forEach(i=>{let a=new Is(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!n||Si(a,n))&&(n=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),n&&(!t||Si(t,n))&&(t=n)}return t&&o.test(t)?t:null},"minVersion");Ei.exports=Ig});var Mi=T((vv,Ti)=>{"use strict";var $g=pe(),Og=c((o,e)=>{try{return new $g(o,e).range||"*"}catch{return null}},"validRange");Ti.exports=Og});var Ir=T((Ev,bi)=>{"use strict";var Ag=B(),Ri=It(),{ANY:xg}=Ri,Ng=pe(),Dg=Ot(),Pi=bt(),wi=Mr(),Lg=wr(),_g=Pr(),kg=c((o,e,t,r)=>{o=new Ag(o,r),e=new Ng(e,r);let s,n,i,a,l;switch(t){case">":s=Pi,n=Lg,i=wi,a=">",l=">=";break;case"<":s=wi,n=_g,i=Pi,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Dg(o,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],h=null,f=null;if(u.forEach(m=>{m.semver===xg&&(m=new Ri(">=0.0.0")),h=h||m,f=f||m,s(m.semver,h.semver,r)?h=m:i(m.semver,f.semver,r)&&(f=m)}),h.operator===a||h.operator===l||(!f.operator||f.operator===a)&&n(o,f.semver))return!1;if(f.operator===l&&i(o,f.semver))return!1}return!0},"outside");bi.exports=kg});var $i=T((Tv,Ii)=>{"use strict";var jg=Ir(),Hg=c((o,e,t)=>jg(o,e,">",t),"gtr");Ii.exports=Hg});var Ai=T((Pv,Oi)=>{"use strict";var zg=Ir(),Ug=c((o,e,t)=>zg(o,e,"<",t),"ltr");Oi.exports=Ug});var Di=T((Rv,Ni)=>{"use strict";var xi=pe(),Fg=c((o,e,t)=>(o=new xi(o,t),e=new xi(e,t),o.intersects(e,t)),"intersects");Ni.exports=Fg});var _i=T((Iv,Li)=>{"use strict";var Vg=Ot(),Wg=he();Li.exports=(o,e,t)=>{let r=[],s=null,n=null,i=o.sort((u,h)=>Wg(u,h,t));for(let u of i)Vg(u,e,t)?(n=u,s||(s=u)):(n&&r.push([s,n]),n=null,s=null);s&&r.push([s,null]);let a=[];for(let[u,h]of r)u===h?a.push(u):!h&&u===i[0]?a.push("*"):h?u===i[0]?a.push(`<=${h}`):a.push(`${u} - ${h}`):a.push(`>=${u}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Fi=T(($v,Ui)=>{"use strict";var ki=pe(),Os=It(),{ANY:$s}=Os,At=Ot(),As=he(),Bg=c((o,e,t={})=>{if(o===e)return!0;o=new ki(o,t),e=new ki(e,t);let r=!1;e:for(let s of o.set){for(let n of e.set){let i=Gg(s,n,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),qg=[new Os(">=0.0.0-0")],ji=[new Os(">=0.0.0")],Gg=c((o,e,t)=>{if(o===e)return!0;if(o.length===1&&o[0].semver===$s){if(e.length===1&&e[0].semver===$s)return!0;t.includePrerelease?o=qg:o=ji}if(e.length===1&&e[0].semver===$s){if(t.includePrerelease)return!0;e=ji}let r=new Set,s,n;for(let m of o)m.operator===">"||m.operator===">="?s=Hi(s,m,t):m.operator==="<"||m.operator==="<="?n=zi(n,m,t):r.add(m.semver);if(r.size>1)return null;let i;if(s&&n){if(i=As(s.semver,n.semver,t),i>0)return null;if(i===0&&(s.operator!==">="||n.operator!=="<="))return null}for(let m of r){if(s&&!At(m,String(s),t)||n&&!At(m,String(n),t))return null;for(let A of e)if(!At(m,String(A),t))return!1;return!0}let a,l,g,u,h=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1,f=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1;h&&h.prerelease.length===1&&n.operator==="<"&&h.prerelease[0]===0&&(h=!1);for(let m of e){if(u=u||m.operator===">"||m.operator===">=",g=g||m.operator==="<"||m.operator==="<=",s){if(f&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===f.major&&m.semver.minor===f.minor&&m.semver.patch===f.patch&&(f=!1),m.operator===">"||m.operator===">="){if(a=Hi(s,m,t),a===m&&a!==s)return!1}else if(s.operator===">="&&!At(s.semver,String(m),t))return!1}if(n){if(h&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===h.major&&m.semver.minor===h.minor&&m.semver.patch===h.patch&&(h=!1),m.operator==="<"||m.operator==="<="){if(l=zi(n,m,t),l===m&&l!==n)return!1}else if(n.operator==="<="&&!At(n.semver,String(m),t))return!1}if(!m.operator&&(n||s)&&i!==0)return!1}return!(s&&g&&!n&&i!==0||n&&u&&!s&&i!==0||f||h)},"simpleSubset"),Hi=c((o,e,t)=>{if(!o)return e;let r=As(o.semver,e.semver,t);return r>0?o:r<0||e.operator===">"&&o.operator===">="?e:o},"higherGT"),zi=c((o,e,t)=>{if(!o)return e;let r=As(o.semver,e.semver,t);return r<0?o:r>0||e.operator==="<"&&o.operator==="<="?e:o},"lowerLT");Ui.exports=Bg});var qi=T((Av,Bi)=>{"use strict";var xs=at(),Vi=wt(),Xg=B(),Wi=fs(),Jg=Ue(),Kg=fo(),Yg=vo(),Zg=yo(),Qg=Po(),eu=Ro(),tu=Io(),ru=Oo(),su=xo(),nu=he(),ou=_o(),iu=jo(),au=Tr(),cu=Fo(),lu=Wo(),gu=bt(),uu=Mr(),hu=Ss(),pu=Es(),du=Pr(),mu=wr(),fu=ys(),Cu=Qo(),vu=It(),Su=pe(),Eu=Ot(),yu=di(),Tu=fi(),Mu=vi(),Pu=yi(),wu=Mi(),Ru=Ir(),bu=$i(),Iu=Ai(),$u=Di(),Ou=_i(),Au=Fi();Bi.exports={parse:Jg,valid:Kg,clean:Yg,inc:Zg,diff:Qg,major:eu,minor:tu,patch:ru,prerelease:su,compare:nu,rcompare:ou,compareLoose:iu,compareBuild:au,sort:cu,rsort:lu,gt:gu,lt:uu,eq:hu,neq:pu,gte:du,lte:mu,cmp:fu,coerce:Cu,Comparator:vu,Range:Su,satisfies:Eu,toComparators:yu,maxSatisfying:Tu,minSatisfying:Mu,minVersion:Pu,validRange:wu,outside:Ru,gtr:bu,ltr:Iu,intersects:$u,simplifyRange:Ou,subset:Au,SemVer:Xg,re:xs.re,src:xs.src,tokens:xs.t,SEMVER_SPEC_VERSION:Vi.SEMVER_SPEC_VERSION,RELEASE_TYPES:Vi.RELEASE_TYPES,compareIdentifiers:Wi.compareIdentifiers,rcompareIdentifiers:Wi.rcompareIdentifiers}});import{exec as xu,spawn as Nu}from"child_process";import{promisify as Du}from"util";var xt,Gi,Fe,Ns=C(()=>{"use strict";xt=Ta(qi(),1);P();z();Gi=Du(xu),Fe=class{static{c(this,"NPMManager")}logger=p.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||w()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.logger.info(`\u5F00\u59CB\u5B89\u88C5: xiaozhi-client@${e} [${t}]`),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let s=Nu("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((n,i)=>{s.stdout.on("data",a=>{let l=a.toString();console.log(l),this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),s.stderr.on("data",a=>{let l=a.toString();console.log(l),this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),s.on("close",a=>{let l=Date.now()-r;if(a===0)console.log("\u5B89\u88C5\u5B8C\u6210\uFF01"),this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),n();else{let g=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${a}`;console.log(g),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:g,duration:l,timestamp:Date.now()}),i(new Error(g))}})})}async getCurrentVersion(){let{stdout:e}=await Gi("npm list -g xiaozhi-client --depth=0 --json --registry=https://registry.npmmirror.com");return JSON.parse(e).dependencies?.["xiaozhi-client"]?.version||"unknown"}static VERSION_TYPES={STABLE:"stable",RC:"rc",BETA:"beta",ALL:"all"};async getAvailableVersions(e="stable"){try{let{stdout:t}=await Gi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(n=>n&&typeof n=="string"&&xt.default.valid(n));return e!=="all"&&(s=s.filter(n=>{let i=xt.default.prerelease(n);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})),s.sort((n,i)=>xt.default.rcompare(n,i))}catch(t){return this.logger.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25:",t),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],s=!1;try{s=xt.default.gt(r,e)}catch(n){this.logger.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25:",n),s=r!==e}return this.logger.info(`\u7248\u672C\u68C0\u67E5\u5B8C\u6210: \u5F53\u524D\u7248\u672C ${e}, \u6700\u65B0\u7248\u672C ${r}, \u6709\u66F4\u65B0: ${s}`),{currentVersion:e,latestVersion:r,hasUpdate:s}}catch(e){return this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",e),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});import{z as Xi}from"zod";var Lu,$r,Ji=C(()=>{"use strict";P();z();Ns();Lu=Xi.object({version:Xi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),$r=class{static{c(this,"UpdateApiHandler")}npmManager;logger=p.withTag("UpdateApiHandler");eventBus=w();activeInstalls=new Map;constructor(){this.npmManager=new Fe(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Lu.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version:s}=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(s).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:s,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 Or,Ki=C(()=>{"use strict";P();Kr();Ns();Or=class{static{c(this,"VersionApiHandler")}logger;constructor(){this.logger=p.withTag("VersionApiHandler")}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getVersion(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=xe.getVersionInfo();return this.logger.debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25");return e.json(r,500)}}async getVersionSimple(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=xe.getVersion();return this.logger.debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.json(this.createSuccessResponse({version:t}))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25");return e.json(r,500)}}async clearVersionCache(e){try{return this.logger.debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),xe.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let n=await new Fe().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${n.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:n,type:t,total:n.length}))}catch(t){this.logger.error("\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("VERSIONS_FETCH_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async checkLatestVersion(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new Fe().checkForLatestVersion();return this.logger.debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error})):e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate}))}catch(t){this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",t);let r=this.createErrorResponse("LATEST_VERSION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25");return e.json(r,500)}}}});var Ar,Yi=C(()=>{"use strict";P();se();z();Ar=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=p.withTag("NotificationService"),this.eventBus=w(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=d.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:c(s=>{t.readyState===1&&t.send(s)},"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[s,n]of this.clients)this.sendMessageToClient(n,r,s)}sendToClient(e,t,r){let s={type:t,data:r,timestamp:Date.now()},n=this.clients.get(e);n?this.sendMessageToClient(n,s,e):this.queueMessage(e,s)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let s=JSON.stringify(t);e.send(s),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(s){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,s),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:s instanceof Error?s:new Error(String(s)),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 s of t)this.sendMessageToClient(r,s,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let s={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",s)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,s)=>r+s.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var xr,Zi=C(()=>{"use strict";P();z();xr=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=p.withTag("StatusService"),this.eventBus=w()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.updateClientInfo({status:"disconnected"},"heartbeat-timeout")},this.HEARTBEAT_TIMEOUT)}clearHeartbeatTimeout(){this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=void 0)}isClientConnected(){return this.clientInfo.status==="connected"}getLastHeartbeat(){return this.clientInfo.lastHeartbeat}getActiveMCPServers(){return[...this.clientInfo.activeMCPServers]}setActiveMCPServers(e){this.updateClientInfo({activeMCPServers:[...e]},"mcp-servers-update")}setMcpEndpoint(e){this.updateClientInfo({mcpEndpoint:e},"mcp-endpoint-update")}reset(){this.logger.info("\u91CD\u7F6E\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]},this.restartStatus=void 0}destroy(){this.logger.info("\u9500\u6BC1\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.reset()}}});var Ls={};re(Ls,{WebServer:()=>Ds});import{createServer as _u}from"http";import{serve as ku}from"@hono/node-server";import{Hono as ju}from"hono";import{cors as Hu}from"hono/cors";import{WebSocketServer as zu}from"ws";var Ds,_s=C(()=>{"use strict";P();Ft();_n();se();Qt();Fn();Vn();Bn();qn();Gn();Xn();Kn();Yn();Zn();Qn();eo();ro();Ji();Ki();Pt();z();Yi();Zi();Ds=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;proxyMCPServer;xiaozhiConnectionManager;mcpServiceManager;createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}constructor(e){try{this.port=e??d.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=p.withTag("WebServer"),this.eventBus=w(),this.configService=new Me,this.statusService=new xr,this.notificationService=new Ar,this.configApiHandler=new tr,this.statusApiHandler=new dr(this.statusService),this.serviceApiHandler=new ur(this.statusService),this.toolApiHandler=new fr,this.versionApiHandler=new Or,this.staticFileHandler=new pr,this.mcpRouteHandler=new ir,this.realtimeNotificationHandler=new lr(this.notificationService,this.statusService),this.heartbeatHandler=new or(this.statusService,this.notificationService),this.app=new ju,this.setupMiddleware(),this.setupRoutes(),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5...");let e=await this.loadConfiguration();this.mcpServiceManager=await oe.getInstance(),this.mcpServerApiHandler=new cr(this.mcpServiceManager,d),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.info(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`),await this.initializeXiaozhiConnection(e.mcpEndpoint,t),this.logger.info("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),e}}async loadConfiguration(){if(!d.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");d.cleanupInvalidServerToolsConfig();let e=d.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.info(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let s=Ln(t,r);this.mcpServiceManager.addServiceConfig(t,s)}await this.mcpServiceManager.startAllServices(),this.logger.info("\u6240\u6709 MCP \u670D\u52A1\u5DF2\u542F\u52A8")}async initializeXiaozhiConnection(e,t){let s=(Array.isArray(e)?e:[e]).filter(n=>n&&!n.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: ${s.length}`);try{this.xiaozhiConnectionManager=await ot.getInstance({reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4}),this.mcpServiceManager&&this.xiaozhiConnectionManager&&this.xiaozhiConnectionManager.setServiceManager(this.mcpServiceManager),this.logger.info("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(n){this.logger.error("\u274C \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n);return}if(s.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",s);try{await this.xiaozhiConnectionManager.initialize(s,t),await this.xiaozhiConnectionManager.connect(),this.xiaozhiConnectionManager.on("configChange",n=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${n.type}`,n.data)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${s.length} \u4E2A\u7AEF\u70B9`)}catch(n){this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n),this.logger.warn("\u56DE\u9000\u5230\u5355\u8FDE\u63A5\u6A21\u5F0F");let i=s[0];this.logger.debug(`\u521D\u59CB\u5316\u5355\u4E2A\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5: ${i}`),this.proxyMCPServer=new be(i),this.mcpServiceManager&&this.proxyMCPServer.setServiceManager(this.mcpServiceManager),await this.connectWithRetry(()=>this.proxyMCPServer.connect(),"\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5"),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")}}else try{this.xiaozhiConnectionManager&&(await this.xiaozhiConnectionManager.initialize([],t),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u521D\u59CB\u5316\u4E3A\u7A7A\u7BA1\u7406\u5668\uFF0C\u652F\u6301\u52A8\u6001\u6DFB\u52A0\u7AEF\u70B9"))}catch(n){this.logger.error("\u274C \u7A7A\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n)}}getXiaozhiConnectionStatus(){return this.xiaozhiConnectionManager?{type:"multi-endpoint",manager:{connectedConnections:this.xiaozhiConnectionManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.xiaozhiConnectionManager.getConnectionStatus().length,healthCheckStats:{},reconnectStats:this.xiaozhiConnectionManager.getReconnectStats()},connections:this.xiaozhiConnectionManager.getConnectionStatus()}:this.proxyMCPServer?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async handleEndpointStatus(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).getEndpointStatus(e)}async handleEndpointConnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).connectEndpoint(e)}async handleEndpointDisconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).disconnectEndpoint(e)}async handleEndpointReconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).reconnectEndpoint(e)}async handleEndpointAdd(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return await new Oe(this.xiaozhiConnectionManager,d).addEndpoint(e)}async handleEndpointRemove(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).removeEndpoint(e)}async connectWithRetry(e,t,r=5,s=1e3,n=3e4,i=2){let a=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(g){if(a=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let u=Math.min(s*i**(l-1),n);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: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",Hu({origin:"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})),this.app?.onError((e,t)=>{this.logger.error("HTTP request error:",e);let r=this.createErrorResponse("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?e.stack:void 0);return t.json(r,500)})}setupRoutes(){this.app?.get("/api/config",t=>this.configApiHandler.getConfig(t)),this.app?.put("/api/config",t=>this.configApiHandler.updateConfig(t)),this.app?.get("/api/config/mcp-endpoint",t=>this.configApiHandler.getMcpEndpoint(t)),this.app?.get("/api/config/mcp-endpoints",t=>this.configApiHandler.getMcpEndpoints(t)),this.app?.get("/api/config/mcp-servers",t=>this.configApiHandler.getMcpServers(t)),this.app?.get("/api/config/connection",t=>this.configApiHandler.getConnectionConfig(t)),this.app?.post("/api/config/reload",t=>this.configApiHandler.reloadConfig(t)),this.app?.get("/api/config/path",t=>this.configApiHandler.getConfigPath(t)),this.app?.get("/api/config/exists",t=>this.configApiHandler.checkConfigExists(t)),this.app?.get("/api/version",t=>this.versionApiHandler.getVersion(t)),this.app?.get("/api/version/simple",t=>this.versionApiHandler.getVersionSimple(t)),this.app?.get("/api/version/available",t=>this.versionApiHandler.getAvailableVersions(t)),this.app?.get("/api/version/latest",t=>this.versionApiHandler.checkLatestVersion(t)),this.app?.post("/api/version/cache/clear",t=>this.versionApiHandler.clearVersionCache(t));let e=new $r;this.app?.post("/api/update",t=>e.performUpdate(t)),this.app?.get("/api/status",t=>this.statusApiHandler.getStatus(t)),this.app?.get("/api/status/client",t=>this.statusApiHandler.getClientStatus(t)),this.app?.get("/api/status/restart",t=>this.statusApiHandler.getRestartStatus(t)),this.app?.get("/api/status/connected",t=>this.statusApiHandler.checkClientConnected(t)),this.app?.get("/api/status/heartbeat",t=>this.statusApiHandler.getLastHeartbeat(t)),this.app?.get("/api/status/mcp-servers",t=>this.statusApiHandler.getActiveMCPServers(t)),this.app?.put("/api/status/client",t=>this.statusApiHandler.updateClientStatus(t)),this.app?.put("/api/status/mcp-servers",t=>this.statusApiHandler.setActiveMCPServers(t)),this.app?.post("/api/status/reset",t=>this.statusApiHandler.resetStatus(t)),this.app?.post("/api/services/restart",t=>this.serviceApiHandler.restartService(t)),this.app?.post("/api/services/stop",t=>this.serviceApiHandler.stopService(t)),this.app?.post("/api/services/start",t=>this.serviceApiHandler.startService(t)),this.app?.get("/api/services/status",t=>this.serviceApiHandler.getServiceStatus(t)),this.app?.get("/api/services/health",t=>this.serviceApiHandler.getServiceHealth(t)),this.app?.post("/api/tools/call",t=>this.toolApiHandler.callTool(t)),this.app?.get("/api/tools/list",t=>this.toolApiHandler.listTools(t)),this.app?.get("/api/tools/custom",t=>this.toolApiHandler.getCustomTools(t)),this.app?.post("/api/tools/custom",t=>this.toolApiHandler.addCustomTool(t)),this.app?.put("/api/tools/custom/:toolName",t=>this.toolApiHandler.updateCustomTool(t)),this.app?.delete("/api/tools/custom/:toolName",t=>this.toolApiHandler.removeCustomTool(t)),this.app?.get("/api/coze/workspaces",t=>He.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>He.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>He.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>He.getCacheStats(t)),this.app?.post("/api/endpoint/status",t=>this.handleEndpointStatus(t)),this.app?.post("/api/endpoint/connect",t=>this.handleEndpointConnect(t)),this.app?.post("/api/endpoint/disconnect",t=>this.handleEndpointDisconnect(t)),this.app?.post("/api/endpoint/reconnect",t=>this.handleEndpointReconnect(t)),this.app?.post("/api/endpoint/add",t=>this.handleEndpointAdd(t)),this.app?.post("/api/endpoint/remove",t=>this.handleEndpointRemove(t)),this.app?.post("/api/mcp-servers",t=>this.mcpServerApiHandler?.addMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.delete("/api/mcp-servers/:serverName",t=>this.mcpServerApiHandler?.removeMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers/:serverName/status",t=>this.mcpServerApiHandler?.getMCPServerStatus(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers",t=>this.mcpServerApiHandler?.listMCPServers(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.post("/mcp",t=>this.mcpRouteHandler.handlePost(t)),this.app?.get("/mcp",t=>this.mcpRouteHandler.handleGet(t)),this.app?.all("/api/*",async t=>{let r=this.createErrorResponse("API_NOT_FOUND",`API \u7AEF\u70B9\u4E0D\u5B58\u5728: ${t.req.path}`);return t.json(r,404)}),this.app.get("*",t=>this.staticFileHandler.handleStaticFile(t))}setupWebSocket(){this.wss&&this.wss.on("connection",e=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let s=JSON.parse(r.toString());s.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,s,t):await this.realtimeNotificationHandler.handleMessage(e,s,t)}catch(s){this.logger.error("WebSocket message error:",s);let n={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:s instanceof Error?s.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(n))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}let e=ku({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:_u});this.httpServer=e,this.wss=new zu({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://0.0.0.0:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`);try{await this.initializeConnections()}catch(t){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u4F46 Web \u670D\u52A1\u5668\u7EE7\u7EED\u8FD0\u884C:",t)}}stop(){return new Promise(e=>{let t=!1,r=c(()=>{t||(t=!0,e())},"doResolve");if(this.proxyMCPServer?.disconnect(),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let s of this.wss.clients)s.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(),Zs(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});var Qi={};re(Qi,{ServiceManagerImpl:()=>ks});var ks,ea=C(()=>{"use strict";Ce();Ye();ft();Ht();ks=class{constructor(e,t,r){this.processManager=e;this.configManager=t;this.logger=r}static{c(this,"ServiceManagerImpl")}async start(e){try{this.validateStartOptions(e),this.processManager.cleanupContainerState();let t=this.getStatus();if(t.running){console.log(`\u68C0\u6D4B\u5230\u670D\u52A1\u5DF2\u5728\u8FD0\u884C (PID: ${t.pid})\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u542F...`);try{await this.processManager.gracefulKillProcess(t.pid),this.processManager.cleanupPidFile(),await new Promise(r=>setTimeout(r,1e3)),console.log("\u73B0\u6709\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u6B63\u5728\u542F\u52A8\u65B0\u670D\u52A1...")}catch(r){console.warn(`\u505C\u6B62\u73B0\u6709\u670D\u52A1\u65F6\u51FA\u73B0\u8B66\u544A: ${r instanceof Error?r.message:String(r)}`)}}switch(this.checkEnvironment(),e.mode){case"mcp-server":await this.startMcpServerMode(e);break;case"stdio":await this.startStdioMode(e);break;case"normal":await this.startNormalMode(e);break;default:await this.startNormalMode(e);break}}catch(t){throw t instanceof _?t:_.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw _.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile()}catch(e){throw e instanceof _?e:new _(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restart(e){try{this.getStatus().running&&(await this.stop(),await new Promise(r=>setTimeout(r,1e3))),await this.start(e)}catch(t){throw new _(`\u91CD\u542F\u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}getStatus(){return this.processManager.getServiceStatus()}validateStartOptions(e){if(e.port!==void 0&&le.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new _(`\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F: ${e.mode}`)}checkEnvironment(){if(!this.configManager.configExists())throw ke.configNotFound();try{if(!this.configManager.getConfig())throw new ke("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof ke?e:new ke(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${e instanceof Error?e.message:String(e)}`)}}async startNormalMode(e){let{spawn:t}=await import("child_process");e.daemon?await this.startWebServerInDaemon(e.ui||!1):await this.startWebServerInForeground(e.ui||!1)}async startMcpServerMode(e){let t=e.port||3e3,{spawn:r}=await import("child_process");if(e.daemon){let s=L.getExecutablePath("cli"),n=r("node",[s,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(n.pid,"daemon"),n.unref(),console.log(`\u2705 MCP Server \u5DF2\u5728\u540E\u53F0\u542F\u52A8 (PID: ${n.pid}, Port: ${t})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),process.exit(0)}else{let{MCPServer:s}=await Promise.resolve().then(()=>(An(),On)),n=new s(t),i=c(async()=>{await n.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i),await n.start()}}async startStdioMode(e){let{spawn:t}=await import("child_process"),r=L.getMcpServerProxyPath(),s=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir()}});this.processManager.savePidInfo(s.pid,"foreground")}async startWebServerInDaemon(e){let{spawn:t}=await import("child_process"),r=L.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(r))throw new _(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${r}`);let n=[r];e&&n.push("--open-browser");let i=t("node",n,{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(i.pid,"daemon"),i.unref(),console.log(`\u2705 \u540E\u53F0\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${i.pid})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi attach' \u67E5\u770B\u65E5\u5FD7"),process.exit(0)}async startWebServerInForeground(e){let{WebServer:t}=await Promise.resolve().then(()=>(_s(),Ls)),r=new t,s=c(async()=>{await r.stop(),this.processManager.cleanupPidFile(),process.exit(0)},"cleanup");if(process.on("SIGINT",s),process.on("SIGTERM",s),this.processManager.savePidInfo(process.pid,"foreground"),await r.start(),e){let i=this.configManager.getConfig()?.webServer?.port||9999;await this.openBrowserUrl(`http://localhost:${i}`)}}async openBrowserUrl(e){try{let{spawn:t}=await import("child_process"),r=ne.getCurrentPlatform(),s,n;r==="darwin"?(s="open",n=[e]):r==="win32"?(s="start",n=["",e]):(s="xdg-open",n=[e]),t(s,n,{detached:!0,stdio:"ignore"}),console.log(`\u{1F310} \u5DF2\u5C1D\u8BD5\u6253\u5F00\u6D4F\u89C8\u5668: ${e}`)}catch{console.log(`\u26A0\uFE0F \u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`)}}}});var ta={};re(ta,{TemplateManagerImpl:()=>js});import Uu from"fs";import Ve from"path";var js,ra=C(()=>{"use strict";Ce();mt();Ye();Ht();js=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=L.findTemplatesDir();if(!e)return[];let t=[],r=Uu.readdirSync(e,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);for(let s of r)try{let n=await this.getTemplateInfo(s);n&&t.push(n)}catch{console.warn(`\u8DF3\u8FC7\u65E0\u6548\u6A21\u677F: ${s}`)}return t}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",L.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(le.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=L.getTemplatePath(e);if(!t)return null;let r=Ve.join(t,"template.json"),s={};if($.exists(r))try{let a=$.readFile(r);s=JSON.parse(a)}catch{console.warn(`\u6A21\u677F\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}`)}let n=this.getTemplateFiles(t),i={name:e,path:t,description:s.description||`${e} \u6A21\u677F`,version:s.version||"1.0.0",author:s.author,files:n};return this.templateCache.set(e,i),i}catch(t){throw t instanceof I?t:new R(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:Ve.basename(t)})}async createProject(e){try{this.validateCreateOptions(e);let t=e.templateName||"default",r=await this.getTemplateInfo(t);if(!r)throw new R(`\u6A21\u677F\u4E0D\u5B58\u5728: ${t}`,"");let s=Ve.resolve(e.targetPath);if($.exists(s))throw R.alreadyExists(s);$.ensureDir(s),await this.copyTemplateFiles(r,s,e),await this.processTemplateVariables(s,e),console.log(`\u2705 \u9879\u76EE\u521B\u5EFA\u6210\u529F: ${s}`)}catch(t){throw t instanceof R||t instanceof I?t:new R(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,e.targetPath)}}async validateTemplate(e){try{let t=await this.getTemplateInfo(e);if(!t)return!1;let r=["package.json"];for(let s of r){let n=Ve.join(t.path,s);if(!$.exists(n))return console.warn(`\u6A21\u677F\u7F3A\u5C11\u5FC5\u8981\u6587\u4EF6: ${s}`),!1}return!0}catch{return!1}}clearCache(){this.templateCache.clear()}getTemplateFiles(e){try{return $.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let s=Ve.relative(e,r);return!s.startsWith(".")&&s!=="template.json"&&!s.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){le.validateRequired(e.targetPath,"targetPath"),le.validateRequired(e.projectName,"projectName"),le.validateProjectName(e.projectName),e.templateName&&le.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{$.copyDirectory(e.path,t,{exclude:["template.json",".git","node_modules"],overwrite:!1,recursive:!0})}catch(s){throw new R(`\u590D\u5236\u6A21\u677F\u6587\u4EF6\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`,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},s=["package.json","README.md","src/**/*.ts","src/**/*.js","src/**/*.json"];for(let n of s){let i=this.findFilesByPattern(e,n);for(let a of i)await this.replaceVariablesInFile(a,r)}}catch(r){console.warn(`\u5904\u7406\u6A21\u677F\u53D8\u91CF\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}findFilesByPattern(e,t){try{if(!t.includes("*")){let n=Ve.join(e,t);return $.exists(n)?[n]:[]}let r=$.listDirectory(e,{recursive:!0}),s=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(n=>{let i=Ve.relative(e,n);return s.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=$.readFile(e),s=!1;for(let[n,i]of Object.entries(t)){let a=new RegExp(`{{\\s*${n}\\s*}}`,"g");a.test(r)&&(r=r.replace(a,i),s=!0)}s&&$.writeFile(e,r,{overwrite:!0})}catch(r){console.warn(`\u66FF\u6362\u6587\u4EF6\u53D8\u91CF\u5931\u8D25 ${e}: ${r instanceof Error?r.message:String(r)}`)}}}});async function ze(){return Hs.create()}var Hs,ps=C(()=>{"use strict";P();se();Xr();mt();Jr();Ye();ft();Ht();Kr();Hs=class o{static{c(this,"DIContainer")}instances=new Map;factories=new Map;asyncFactories=new Map;singletons=new Set;register(e,t,r=!1){this.factories.set(e,t),r&&this.singletons.add(e)}registerSingleton(e,t){this.register(e,t,!0)}registerInstance(e,t){this.instances.set(e,t),this.singletons.add(e)}get(e){if(this.singletons.has(e)&&this.instances.has(e))return this.instances.get(e);let t=this.factories.get(e);if(!t)throw new Error(`Service ${e} not registered`);let r=t();return this.singletons.has(e)&&this.instances.set(e,r),r}has(e){return this.factories.has(e)||this.instances.has(e)}clear(){this.instances.clear(),this.factories.clear(),this.singletons.clear()}getRegisteredKeys(){let e=Array.from(this.factories.keys()),t=Array.from(this.instances.keys());return[...new Set([...e,...t])]}static create(){let e=new o;return e.registerSingleton("versionUtils",()=>xe),e.registerSingleton("platformUtils",()=>ne),e.registerSingleton("formatUtils",()=>Ke),e.registerSingleton("fileUtils",()=>$),e.registerSingleton("pathUtils",()=>L),e.registerSingleton("validation",()=>le),e.registerSingleton("configManager",()=>d),e.registerSingleton("logger",()=>p),e.registerSingleton("errorHandler",()=>ve),e.registerSingleton("processManager",()=>{let t=(Yr(),fe(an));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(gn(),fe(ln)),r=e.get("processManager"),s=e.get("logger");return new t.DaemonManagerImpl(r,s)}),e.registerSingleton("serviceManager",()=>{let t=(ea(),fe(Qi)),r=e.get("processManager"),s=e.get("configManager"),n=e.get("logger");return new t.ServiceManagerImpl(r,s,n)}),e.registerSingleton("templateManager",()=>{let t=(ra(),fe(ta));return new t.TemplateManagerImpl}),e}};c(ze,"createContainer")});var ee,We=C(()=>{"use strict";ee=class{constructor(e){this.container=e}static{c(this,"BaseCommandHandler")}options;subcommands;getService(e){return this.container.get(e)}handleError(e){this.getService("errorHandler").handle(e)}validateArgs(e,t){if(e.length<t)throw new Error(`\u547D\u4EE4\u9700\u8981\u81F3\u5C11 ${t} \u4E2A\u53C2\u6570\uFF0C\u4F46\u53EA\u63D0\u4F9B\u4E86 ${e.length} \u4E2A`)}}});var sa={};re(sa,{ServiceCommandHandler:()=>zs});var zs,na=C(()=>{"use strict";P();We();zs=class extends ee{static{c(this,"ServiceCommandHandler")}name="service";description="\u670D\u52A1\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"start",description:"\u542F\u52A8\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"},{flags:"--debug",description:"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F (\u8F93\u51FADEBUG\u7EA7\u522B\u65E5\u5FD7)"},{flags:"--stdio",description:"\u4EE5 stdio \u6A21\u5F0F\u8FD0\u884C MCP Server (\u7528\u4E8E Cursor \u7B49\u5BA2\u6237\u7AEF)"}],execute:c(async(e,t)=>{await this.handleStart(t)},"execute")},{name:"stop",description:"\u505C\u6B62\u670D\u52A1",execute:c(async(e,t)=>{await this.handleStop()},"execute")},{name:"status",description:"\u68C0\u67E5\u670D\u52A1\u72B6\u6001",execute:c(async(e,t)=>{await this.handleStatus()},"execute")},{name:"restart",description:"\u91CD\u542F\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"}],execute:c(async(e,t)=>{await this.handleRestart(t)},"execute")},{name:"attach",description:"\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7",execute:c(async(e,t)=>{await this.handleAttach()},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u670D\u52A1\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleStart(e){try{e.debug&&Ys("debug");let t=this.getService("serviceManager");e.stdio?await this.startStdioMode():await t.start({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleStop(){try{await this.getService("serviceManager").stop()}catch(e){this.handleError(e)}}async handleStatus(){try{let t=await this.getService("serviceManager").getStatus();t.running?(console.log(`\u2705 \u670D\u52A1\u6B63\u5728\u8FD0\u884C (PID: ${t.pid})`),t.uptime&&console.log(`\u23F1\uFE0F \u8FD0\u884C\u65F6\u95F4: ${t.uptime}`),t.mode&&console.log(`\u{1F527} \u8FD0\u884C\u6A21\u5F0F: ${t.mode}`)):console.log("\u274C \u670D\u52A1\u672A\u8FD0\u884C")}catch(e){this.handleError(e)}}async handleRestart(e){try{await this.getService("serviceManager").restart({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleAttach(){try{await this.getService("daemonManager").attachToLogs()}catch(e){this.handleError(e)}}async startStdioMode(){let{spawn:e}=await import("child_process"),{fileURLToPath:t}=await import("url"),r=await import("path"),s=t(import.meta.url),n=r.dirname(s),i=r.join(n,"mcpServerProxy.js");e("node",[i],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}})}}});var oa={};re(oa,{ConfigCommandHandler:()=>Fs});import Fu from"path";import N from"chalk";import Us from"ora";var Fs,ia=C(()=>{"use strict";We();Fs=class extends ee{static{c(this,"ConfigCommandHandler")}name="config";description="\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"init",description:"\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6",options:[{flags:"-f, --format <format>",description:"\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F (json, json5, jsonc)",defaultValue:"json"}],execute:c(async(e,t)=>{await this.handleInit(t)},"execute")},{name:"get",description:"\u67E5\u770B\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleGet(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,2),await this.handleSet(e[0],e[1])},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleInit(e){let t=Us("\u521D\u59CB\u5316\u914D\u7F6E...").start();try{let r=e.format;if(r!=="json"&&r!=="json5"&&r!=="jsonc")throw new Error("\u683C\u5F0F\u5FC5\u987B\u662F json, json5 \u6216 jsonc");let s=this.getService("configManager");if(s.configExists()){t.warn("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728"),console.log(N.yellow("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u5220\u9664\u73B0\u6709\u7684\u914D\u7F6E\u6587\u4EF6"));return}s.initConfig(r),t.succeed("\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u6210\u529F");let n=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),i=`xiaozhi.config.${r}`,a=Fu.join(n,i);console.log(N.green(`\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u521B\u5EFA: ${i}`)),console.log(N.yellow("\u{1F4DD} \u8BF7\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9:")),console.log(N.gray(` \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${a}`)),console.log(N.yellow("\u{1F4A1} \u6216\u8005\u4F7F\u7528\u547D\u4EE4\u8BBE\u7F6E:")),console.log(N.gray(" xiaozhi config set mcpEndpoint <your-endpoint-url>"))}catch(r){t.fail(`\u521D\u59CB\u5316\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleGet(e){let t=Us("\u8BFB\u53D6\u914D\u7F6E...").start();try{let r=this.getService("configManager");if(!r.configExists()){t.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let s=r.getConfig();switch(e){case"mcpEndpoint":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let n=r.getMcpEndpoints();n.length===0?console.log(N.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):n.length===1?console.log(N.green(`MCP \u7AEF\u70B9: ${n[0]}`)):(console.log(N.green(`MCP \u7AEF\u70B9 (${n.length} \u4E2A):`)),n.forEach((i,a)=>{console.log(N.gray(` ${a+1}. ${i}`))}));break}case"mcpServers":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green("MCP \u670D\u52A1:"));for(let[n,i]of Object.entries(s.mcpServers)){let a=i;"type"in a&&a.type==="sse"?console.log(N.gray(` ${n}: [SSE] ${a.url}`)):console.log(N.gray(` ${n}: ${a.command} ${a.args.join(" ")}`))}break;case"connection":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let n=r.getConnectionConfig();console.log(N.green("\u8FDE\u63A5\u914D\u7F6E:")),console.log(N.gray(` \u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${n.heartbeatInterval}ms`)),console.log(N.gray(` \u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${n.heartbeatTimeout}ms`)),console.log(N.gray(` \u91CD\u8FDE\u95F4\u9694: ${n.reconnectInterval}ms`));break}case"heartbeatInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${r.getHeartbeatInterval()}ms`));break;case"heartbeatTimeout":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${r.getHeartbeatTimeout()}ms`));break;case"reconnectInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u91CD\u8FDE\u95F4\u9694: ${r.getReconnectInterval()}ms`));break;default:t.fail(`\u672A\u77E5\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u7684\u914D\u7F6E\u9879: mcpEndpoint, mcpServers, connection, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(r){t.fail(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e,t){let r=Us("\u66F4\u65B0\u914D\u7F6E...").start();try{let s=this.getService("configManager");if(!s.configExists()){r.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}switch(e){case"mcpEndpoint":s.updateMcpEndpoint(t),r.succeed(`MCP \u7AEF\u70B9\u5DF2\u8BBE\u7F6E\u4E3A: ${t}`);break;case"heartbeatInterval":{let n=Number.parseInt(t);if(Number.isNaN(n)||n<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");s.updateHeartbeatInterval(n),r.succeed(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${n}ms`);break}case"heartbeatTimeout":{let n=Number.parseInt(t);if(Number.isNaN(n)||n<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u662F\u6B63\u6574\u6570");s.updateHeartbeatTimeout(n),r.succeed(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5DF2\u8BBE\u7F6E\u4E3A: ${n}ms`);break}case"reconnectInterval":{let n=Number.parseInt(t);if(Number.isNaN(n)||n<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");s.updateReconnectInterval(n),r.succeed(`\u91CD\u8FDE\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${n}ms`);break}default:r.fail(`\u4E0D\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: mcpEndpoint, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(s){r.fail(`\u8BBE\u7F6E\u914D\u7F6E\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`),this.handleError(s)}}}});var aa={};re(aa,{ProjectCommandHandler:()=>Vs});import Vu from"path";import H from"chalk";import Wu from"ora";var Vs,ca=C(()=>{"use strict";We();Vs=class extends ee{static{c(this,"ProjectCommandHandler")}name="create";description="\u521B\u5EFA\u9879\u76EE";options=[{flags:"-t, --template <templateName>",description:"\u4F7F\u7528\u6307\u5B9A\u6A21\u677F\u521B\u5EFA\u9879\u76EE"}];constructor(e){super(e)}async execute(e,t){this.validateArgs(e,1);let r=e[0];await this.handleCreate(r,t)}async handleCreate(e,t){let r=Wu("\u521D\u59CB\u5316\u9879\u76EE...").start();try{let s=this.getService("templateManager"),n=this.getService("fileUtils"),i=Vu.join(process.cwd(),e);if(await n.exists(i)){r.fail(`\u76EE\u5F55 "${e}" \u5DF2\u5B58\u5728`),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u9009\u62E9\u4E0D\u540C\u7684\u9879\u76EE\u540D\u79F0\u6216\u5220\u9664\u73B0\u6709\u76EE\u5F55"));return}t.template?await this.createFromTemplate(e,t.template,i,r,s):await this.createBasicProject(e,i,r,s)}catch(s){r.fail(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`),this.handleError(s)}}async createFromTemplate(e,t,r,s,n){s.text="\u68C0\u67E5\u6A21\u677F...";let i=await n.getAvailableTemplates();if(i.length===0){s.fail("\u627E\u4E0D\u5230\u53EF\u7528\u6A21\u677F"),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u786E\u4FDD xiaozhi-client \u6B63\u786E\u5B89\u88C5"));return}let a=t;if(!await n.validateTemplate(a)){s.fail(`\u6A21\u677F "${a}" \u4E0D\u5B58\u5728`);let g=this.findSimilarTemplate(a,i);if(g)if(console.log(H.yellow(`\u{1F4A1} \u4F60\u662F\u60F3\u4F7F\u7528\u6A21\u677F "${g}" \u5417\uFF1F`)),await this.askUserConfirmation(H.cyan("\u786E\u8BA4\u4F7F\u7528\u6B64\u6A21\u677F\uFF1F(y/n): ")))a=g;else{this.showAvailableTemplates(i);return}else{this.showAvailableTemplates(i);return}}s.text=`\u4ECE\u6A21\u677F "${a}" \u521B\u5EFA\u9879\u76EE "${e}"...`,await n.createProject({templateName:a,targetPath:r,projectName:e}),s.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" pnpm install # \u5B89\u88C5\u4F9D\u8D56")),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1"))}async createBasicProject(e,t,r,s){r.text=`\u521B\u5EFA\u57FA\u672C\u9879\u76EE "${e}"...`,await s.createProject({templateName:null,targetPath:t,projectName:e}),r.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u57FA\u672C\u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9\u548C\u670D\u52A1")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1")),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 --template \u9009\u9879\u53EF\u4EE5\u4ECE\u6A21\u677F\u521B\u5EFA\u9879\u76EE"))}showAvailableTemplates(e){console.log(H.yellow("\u53EF\u7528\u7684\u6A21\u677F:"));for(let t of e)console.log(H.gray(` - ${t}`))}findSimilarTemplate(e,t){let r=this.getService("formatUtils"),s=null,n=0;for(let i of t){let a=r.calculateSimilarity(e.toLowerCase(),i.toLowerCase());a>n&&a>.6&&(n=a,s=i)}return s}async askUserConfirmation(e){let r=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise(s=>{r.question(e,n=>{r.close(),s(n.toLowerCase().trim()==="y"||n.toLowerCase().trim()==="yes")})})}}});var Nr,la=C(()=>{"use strict";P();Yr();se();Nr=class{static{c(this,"ToolCallService")}logger;processManager;baseUrl;constructor(){this.logger=p.withTag("ToolCallService"),this.processManager=new Ct;try{let e=d.getWebUIPort()??9999;this.baseUrl=`http://localhost:${e}`}catch{this.baseUrl="http://localhost:9999"}}async callTool(e,t,r){await this.validateServiceStatus();try{let s=await fetch(`${this.baseUrl}/api/tools/call`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceName:e,toolName:t,args:r})});if(!s.ok){let i=await s.json();throw new Error(i.error?.message||`HTTP ${s.status}: ${s.statusText}`)}let n=await s.json();if(!n.success)throw new Error(n.error?.message||"\u5DE5\u5177\u8C03\u7528\u5931\u8D25");return n.data}catch(s){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`,s instanceof Error?s.message:String(s)),s}}parseJsonArgs(e){try{return JSON.parse(e)}catch(t){throw new Error(`\u53C2\u6570\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u4F7F\u7528\u6709\u6548\u7684 JSON \u683C\u5F0F\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}async validateServiceStatus(){if(!this.processManager.getServiceStatus().running)throw new Error("xiaozhi \u670D\u52A1\u672A\u542F\u52A8\u3002\u8BF7\u5148\u8FD0\u884C 'xiaozhi start' \u6216 'xiaozhi start -d' \u542F\u52A8\u670D\u52A1\u3002");try{let t=await fetch(`${this.baseUrl}/api/status`,{method:"GET",signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Web \u670D\u52A1\u5668\u54CD\u5E94\u9519\u8BEF: ${t.status}`)}catch(t){throw t instanceof Error&&t.name==="AbortError"?new Error("\u8FDE\u63A5 xiaozhi \u670D\u52A1\u8D85\u65F6\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5E38\u8FD0\u884C\u3002"):new Error(`\u65E0\u6CD5\u8FDE\u63A5\u5230 xiaozhi \u670D\u52A1\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}formatOutput(e){return JSON.stringify(e)}async getServiceStatus(){try{let e=this.processManager.getServiceStatus();if(!e.running)return"\u670D\u52A1\u672A\u542F\u52A8";try{let t=await fetch(`${this.baseUrl}/api/tools/list`,{method:"GET",signal:AbortSignal.timeout(3e3)});if(t.ok){let r=await t.json();if(r.success)return`\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${e.pid}, ${r.data.totalTools} \u4E2A\u5DE5\u5177\u53EF\u7528)`}return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46 MCP \u670D\u52A1\u53EF\u80FD\u672A\u5B8C\u5168\u521D\u59CB\u5316`}catch{return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46\u65E0\u6CD5\u8FDE\u63A5\u5230 Web API`}}catch(e){return`\u670D\u52A1\u72B6\u6001\u68C0\u67E5\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}}});var Lr={};re(Lr,{getDisplayWidth:()=>Bs,listMcpServers:()=>Bu,listServerTools:()=>qu,setToolEnabled:()=>Gu,truncateToWidth:()=>Dr});import y from"chalk";import ga from"cli-table3";import Ws from"ora";function Bs(o){let e=0;for(let t of o)/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(t)?e+=2:e+=1;return e}function Dr(o,e){if(Bs(o)<=e)return o;if(e<=3)return"";let t="",r=0,s=!1;for(let n of o){let i=/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(n)?2:1;if(r+i>e-3){if(!s)return"";t+="...";break}t+=n,r+=i,s=!0}return t}async function Bu(o={}){let e=Ws("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{let t=d.getMcpServers(),r=Object.keys(t),s=d.getCustomMCPTools(),n=s.length>0,i=r.length+(n?1:0);if(i===0){e.warn("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\u6216 customMCP \u5DE5\u5177"),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi config' \u547D\u4EE4\u914D\u7F6E MCP \u670D\u52A1\u6216\u5728 xiaozhi.config.json \u4E2D\u914D\u7F6E customMCP \u5DE5\u5177"));return}if(e.succeed(`\u627E\u5230 ${i} \u4E2A MCP \u670D\u52A1${n?" (\u5305\u62EC customMCP)":""}`),o.tools){console.log(),console.log(y.bold("MCP \u670D\u52A1\u5DE5\u5177\u5217\u8868:")),console.log();let a=8,l=[];for(let u of r){let h=d.getServerToolsConfig(u),f=Object.keys(h);l.push(...f)}if(n){let u=s.map(h=>h.name);l.push(...u)}for(let u of l){let h=Bs(u);h>a&&(a=h)}a=Math.max(10,Math.min(a+2,30));let g=new ga({head:[y.bold("MCP"),y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[15,a,8,40],wordWrap:!0,style:{head:[],border:[]}});if(n)for(let u of s){let h=Dr(u.description||"",32);g.push(["customMCP",u.name,y.green("\u542F\u7528"),h])}for(let u of r){let h=d.getServerToolsConfig(u),f=Object.keys(h);if(f.length===0)g.push([y.gray(u),y.gray("-"),y.gray("-"),y.gray("\u6682\u672A\u8BC6\u522B\u5230\u76F8\u5173\u5DE5\u5177")]);else{g.length>0&&g.push([{colSpan:4,content:""}]);for(let m of f){let A=h[m],ie=A.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),te=Dr(A.description||"",32);g.push([u,m,ie,te])}}}console.log(g.toString())}else{console.log(),console.log(y.bold("MCP \u670D\u52A1\u5217\u8868:")),console.log(),n&&(console.log(`${y.cyan("\u2022")} ${y.bold("customMCP")}`),console.log(` \u7C7B\u578B: ${y.gray("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")}`),console.log(` \u914D\u7F6E: ${y.gray("xiaozhi.config.json")}`),console.log(` \u5DE5\u5177: ${y.green(s.length)} \u542F\u7528 / ${y.yellow(s.length)} \u603B\u8BA1`),console.log());for(let a of r){let l=t[a],g=d.getServerToolsConfig(a),u=Object.keys(g).length,h=Object.values(g).filter(f=>f.enable!==!1).length;console.log(`${y.cyan("\u2022")} ${y.bold(a)}`),"url"in l?("type"in l&&l.type==="sse"?console.log(` \u7C7B\u578B: ${y.gray("SSE")}`):console.log(` \u7C7B\u578B: ${y.gray("Streamable HTTP")}`),console.log(` URL: ${y.gray(l.url)}`)):console.log(` \u547D\u4EE4: ${y.gray(l.command)} ${y.gray(l.args.join(" "))}`),u>0?console.log(` \u5DE5\u5177: ${y.green(h)} \u542F\u7528 / ${y.yellow(u)} \u603B\u8BA1`):console.log(` \u5DE5\u5177: ${y.gray("\u672A\u626B\u63CF (\u8BF7\u5148\u542F\u52A8\u670D\u52A1)")}`),console.log()}}console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp list --tools' \u67E5\u770B\u6240\u6709\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> list' \u67E5\u770B\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> <\u5DE5\u5177\u540D> enable/disable' \u542F\u7528/\u7981\u7528\u5DE5\u5177"))}catch(t){e.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function qu(o){let e=Ws(`\u83B7\u53D6 ${o} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!d.getMcpServers()[o]){e.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let r=d.getServerToolsConfig(o),s=Object.keys(r);if(s.length===0){e.warn(`\u670D\u52A1 '${o}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u542F\u52A8\u670D\u52A1\u4EE5\u626B\u63CF\u5DE5\u5177\u5217\u8868"));return}e.succeed(`\u670D\u52A1 '${o}' \u5171\u6709 ${s.length} \u4E2A\u5DE5\u5177`),console.log(),console.log(y.bold(`${o} \u670D\u52A1\u5DE5\u5177\u5217\u8868:`)),console.log();let n=new ga({head:[y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(let i of s){let a=r[i],l=a.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),g=Dr(a.description||"",40);n.push([i,l,g])}console.log(n.toString()),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> enable' \u542F\u7528\u5DE5\u5177`)),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> disable' \u7981\u7528\u5DE5\u5177`))}catch(t){e.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function Gu(o,e,t){let r=t?"\u542F\u7528":"\u7981\u7528",s=Ws(`${r}\u5DE5\u5177 ${o}/${e}...`).start();try{if(!d.getMcpServers()[o]){s.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let i=d.getServerToolsConfig(o);if(!i[e]){s.fail(`\u5DE5\u5177 '${e}' \u5728\u670D\u52A1 '${o}' \u4E2D\u4E0D\u5B58\u5728`),console.log(y.yellow(`\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp ${o} list' \u67E5\u770B\u8BE5\u670D\u52A1\u7684\u6240\u6709\u5DE5\u5177`));return}d.setToolEnabled(o,e,t,i[e].description),s.succeed(`\u6210\u529F${r}\u5DE5\u5177 ${y.cyan(o)}/${y.cyan(e)}`),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A: \u5DE5\u5177\u72B6\u6001\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u670D\u52A1\u65F6\u751F\u6548"))}catch(n){s.fail(`${r}\u5DE5\u5177\u5931\u8D25`),console.error(y.red(`\u9519\u8BEF: ${n instanceof Error?n.message:String(n)}`)),process.exit(1)}}var _r=C(()=>{"use strict";se();c(Bs,"getDisplayWidth");c(Dr,"truncateToWidth");c(Bu,"listMcpServers");c(qu,"listServerTools");c(Gu,"setToolEnabled")});var ua={};re(ua,{McpCommandHandler:()=>qs});import Be from"chalk";var qs,ha=C(()=>{"use strict";la();We();qs=class extends ee{static{c(this,"McpCommandHandler")}name="mcp";description="MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406";subcommands=[{name:"list",description:"\u5217\u51FA MCP \u670D\u52A1",options:[{flags:"--tools",description:"\u663E\u793A\u6240\u6709\u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868"}],execute:c(async(e,t)=>{await this.handleList(t)},"execute")},{name:"server",description:"\u7BA1\u7406\u6307\u5B9A\u7684 MCP \u670D\u52A1",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleServer(e[0])},"execute")},{name:"tool",description:"\u542F\u7528\u6216\u7981\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",execute:c(async(e,t)=>{this.validateArgs(e,3);let[r,s,n]=e;n!=="enable"&&n!=="disable"&&(console.error(Be.red("\u9519\u8BEF: \u64CD\u4F5C\u5FC5\u987B\u662F 'enable' \u6216 'disable'")),process.exit(1));let i=n==="enable";await this.handleTool(r,s,i)},"execute")},{name:"call",description:"\u8C03\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",options:[{flags:"--args <json>",description:"\u5DE5\u5177\u53C2\u6570 (JSON \u683C\u5F0F)",defaultValue:"{}"}],execute:c(async(e,t)=>{this.validateArgs(e,2);let[r,s]=e;await this.handleCall(r,s,t.args)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(e){try{let{listMcpServers:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleServer(e){try{let{listServerTools:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleTool(e,t,r){try{let{setToolEnabled:s}=await Promise.resolve().then(()=>(_r(),Lr));await s(e,t,r)}catch(s){this.handleError(s)}}async handleCall(e,t,r){try{let s=new Nr,n=s.parseJsonArgs(r),i=await s.callTool(e,t,n);console.log(s.formatOutput(i))}catch(s){console.log(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`),console.error(Be.red("\u9519\u8BEF:"),s.message),s.message.includes("\u670D\u52A1\u672A\u542F\u52A8")?(console.log(),console.log(Be.yellow("\u{1F4A1} \u8BF7\u5148\u542F\u52A8\u670D\u52A1:")),console.log(Be.gray(" xiaozhi start # \u524D\u53F0\u542F\u52A8")),console.log(Be.gray(" xiaozhi start -d # \u540E\u53F0\u542F\u52A8"))):s.message.includes("\u53C2\u6570\u683C\u5F0F\u9519\u8BEF")&&(console.log(),console.log(Be.yellow("\u{1F4A1} \u6B63\u786E\u683C\u5F0F\u793A\u4F8B:")),console.log(Be.gray(` xiaozhi mcp call ${e} ${t} --args '{"param": "value"}'`))),process.exit(1)}}}});var pa={};re(pa,{EndpointCommandHandler:()=>Gs});import ct from"chalk";import kr from"ora";var Gs,da=C(()=>{"use strict";We();Gs=class extends ee{static{c(this,"EndpointCommandHandler")}name="endpoint";description="\u7BA1\u7406 MCP \u7AEF\u70B9";subcommands=[{name:"list",description:"\u5217\u51FA\u6240\u6709 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{await this.handleList()},"execute")},{name:"add",description:"\u6DFB\u52A0\u65B0\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleAdd(e[0])},"execute")},{name:"remove",description:"\u79FB\u9664\u6307\u5B9A\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleRemove(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E MCP \u7AEF\u70B9\uFF08\u53EF\u4EE5\u662F\u5355\u4E2A\u6216\u591A\u4E2A\uFF09",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleSet(e)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u7AEF\u70B9\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(){let e=kr("\u8BFB\u53D6\u7AEF\u70B9\u914D\u7F6E...").start();try{let r=this.getService("configManager").getMcpEndpoints();e.succeed("\u7AEF\u70B9\u5217\u8868"),r.length===0?console.log(ct.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):(console.log(ct.green(`\u5171 ${r.length} \u4E2A\u7AEF\u70B9:`)),r.forEach((s,n)=>{console.log(ct.gray(` ${n+1}. ${s}`))}))}catch(t){e.fail(`\u8BFB\u53D6\u7AEF\u70B9\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async handleAdd(e){let t=kr("\u6DFB\u52A0\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.addMcpEndpoint(e),t.succeed(`\u6210\u529F\u6DFB\u52A0\u7AEF\u70B9: ${e}`);let s=r.getMcpEndpoints();console.log(ct.gray(`\u5F53\u524D\u5171 ${s.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u6DFB\u52A0\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleRemove(e){let t=kr("\u79FB\u9664\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.removeMcpEndpoint(e),t.succeed(`\u6210\u529F\u79FB\u9664\u7AEF\u70B9: ${e}`);let s=r.getMcpEndpoints();console.log(ct.gray(`\u5F53\u524D\u5269\u4F59 ${s.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e){let t=kr("\u8BBE\u7F6E\u7AEF\u70B9...").start();try{let r=this.getService("configManager");if(e.length===1)r.updateMcpEndpoint(e[0]),t.succeed(`\u6210\u529F\u8BBE\u7F6E\u7AEF\u70B9: ${e[0]}`);else{r.updateMcpEndpoint(e),t.succeed(`\u6210\u529F\u8BBE\u7F6E ${e.length} \u4E2A\u7AEF\u70B9`);for(let[s,n]of e.entries())console.log(ct.gray(` ${s+1}. ${n}`))}}catch(r){t.fail(`\u8BBE\u7F6E\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}}});var ma={};re(ma,{UICommandHandler:()=>Xs});import qe from"chalk";import Xu from"ora";var Xs,fa=C(()=>{"use strict";We();Xs=class extends ee{static{c(this,"UICommandHandler")}name="ui";description="\u542F\u52A8\u914D\u7F6E\u7BA1\u7406\u7F51\u9875";constructor(e){super(e)}async execute(e,t){await this.handleUI()}async handleUI(){let e=Xu("\u542F\u52A8 UI \u670D\u52A1...").start();try{let t=this.getService("configManager");if(!t.configExists()){e.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(qe.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let{WebServer:r}=await Promise.resolve().then(()=>(_s(),Ls));await new r().start(),e.succeed("UI \u670D\u52A1\u5DF2\u542F\u52A8");let n=t.getWebUIPort();console.log(qe.green("\u2705 \u914D\u7F6E\u7BA1\u7406\u7F51\u9875\u5DF2\u542F\u52A8\uFF0C\u53EF\u901A\u8FC7\u4EE5\u4E0B\u5730\u5740\u8BBF\u95EE:")),console.log(qe.green(` \u672C\u5730\u8BBF\u95EE: http://localhost:${n}`)),console.log(qe.green(` \u7F51\u7EDC\u8BBF\u95EE: http://<\u4F60\u7684IP\u5730\u5740>:${n}`)),console.log(qe.yellow("\u{1F4A1} \u63D0\u793A: \u6309 Ctrl+C \u505C\u6B62\u670D\u52A1")),await this.openBrowser(`http://localhost:${n}`)}catch(t){e.fail(`\u542F\u52A8 UI \u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async openBrowser(e){try{let{spawn:t}=await import("child_process"),r;process.platform==="darwin"?r=t("open",[e],{detached:!0,stdio:"ignore"}):process.platform==="win32"?r=t("cmd",["/c","start",e],{detached:!0,stdio:"ignore"}):r=t("xdg-open",[e],{detached:!0,stdio:"ignore"}),r.on("error",()=>{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}),r.unref()}catch{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}}}});ps();import Ae from"chalk";import{Command as Ju}from"commander";Xr();var jr=class{constructor(e){this.container=e}static{c(this,"CommandHandlerFactory")}createHandlers(){return[this.createHandler("service"),this.createHandler("config"),this.createHandler("project"),this.createHandler("mcp"),this.createHandler("endpoint"),this.createHandler("ui")]}createHandler(e){switch(e){case"service":return this.createServiceCommandHandler();case"config":return this.createConfigCommandHandler();case"project":return this.createProjectCommandHandler();case"mcp":return this.createMcpCommandHandler();case"endpoint":return this.createEndpointCommandHandler();case"ui":return this.createUICommandHandler();default:throw new Error(`\u672A\u77E5\u7684\u547D\u4EE4\u5904\u7406\u5668\u7C7B\u578B: ${e}`)}}createServiceCommandHandler(){let{ServiceCommandHandler:e}=(na(),fe(sa));return new e(this.container)}createConfigCommandHandler(){let{ConfigCommandHandler:e}=(ia(),fe(oa));return new e(this.container)}createProjectCommandHandler(){let{ProjectCommandHandler:e}=(ca(),fe(aa));return new e(this.container)}createMcpCommandHandler(){let{McpCommandHandler:e}=(ha(),fe(ua));return new e(this.container)}createEndpointCommandHandler(){let{EndpointCommandHandler:e}=(da(),fe(pa));return new e(this.container)}createUICommandHandler(){let{UICommandHandler:e}=(fa(),fe(ma));return new e(this.container)}};var Hr=class{constructor(e){this.container=e;this.handlerFactory=new jr(e)}static{c(this,"CommandRegistry")}handlers=[];handlerFactory;async registerCommands(e){try{this.registerVersionCommand(e),this.registerHelpCommand(e);let t=this.handlerFactory.createHandlers();for(let r of t)this.registerHandler(r),this.registerCommand(e,r);this.registerLegacyServiceCommands(e,t)}catch(t){ve.handle(t)}}registerHandler(e){this.handlers.push(e)}registerCommand(e,t){if(t.subcommands&&t.subcommands.length>0){let r=e.command(t.name).description(t.description);for(let s of t.subcommands){let n=s.name;s.name==="get"?n="get <key>":s.name==="set"?n="set <key> <value>":s.name==="call"&&(n="call <serviceName> <toolName>");let i=r.command(n).description(s.description);if(s.options)for(let a of s.options)i.option(a.flags,a.description,a.defaultValue);i.action(async(...a)=>{try{let g=a[a.length-1].opts();await s.execute(a.slice(0,-1),g)}catch(l){ve.handle(l)}})}r.action(async(...s)=>{try{let i=s[s.length-1].opts();await t.execute(s.slice(0,-1),i)}catch(n){ve.handle(n)}})}else{let r=t.name;t.name==="create"&&(r="create <projectName>");let s=e.command(r).description(t.description);if(t.options)for(let n of t.options)s.option(n.flags,n.description,n.defaultValue);s.action(async(...n)=>{try{let a=n[n.length-1].opts();await t.execute(n.slice(0,-1),a)}catch(i){ve.handle(i)}})}}registerVersionCommand(e){let t=this.container.get("versionUtils");e.version(t.getVersion(),"-v, --version","\u663E\u793A\u7248\u672C\u4FE1\u606F"),e.option("--info","\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F"),e.option("--version-info","\u663E\u793A\u8BE6\u7EC6\u7248\u672C\u4FE1\u606F")}registerHelpCommand(e){e.helpOption("-h, --help","\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").addHelpText("after",`
96
+ `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&pr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var dr,eo=C(()=>{"use strict";M();dr=class{static{c(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=h.withTag("StatusApiHandler"),this.statusService=e}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return this.logger.debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getClientStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return this.logger.debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getRestartStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return this.logger.debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async checkClientConnected(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.json(this.createSuccessResponse({connected:t}))}catch(t){this.logger.error("\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_CONNECTION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25");return e.json(r,500)}}async getLastHeartbeat(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return this.logger.debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.json(this.createSuccessResponse({lastHeartbeat:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25:",t);let r=this.createErrorResponse("HEARTBEAT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25");return e.json(r,500)}}async getActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return this.logger.debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,500)}}async updateClientStatus(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object"){let r=this.createErrorResponse("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return e.json(r,400)}return this.statusService.updateClientInfo(t,"http-api"),this.logger.info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,400)}}async setActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await e.req.json();if(!Array.isArray(t)){let r=this.createErrorResponse("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");return e.json(r,400)}return this.statusService.setActiveMCPServers(t),this.logger.info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_UPDATE_ERROR",t instanceof Error?t.message:"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,400)}}async resetStatus(e){try{return this.logger.info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),this.logger.info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u7F6E\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_RESET_ERROR",t instanceof Error?t.message:"\u91CD\u7F6E\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}}});var nt,to=C(()=>{"use strict";nt=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(nt||{})});import _c from"ajv";import mr from"dayjs";var fr,ro=C(()=>{"use strict";M();se();Gt();Qt();to();fr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=h.withTag("ToolApiHandler"),this.ajv=new _c({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:s,args:n}=t;if(!r||!s){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}if(this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${s}\uFF0C\u53C2\u6570:`,JSON.stringify(n)),!oe.isInitialized()){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}let i=await oe.getInstance();await this.validateServiceAndTool(i,r,s),r==="customMCP"&&await this.validateCustomMCPArguments(i,s,n||{});let a;if(r==="customMCP")a=await i.callTool(s,n||{});else{let l=`${r}__${s}`;a=await i.callTool(l,n||{})}return e.json(this.createSuccessResponse(a,"\u5DE5\u5177\u8C03\u7528\u6210\u529F"))}catch(t){this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),s="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?s="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?s="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?s="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?s="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?s="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?s="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(s="TIMEOUT_ERROR");let n=this.createErrorResponse(s,r);return e.json(n,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!d.configExists()){let n=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(n,404)}let t=[],r="";try{t=d.getCustomMCPTools(),r=d.getConfigPath()}catch(n){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",n);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!d.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let n=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(n,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=d.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let s={list:r,total:r.length};return e.json(this.createSuccessResponse(s,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`))}catch(t){this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getDisabledTools(){try{let e=d.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),s=await new Ie().getAllCachedTools(),n=d.getConfig(),i=new Set(Object.keys(n.mcpServers||{})),a=[];for(let l of s){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("__")}}};a.push(u)}return this.logger.debug(`\u4ECE ${s.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${a.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),a}catch(e){return this.logger.error("\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\u5931\u8D25:",e),[]}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let s=e.getCustomMCPTools().map(n=>n.name);throw s.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: ${s.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let n=e.getCustomMCPTools().find(i=>i.name===r);n&&!n.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),n&&!n.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(s){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,s),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 n=e.getCustomMCPTools().find(l=>l.name===t);if(!n)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!n.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(n.inputSchema);if(!i(r)){let u=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(p=>{let f=p.instancePath||p.schemaPath||"",m=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 A=p.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${f} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${A}`}if(p.keyword==="enum"){let A=p.params?.allowedValues||[];return`\u53C2\u6570 ${f} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${A.join(", ")}`}return`\u53C2\u6570 ${f} ${m}`}).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(s){throw s instanceof Error&&s.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?s:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,s),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${s instanceof Error?s.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:s}=this.handleAddToolError(t);return e.json(s,r)}}isNewFormatRequest(e){return e&&typeof e=="object"&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:s}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(nt).includes(r)){let n=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(nt).join(", ")}`);return e.json(n,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,s);case"coze":return await this.handleAddCozeTool(e,s);case"http":case"function":{let n=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(n,501)}default:{let n=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(n,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:s,customDescription:n,parameterConfig:i}=t,a=this.performPreChecks(r,s,n);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,s,n,i);return d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:s,customName:n,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${s}`),!r||!s){let j=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(j,400)}if(!oe.isInitialized()){let j=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(j,503)}let a=await oe.getInstance();try{await this.validateServiceAndTool(a,r,s)}catch(j){let Dt=j instanceof Error?j.message:String(j),me=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Dt);return e.json(me,404)}let g=await new Ie().getAllCachedTools(),u=`${r}__${s}`,p=g.find(j=>j.name===u);if(!p){let j=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`);return e.json(j,404)}let f=n||u,m=d.getCustomMCPTools();if(new Set(m.map(j=>j.name)).has(f)){let j=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${f}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(j,409)}let ie={name:f,description:i||p.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:p.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:mr().format("YYYY-MM-DD HH:mm:ss")}};d.addCustomMCPTool(ie),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`);let te=d.getServerToolsConfig(r);te?.toolName&&(te[s].enable=!0,d.updateServerToolsConfig(r,te),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${f}`);let Nt={tool:ie,toolName:f,toolType:"mcp",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(Nt,`MCP \u5DE5\u5177 "${f}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:s,customDescription:n,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,s,n);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,s,n,i);d.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(g,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t){let n=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(n,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 n=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(n,400)}if(this.isNewFormatRequest(r))return await this.handleNewFormatUpdateTool(e,t,r);let s=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(s,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:s}=this.handleUpdateToolError(t);return e.json(s,r)}}async handleNewFormatUpdateTool(e,t,r){let{type:s,data:n}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${s}`),!Object.values(nt).includes(s)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${s}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(nt).join(", ")}`);return e.json(i,400)}switch(s){case"coze":return await this.handleUpdateCozeTool(e,t,n);case"mcp":case"http":case"function":{let i=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${s} \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: ${s}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:s,customName:n,customDescription:i,parameterConfig:a}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=d.getCustomMCPTools().find(m=>m.name===t);if(!g){let m=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(m,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let m=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(m,400)}!s.workflow_id&&g.handler?.config?.workflow_id&&(s.workflow_id=g.handler.config.workflow_id),!s.workflow_id&&s.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(s);let u=this.generateInputSchema(s,a),p={...g,description:i||g.description,inputSchema:u};d.updateCustomMCPTool(t,p),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let f={tool:p,toolName:t,toolType:"coze",updatedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(f,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`))}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`)}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("UPDATE_CUSTOM_TOOL_ERROR",`\u66F4\u65B0\u5DE5\u5177\u914D\u7F6E\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t){let n=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(n,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let s=d.getCustomMCPTools().find(n=>n.name===t);if(s&&s.handler.type==="mcp"){let n=s.handler.config;if(n.serviceName&&n.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`);let i=d.getServerToolsConfig(n.serviceName);i?.[n.toolName]&&(i[n.toolName].enable=!1,d.updateServerToolsConfig(n.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`))}}return d.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:s}=this.handleRemoveToolError(t);return e.json(s,r)}}convertWorkflowToTool(e,t,r,s){this.validateWorkflowData(e);let n=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(n),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,s),g=this.createHttpHandler(e),u={name:i,description:a,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[s,n]of Object.entries(t))r=r.replace(new RegExp(s,"g"),n);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:s}of t){let n=e[r];if(!n||typeof n!="string"||n.trim()==="")throw new Error(`${s}\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:s,max:n}of t){let i=e[r];if(i&&i.length>n)throw new Error(`${s}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${n}\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 s of t)if(r.includes(s))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${s}`)}resolveToolNameConflict(e){let t=d.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),s=e,n=1;for(;r.has(s);)if(s=`${e}_${n}`,n++,n>999)throw new Error(`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return s}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=d.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!d.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),this.validateProxyHandler(e.handler)}validateToolStructure(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");let t=["name","description","inputSchema","handler"];for(let r of t)if(!(r in e)||e[r]==null)throw new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\u8BA4\u8BC1\u7C7B\u578B\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E4B\u4E00: ${t.join(", ")}`);if(e.type==="bearer"){if(!e.token||typeof e.token!="string")throw new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let s=r.slice(2,-2).trim();if(!s||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s))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 s of e.parameters)t[s.fieldName]={type:s.type,description:s.description},s.required&&r.push(s.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,s]of Object.entries(t))if(e.includes(r))return s;return e}performPreChecks(e,t,r){let s=this.checkBasicParameters(e,t,r);if(s)return s;let n=this.checkSystemStatus();if(n)return n;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570")};if(typeof e!="object")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B")};if(!e.workflow_id||typeof e.workflow_id!="string"||!e.workflow_id.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(!e.workflow_name||typeof e.workflow_name!="string"||!e.workflow_name.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(t!==void 0){if(typeof t!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(t.trim()==="")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32")};if(t.length>50)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}if(r!==void 0){if(typeof r!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(r.length>200)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26")}}return null}checkSystemStatus(){try{let e=d.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=d.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,s=1024*1024;if(r>s)return{statusCode:413,errorResponse:this.createErrorResponse("PAYLOAD_TOO_LARGE","\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4")}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}}});var wt=T((tC,so)=>{"use strict";var kc="2.0.0",jc=Number.MAX_SAFE_INTEGER||9007199254740991,Hc=16,zc=250,Uc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];so.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Hc,MAX_SAFE_BUILD_LENGTH:zc,MAX_SAFE_INTEGER:jc,RELEASE_TYPES:Uc,SEMVER_SPEC_VERSION:kc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Rt=T((rC,no)=>{"use strict";var Fc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...o)=>console.error("SEMVER",...o):()=>{};no.exports=Fc});var ot=T((we,oo)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:ds,MAX_SAFE_BUILD_LENGTH:Vc,MAX_LENGTH:Wc}=wt(),Bc=Rt();we=oo.exports={};var qc=we.re=[],Gc=we.safeRe=[],v=we.src=[],Xc=we.safeSrc=[],S=we.t={},Jc=0,ms="[a-zA-Z0-9-]",Kc=[["\\s",1],["\\d",Wc],[ms,Vc]],Yc=c(o=>{for(let[e,t]of Kc)o=o.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return o},"makeSafeRegex"),P=c((o,e,t)=>{let r=Yc(e),s=Jc++;Bc(o,s,e),S[o]=s,v[s]=e,Xc[s]=r,qc[s]=new RegExp(e,t?"g":void 0),Gc[s]=new RegExp(r,t?"g":void 0)},"createToken");P("NUMERICIDENTIFIER","0|[1-9]\\d*");P("NUMERICIDENTIFIERLOOSE","\\d+");P("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${ms}*`);P("MAINVERSION",`(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})\\.(${v[S.NUMERICIDENTIFIER]})`);P("MAINVERSIONLOOSE",`(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})\\.(${v[S.NUMERICIDENTIFIERLOOSE]})`);P("PRERELEASEIDENTIFIER",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIER]})`);P("PRERELEASEIDENTIFIERLOOSE",`(?:${v[S.NONNUMERICIDENTIFIER]}|${v[S.NUMERICIDENTIFIERLOOSE]})`);P("PRERELEASE",`(?:-(${v[S.PRERELEASEIDENTIFIER]}(?:\\.${v[S.PRERELEASEIDENTIFIER]})*))`);P("PRERELEASELOOSE",`(?:-?(${v[S.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${v[S.PRERELEASEIDENTIFIERLOOSE]})*))`);P("BUILDIDENTIFIER",`${ms}+`);P("BUILD",`(?:\\+(${v[S.BUILDIDENTIFIER]}(?:\\.${v[S.BUILDIDENTIFIER]})*))`);P("FULLPLAIN",`v?${v[S.MAINVERSION]}${v[S.PRERELEASE]}?${v[S.BUILD]}?`);P("FULL",`^${v[S.FULLPLAIN]}$`);P("LOOSEPLAIN",`[v=\\s]*${v[S.MAINVERSIONLOOSE]}${v[S.PRERELEASELOOSE]}?${v[S.BUILD]}?`);P("LOOSE",`^${v[S.LOOSEPLAIN]}$`);P("GTLT","((?:<|>)?=?)");P("XRANGEIDENTIFIERLOOSE",`${v[S.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);P("XRANGEIDENTIFIER",`${v[S.NUMERICIDENTIFIER]}|x|X|\\*`);P("XRANGEPLAIN",`[v=\\s]*(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:\\.(${v[S.XRANGEIDENTIFIER]})(?:${v[S.PRERELEASE]})?${v[S.BUILD]}?)?)?`);P("XRANGEPLAINLOOSE",`[v=\\s]*(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:\\.(${v[S.XRANGEIDENTIFIERLOOSE]})(?:${v[S.PRERELEASELOOSE]})?${v[S.BUILD]}?)?)?`);P("XRANGE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAIN]}$`);P("XRANGELOOSE",`^${v[S.GTLT]}\\s*${v[S.XRANGEPLAINLOOSE]}$`);P("COERCEPLAIN",`(^|[^\\d])(\\d{1,${ds}})(?:\\.(\\d{1,${ds}}))?(?:\\.(\\d{1,${ds}}))?`);P("COERCE",`${v[S.COERCEPLAIN]}(?:$|[^\\d])`);P("COERCEFULL",v[S.COERCEPLAIN]+`(?:${v[S.PRERELEASE]})?(?:${v[S.BUILD]})?(?:$|[^\\d])`);P("COERCERTL",v[S.COERCE],!0);P("COERCERTLFULL",v[S.COERCEFULL],!0);P("LONETILDE","(?:~>?)");P("TILDETRIM",`(\\s*)${v[S.LONETILDE]}\\s+`,!0);we.tildeTrimReplace="$1~";P("TILDE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAIN]}$`);P("TILDELOOSE",`^${v[S.LONETILDE]}${v[S.XRANGEPLAINLOOSE]}$`);P("LONECARET","(?:\\^)");P("CARETTRIM",`(\\s*)${v[S.LONECARET]}\\s+`,!0);we.caretTrimReplace="$1^";P("CARET",`^${v[S.LONECARET]}${v[S.XRANGEPLAIN]}$`);P("CARETLOOSE",`^${v[S.LONECARET]}${v[S.XRANGEPLAINLOOSE]}$`);P("COMPARATORLOOSE",`^${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]})$|^$`);P("COMPARATOR",`^${v[S.GTLT]}\\s*(${v[S.FULLPLAIN]})$|^$`);P("COMPARATORTRIM",`(\\s*)${v[S.GTLT]}\\s*(${v[S.LOOSEPLAIN]}|${v[S.XRANGEPLAIN]})`,!0);we.comparatorTrimReplace="$1$2$3";P("HYPHENRANGE",`^\\s*(${v[S.XRANGEPLAIN]})\\s+-\\s+(${v[S.XRANGEPLAIN]})\\s*$`);P("HYPHENRANGELOOSE",`^\\s*(${v[S.XRANGEPLAINLOOSE]})\\s+-\\s+(${v[S.XRANGEPLAINLOOSE]})\\s*$`);P("STAR","(<|>)?=?\\s*\\*");P("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");P("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Cr=T((nC,io)=>{"use strict";var Zc=Object.freeze({loose:!0}),Qc=Object.freeze({}),el=c(o=>o?typeof o!="object"?Zc:o:Qc,"parseOptions");io.exports=el});var fs=T((iC,lo)=>{"use strict";var ao=/^[0-9]+$/,co=c((o,e)=>{if(typeof o=="number"&&typeof e=="number")return o===e?0:o<e?-1:1;let t=ao.test(o),r=ao.test(e);return t&&r&&(o=+o,e=+e),o===e?0:t&&!r?-1:r&&!t?1:o<e?-1:1},"compareIdentifiers"),tl=c((o,e)=>co(e,o),"rcompareIdentifiers");lo.exports={compareIdentifiers:co,rcompareIdentifiers:tl}});var W=T((cC,uo)=>{"use strict";var vr=Rt(),{MAX_LENGTH:go,MAX_SAFE_INTEGER:Sr}=wt(),{safeRe:Er,t:yr}=ot(),rl=Cr(),{compareIdentifiers:Cs}=fs(),vs=class o{static{c(this,"SemVer")}constructor(e,t){if(t=rl(t),e instanceof o){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>go)throw new TypeError(`version is longer than ${go} characters`);vr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Er[yr.LOOSE]:Er[yr.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>Sr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Sr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Sr||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(s=>{if(/^[0-9]+$/.test(s)){let n=+s;if(n>=0&&n<Sr)return n}return s}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(vr("SemVer.compare",this.version,this.options,e),!(e instanceof o)){if(typeof e=="string"&&e===this.version)return 0;e=new o(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof o||(e=new o(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof o||(e=new o(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],s=e.prerelease[t];if(vr("prerelease compare",t,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return Cs(r,s)}while(++t)}compareBuild(e){e instanceof o||(e=new o(e,this.options));let t=0;do{let r=this.build[t],s=e.build[t];if(vr("build compare",t,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return Cs(r,s)}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 s=`-${t}`.match(this.options.loose?Er[yr.PRERELEASELOOSE]:Er[yr.PRERELEASE]);if(!s||s[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 s=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[s];else{let n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(s)}}if(t){let n=[t,s];r===!1&&(n=[t]),Cs(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};uo.exports=vs});var Ue=T((gC,ho)=>{"use strict";var po=W(),sl=c((o,e,t=!1)=>{if(o instanceof po)return o;try{return new po(o,e)}catch(r){if(!t)return null;throw r}},"parse");ho.exports=sl});var fo=T((pC,mo)=>{"use strict";var nl=Ue(),ol=c((o,e)=>{let t=nl(o,e);return t?t.version:null},"valid");mo.exports=ol});var vo=T((dC,Co)=>{"use strict";var il=Ue(),al=c((o,e)=>{let t=il(o.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Co.exports=al});var yo=T((fC,Eo)=>{"use strict";var So=W(),cl=c((o,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new So(o instanceof So?o.version:o,t).inc(e,r,s).version}catch{return null}},"inc");Eo.exports=cl});var Mo=T((vC,Po)=>{"use strict";var To=Ue(),ll=c((o,e)=>{let t=To(o,null,!0),r=To(e,null,!0),s=t.compare(r);if(s===0)return null;let n=s>0,i=n?t:r,a=n?r:t,l=!!i.prerelease.length;if(!!a.prerelease.length&&!l){if(!a.patch&&!a.minor)return"major";if(a.compareMain(i)===0)return a.minor&&!a.patch?"minor":"patch"}let u=l?"pre":"";return t.major!==r.major?u+"major":t.minor!==r.minor?u+"minor":t.patch!==r.patch?u+"patch":"prerelease"},"diff");Po.exports=ll});var Ro=T((EC,wo)=>{"use strict";var gl=W(),ul=c((o,e)=>new gl(o,e).major,"major");wo.exports=ul});var Io=T((TC,bo)=>{"use strict";var pl=W(),hl=c((o,e)=>new pl(o,e).minor,"minor");bo.exports=hl});var Oo=T((MC,$o)=>{"use strict";var dl=W(),ml=c((o,e)=>new dl(o,e).patch,"patch");$o.exports=ml});var xo=T((RC,Ao)=>{"use strict";var fl=Ue(),Cl=c((o,e)=>{let t=fl(o,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Ao.exports=Cl});var pe=T((IC,Do)=>{"use strict";var No=W(),vl=c((o,e,t)=>new No(o,t).compare(new No(e,t)),"compare");Do.exports=vl});var _o=T((OC,Lo)=>{"use strict";var Sl=pe(),El=c((o,e,t)=>Sl(e,o,t),"rcompare");Lo.exports=El});var jo=T((xC,ko)=>{"use strict";var yl=pe(),Tl=c((o,e)=>yl(o,e,!0),"compareLoose");ko.exports=Tl});var Tr=T((DC,zo)=>{"use strict";var Ho=W(),Pl=c((o,e,t)=>{let r=new Ho(o,t),s=new Ho(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");zo.exports=Pl});var Fo=T((_C,Uo)=>{"use strict";var Ml=Tr(),wl=c((o,e)=>o.sort((t,r)=>Ml(t,r,e)),"sort");Uo.exports=wl});var Wo=T((jC,Vo)=>{"use strict";var Rl=Tr(),bl=c((o,e)=>o.sort((t,r)=>Rl(r,t,e)),"rsort");Vo.exports=bl});var bt=T((zC,Bo)=>{"use strict";var Il=pe(),$l=c((o,e,t)=>Il(o,e,t)>0,"gt");Bo.exports=$l});var Pr=T((FC,qo)=>{"use strict";var Ol=pe(),Al=c((o,e,t)=>Ol(o,e,t)<0,"lt");qo.exports=Al});var Ss=T((WC,Go)=>{"use strict";var xl=pe(),Nl=c((o,e,t)=>xl(o,e,t)===0,"eq");Go.exports=Nl});var Es=T((qC,Xo)=>{"use strict";var Dl=pe(),Ll=c((o,e,t)=>Dl(o,e,t)!==0,"neq");Xo.exports=Ll});var Mr=T((XC,Jo)=>{"use strict";var _l=pe(),kl=c((o,e,t)=>_l(o,e,t)>=0,"gte");Jo.exports=kl});var wr=T((KC,Ko)=>{"use strict";var jl=pe(),Hl=c((o,e,t)=>jl(o,e,t)<=0,"lte");Ko.exports=Hl});var ys=T((ZC,Yo)=>{"use strict";var zl=Ss(),Ul=Es(),Fl=bt(),Vl=Mr(),Wl=Pr(),Bl=wr(),ql=c((o,e,t,r)=>{switch(e){case"===":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o===t;case"!==":return typeof o=="object"&&(o=o.version),typeof t=="object"&&(t=t.version),o!==t;case"":case"=":case"==":return zl(o,t,r);case"!=":return Ul(o,t,r);case">":return Fl(o,t,r);case">=":return Vl(o,t,r);case"<":return Wl(o,t,r);case"<=":return Bl(o,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Yo.exports=ql});var Qo=T((ev,Zo)=>{"use strict";var Gl=W(),Xl=Ue(),{safeRe:Rr,t:br}=ot(),Jl=c((o,e)=>{if(o instanceof Gl)return o;if(typeof o=="number"&&(o=String(o)),typeof o!="string")return null;e=e||{};let t=null;if(!e.rtl)t=o.match(e.includePrerelease?Rr[br.COERCEFULL]:Rr[br.COERCE]);else{let l=e.includePrerelease?Rr[br.COERCERTLFULL]:Rr[br.COERCERTL],g;for(;(g=l.exec(o))&&(!t||t.index+t[0].length!==o.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],s=t[3]||"0",n=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Xl(`${r}.${s}.${n}${i}${a}`,e)},"coerce");Zo.exports=Jl});var ti=T((rv,ei)=>{"use strict";var Ts=class{static{c(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let s=this.map.keys().next().value;this.delete(s)}this.map.set(e,t)}return this}};ei.exports=Ts});var he=T((nv,oi)=>{"use strict";var Kl=/\s+/g,Ps=class o{static{c(this,"Range")}constructor(e,t){if(t=Zl(t),e instanceof o)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new o(e.raw,t);if(e instanceof Ms)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e.trim().replace(Kl," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(s=>!si(s[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let s of this.set)if(s.length===1&&og(s[0])){this.set=[s];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&&ng))+":"+e,s=ri.get(r);if(s)return s;let n=this.options.loose,i=n?J[B.HYPHENRANGELOOSE]:J[B.HYPHENRANGE];e=e.replace(i,mg(this.options.includePrerelease)),O("hyphen replace",e),e=e.replace(J[B.COMPARATORTRIM],eg),O("comparator trim",e),e=e.replace(J[B.TILDETRIM],tg),O("tilde trim",e),e=e.replace(J[B.CARETTRIM],rg),O("caret trim",e);let a=e.split(" ").map(p=>ig(p,this.options)).join(" ").split(/\s+/).map(p=>dg(p,this.options));n&&(a=a.filter(p=>(O("loose invalid filter",p,this.options),!!p.match(J[B.COMPARATORLOOSE])))),O("range list",a);let l=new Map,g=a.map(p=>new Ms(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 ri.set(r,u),u}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Range is required");return this.set.some(r=>ni(r,t)&&e.set.some(s=>ni(s,t)&&r.every(n=>s.every(i=>n.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Ql(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(fg(this.set[t],e,this.options))return!0;return!1}};oi.exports=Ps;var Yl=ti(),ri=new Yl,Zl=Cr(),Ms=It(),O=Rt(),Ql=W(),{safeRe:J,t:B,comparatorTrimReplace:eg,tildeTrimReplace:tg,caretTrimReplace:rg}=ot(),{FLAG_INCLUDE_PRERELEASE:sg,FLAG_LOOSE:ng}=wt(),si=c(o=>o.value==="<0.0.0-0","isNullSet"),og=c(o=>o.value==="","isAny"),ni=c((o,e)=>{let t=!0,r=o.slice(),s=r.pop();for(;t&&r.length;)t=r.every(n=>s.intersects(n,e)),s=r.pop();return t},"isSatisfiable"),ig=c((o,e)=>(o=o.replace(J[B.BUILD],""),O("comp",o,e),o=lg(o,e),O("caret",o),o=ag(o,e),O("tildes",o),o=ug(o,e),O("xrange",o),o=hg(o,e),O("stars",o),o),"parseComparator"),K=c(o=>!o||o.toLowerCase()==="x"||o==="*","isX"),ag=c((o,e)=>o.trim().split(/\s+/).map(t=>cg(t,e)).join(" "),"replaceTildes"),cg=c((o,e)=>{let t=e.loose?J[B.TILDELOOSE]:J[B.TILDE];return o.replace(t,(r,s,n,i,a)=>{O("tilde",o,r,s,n,i,a);let l;return K(s)?l="":K(n)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:K(i)?l=`>=${s}.${n}.0 <${s}.${+n+1}.0-0`:a?(O("replaceTilde pr",a),l=`>=${s}.${n}.${i}-${a} <${s}.${+n+1}.0-0`):l=`>=${s}.${n}.${i} <${s}.${+n+1}.0-0`,O("tilde return",l),l})},"replaceTilde"),lg=c((o,e)=>o.trim().split(/\s+/).map(t=>gg(t,e)).join(" "),"replaceCarets"),gg=c((o,e)=>{O("caret",o,e);let t=e.loose?J[B.CARETLOOSE]:J[B.CARET],r=e.includePrerelease?"-0":"";return o.replace(t,(s,n,i,a,l)=>{O("caret",o,s,n,i,a,l);let g;return K(n)?g="":K(i)?g=`>=${n}.0.0${r} <${+n+1}.0.0-0`:K(a)?n==="0"?g=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:l?(O("replaceCaret pr",l),n==="0"?i==="0"?g=`>=${n}.${i}.${a}-${l} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}-${l} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a}-${l} <${+n+1}.0.0-0`):(O("no pr"),n==="0"?i==="0"?g=`>=${n}.${i}.${a}${r} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a} <${+n+1}.0.0-0`),O("caret return",g),g})},"replaceCaret"),ug=c((o,e)=>(O("replaceXRanges",o,e),o.split(/\s+/).map(t=>pg(t,e)).join(" ")),"replaceXRanges"),pg=c((o,e)=>{o=o.trim();let t=e.loose?J[B.XRANGELOOSE]:J[B.XRANGE];return o.replace(t,(r,s,n,i,a,l)=>{O("xRange",o,r,s,n,i,a,l);let g=K(n),u=g||K(i),p=u||K(a),f=p;return s==="="&&f&&(s=""),l=e.includePrerelease?"-0":"",g?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&f?(u&&(i=0),a=0,s===">"?(s=">=",u?(n=+n+1,i=0,a=0):(i=+i+1,a=0)):s==="<="&&(s="<",u?n=+n+1:i=+i+1),s==="<"&&(l="-0"),r=`${s+n}.${i}.${a}${l}`):u?r=`>=${n}.0.0${l} <${+n+1}.0.0-0`:p&&(r=`>=${n}.${i}.0${l} <${n}.${+i+1}.0-0`),O("xRange return",r),r})},"replaceXRange"),hg=c((o,e)=>(O("replaceStars",o,e),o.trim().replace(J[B.STAR],"")),"replaceStars"),dg=c((o,e)=>(O("replaceGTE0",o,e),o.trim().replace(J[e.includePrerelease?B.GTE0PRE:B.GTE0],"")),"replaceGTE0"),mg=c(o=>(e,t,r,s,n,i,a,l,g,u,p,f)=>(K(r)?t="":K(s)?t=`>=${r}.0.0${o?"-0":""}`:K(n)?t=`>=${r}.${s}.0${o?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${o?"-0":""}`,K(g)?l="":K(u)?l=`<${+g+1}.0.0-0`:K(p)?l=`<${g}.${+u+1}.0-0`:f?l=`<=${g}.${u}.${p}-${f}`:o?l=`<${g}.${u}.${+p+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),fg=c((o,e,t)=>{for(let r=0;r<o.length;r++)if(!o[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<o.length;r++)if(O(o[r].semver),o[r].semver!==Ms.ANY&&o[r].semver.prerelease.length>0){let s=o[r].semver;if(s.major===e.major&&s.minor===e.minor&&s.patch===e.patch)return!0}return!1}return!0},"testSet")});var It=T((iv,ui)=>{"use strict";var $t=Symbol("SemVer ANY"),bs=class o{static{c(this,"Comparator")}static get ANY(){return $t}constructor(e,t){if(t=ii(t),e instanceof o){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Rs("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===$t?this.value="":this.value=this.operator+this.semver.version,Rs("comp",this)}parse(e){let t=this.options.loose?ai[ci.COMPARATORLOOSE]:ai[ci.COMPARATOR],r=e.match(t);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new li(r[2],this.options.loose):this.semver=$t}toString(){return this.value}test(e){if(Rs("Comparator.test",e,this.options.loose),this.semver===$t||e===$t)return!0;if(typeof e=="string")try{e=new li(e,this.options)}catch{return!1}return ws(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new gi(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new gi(this.value,t).test(e.semver):(t=ii(t),t.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!t.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||ws(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||ws(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};ui.exports=bs;var ii=Cr(),{safeRe:ai,t:ci}=ot(),ws=ys(),Rs=Rt(),li=W(),gi=he()});var Ot=T((cv,pi)=>{"use strict";var Cg=he(),vg=c((o,e,t)=>{try{e=new Cg(e,t)}catch{return!1}return e.test(o)},"satisfies");pi.exports=vg});var di=T((gv,hi)=>{"use strict";var Sg=he(),Eg=c((o,e)=>new Sg(o,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");hi.exports=Eg});var fi=T((pv,mi)=>{"use strict";var yg=W(),Tg=he(),Pg=c((o,e,t)=>{let r=null,s=null,n=null;try{n=new Tg(e,t)}catch{return null}return o.forEach(i=>{n.test(i)&&(!r||s.compare(i)===-1)&&(r=i,s=new yg(r,t))}),r},"maxSatisfying");mi.exports=Pg});var vi=T((dv,Ci)=>{"use strict";var Mg=W(),wg=he(),Rg=c((o,e,t)=>{let r=null,s=null,n=null;try{n=new wg(e,t)}catch{return null}return o.forEach(i=>{n.test(i)&&(!r||s.compare(i)===1)&&(r=i,s=new Mg(r,t))}),r},"minSatisfying");Ci.exports=Rg});var yi=T((fv,Ei)=>{"use strict";var Is=W(),bg=he(),Si=bt(),Ig=c((o,e)=>{o=new bg(o,e);let t=new Is("0.0.0");if(o.test(t)||(t=new Is("0.0.0-0"),o.test(t)))return t;t=null;for(let r=0;r<o.set.length;++r){let s=o.set[r],n=null;s.forEach(i=>{let a=new Is(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!n||Si(a,n))&&(n=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),n&&(!t||Si(t,n))&&(t=n)}return t&&o.test(t)?t:null},"minVersion");Ei.exports=Ig});var Pi=T((vv,Ti)=>{"use strict";var $g=he(),Og=c((o,e)=>{try{return new $g(o,e).range||"*"}catch{return null}},"validRange");Ti.exports=Og});var Ir=T((Ev,bi)=>{"use strict";var Ag=W(),Ri=It(),{ANY:xg}=Ri,Ng=he(),Dg=Ot(),Mi=bt(),wi=Pr(),Lg=wr(),_g=Mr(),kg=c((o,e,t,r)=>{o=new Ag(o,r),e=new Ng(e,r);let s,n,i,a,l;switch(t){case">":s=Mi,n=Lg,i=wi,a=">",l=">=";break;case"<":s=wi,n=_g,i=Mi,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Dg(o,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],p=null,f=null;if(u.forEach(m=>{m.semver===xg&&(m=new Ri(">=0.0.0")),p=p||m,f=f||m,s(m.semver,p.semver,r)?p=m:i(m.semver,f.semver,r)&&(f=m)}),p.operator===a||p.operator===l||(!f.operator||f.operator===a)&&n(o,f.semver))return!1;if(f.operator===l&&i(o,f.semver))return!1}return!0},"outside");bi.exports=kg});var $i=T((Tv,Ii)=>{"use strict";var jg=Ir(),Hg=c((o,e,t)=>jg(o,e,">",t),"gtr");Ii.exports=Hg});var Ai=T((Mv,Oi)=>{"use strict";var zg=Ir(),Ug=c((o,e,t)=>zg(o,e,"<",t),"ltr");Oi.exports=Ug});var Di=T((Rv,Ni)=>{"use strict";var xi=he(),Fg=c((o,e,t)=>(o=new xi(o,t),e=new xi(e,t),o.intersects(e,t)),"intersects");Ni.exports=Fg});var _i=T((Iv,Li)=>{"use strict";var Vg=Ot(),Wg=pe();Li.exports=(o,e,t)=>{let r=[],s=null,n=null,i=o.sort((u,p)=>Wg(u,p,t));for(let u of i)Vg(u,e,t)?(n=u,s||(s=u)):(n&&r.push([s,n]),n=null,s=null);s&&r.push([s,null]);let a=[];for(let[u,p]of r)u===p?a.push(u):!p&&u===i[0]?a.push("*"):p?u===i[0]?a.push(`<=${p}`):a.push(`${u} - ${p}`):a.push(`>=${u}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Fi=T(($v,Ui)=>{"use strict";var ki=he(),Os=It(),{ANY:$s}=Os,At=Ot(),As=pe(),Bg=c((o,e,t={})=>{if(o===e)return!0;o=new ki(o,t),e=new ki(e,t);let r=!1;e:for(let s of o.set){for(let n of e.set){let i=Gg(s,n,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),qg=[new Os(">=0.0.0-0")],ji=[new Os(">=0.0.0")],Gg=c((o,e,t)=>{if(o===e)return!0;if(o.length===1&&o[0].semver===$s){if(e.length===1&&e[0].semver===$s)return!0;t.includePrerelease?o=qg:o=ji}if(e.length===1&&e[0].semver===$s){if(t.includePrerelease)return!0;e=ji}let r=new Set,s,n;for(let m of o)m.operator===">"||m.operator===">="?s=Hi(s,m,t):m.operator==="<"||m.operator==="<="?n=zi(n,m,t):r.add(m.semver);if(r.size>1)return null;let i;if(s&&n){if(i=As(s.semver,n.semver,t),i>0)return null;if(i===0&&(s.operator!==">="||n.operator!=="<="))return null}for(let m of r){if(s&&!At(m,String(s),t)||n&&!At(m,String(n),t))return null;for(let A of e)if(!At(m,String(A),t))return!1;return!0}let a,l,g,u,p=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1,f=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1;p&&p.prerelease.length===1&&n.operator==="<"&&p.prerelease[0]===0&&(p=!1);for(let m of e){if(u=u||m.operator===">"||m.operator===">=",g=g||m.operator==="<"||m.operator==="<=",s){if(f&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===f.major&&m.semver.minor===f.minor&&m.semver.patch===f.patch&&(f=!1),m.operator===">"||m.operator===">="){if(a=Hi(s,m,t),a===m&&a!==s)return!1}else if(s.operator===">="&&!At(s.semver,String(m),t))return!1}if(n){if(p&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===p.major&&m.semver.minor===p.minor&&m.semver.patch===p.patch&&(p=!1),m.operator==="<"||m.operator==="<="){if(l=zi(n,m,t),l===m&&l!==n)return!1}else if(n.operator==="<="&&!At(n.semver,String(m),t))return!1}if(!m.operator&&(n||s)&&i!==0)return!1}return!(s&&g&&!n&&i!==0||n&&u&&!s&&i!==0||f||p)},"simpleSubset"),Hi=c((o,e,t)=>{if(!o)return e;let r=As(o.semver,e.semver,t);return r>0?o:r<0||e.operator===">"&&o.operator===">="?e:o},"higherGT"),zi=c((o,e,t)=>{if(!o)return e;let r=As(o.semver,e.semver,t);return r<0?o:r>0||e.operator==="<"&&o.operator==="<="?e:o},"lowerLT");Ui.exports=Bg});var qi=T((Av,Bi)=>{"use strict";var xs=ot(),Vi=wt(),Xg=W(),Wi=fs(),Jg=Ue(),Kg=fo(),Yg=vo(),Zg=yo(),Qg=Mo(),eu=Ro(),tu=Io(),ru=Oo(),su=xo(),nu=pe(),ou=_o(),iu=jo(),au=Tr(),cu=Fo(),lu=Wo(),gu=bt(),uu=Pr(),pu=Ss(),hu=Es(),du=Mr(),mu=wr(),fu=ys(),Cu=Qo(),vu=It(),Su=he(),Eu=Ot(),yu=di(),Tu=fi(),Pu=vi(),Mu=yi(),wu=Pi(),Ru=Ir(),bu=$i(),Iu=Ai(),$u=Di(),Ou=_i(),Au=Fi();Bi.exports={parse:Jg,valid:Kg,clean:Yg,inc:Zg,diff:Qg,major:eu,minor:tu,patch:ru,prerelease:su,compare:nu,rcompare:ou,compareLoose:iu,compareBuild:au,sort:cu,rsort:lu,gt:gu,lt:uu,eq:pu,neq:hu,gte:du,lte:mu,cmp:fu,coerce:Cu,Comparator:vu,Range:Su,satisfies:Eu,toComparators:yu,maxSatisfying:Tu,minSatisfying:Pu,minVersion:Mu,validRange:wu,outside:Ru,gtr:bu,ltr:Iu,intersects:$u,simplifyRange:Ou,subset:Au,SemVer:Xg,re:xs.re,src:xs.src,tokens:xs.t,SEMVER_SPEC_VERSION:Vi.SEMVER_SPEC_VERSION,RELEASE_TYPES:Vi.RELEASE_TYPES,compareIdentifiers:Wi.compareIdentifiers,rcompareIdentifiers:Wi.rcompareIdentifiers}});import{exec as xu,spawn as Nu}from"child_process";import{promisify as Du}from"util";var xt,Gi,Fe,Ns=C(()=>{"use strict";xt=Ta(qi(),1);M();z();Gi=Du(xu),Fe=class{static{c(this,"NPMManager")}logger=h.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||w()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.logger.info(`\u5F00\u59CB\u5B89\u88C5: xiaozhi-client@${e} [${t}]`),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let s=Nu("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((n,i)=>{s.stdout.on("data",a=>{let l=a.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),s.stderr.on("data",a=>{let l=a.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),s.on("close",a=>{let l=Date.now()-r;if(a===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),n();else{let g=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${a}`;console.log(g),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:g,duration:l,timestamp:Date.now()}),i(new Error(g))}})})}async getCurrentVersion(){let{stdout:e}=await Gi("npm list -g xiaozhi-client --depth=0 --json --registry=https://registry.npmmirror.com");return JSON.parse(e).dependencies?.["xiaozhi-client"]?.version||"unknown"}static VERSION_TYPES={STABLE:"stable",RC:"rc",BETA:"beta",ALL:"all"};async getAvailableVersions(e="stable"){try{let{stdout:t}=await Gi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(n=>n&&typeof n=="string"&&xt.default.valid(n));return e!=="all"&&(s=s.filter(n=>{let i=xt.default.prerelease(n);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})),s.sort((n,i)=>xt.default.rcompare(n,i))}catch(t){return this.logger.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25:",t),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],s=!1;try{s=xt.default.gt(r,e)}catch(n){this.logger.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25:",n),s=r!==e}return this.logger.info(`\u7248\u672C\u68C0\u67E5\u5B8C\u6210: \u5F53\u524D\u7248\u672C ${e}, \u6700\u65B0\u7248\u672C ${r}, \u6709\u66F4\u65B0: ${s}`),{currentVersion:e,latestVersion:r,hasUpdate:s}}catch(e){return this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",e),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});import{z as Xi}from"zod";var Lu,$r,Ji=C(()=>{"use strict";M();z();Ns();Lu=Xi.object({version:Xi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),$r=class{static{c(this,"UpdateApiHandler")}npmManager;logger=h.withTag("UpdateApiHandler");eventBus=w();activeInstalls=new Map;constructor(){this.npmManager=new Fe(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Lu.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version:s}=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(s).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:s,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 Or,Ki=C(()=>{"use strict";M();Kr();Ns();Or=class{static{c(this,"VersionApiHandler")}logger;constructor(){this.logger=h.withTag("VersionApiHandler")}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getVersion(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=xe.getVersionInfo();return this.logger.debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25");return e.json(r,500)}}async getVersionSimple(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=xe.getVersion();return this.logger.debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.json(this.createSuccessResponse({version:t}))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25");return e.json(r,500)}}async clearVersionCache(e){try{return this.logger.debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),xe.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let n=await new Fe().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${n.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:n,type:t,total:n.length}))}catch(t){this.logger.error("\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("VERSIONS_FETCH_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async checkLatestVersion(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new Fe().checkForLatestVersion();return this.logger.debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error})):e.json(this.createSuccessResponse({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate}))}catch(t){this.logger.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25:",t);let r=this.createErrorResponse("LATEST_VERSION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25");return e.json(r,500)}}}});var Ar,Yi=C(()=>{"use strict";M();se();z();Ar=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=h.withTag("NotificationService"),this.eventBus=w(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=d.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:c(s=>{t.readyState===1&&t.send(s)},"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[s,n]of this.clients)this.sendMessageToClient(n,r,s)}sendToClient(e,t,r){let s={type:t,data:r,timestamp:Date.now()},n=this.clients.get(e);n?this.sendMessageToClient(n,s,e):this.queueMessage(e,s)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let s=JSON.stringify(t);e.send(s),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(s){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,s),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:s instanceof Error?s:new Error(String(s)),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 s of t)this.sendMessageToClient(r,s,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let s={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",s)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,s)=>r+s.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var xr,Zi=C(()=>{"use strict";M();z();xr=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=h.withTag("StatusService"),this.eventBus=w()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.updateClientInfo({status:"disconnected"},"heartbeat-timeout")},this.HEARTBEAT_TIMEOUT)}clearHeartbeatTimeout(){this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=void 0)}isClientConnected(){return this.clientInfo.status==="connected"}getLastHeartbeat(){return this.clientInfo.lastHeartbeat}getActiveMCPServers(){return[...this.clientInfo.activeMCPServers]}setActiveMCPServers(e){this.updateClientInfo({activeMCPServers:[...e]},"mcp-servers-update")}setMcpEndpoint(e){this.updateClientInfo({mcpEndpoint:e},"mcp-endpoint-update")}reset(){this.logger.info("\u91CD\u7F6E\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]},this.restartStatus=void 0}destroy(){this.logger.info("\u9500\u6BC1\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.reset()}}});var Ls={};re(Ls,{WebServer:()=>Ds});import{createServer as _u}from"http";import{serve as ku}from"@hono/node-server";import{Hono as ju}from"hono";import{cors as Hu}from"hono/cors";import{WebSocketServer as zu}from"ws";var Ds,_s=C(()=>{"use strict";M();Ft();_n();se();Qt();Fn();Vn();Bn();qn();Gn();Xn();Kn();Yn();Zn();Qn();eo();ro();Ji();Ki();Mt();z();Yi();Zi();Ds=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;proxyMCPServer;xiaozhiConnectionManager;mcpServiceManager;createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}constructor(e){try{this.port=e??d.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=h.withTag("WebServer"),this.eventBus=w(),this.configService=new Pe,this.statusService=new xr,this.notificationService=new Ar,this.configApiHandler=new tr,this.statusApiHandler=new dr(this.statusService),this.serviceApiHandler=new ur(this.statusService),this.toolApiHandler=new fr,this.versionApiHandler=new Or,this.staticFileHandler=new hr,this.mcpRouteHandler=new ir,this.realtimeNotificationHandler=new lr(this.notificationService,this.statusService),this.heartbeatHandler=new or(this.statusService,this.notificationService),this.app=new ju,this.setupMiddleware(),this.setupRoutes(),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5...");let e=await this.loadConfiguration();this.mcpServiceManager=await oe.getInstance(),this.mcpServerApiHandler=new cr(this.mcpServiceManager,d),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`),await this.initializeXiaozhiConnection(e.mcpEndpoint,t),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)}}async loadConfiguration(){if(!d.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");d.cleanupInvalidServerToolsConfig();let e=d.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let s=Ln(t,r);this.mcpServiceManager.addServiceConfig(t,s)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e,t){let s=(Array.isArray(e)?e:[e]).filter(n=>n&&!n.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: ${s.length}`);try{this.xiaozhiConnectionManager=await st.getInstance({reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4}),this.mcpServiceManager&&this.xiaozhiConnectionManager&&this.xiaozhiConnectionManager.setServiceManager(this.mcpServiceManager),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(n){this.logger.error("\u274C \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n);return}if(s.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",s);try{await this.xiaozhiConnectionManager.initialize(s,t),await this.xiaozhiConnectionManager.connect(),this.xiaozhiConnectionManager.on("configChange",n=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${n.type}`,n.data)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${s.length} \u4E2A\u7AEF\u70B9`)}catch(n){this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n),this.logger.warn("\u56DE\u9000\u5230\u5355\u8FDE\u63A5\u6A21\u5F0F");let i=s[0];this.logger.debug(`\u521D\u59CB\u5316\u5355\u4E2A\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5: ${i}`),this.proxyMCPServer=new be(i),this.mcpServiceManager&&this.proxyMCPServer.setServiceManager(this.mcpServiceManager),await this.connectWithRetry(()=>this.proxyMCPServer.connect(),"\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5"),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")}}else try{this.xiaozhiConnectionManager&&(await this.xiaozhiConnectionManager.initialize([],t),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u521D\u59CB\u5316\u4E3A\u7A7A\u7BA1\u7406\u5668\uFF0C\u652F\u6301\u52A8\u6001\u6DFB\u52A0\u7AEF\u70B9"))}catch(n){this.logger.error("\u274C \u7A7A\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n)}}getXiaozhiConnectionStatus(){return this.xiaozhiConnectionManager?{type:"multi-endpoint",manager:{connectedConnections:this.xiaozhiConnectionManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.xiaozhiConnectionManager.getConnectionStatus().length,healthCheckStats:{},reconnectStats:this.xiaozhiConnectionManager.getReconnectStats()},connections:this.xiaozhiConnectionManager.getConnectionStatus()}:this.proxyMCPServer?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async handleEndpointStatus(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).getEndpointStatus(e)}async handleEndpointConnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).connectEndpoint(e)}async handleEndpointDisconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).disconnectEndpoint(e)}async handleEndpointReconnect(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).reconnectEndpoint(e)}async handleEndpointAdd(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return await new Oe(this.xiaozhiConnectionManager,d).addEndpoint(e)}async handleEndpointRemove(e){if(!this.xiaozhiConnectionManager){let r=this.createErrorResponse("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new Oe(this.xiaozhiConnectionManager,d).removeEndpoint(e)}async connectWithRetry(e,t,r=5,s=1e3,n=3e4,i=2){let a=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(g){if(a=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let u=Math.min(s*i**(l-1),n);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: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",Hu({origin:"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})),this.app?.onError((e,t)=>{this.logger.error("HTTP request error:",e);let r=this.createErrorResponse("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?e.stack:void 0);return t.json(r,500)})}setupRoutes(){this.app?.get("/api/config",t=>this.configApiHandler.getConfig(t)),this.app?.put("/api/config",t=>this.configApiHandler.updateConfig(t)),this.app?.get("/api/config/mcp-endpoint",t=>this.configApiHandler.getMcpEndpoint(t)),this.app?.get("/api/config/mcp-endpoints",t=>this.configApiHandler.getMcpEndpoints(t)),this.app?.get("/api/config/mcp-servers",t=>this.configApiHandler.getMcpServers(t)),this.app?.get("/api/config/connection",t=>this.configApiHandler.getConnectionConfig(t)),this.app?.post("/api/config/reload",t=>this.configApiHandler.reloadConfig(t)),this.app?.get("/api/config/path",t=>this.configApiHandler.getConfigPath(t)),this.app?.get("/api/config/exists",t=>this.configApiHandler.checkConfigExists(t)),this.app?.get("/api/version",t=>this.versionApiHandler.getVersion(t)),this.app?.get("/api/version/simple",t=>this.versionApiHandler.getVersionSimple(t)),this.app?.get("/api/version/available",t=>this.versionApiHandler.getAvailableVersions(t)),this.app?.get("/api/version/latest",t=>this.versionApiHandler.checkLatestVersion(t)),this.app?.post("/api/version/cache/clear",t=>this.versionApiHandler.clearVersionCache(t));let e=new $r;this.app?.post("/api/update",t=>e.performUpdate(t)),this.app?.get("/api/status",t=>this.statusApiHandler.getStatus(t)),this.app?.get("/api/status/client",t=>this.statusApiHandler.getClientStatus(t)),this.app?.get("/api/status/restart",t=>this.statusApiHandler.getRestartStatus(t)),this.app?.get("/api/status/connected",t=>this.statusApiHandler.checkClientConnected(t)),this.app?.get("/api/status/heartbeat",t=>this.statusApiHandler.getLastHeartbeat(t)),this.app?.get("/api/status/mcp-servers",t=>this.statusApiHandler.getActiveMCPServers(t)),this.app?.put("/api/status/client",t=>this.statusApiHandler.updateClientStatus(t)),this.app?.put("/api/status/mcp-servers",t=>this.statusApiHandler.setActiveMCPServers(t)),this.app?.post("/api/status/reset",t=>this.statusApiHandler.resetStatus(t)),this.app?.post("/api/services/restart",t=>this.serviceApiHandler.restartService(t)),this.app?.post("/api/services/stop",t=>this.serviceApiHandler.stopService(t)),this.app?.post("/api/services/start",t=>this.serviceApiHandler.startService(t)),this.app?.get("/api/services/status",t=>this.serviceApiHandler.getServiceStatus(t)),this.app?.get("/api/services/health",t=>this.serviceApiHandler.getServiceHealth(t)),this.app?.post("/api/tools/call",t=>this.toolApiHandler.callTool(t)),this.app?.get("/api/tools/list",t=>this.toolApiHandler.listTools(t)),this.app?.get("/api/tools/custom",t=>this.toolApiHandler.getCustomTools(t)),this.app?.post("/api/tools/custom",t=>this.toolApiHandler.addCustomTool(t)),this.app?.put("/api/tools/custom/:toolName",t=>this.toolApiHandler.updateCustomTool(t)),this.app?.delete("/api/tools/custom/:toolName",t=>this.toolApiHandler.removeCustomTool(t)),this.app?.get("/api/coze/workspaces",t=>He.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>He.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>He.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>He.getCacheStats(t)),this.app?.post("/api/endpoint/status",t=>this.handleEndpointStatus(t)),this.app?.post("/api/endpoint/connect",t=>this.handleEndpointConnect(t)),this.app?.post("/api/endpoint/disconnect",t=>this.handleEndpointDisconnect(t)),this.app?.post("/api/endpoint/reconnect",t=>this.handleEndpointReconnect(t)),this.app?.post("/api/endpoint/add",t=>this.handleEndpointAdd(t)),this.app?.post("/api/endpoint/remove",t=>this.handleEndpointRemove(t)),this.app?.post("/api/mcp-servers",t=>this.mcpServerApiHandler?.addMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.delete("/api/mcp-servers/:serverName",t=>this.mcpServerApiHandler?.removeMCPServer(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers/:serverName/status",t=>this.mcpServerApiHandler?.getMCPServerStatus(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.get("/api/mcp-servers",t=>this.mcpServerApiHandler?.listMCPServers(t)||t.json({error:"MCP Server API Handler not initialized"},500)),this.app?.post("/mcp",t=>this.mcpRouteHandler.handlePost(t)),this.app?.get("/mcp",t=>this.mcpRouteHandler.handleGet(t)),this.app?.all("/api/*",async t=>{let r=this.createErrorResponse("API_NOT_FOUND",`API \u7AEF\u70B9\u4E0D\u5B58\u5728: ${t.req.path}`);return t.json(r,404)}),this.app.get("*",t=>this.staticFileHandler.handleStaticFile(t))}setupWebSocket(){this.wss&&this.wss.on("connection",e=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let s=JSON.parse(r.toString());s.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,s,t):await this.realtimeNotificationHandler.handleMessage(e,s,t)}catch(s){this.logger.error("WebSocket message error:",s);let n={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:s instanceof Error?s.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(n))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}let e=ku({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:_u});this.httpServer=e,this.wss=new zu({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://0.0.0.0:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`),await this.initializeConnections()}stop(){return new Promise(e=>{let t=!1,r=c(()=>{t||(t=!0,e())},"doResolve");if(this.proxyMCPServer?.disconnect(),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let s of this.wss.clients)s.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(),Zs(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});var Qi={};re(Qi,{ServiceManagerImpl:()=>ks});var ks,ea=C(()=>{"use strict";Ce();Ye();dt();Ht();ks=class{constructor(e,t,r){this.processManager=e;this.configManager=t;this.logger=r}static{c(this,"ServiceManagerImpl")}async start(e){try{this.validateStartOptions(e),this.processManager.cleanupContainerState();let t=this.getStatus();if(t.running){console.log(`\u68C0\u6D4B\u5230\u670D\u52A1\u5DF2\u5728\u8FD0\u884C (PID: ${t.pid})\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u542F...`);try{await this.processManager.gracefulKillProcess(t.pid),this.processManager.cleanupPidFile(),await new Promise(r=>setTimeout(r,1e3)),console.log("\u73B0\u6709\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u6B63\u5728\u542F\u52A8\u65B0\u670D\u52A1...")}catch(r){console.warn(`\u505C\u6B62\u73B0\u6709\u670D\u52A1\u65F6\u51FA\u73B0\u8B66\u544A: ${r instanceof Error?r.message:String(r)}`)}}switch(this.checkEnvironment(),e.mode){case"mcp-server":await this.startMcpServerMode(e);break;case"stdio":await this.startStdioMode(e);break;case"normal":await this.startNormalMode(e);break;default:await this.startNormalMode(e);break}}catch(t){throw t instanceof _?t:_.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw _.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile()}catch(e){throw e instanceof _?e:new _(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restart(e){try{this.getStatus().running&&(await this.stop(),await new Promise(r=>setTimeout(r,1e3))),await this.start(e)}catch(t){throw new _(`\u91CD\u542F\u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}getStatus(){return this.processManager.getServiceStatus()}validateStartOptions(e){if(e.port!==void 0&&le.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new _(`\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F: ${e.mode}`)}checkEnvironment(){if(!this.configManager.configExists())throw ke.configNotFound();try{if(!this.configManager.getConfig())throw new ke("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof ke?e:new ke(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${e instanceof Error?e.message:String(e)}`)}}async startNormalMode(e){let{spawn:t}=await import("child_process");e.daemon?await this.startWebServerInDaemon(e.ui||!1):await this.startWebServerInForeground(e.ui||!1)}async startMcpServerMode(e){let t=e.port||3e3,{spawn:r}=await import("child_process");if(e.daemon){let s=L.getExecutablePath("cli"),n=r("node",[s,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(n.pid,"daemon"),n.unref(),console.log(`\u2705 MCP Server \u5DF2\u5728\u540E\u53F0\u542F\u52A8 (PID: ${n.pid}, Port: ${t})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),process.exit(0)}else{let{MCPServer:s}=await Promise.resolve().then(()=>(An(),On)),n=new s(t),i=c(async()=>{await n.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i),await n.start()}}async startStdioMode(e){let{spawn:t}=await import("child_process"),r=L.getMcpServerProxyPath(),s=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir()}});this.processManager.savePidInfo(s.pid,"foreground")}async startWebServerInDaemon(e){let{spawn:t}=await import("child_process"),r=L.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(r))throw new _(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${r}`);let n=[r];e&&n.push("--open-browser");let i=t("node",n,{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:L.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(i.pid,"daemon"),i.unref(),console.log(`\u2705 \u540E\u53F0\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${i.pid})`),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi status' \u67E5\u770B\u72B6\u6001"),console.log("\u{1F4A1} \u4F7F\u7528 'xiaozhi attach' \u67E5\u770B\u65E5\u5FD7"),process.exit(0)}async startWebServerInForeground(e){let{WebServer:t}=await Promise.resolve().then(()=>(_s(),Ls)),r=new t,s=c(async()=>{await r.stop(),this.processManager.cleanupPidFile(),process.exit(0)},"cleanup");if(process.on("SIGINT",s),process.on("SIGTERM",s),this.processManager.savePidInfo(process.pid,"foreground"),await r.start(),e){let i=this.configManager.getConfig()?.webServer?.port||9999;await this.openBrowserUrl(`http://localhost:${i}`)}}async openBrowserUrl(e){try{let{spawn:t}=await import("child_process"),r=ne.getCurrentPlatform(),s,n;r==="darwin"?(s="open",n=[e]):r==="win32"?(s="start",n=["",e]):(s="xdg-open",n=[e]),t(s,n,{detached:!0,stdio:"ignore"}),console.log(`\u{1F310} \u5DF2\u5C1D\u8BD5\u6253\u5F00\u6D4F\u89C8\u5668: ${e}`)}catch{console.log(`\u26A0\uFE0F \u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`)}}}});var ta={};re(ta,{TemplateManagerImpl:()=>js});import Uu from"fs";import Ve from"path";var js,ra=C(()=>{"use strict";Ce();ht();Ye();Ht();js=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=L.findTemplatesDir();if(!e)return[];let t=[],r=Uu.readdirSync(e,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);for(let s of r)try{let n=await this.getTemplateInfo(s);n&&t.push(n)}catch{console.warn(`\u8DF3\u8FC7\u65E0\u6548\u6A21\u677F: ${s}`)}return t}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",L.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(le.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=L.getTemplatePath(e);if(!t)return null;let r=Ve.join(t,"template.json"),s={};if($.exists(r))try{let a=$.readFile(r);s=JSON.parse(a)}catch{console.warn(`\u6A21\u677F\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}`)}let n=this.getTemplateFiles(t),i={name:e,path:t,description:s.description||`${e} \u6A21\u677F`,version:s.version||"1.0.0",author:s.author,files:n};return this.templateCache.set(e,i),i}catch(t){throw t instanceof I?t:new R(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:Ve.basename(t)})}async createProject(e){try{this.validateCreateOptions(e);let t=e.templateName||"default",r=await this.getTemplateInfo(t);if(!r)throw new R(`\u6A21\u677F\u4E0D\u5B58\u5728: ${t}`,"");let s=Ve.resolve(e.targetPath);if($.exists(s))throw R.alreadyExists(s);$.ensureDir(s),await this.copyTemplateFiles(r,s,e),await this.processTemplateVariables(s,e),console.log(`\u2705 \u9879\u76EE\u521B\u5EFA\u6210\u529F: ${s}`)}catch(t){throw t instanceof R||t instanceof I?t:new R(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,e.targetPath)}}async validateTemplate(e){try{let t=await this.getTemplateInfo(e);if(!t)return!1;let r=["package.json"];for(let s of r){let n=Ve.join(t.path,s);if(!$.exists(n))return console.warn(`\u6A21\u677F\u7F3A\u5C11\u5FC5\u8981\u6587\u4EF6: ${s}`),!1}return!0}catch{return!1}}clearCache(){this.templateCache.clear()}getTemplateFiles(e){try{return $.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let s=Ve.relative(e,r);return!s.startsWith(".")&&s!=="template.json"&&!s.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){le.validateRequired(e.targetPath,"targetPath"),le.validateRequired(e.projectName,"projectName"),le.validateProjectName(e.projectName),e.templateName&&le.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{$.copyDirectory(e.path,t,{exclude:["template.json",".git","node_modules"],overwrite:!1,recursive:!0})}catch(s){throw new R(`\u590D\u5236\u6A21\u677F\u6587\u4EF6\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`,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},s=["package.json","README.md","src/**/*.ts","src/**/*.js","src/**/*.json"];for(let n of s){let i=this.findFilesByPattern(e,n);for(let a of i)await this.replaceVariablesInFile(a,r)}}catch(r){console.warn(`\u5904\u7406\u6A21\u677F\u53D8\u91CF\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}findFilesByPattern(e,t){try{if(!t.includes("*")){let n=Ve.join(e,t);return $.exists(n)?[n]:[]}let r=$.listDirectory(e,{recursive:!0}),s=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(n=>{let i=Ve.relative(e,n);return s.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=$.readFile(e),s=!1;for(let[n,i]of Object.entries(t)){let a=new RegExp(`{{\\s*${n}\\s*}}`,"g");a.test(r)&&(r=r.replace(a,i),s=!0)}s&&$.writeFile(e,r,{overwrite:!0})}catch(r){console.warn(`\u66FF\u6362\u6587\u4EF6\u53D8\u91CF\u5931\u8D25 ${e}: ${r instanceof Error?r.message:String(r)}`)}}}});async function ze(){return Hs.create()}var Hs,hs=C(()=>{"use strict";M();se();Xr();ht();Jr();Ye();dt();Ht();Kr();Hs=class o{static{c(this,"DIContainer")}instances=new Map;factories=new Map;asyncFactories=new Map;singletons=new Set;register(e,t,r=!1){this.factories.set(e,t),r&&this.singletons.add(e)}registerSingleton(e,t){this.register(e,t,!0)}registerInstance(e,t){this.instances.set(e,t),this.singletons.add(e)}get(e){if(this.singletons.has(e)&&this.instances.has(e))return this.instances.get(e);let t=this.factories.get(e);if(!t)throw new Error(`Service ${e} not registered`);let r=t();return this.singletons.has(e)&&this.instances.set(e,r),r}has(e){return this.factories.has(e)||this.instances.has(e)}clear(){this.instances.clear(),this.factories.clear(),this.singletons.clear()}getRegisteredKeys(){let e=Array.from(this.factories.keys()),t=Array.from(this.instances.keys());return[...new Set([...e,...t])]}static create(){let e=new o;return e.registerSingleton("versionUtils",()=>xe),e.registerSingleton("platformUtils",()=>ne),e.registerSingleton("formatUtils",()=>Ke),e.registerSingleton("fileUtils",()=>$),e.registerSingleton("pathUtils",()=>L),e.registerSingleton("validation",()=>le),e.registerSingleton("configManager",()=>d),e.registerSingleton("logger",()=>h),e.registerSingleton("errorHandler",()=>ve),e.registerSingleton("processManager",()=>{let t=(Yr(),fe(an));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(gn(),fe(ln)),r=e.get("processManager"),s=e.get("logger");return new t.DaemonManagerImpl(r,s)}),e.registerSingleton("serviceManager",()=>{let t=(ea(),fe(Qi)),r=e.get("processManager"),s=e.get("configManager"),n=e.get("logger");return new t.ServiceManagerImpl(r,s,n)}),e.registerSingleton("templateManager",()=>{let t=(ra(),fe(ta));return new t.TemplateManagerImpl}),e}};c(ze,"createContainer")});var ee,We=C(()=>{"use strict";ee=class{constructor(e){this.container=e}static{c(this,"BaseCommandHandler")}options;subcommands;getService(e){return this.container.get(e)}handleError(e){this.getService("errorHandler").handle(e)}validateArgs(e,t){if(e.length<t)throw new Error(`\u547D\u4EE4\u9700\u8981\u81F3\u5C11 ${t} \u4E2A\u53C2\u6570\uFF0C\u4F46\u53EA\u63D0\u4F9B\u4E86 ${e.length} \u4E2A`)}}});var sa={};re(sa,{ServiceCommandHandler:()=>zs});var zs,na=C(()=>{"use strict";M();We();zs=class extends ee{static{c(this,"ServiceCommandHandler")}name="service";description="\u670D\u52A1\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"start",description:"\u542F\u52A8\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"},{flags:"--debug",description:"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F (\u8F93\u51FADEBUG\u7EA7\u522B\u65E5\u5FD7)"},{flags:"--stdio",description:"\u4EE5 stdio \u6A21\u5F0F\u8FD0\u884C MCP Server (\u7528\u4E8E Cursor \u7B49\u5BA2\u6237\u7AEF)"}],execute:c(async(e,t)=>{await this.handleStart(t)},"execute")},{name:"stop",description:"\u505C\u6B62\u670D\u52A1",execute:c(async(e,t)=>{await this.handleStop()},"execute")},{name:"status",description:"\u68C0\u67E5\u670D\u52A1\u72B6\u6001",execute:c(async(e,t)=>{await this.handleStatus()},"execute")},{name:"restart",description:"\u91CD\u542F\u670D\u52A1",options:[{flags:"-d, --daemon",description:"\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1"},{flags:"-u, --ui",description:"\u540C\u65F6\u542F\u52A8 Web UI \u670D\u52A1"}],execute:c(async(e,t)=>{await this.handleRestart(t)},"execute")},{name:"attach",description:"\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7",execute:c(async(e,t)=>{await this.handleAttach()},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u670D\u52A1\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleStart(e){try{e.debug&&Ys("debug");let t=this.getService("serviceManager");e.stdio?await this.startStdioMode():await t.start({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleStop(){try{await this.getService("serviceManager").stop()}catch(e){this.handleError(e)}}async handleStatus(){try{let t=await this.getService("serviceManager").getStatus();t.running?(console.log(`\u2705 \u670D\u52A1\u6B63\u5728\u8FD0\u884C (PID: ${t.pid})`),t.uptime&&console.log(`\u23F1\uFE0F \u8FD0\u884C\u65F6\u95F4: ${t.uptime}`),t.mode&&console.log(`\u{1F527} \u8FD0\u884C\u6A21\u5F0F: ${t.mode}`)):console.log("\u274C \u670D\u52A1\u672A\u8FD0\u884C")}catch(e){this.handleError(e)}}async handleRestart(e){try{await this.getService("serviceManager").restart({daemon:e.daemon||!1,ui:e.ui||!1})}catch(t){this.handleError(t)}}async handleAttach(){try{await this.getService("daemonManager").attachToLogs()}catch(e){this.handleError(e)}}async startStdioMode(){let{spawn:e}=await import("child_process"),{fileURLToPath:t}=await import("url"),r=await import("path"),s=t(import.meta.url),n=r.dirname(s),i=r.join(n,"mcpServerProxy.js");e("node",[i],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}})}}});var oa={};re(oa,{ConfigCommandHandler:()=>Fs});import Fu from"path";import N from"chalk";import Us from"ora";var Fs,ia=C(()=>{"use strict";We();Fs=class extends ee{static{c(this,"ConfigCommandHandler")}name="config";description="\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4";subcommands=[{name:"init",description:"\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6",options:[{flags:"-f, --format <format>",description:"\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F (json, json5, jsonc)",defaultValue:"json"}],execute:c(async(e,t)=>{await this.handleInit(t)},"execute")},{name:"get",description:"\u67E5\u770B\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleGet(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E\u914D\u7F6E\u503C",execute:c(async(e,t)=>{this.validateArgs(e,2),await this.handleSet(e[0],e[1])},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("\u914D\u7F6E\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleInit(e){let t=Us("\u521D\u59CB\u5316\u914D\u7F6E...").start();try{let r=e.format;if(r!=="json"&&r!=="json5"&&r!=="jsonc")throw new Error("\u683C\u5F0F\u5FC5\u987B\u662F json, json5 \u6216 jsonc");let s=this.getService("configManager");if(s.configExists()){t.warn("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728"),console.log(N.yellow("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u5220\u9664\u73B0\u6709\u7684\u914D\u7F6E\u6587\u4EF6"));return}s.initConfig(r),t.succeed("\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u6210\u529F");let n=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),i=`xiaozhi.config.${r}`,a=Fu.join(n,i);console.log(N.green(`\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u521B\u5EFA: ${i}`)),console.log(N.yellow("\u{1F4DD} \u8BF7\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9:")),console.log(N.gray(` \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${a}`)),console.log(N.yellow("\u{1F4A1} \u6216\u8005\u4F7F\u7528\u547D\u4EE4\u8BBE\u7F6E:")),console.log(N.gray(" xiaozhi config set mcpEndpoint <your-endpoint-url>"))}catch(r){t.fail(`\u521D\u59CB\u5316\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleGet(e){let t=Us("\u8BFB\u53D6\u914D\u7F6E...").start();try{let r=this.getService("configManager");if(!r.configExists()){t.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let s=r.getConfig();switch(e){case"mcpEndpoint":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let n=r.getMcpEndpoints();n.length===0?console.log(N.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):n.length===1?console.log(N.green(`MCP \u7AEF\u70B9: ${n[0]}`)):(console.log(N.green(`MCP \u7AEF\u70B9 (${n.length} \u4E2A):`)),n.forEach((i,a)=>{console.log(N.gray(` ${a+1}. ${i}`))}));break}case"mcpServers":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green("MCP \u670D\u52A1:"));for(let[n,i]of Object.entries(s.mcpServers)){let a=i;"type"in a&&a.type==="sse"?console.log(N.gray(` ${n}: [SSE] ${a.url}`)):console.log(N.gray(` ${n}: ${a.command} ${a.args.join(" ")}`))}break;case"connection":{t.succeed("\u914D\u7F6E\u4FE1\u606F");let n=r.getConnectionConfig();console.log(N.green("\u8FDE\u63A5\u914D\u7F6E:")),console.log(N.gray(` \u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${n.heartbeatInterval}ms`)),console.log(N.gray(` \u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${n.heartbeatTimeout}ms`)),console.log(N.gray(` \u91CD\u8FDE\u95F4\u9694: ${n.reconnectInterval}ms`));break}case"heartbeatInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694: ${r.getHeartbeatInterval()}ms`));break;case"heartbeatTimeout":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4: ${r.getHeartbeatTimeout()}ms`));break;case"reconnectInterval":t.succeed("\u914D\u7F6E\u4FE1\u606F"),console.log(N.green(`\u91CD\u8FDE\u95F4\u9694: ${r.getReconnectInterval()}ms`));break;default:t.fail(`\u672A\u77E5\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u7684\u914D\u7F6E\u9879: mcpEndpoint, mcpServers, connection, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(r){t.fail(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e,t){let r=Us("\u66F4\u65B0\u914D\u7F6E...").start();try{let s=this.getService("configManager");if(!s.configExists()){r.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(N.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}switch(e){case"mcpEndpoint":s.updateMcpEndpoint(t),r.succeed(`MCP \u7AEF\u70B9\u5DF2\u8BBE\u7F6E\u4E3A: ${t}`);break;case"heartbeatInterval":{let n=Number.parseInt(t);if(Number.isNaN(n)||n<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");s.updateHeartbeatInterval(n),r.succeed(`\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${n}ms`);break}case"heartbeatTimeout":{let n=Number.parseInt(t);if(Number.isNaN(n)||n<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u662F\u6B63\u6574\u6570");s.updateHeartbeatTimeout(n),r.succeed(`\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5DF2\u8BBE\u7F6E\u4E3A: ${n}ms`);break}case"reconnectInterval":{let n=Number.parseInt(t);if(Number.isNaN(n)||n<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u662F\u6B63\u6574\u6570");s.updateReconnectInterval(n),r.succeed(`\u91CD\u8FDE\u95F4\u9694\u5DF2\u8BBE\u7F6E\u4E3A: ${n}ms`);break}default:r.fail(`\u4E0D\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: ${e}`),console.log(N.yellow("\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: mcpEndpoint, heartbeatInterval, heartbeatTimeout, reconnectInterval"))}}catch(s){r.fail(`\u8BBE\u7F6E\u914D\u7F6E\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`),this.handleError(s)}}}});var aa={};re(aa,{ProjectCommandHandler:()=>Vs});import Vu from"path";import H from"chalk";import Wu from"ora";var Vs,ca=C(()=>{"use strict";We();Vs=class extends ee{static{c(this,"ProjectCommandHandler")}name="create";description="\u521B\u5EFA\u9879\u76EE";options=[{flags:"-t, --template <templateName>",description:"\u4F7F\u7528\u6307\u5B9A\u6A21\u677F\u521B\u5EFA\u9879\u76EE"}];constructor(e){super(e)}async execute(e,t){this.validateArgs(e,1);let r=e[0];await this.handleCreate(r,t)}async handleCreate(e,t){let r=Wu("\u521D\u59CB\u5316\u9879\u76EE...").start();try{let s=this.getService("templateManager"),n=this.getService("fileUtils"),i=Vu.join(process.cwd(),e);if(await n.exists(i)){r.fail(`\u76EE\u5F55 "${e}" \u5DF2\u5B58\u5728`),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u9009\u62E9\u4E0D\u540C\u7684\u9879\u76EE\u540D\u79F0\u6216\u5220\u9664\u73B0\u6709\u76EE\u5F55"));return}t.template?await this.createFromTemplate(e,t.template,i,r,s):await this.createBasicProject(e,i,r,s)}catch(s){r.fail(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`),this.handleError(s)}}async createFromTemplate(e,t,r,s,n){s.text="\u68C0\u67E5\u6A21\u677F...";let i=await n.getAvailableTemplates();if(i.length===0){s.fail("\u627E\u4E0D\u5230\u53EF\u7528\u6A21\u677F"),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u786E\u4FDD xiaozhi-client \u6B63\u786E\u5B89\u88C5"));return}let a=t;if(!await n.validateTemplate(a)){s.fail(`\u6A21\u677F "${a}" \u4E0D\u5B58\u5728`);let g=this.findSimilarTemplate(a,i);if(g)if(console.log(H.yellow(`\u{1F4A1} \u4F60\u662F\u60F3\u4F7F\u7528\u6A21\u677F "${g}" \u5417\uFF1F`)),await this.askUserConfirmation(H.cyan("\u786E\u8BA4\u4F7F\u7528\u6B64\u6A21\u677F\uFF1F(y/n): ")))a=g;else{this.showAvailableTemplates(i);return}else{this.showAvailableTemplates(i);return}}s.text=`\u4ECE\u6A21\u677F "${a}" \u521B\u5EFA\u9879\u76EE "${e}"...`,await n.createProject({templateName:a,targetPath:r,projectName:e}),s.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" pnpm install # \u5B89\u88C5\u4F9D\u8D56")),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1"))}async createBasicProject(e,t,r,s){r.text=`\u521B\u5EFA\u57FA\u672C\u9879\u76EE "${e}"...`,await s.createProject({templateName:null,targetPath:t,projectName:e}),r.succeed(`\u9879\u76EE "${e}" \u521B\u5EFA\u6210\u529F`),console.log(H.green("\u2705 \u57FA\u672C\u9879\u76EE\u521B\u5EFA\u5B8C\u6210!")),console.log(H.yellow("\u{1F4DD} \u63A5\u4E0B\u6765\u7684\u6B65\u9AA4:")),console.log(H.gray(` cd ${e}`)),console.log(H.gray(" # \u7F16\u8F91 xiaozhi.config.json \u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9\u548C\u670D\u52A1")),console.log(H.gray(" xiaozhi start # \u542F\u52A8\u670D\u52A1")),console.log(H.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 --template \u9009\u9879\u53EF\u4EE5\u4ECE\u6A21\u677F\u521B\u5EFA\u9879\u76EE"))}showAvailableTemplates(e){console.log(H.yellow("\u53EF\u7528\u7684\u6A21\u677F:"));for(let t of e)console.log(H.gray(` - ${t}`))}findSimilarTemplate(e,t){let r=this.getService("formatUtils"),s=null,n=0;for(let i of t){let a=r.calculateSimilarity(e.toLowerCase(),i.toLowerCase());a>n&&a>.6&&(n=a,s=i)}return s}async askUserConfirmation(e){let r=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise(s=>{r.question(e,n=>{r.close(),s(n.toLowerCase().trim()==="y"||n.toLowerCase().trim()==="yes")})})}}});var Nr,la=C(()=>{"use strict";M();Yr();se();Nr=class{static{c(this,"ToolCallService")}logger;processManager;baseUrl;constructor(){this.logger=h.withTag("ToolCallService"),this.processManager=new mt;try{let e=d.getWebUIPort()??9999;this.baseUrl=`http://localhost:${e}`}catch{this.baseUrl="http://localhost:9999"}}async callTool(e,t,r){await this.validateServiceStatus();try{let s=await fetch(`${this.baseUrl}/api/tools/call`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceName:e,toolName:t,args:r})});if(!s.ok){let i=await s.json();throw new Error(i.error?.message||`HTTP ${s.status}: ${s.statusText}`)}let n=await s.json();if(!n.success)throw new Error(n.error?.message||"\u5DE5\u5177\u8C03\u7528\u5931\u8D25");return n.data}catch(s){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`,s instanceof Error?s.message:String(s)),s}}parseJsonArgs(e){try{return JSON.parse(e)}catch(t){throw new Error(`\u53C2\u6570\u683C\u5F0F\u9519\u8BEF\uFF0C\u8BF7\u4F7F\u7528\u6709\u6548\u7684 JSON \u683C\u5F0F\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}async validateServiceStatus(){if(!this.processManager.getServiceStatus().running)throw new Error("xiaozhi \u670D\u52A1\u672A\u542F\u52A8\u3002\u8BF7\u5148\u8FD0\u884C 'xiaozhi start' \u6216 'xiaozhi start -d' \u542F\u52A8\u670D\u52A1\u3002");try{let t=await fetch(`${this.baseUrl}/api/status`,{method:"GET",signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Web \u670D\u52A1\u5668\u54CD\u5E94\u9519\u8BEF: ${t.status}`)}catch(t){throw t instanceof Error&&t.name==="AbortError"?new Error("\u8FDE\u63A5 xiaozhi \u670D\u52A1\u8D85\u65F6\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5E38\u8FD0\u884C\u3002"):new Error(`\u65E0\u6CD5\u8FDE\u63A5\u5230 xiaozhi \u670D\u52A1\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002\u9519\u8BEF\u8BE6\u60C5: ${t instanceof Error?t.message:String(t)}`)}}formatOutput(e){return JSON.stringify(e)}async getServiceStatus(){try{let e=this.processManager.getServiceStatus();if(!e.running)return"\u670D\u52A1\u672A\u542F\u52A8";try{let t=await fetch(`${this.baseUrl}/api/tools/list`,{method:"GET",signal:AbortSignal.timeout(3e3)});if(t.ok){let r=await t.json();if(r.success)return`\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${e.pid}, ${r.data.totalTools} \u4E2A\u5DE5\u5177\u53EF\u7528)`}return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46 MCP \u670D\u52A1\u53EF\u80FD\u672A\u5B8C\u5168\u521D\u59CB\u5316`}catch{return`\u670D\u52A1\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${e.pid})\uFF0C\u4F46\u65E0\u6CD5\u8FDE\u63A5\u5230 Web API`}}catch(e){return`\u670D\u52A1\u72B6\u6001\u68C0\u67E5\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}}});var Lr={};re(Lr,{getDisplayWidth:()=>Bs,listMcpServers:()=>Bu,listServerTools:()=>qu,setToolEnabled:()=>Gu,truncateToWidth:()=>Dr});import y from"chalk";import ga from"cli-table3";import Ws from"ora";function Bs(o){let e=0;for(let t of o)/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(t)?e+=2:e+=1;return e}function Dr(o,e){if(Bs(o)<=e)return o;if(e<=3)return"";let t="",r=0,s=!1;for(let n of o){let i=/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(n)?2:1;if(r+i>e-3){if(!s)return"";t+="...";break}t+=n,r+=i,s=!0}return t}async function Bu(o={}){let e=Ws("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{let t=d.getMcpServers(),r=Object.keys(t),s=d.getCustomMCPTools(),n=s.length>0,i=r.length+(n?1:0);if(i===0){e.warn("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\u6216 customMCP \u5DE5\u5177"),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi config' \u547D\u4EE4\u914D\u7F6E MCP \u670D\u52A1\u6216\u5728 xiaozhi.config.json \u4E2D\u914D\u7F6E customMCP \u5DE5\u5177"));return}if(e.succeed(`\u627E\u5230 ${i} \u4E2A MCP \u670D\u52A1${n?" (\u5305\u62EC customMCP)":""}`),o.tools){console.log(),console.log(y.bold("MCP \u670D\u52A1\u5DE5\u5177\u5217\u8868:")),console.log();let a=8,l=[];for(let u of r){let p=d.getServerToolsConfig(u),f=Object.keys(p);l.push(...f)}if(n){let u=s.map(p=>p.name);l.push(...u)}for(let u of l){let p=Bs(u);p>a&&(a=p)}a=Math.max(10,Math.min(a+2,30));let g=new ga({head:[y.bold("MCP"),y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[15,a,8,40],wordWrap:!0,style:{head:[],border:[]}});if(n)for(let u of s){let p=Dr(u.description||"",32);g.push(["customMCP",u.name,y.green("\u542F\u7528"),p])}for(let u of r){let p=d.getServerToolsConfig(u),f=Object.keys(p);if(f.length===0)g.push([y.gray(u),y.gray("-"),y.gray("-"),y.gray("\u6682\u672A\u8BC6\u522B\u5230\u76F8\u5173\u5DE5\u5177")]);else{g.length>0&&g.push([{colSpan:4,content:""}]);for(let m of f){let A=p[m],ie=A.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),te=Dr(A.description||"",32);g.push([u,m,ie,te])}}}console.log(g.toString())}else{console.log(),console.log(y.bold("MCP \u670D\u52A1\u5217\u8868:")),console.log(),n&&(console.log(`${y.cyan("\u2022")} ${y.bold("customMCP")}`),console.log(` \u7C7B\u578B: ${y.gray("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")}`),console.log(` \u914D\u7F6E: ${y.gray("xiaozhi.config.json")}`),console.log(` \u5DE5\u5177: ${y.green(s.length)} \u542F\u7528 / ${y.yellow(s.length)} \u603B\u8BA1`),console.log());for(let a of r){let l=t[a],g=d.getServerToolsConfig(a),u=Object.keys(g).length,p=Object.values(g).filter(f=>f.enable!==!1).length;console.log(`${y.cyan("\u2022")} ${y.bold(a)}`),"url"in l?("type"in l&&l.type==="sse"?console.log(` \u7C7B\u578B: ${y.gray("SSE")}`):console.log(` \u7C7B\u578B: ${y.gray("Streamable HTTP")}`),console.log(` URL: ${y.gray(l.url)}`)):console.log(` \u547D\u4EE4: ${y.gray(l.command)} ${y.gray(l.args.join(" "))}`),u>0?console.log(` \u5DE5\u5177: ${y.green(p)} \u542F\u7528 / ${y.yellow(u)} \u603B\u8BA1`):console.log(` \u5DE5\u5177: ${y.gray("\u672A\u626B\u63CF (\u8BF7\u5148\u542F\u52A8\u670D\u52A1)")}`),console.log()}}console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp list --tools' \u67E5\u770B\u6240\u6709\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> list' \u67E5\u770B\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177")),console.log(y.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> <\u5DE5\u5177\u540D> enable/disable' \u542F\u7528/\u7981\u7528\u5DE5\u5177"))}catch(t){e.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function qu(o){let e=Ws(`\u83B7\u53D6 ${o} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!d.getMcpServers()[o]){e.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let r=d.getServerToolsConfig(o),s=Object.keys(r);if(s.length===0){e.warn(`\u670D\u52A1 '${o}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u542F\u52A8\u670D\u52A1\u4EE5\u626B\u63CF\u5DE5\u5177\u5217\u8868"));return}e.succeed(`\u670D\u52A1 '${o}' \u5171\u6709 ${s.length} \u4E2A\u5DE5\u5177`),console.log(),console.log(y.bold(`${o} \u670D\u52A1\u5DE5\u5177\u5217\u8868:`)),console.log();let n=new ga({head:[y.bold("\u5DE5\u5177\u540D\u79F0"),y.bold("\u72B6\u6001"),y.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(let i of s){let a=r[i],l=a.enable?y.green("\u542F\u7528"):y.red("\u7981\u7528"),g=Dr(a.description||"",40);n.push([i,l,g])}console.log(n.toString()),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A:")),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> enable' \u542F\u7528\u5DE5\u5177`)),console.log(y.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> disable' \u7981\u7528\u5DE5\u5177`))}catch(t){e.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),console.error(y.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function Gu(o,e,t){let r=t?"\u542F\u7528":"\u7981\u7528",s=Ws(`${r}\u5DE5\u5177 ${o}/${e}...`).start();try{if(!d.getMcpServers()[o]){s.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(y.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}let i=d.getServerToolsConfig(o);if(!i[e]){s.fail(`\u5DE5\u5177 '${e}' \u5728\u670D\u52A1 '${o}' \u4E2D\u4E0D\u5B58\u5728`),console.log(y.yellow(`\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp ${o} list' \u67E5\u770B\u8BE5\u670D\u52A1\u7684\u6240\u6709\u5DE5\u5177`));return}d.setToolEnabled(o,e,t,i[e].description),s.succeed(`\u6210\u529F${r}\u5DE5\u5177 ${y.cyan(o)}/${y.cyan(e)}`),console.log(),console.log(y.gray("\u{1F4A1} \u63D0\u793A: \u5DE5\u5177\u72B6\u6001\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u670D\u52A1\u65F6\u751F\u6548"))}catch(n){s.fail(`${r}\u5DE5\u5177\u5931\u8D25`),console.error(y.red(`\u9519\u8BEF: ${n instanceof Error?n.message:String(n)}`)),process.exit(1)}}var _r=C(()=>{"use strict";se();c(Bs,"getDisplayWidth");c(Dr,"truncateToWidth");c(Bu,"listMcpServers");c(qu,"listServerTools");c(Gu,"setToolEnabled")});var ua={};re(ua,{McpCommandHandler:()=>qs});import Be from"chalk";var qs,pa=C(()=>{"use strict";la();We();qs=class extends ee{static{c(this,"McpCommandHandler")}name="mcp";description="MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406";subcommands=[{name:"list",description:"\u5217\u51FA MCP \u670D\u52A1",options:[{flags:"--tools",description:"\u663E\u793A\u6240\u6709\u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868"}],execute:c(async(e,t)=>{await this.handleList(t)},"execute")},{name:"server",description:"\u7BA1\u7406\u6307\u5B9A\u7684 MCP \u670D\u52A1",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleServer(e[0])},"execute")},{name:"tool",description:"\u542F\u7528\u6216\u7981\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",execute:c(async(e,t)=>{this.validateArgs(e,3);let[r,s,n]=e;n!=="enable"&&n!=="disable"&&(console.error(Be.red("\u9519\u8BEF: \u64CD\u4F5C\u5FC5\u987B\u662F 'enable' \u6216 'disable'")),process.exit(1));let i=n==="enable";await this.handleTool(r,s,i)},"execute")},{name:"call",description:"\u8C03\u7528\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177",options:[{flags:"--args <json>",description:"\u5DE5\u5177\u53C2\u6570 (JSON \u683C\u5F0F)",defaultValue:"{}"}],execute:c(async(e,t)=>{this.validateArgs(e,2);let[r,s]=e;await this.handleCall(r,s,t.args)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u670D\u52A1\u548C\u5DE5\u5177\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(e){try{let{listMcpServers:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleServer(e){try{let{listServerTools:t}=await Promise.resolve().then(()=>(_r(),Lr));await t(e)}catch(t){this.handleError(t)}}async handleTool(e,t,r){try{let{setToolEnabled:s}=await Promise.resolve().then(()=>(_r(),Lr));await s(e,t,r)}catch(s){this.handleError(s)}}async handleCall(e,t,r){try{let s=new Nr,n=s.parseJsonArgs(r),i=await s.callTool(e,t,n);console.log(s.formatOutput(i))}catch(s){console.log(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e}/${t}`),console.error(Be.red("\u9519\u8BEF:"),s.message),s.message.includes("\u670D\u52A1\u672A\u542F\u52A8")?(console.log(),console.log(Be.yellow("\u{1F4A1} \u8BF7\u5148\u542F\u52A8\u670D\u52A1:")),console.log(Be.gray(" xiaozhi start # \u524D\u53F0\u542F\u52A8")),console.log(Be.gray(" xiaozhi start -d # \u540E\u53F0\u542F\u52A8"))):s.message.includes("\u53C2\u6570\u683C\u5F0F\u9519\u8BEF")&&(console.log(),console.log(Be.yellow("\u{1F4A1} \u6B63\u786E\u683C\u5F0F\u793A\u4F8B:")),console.log(Be.gray(` xiaozhi mcp call ${e} ${t} --args '{"param": "value"}'`))),process.exit(1)}}}});var ha={};re(ha,{EndpointCommandHandler:()=>Gs});import it from"chalk";import kr from"ora";var Gs,da=C(()=>{"use strict";We();Gs=class extends ee{static{c(this,"EndpointCommandHandler")}name="endpoint";description="\u7BA1\u7406 MCP \u7AEF\u70B9";subcommands=[{name:"list",description:"\u5217\u51FA\u6240\u6709 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{await this.handleList()},"execute")},{name:"add",description:"\u6DFB\u52A0\u65B0\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleAdd(e[0])},"execute")},{name:"remove",description:"\u79FB\u9664\u6307\u5B9A\u7684 MCP \u7AEF\u70B9",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleRemove(e[0])},"execute")},{name:"set",description:"\u8BBE\u7F6E MCP \u7AEF\u70B9\uFF08\u53EF\u4EE5\u662F\u5355\u4E2A\u6216\u591A\u4E2A\uFF09",execute:c(async(e,t)=>{this.validateArgs(e,1),await this.handleSet(e)},"execute")}];constructor(e){super(e)}async execute(e,t){console.log("MCP \u7AEF\u70B9\u7BA1\u7406\u547D\u4EE4\u3002\u4F7F\u7528 --help \u67E5\u770B\u53EF\u7528\u7684\u5B50\u547D\u4EE4\u3002")}async handleList(){let e=kr("\u8BFB\u53D6\u7AEF\u70B9\u914D\u7F6E...").start();try{let r=this.getService("configManager").getMcpEndpoints();e.succeed("\u7AEF\u70B9\u5217\u8868"),r.length===0?console.log(it.yellow("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u7AEF\u70B9")):(console.log(it.green(`\u5171 ${r.length} \u4E2A\u7AEF\u70B9:`)),r.forEach((s,n)=>{console.log(it.gray(` ${n+1}. ${s}`))}))}catch(t){e.fail(`\u8BFB\u53D6\u7AEF\u70B9\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async handleAdd(e){let t=kr("\u6DFB\u52A0\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.addMcpEndpoint(e),t.succeed(`\u6210\u529F\u6DFB\u52A0\u7AEF\u70B9: ${e}`);let s=r.getMcpEndpoints();console.log(it.gray(`\u5F53\u524D\u5171 ${s.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u6DFB\u52A0\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleRemove(e){let t=kr("\u79FB\u9664\u7AEF\u70B9...").start();try{let r=this.getService("configManager");r.removeMcpEndpoint(e),t.succeed(`\u6210\u529F\u79FB\u9664\u7AEF\u70B9: ${e}`);let s=r.getMcpEndpoints();console.log(it.gray(`\u5F53\u524D\u5269\u4F59 ${s.length} \u4E2A\u7AEF\u70B9`))}catch(r){t.fail(`\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}async handleSet(e){let t=kr("\u8BBE\u7F6E\u7AEF\u70B9...").start();try{let r=this.getService("configManager");if(e.length===1)r.updateMcpEndpoint(e[0]),t.succeed(`\u6210\u529F\u8BBE\u7F6E\u7AEF\u70B9: ${e[0]}`);else{r.updateMcpEndpoint(e),t.succeed(`\u6210\u529F\u8BBE\u7F6E ${e.length} \u4E2A\u7AEF\u70B9`);for(let[s,n]of e.entries())console.log(it.gray(` ${s+1}. ${n}`))}}catch(r){t.fail(`\u8BBE\u7F6E\u7AEF\u70B9\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),this.handleError(r)}}}});var ma={};re(ma,{UICommandHandler:()=>Xs});import qe from"chalk";import Xu from"ora";var Xs,fa=C(()=>{"use strict";We();Xs=class extends ee{static{c(this,"UICommandHandler")}name="ui";description="\u542F\u52A8\u914D\u7F6E\u7BA1\u7406\u7F51\u9875";constructor(e){super(e)}async execute(e,t){await this.handleUI()}async handleUI(){let e=Xu("\u542F\u52A8 UI \u670D\u52A1...").start();try{let t=this.getService("configManager");if(!t.configExists()){e.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"),console.log(qe.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi config init" \u521D\u59CB\u5316\u914D\u7F6E'));return}let{WebServer:r}=await Promise.resolve().then(()=>(_s(),Ls));await new r().start(),e.succeed("UI \u670D\u52A1\u5DF2\u542F\u52A8");let n=t.getWebUIPort();console.log(qe.green("\u2705 \u914D\u7F6E\u7BA1\u7406\u7F51\u9875\u5DF2\u542F\u52A8\uFF0C\u53EF\u901A\u8FC7\u4EE5\u4E0B\u5730\u5740\u8BBF\u95EE:")),console.log(qe.green(` \u672C\u5730\u8BBF\u95EE: http://localhost:${n}`)),console.log(qe.green(` \u7F51\u7EDC\u8BBF\u95EE: http://<\u4F60\u7684IP\u5730\u5740>:${n}`)),console.log(qe.yellow("\u{1F4A1} \u63D0\u793A: \u6309 Ctrl+C \u505C\u6B62\u670D\u52A1")),await this.openBrowser(`http://localhost:${n}`)}catch(t){e.fail(`\u542F\u52A8 UI \u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),this.handleError(t)}}async openBrowser(e){try{let{spawn:t}=await import("child_process"),r;process.platform==="darwin"?r=t("open",[e],{detached:!0,stdio:"ignore"}):process.platform==="win32"?r=t("cmd",["/c","start",e],{detached:!0,stdio:"ignore"}):r=t("xdg-open",[e],{detached:!0,stdio:"ignore"}),r.on("error",()=>{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}),r.unref()}catch{console.log(qe.gray(`\u{1F4A1} \u63D0\u793A: \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE: ${e}`))}}}});hs();import Ae from"chalk";import{Command as Ju}from"commander";Xr();var jr=class{constructor(e){this.container=e}static{c(this,"CommandHandlerFactory")}createHandlers(){return[this.createHandler("service"),this.createHandler("config"),this.createHandler("project"),this.createHandler("mcp"),this.createHandler("endpoint"),this.createHandler("ui")]}createHandler(e){switch(e){case"service":return this.createServiceCommandHandler();case"config":return this.createConfigCommandHandler();case"project":return this.createProjectCommandHandler();case"mcp":return this.createMcpCommandHandler();case"endpoint":return this.createEndpointCommandHandler();case"ui":return this.createUICommandHandler();default:throw new Error(`\u672A\u77E5\u7684\u547D\u4EE4\u5904\u7406\u5668\u7C7B\u578B: ${e}`)}}createServiceCommandHandler(){let{ServiceCommandHandler:e}=(na(),fe(sa));return new e(this.container)}createConfigCommandHandler(){let{ConfigCommandHandler:e}=(ia(),fe(oa));return new e(this.container)}createProjectCommandHandler(){let{ProjectCommandHandler:e}=(ca(),fe(aa));return new e(this.container)}createMcpCommandHandler(){let{McpCommandHandler:e}=(pa(),fe(ua));return new e(this.container)}createEndpointCommandHandler(){let{EndpointCommandHandler:e}=(da(),fe(ha));return new e(this.container)}createUICommandHandler(){let{UICommandHandler:e}=(fa(),fe(ma));return new e(this.container)}};var Hr=class{constructor(e){this.container=e;this.handlerFactory=new jr(e)}static{c(this,"CommandRegistry")}handlers=[];handlerFactory;async registerCommands(e){try{this.registerVersionCommand(e),this.registerHelpCommand(e);let t=this.handlerFactory.createHandlers();for(let r of t)this.registerHandler(r),this.registerCommand(e,r);this.registerLegacyServiceCommands(e,t)}catch(t){ve.handle(t)}}registerHandler(e){this.handlers.push(e)}registerCommand(e,t){if(t.subcommands&&t.subcommands.length>0){let r=e.command(t.name).description(t.description);for(let s of t.subcommands){let n=s.name;s.name==="get"?n="get <key>":s.name==="set"?n="set <key> <value>":s.name==="call"&&(n="call <serviceName> <toolName>");let i=r.command(n).description(s.description);if(s.options)for(let a of s.options)i.option(a.flags,a.description,a.defaultValue);i.action(async(...a)=>{try{let g=a[a.length-1].opts();await s.execute(a.slice(0,-1),g)}catch(l){ve.handle(l)}})}r.action(async(...s)=>{try{let i=s[s.length-1].opts();await t.execute(s.slice(0,-1),i)}catch(n){ve.handle(n)}})}else{let r=t.name;t.name==="create"&&(r="create <projectName>");let s=e.command(r).description(t.description);if(t.options)for(let n of t.options)s.option(n.flags,n.description,n.defaultValue);s.action(async(...n)=>{try{let a=n[n.length-1].opts();await t.execute(n.slice(0,-1),a)}catch(i){ve.handle(i)}})}}registerVersionCommand(e){let t=this.container.get("versionUtils");e.version(t.getVersion(),"-v, --version","\u663E\u793A\u7248\u672C\u4FE1\u606F"),e.option("--info","\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F"),e.option("--version-info","\u663E\u793A\u8BE6\u7EC6\u7248\u672C\u4FE1\u606F")}registerHelpCommand(e){e.helpOption("-h, --help","\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").addHelpText("after",`
97
97
  \u793A\u4F8B:
98
98
  xiaozhi init # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6
99
99
  xiaozhi start # \u542F\u52A8\u670D\u52A1