xiaozhi-client 1.9.2 → 1.9.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +4 -4
  2. package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js +2 -0
  3. package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js.map +1 -0
  4. package/apps/frontend/dist/assets/index-88NfCOo9.js +50 -0
  5. package/apps/frontend/dist/assets/index-88NfCOo9.js.map +1 -0
  6. package/apps/frontend/dist/assets/index-P6Zq3MZF.css +1 -0
  7. package/apps/frontend/dist/assets/radix-ui-BA32w1ww.js.map +1 -1
  8. package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js +319 -0
  9. package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js.map +1 -0
  10. package/apps/frontend/dist/assets/utils-CiPelQLP.js +2 -0
  11. package/apps/frontend/dist/assets/utils-CiPelQLP.js.map +1 -0
  12. package/apps/frontend/dist/assets/{vendor-DvFnRBMT.js → vendor-DK9yaMt3.js} +2 -2
  13. package/apps/frontend/dist/assets/vendor-DK9yaMt3.js.map +1 -0
  14. package/apps/frontend/dist/index.html +6 -6
  15. package/dist/WebServerStandalone.js +16 -21
  16. package/dist/WebServerStandalone.js.map +1 -1
  17. package/dist/cli.js +17 -25
  18. package/dist/cli.js.map +1 -1
  19. package/dist/mcpServerProxy.d.ts +1 -1
  20. package/dist/mcpServerProxy.js +13 -13
  21. package/dist/mcpServerProxy.js.map +1 -1
  22. package/dist/package.json +25 -18
  23. package/docs/arch/{cache.md → cache.mdx} +62 -95
  24. package/docs/changelog.mdx +617 -0
  25. package/docs/development/docker-build.mdx +256 -0
  26. package/docs/development/todo__release-guide.md +5 -5
  27. package/docs/docs.json +6 -1
  28. package/docs/python-dependencies.md +2 -2
  29. package/docs/usage/docker.mdx +4 -4
  30. package/package.json +25 -18
  31. package/apps/frontend/dist/assets/form-utils-wyhL6gg0.js +0 -24
  32. package/apps/frontend/dist/assets/form-utils-wyhL6gg0.js.map +0 -1
  33. package/apps/frontend/dist/assets/index-COfJftUA.css +0 -1
  34. package/apps/frontend/dist/assets/index-ukaaLbQN.js +0 -50
  35. package/apps/frontend/dist/assets/index-ukaaLbQN.js.map +0 -1
  36. package/apps/frontend/dist/assets/react-vendor-B6Uf_8Kw.js +0 -319
  37. package/apps/frontend/dist/assets/react-vendor-B6Uf_8Kw.js.map +0 -1
  38. package/apps/frontend/dist/assets/utils-D0kRQKVW.js +0 -2
  39. package/apps/frontend/dist/assets/utils-D0kRQKVW.js.map +0 -1
  40. package/apps/frontend/dist/assets/vendor-DvFnRBMT.js.map +0 -1
  41. package/dist/templates/docker/mcpServers/calculator.js +0 -106
  42. package/dist/templates/docker/mcpServers/datetime.js +0 -390
  43. package/dist/templates/docker/package.json +0 -13
  44. package/dist/templates/docker/requirements.txt +0 -16
  45. package/dist/templates/docker/xiaozhi.config.json +0 -21
  46. package/templates/docker/mcpServers/calculator.js +0 -106
  47. package/templates/docker/mcpServers/datetime.js +0 -390
  48. package/templates/docker/package.json +0 -13
  49. package/templates/docker/requirements.txt +0 -16
  50. package/templates/docker/xiaozhi.config.json +0 -21
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var pa=Object.create;var ot=Object.defineProperty;var da=Object.getOwnPropertyDescriptor;var ma=Object.getOwnPropertyNames;var fa=Object.getPrototypeOf,Ca=Object.prototype.hasOwnProperty;var c=(o,e)=>ot(o,"name",{value:e,configurable:!0});var f=(o,e)=>()=>(o&&(e=o(o=0)),e);var y=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports),Re=(o,e)=>{for(var t in e)ot(o,t,{get:e[t],enumerable:!0})},Xs=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ma(e))!Ca.call(o,s)&&s!==t&&ot(o,s,{get:()=>e[s],enumerable:!(r=da(e,s))||r.enumerable});return o};var va=(o,e,t)=>(t=o!=null?pa(fa(o)):{},Xs(e||!o||!o.__esModule?ot(t,"default",{value:o,enumerable:!0}):t,o)),Nt=o=>Xs(ot({},"__esModule",{value:!0}),o);var Ys={};Re(Ys,{Logger:()=>Ae,createLogger:()=>ya,getGlobalLogLevel:()=>Ra,getLogger:()=>Js,logger:()=>u,setGlobalLogLevel:()=>Pa,setGlobalLogger:()=>Ma});import*as V from"fs";import*as ee from"path";import it from"chalk";import ze from"pino";import{z as Sa}from"zod";function Ta(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 ya(o){return new Ae(o||xt)}function Js(){return Ue||(Ue=new Ae(xt)),Ue}function Ma(o){Ue=o}function Pa(o){xt=o,Ue&&Ue.setLevel(o)}function Ra(){return xt}var Ea,Ae,Ue,xt,u,T=f(()=>{"use strict";Ea=Sa.enum(["fatal","error","warn","info","debug","trace"]);c(Ta,"formatDateTime");Ae=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=Ea.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:ze.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:ze.destination({dest:"/dev/null"})}),ze({level:this.logLevel,timestamp:ze.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:ze.stdSerializers?.err||(t=>t)}},ze.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:it.gray}],[30,{name:"INFO",color:it.blue}],[40,{name:"WARN",color:it.yellow}],[50,{name:"ERROR",color:it.red}],[60,{name:"FATAL",color:it.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=Ta(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=ee.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),V.existsSync(this.logFilePath)||V.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(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||!V.existsSync(this.logFilePath)))try{V.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=ee.dirname(this.logFilePath),t=ee.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let n=ee.join(e,`${t}.${s}.log`),i=ee.join(e,`${t}.${s+1}.log`);V.existsSync(n)&&(s===this.maxLogFiles-1?V.unlinkSync(n):V.renameSync(n,i))}let r=ee.join(e,`${t}.1.log`);V.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=ee.dirname(this.logFilePath),t=ee.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=ee.join(e,`${t}.${r}.log`);V.existsSync(s)&&V.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}},Ue=null,xt="info";c(ya,"createLogger");c(Js,"getLogger");c(Ma,"setGlobalLogger");c(Pa,"setGlobalLogLevel");c(Ra,"getGlobalLogLevel");u=Js()});import{EventEmitter as wa}from"events";function P(){return Ve||(Ve=new kr),Ve}function Ks(){Ve&&(Ve.destroy(),Ve=null)}var kr,Ve,k=f(()=>{"use strict";T();kr=class extends wa{static{c(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=u.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")}},Ve=null;c(P,"getEventBus");c(Ks,"destroyEventBus")});import{SSEClientTransport as ba}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Ia}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Oa}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as $a}from"eventsource";function Aa(){return u}function Na(o){switch(Aa().debug(`[TransportFactory] \u521B\u5EFA ${o.type} transport for ${o.name}`),o.type){case"stdio":return xa(o);case"sse":return Da(o);case"streamable-http":return La(o);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}function xa(o){if(!o.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new Ia({command:o.command,args:o.args||[],env:o.env})}function Da(o){if(!o.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(o.url),t=_a(o);return new ba(e,t)}function La(o){if(!o.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(o.url),t=ka(o);return new Oa(e,t)}function _a(o){let e={};return o.apiKey?e.headers={Authorization:`Bearer ${o.apiKey}`,...o.headers}:o.headers&&(e.headers=o.headers),e}function ka(o){let e={};return o.apiKey?e.headers={Authorization:`Bearer ${o.apiKey}`,...o.headers}:o.headers&&(e.headers=o.headers),e}function ja(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(We).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 Ha(){return["stdio","sse","streamable-http"]}var Dt,jr=f(()=>{"use strict";T();Be();typeof global<"u"&&!global.EventSource&&(global.EventSource=$a);c(Aa,"getLogger");c(Na,"createTransport");c(xa,"createStdioTransport");c(Da,"createSSETransport");c(La,"createStreamableHTTPTransport");c(_a,"createSSEOptions");c(ka,"createStreamableHTTPOptions");c(ja,"validateConfig");c(Ha,"getSupportedTypes");Dt={create:Na,validateConfig:ja,getSupportedTypes:Ha}});import{Client as Fa}from"@modelcontextprotocol/sdk/client/index.js";var We,qe,Be=f(()=>{"use strict";T();k();jr();We=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(We||{}),qe=class{static{c(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";reconnectOptions;reconnectState;logger;connectionTimeout=null;initialized=!1;eventBus=P();pingOptions;pingTimer=null;pingFailureCount=0;lastPingTime=null;isPinging=!1;constructor(e,t){this.logger=u;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(){Dt.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 Fa({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{tools:{}}}),this.transport=Dt.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}}}});import{isAbsolute as za,resolve as Ua}from"path";function en(o){try{let t=new URL(o).pathname;return t.endsWith("/sse")?"sse":t.endsWith("/mcp")?"streamable-http":"streamable-http"}catch(e){return Ge.warn(`URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B: ${o}`,e),"streamable-http"}}function tn(o,e){Ge.debug(`\u8F6C\u6362\u914D\u7F6E: ${o}`,e);try{if(!o||typeof o!="string")throw new L("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new L("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",o);let t=Va(o,e);return Xa(t),Ge.debug(`\u914D\u7F6E\u8F6C\u6362\u6210\u529F: ${o} -> ${t.type}`),t}catch(t){throw Ge.error(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${o}`,t),t instanceof L?t:new L(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,o)}}function Va(o,e){if(qa(e))return Wa(o,e);if("type"in e)switch(e.type){case"sse":return Zs(o,e);case"streamable-http":return Qs(o,e);default:throw new L(`\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 L("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",o);if(en(e.url||"")==="sse"){let s={...e,type:"sse"};return Zs(o,s)}let r={...e,type:"streamable-http"};return Qs(o,r)}throw new L("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",o)}function Wa(o,e){if(!e.command)throw new L("\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(Ba(s)){let n=Ua(t,s);return Ge.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 Zs(o,e){if(e.url===void 0||e.url===null)throw new L("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",o);let t=e.type==="sse"?"sse":en(e.url||""),r=e.url?Ga(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),Ge.info(`[ConfigAdapter] \u670D\u52A1 ${o} URL: ${e.url}\uFF0C\u63A8\u65AD\u7C7B\u578B: ${t}${r?" (ModelScope)":""}`),s}function Qs(o,e){if(e.url===void 0||e.url===null)throw new L("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 Ba(o){return za(o)?!1:!!(o.startsWith("./")||o.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(o))}function qa(o){return"command"in o&&typeof o.command=="string"}function Ga(o){return o.includes("modelscope.net")||o.includes("modelscope.cn")}function Xa(o){if(!o.name||typeof o.name!="string")throw new L("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(o.type&&!Object.values(We).includes(o.type))throw new L(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`);if(!o.type)throw new L("\u4F20\u8F93\u7C7B\u578B\u672A\u6307\u5B9A\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6216\u542F\u7528\u81EA\u52A8\u63A8\u65AD");switch(o.type){case"stdio":if(!o.command)throw new L("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(o.url===void 0||o.url===null)throw new L("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(o.url===void 0||o.url===null)throw new L("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new L(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${o.type}`)}}var Ge,L,rn=f(()=>{"use strict";T();Be();Ge=u.withTag("ConfigAdapter");c(en,"inferTransportTypeFromUrl");L=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{c(this,"ConfigValidationError")}};c(tn,"convertLegacyToNew");c(Va,"convertByConfigType");c(Wa,"convertLocalConfig");c(Zs,"convertSSEConfig");c(Qs,"convertStreamableHTTPConfig");c(Ba,"isRelativePath");c(qa,"isLocalConfig");c(Ga,"isModelScopeURL");c(Xa,"validateNewConfig")});var sn=f(()=>{"use strict";T();Be()});var nn=f(()=>{"use strict";rn();sn()});function Ja(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 Hr(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(Ja(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=f(()=>{"use strict";c(Ja,"getMcpServerCommunicationType");c(Hr,"validateMcpServerConfig");c(E,"sliceEndpoint")});var ln={};Re(ln,{ConfigManager:()=>kt,configManager:()=>d});import{copyFileSync as Ya,existsSync as _t,readFileSync as Ka,writeFileSync as Za}from"fs";import{dirname as Qa,resolve as Ne}from"path";import{fileURLToPath as ec}from"url";import*as jt from"comment-json";import on from"dayjs";import Fr from"json5";import*as cn from"json5-writer";var an,zr,kt,d,te=f(()=>{"use strict";k();Lt();T();an=Qa(ec(import.meta.url)),zr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},kt=class o{static{c(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=P();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[Ne(an,"templates","default","xiaozhi.config.json"),Ne(an,"..","templates","default","xiaozhi.config.json"),Ne(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=Ne(e,r);if(_t(s))return s}return Ne(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=Ne(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=Ne(t,r);Ya(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=Ka(e,"utf8").replace(/^\uFEFF/,""),n;switch(t){case"json5":n=Fr.parse(s),this.json5Writer=cn.load(s);break;case"jsonc":n=jt.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=Hr(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=Hr(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}),u.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),u.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=Fr.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=Fr.stringify(e,null,2)}break;case"jsonc":try{s=jt.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}Za(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??zr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??zr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??zr.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)]),u.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),u.debug(`CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}`)}}catch(s){if(typeof t=="string"&&r){let n=e,i=t;u.error(`\u66F4\u65B0\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${n}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let n=e;u.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 u.warn(`CustomMCP \u5DE5\u5177\u7F3A\u5C11\u6709\u6548\u7684 name \u5B57\u6BB5: ${JSON.stringify(t)}`),!1;if(!t.description||typeof t.description!="string")return u.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 description \u5B57\u6BB5`),!1;if(!t.inputSchema||typeof t.inputSchema!="object")return u.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 inputSchema \u5B57\u6BB5`),!1;if(!t.handler||typeof t.handler!="object")return u.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 u.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 u.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"?(u.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?(u.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 Coze \u5904\u7406\u5668\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id`),!1):!0:(u.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u5E73\u53F0: ${t.platform}`),!1):(u.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 u.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 u.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)?(u.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"?(u.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"?(u.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"?(u.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)?(u.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?(u.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:(u.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):(u.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"?(u.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):!t.config.serviceName||typeof t.config.serviceName!="string"?(u.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"?(u.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 u.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),u.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}),u.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),u.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),u.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}),u.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=on(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 h=[...l],p=h[g];p.stats||(p.stats={});let S=p.stats.usageCount||0,m=p.stats.lastUsedTime;i&&(p.stats.usageCount=S+1),(!m||new Date(n)>new Date(m))&&(p.stats.lastUsedTime=on(n).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(h)}catch(s){if(typeof r=="string"){let n=e,i=t;u.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;u.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 u.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)),u.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),u.debug(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(s){throw u.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),u.debug(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(i){throw u.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&&u.info(`\u5DF2\u6E05\u7406 ${e} \u4E2A\u7EDF\u8BA1\u66F4\u65B0\u9501`)}getStatsUpdateLocks(){return Array.from(this.statsUpdateLocks.keys())}getToolCallLogConfig(){return this.getConfig().toolCallLog||{}}updateToolCallLogConfig(e){let t=this.getMutableConfig();t.toolCallLog||(t.toolCallLog={}),Object.assign(t.toolCallLog,e),this.saveConfig(t)}getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}},d=kt.getInstance()});var he,at=f(()=>{"use strict";T();te();k();he=class{static{c(this,"ConfigService")}logger;eventBus;constructor(){this.logger=u.withTag("ConfigService"),this.eventBus=P()}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 Ht,gn=f(()=>{"use strict";T();at();Ht=class{static{c(this,"ConfigApiHandler")}logger;configService;constructor(){this.logger=u.withTag("ConfigApiHandler"),this.configService=new he}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 tc(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);u.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 rc(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 Ur,pe,Ft,Vr=f(()=>{"use strict";T();Ur=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(tc,"retryWithBackoff");c(rc,"handleCozeApiError");Ft=class{static{c(this,"CozeApiService")}cache=new Ur;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 u.debug("\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868"),t;u.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"),u.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 u.debug(`\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868: ${t}`),i;u.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"),u.info(`\u6210\u529F\u83B7\u53D6 ${g.items.length} \u4E2A\u5DE5\u4F5C\u6D41\uFF0ChasMore: ${g.hasMore}`),g}async request(e){return tc(async()=>{let t=`${this.API_BASE_URL}${e}`;u.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 u.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 rc(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),u.info(`\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58${e?` (\u6A21\u5F0F: ${e})`:""}`)}getCacheStats(){return this.cache.getStats()}}});function zt(o,e){return{success:!0,data:o,message:e}}function j(o,e,t){return{success:!1,message:o,error:e?{code:e,details:t}:void 0}}function Ut(){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 Ft(o)}var xe,un=f(()=>{"use strict";T();te();Vr();c(zt,"createSuccessResponse");c(j,"createErrorResponse");c(Ut,"getCozeApiService");xe=class{static{c(this,"CozeApiHandler")}static async getWorkspaces(e){try{if(u.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!d.isCozeConfigValid())return u.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=await Ut().getWorkspaces();return u.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(zt({workspaces:r}))}catch(t){return u.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),t instanceof Error&&t.code==="AUTH_FAILED"?e.json(j("\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(j("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):t instanceof Error&&t.code==="TIMEOUT"?e.json(j("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(j(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}static async getWorkflows(e){try{if(u.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!d.isCozeConfigValid())return u.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),s=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return u.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(j("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(j("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(s<1||s>100)return e.json(j("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 Ut().getWorkflows(n);u.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(h=>{let p=l.find(S=>S.handler.type==="proxy"&&S.handler.platform==="coze"&&S.handler.config.workflow_id===h.workflow_id);return{...h,isAddedAsTool:!!p,toolName:p?.name||null}});return u.info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${g.filter(h=>h.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.json(zt({items:g,has_more:a.hasMore,page_num:r,page_size:s,total_count:a.items.length}))}catch(t){return u.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),t instanceof Error&&t.code==="AUTH_FAILED"?e.json(j("\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(j("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):t instanceof Error&&t.code==="TIMEOUT"?e.json(j("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(j(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}static async clearCache(e){try{if(u.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!d.isCozeConfigValid())return u.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("pattern"),r=Ut(),s=r.getCacheStats();r.clearCache(t);let n=r.getCacheStats();return u.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${s.size} \u9879\uFF0C\u6E05\u9664\u540E: ${n.size} \u9879`),e.json(zt({cleared:s.size-n.size,remaining:n.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return u.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(j(t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}static async getCacheStats(e){try{if(u.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!d.isCozeConfigValid())return u.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(j("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=Ut().getCacheStats();return e.json(zt(r))}catch(t){return u.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(j(t instanceof Error?t.message:"\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}}});var Vt,hn=f(()=>{"use strict";T();at();Vt=class{static{c(this,"HeartbeatHandler")}logger;statusService;notificationService;configService;constructor(e,t){this.logger=u.withTag("HeartbeatHandler"),this.statusService=e,this.notificationService=t,this.configService=new he}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 Ee,pn=f(()=>{"use strict";T();k();Ee=class{static{c(this,"MCPEndpointApiHandler")}logger;xiaozhiConnectionManager;configManager;eventBus;constructor(e,t){this.logger=u.withTag("MCPEndpointApiHandler"),this.xiaozhiConnectionManager=e,this.configManager=t,this.eventBus=P()}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(h=>h.endpoint===r);if(!n){let h=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(h,404)}if(!n.connected){let h=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(h,409)}await this.xiaozhiConnectionManager.disconnectEndpoint(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(h=>h.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)}}}});var Xe,Wr=f(()=>{"use strict";T();Xe=class{static{c(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=u}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){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{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.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{createHash as sc}from"crypto";function we(o,e){let t=sc("md5").update(JSON.stringify(e||{})).digest("hex");return`${o}_${t}`}function Je(o,e){let t=new Date(o).getTime();return Date.now()-t>e}function De(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 be,Wt=f(()=>{"use strict";c(we,"generateCacheKey");c(Je,"isCacheExpired");c(De,"shouldCleanupCache");be={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});var Bt,dn=f(()=>{"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}`)})},be.CLEANUP_INTERVAL),this.logger.debug(`[CacheLifecycle] \u542F\u52A8\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${be.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:be.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 Je(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&&De(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)Je(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}`),Je(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=f(()=>{"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,h)=>{let p=this.getTaskExecutionTime(h.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?nc(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 nc(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...
2
+ var ea=Object.create;var ot=Object.defineProperty;var ta=Object.getOwnPropertyDescriptor;var ra=Object.getOwnPropertyNames;var sa=Object.getPrototypeOf,oa=Object.prototype.hasOwnProperty;var c=(n,e)=>ot(n,"name",{value:e,configurable:!0});var f=(n,e)=>()=>(n&&(e=n(n=0)),e);var T=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Se=(n,e)=>{for(var t in e)ot(n,t,{get:e[t],enumerable:!0})},zs=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ra(e))!oa.call(n,s)&&s!==t&&ot(n,s,{get:()=>e[s],enumerable:!(r=ta(e,s))||r.enumerable});return n};var na=(n,e,t)=>(t=n!=null?ea(sa(n)):{},zs(e||!n||!n.__esModule?ot(t,"default",{value:n,enumerable:!0}):t,n)),$t=n=>zs(ot({},"__esModule",{value:!0}),n);var Vs={};Se(Vs,{Logger:()=>Ne,createLogger:()=>la,getGlobalLogLevel:()=>pa,getLogger:()=>Us,logger:()=>u,setGlobalLogLevel:()=>ua,setGlobalLogger:()=>ga});import*as W from"fs";import*as ee from"path";import nt from"chalk";import Ue from"pino";import{z as ia}from"zod";function ca(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),s=String(n.getHours()).padStart(2,"0"),o=String(n.getMinutes()).padStart(2,"0"),i=String(n.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${s}:${o}:${i}`}function la(n){return new Ne(n||At)}function Us(){return Ve||(Ve=new Ne(At)),Ve}function ga(n){Ve=n}function ua(n){At=n,Ve&&Ve.setLevel(n)}function pa(){return At}var aa,Ne,Ve,At,u,y=f(()=>{"use strict";aa=ia.enum(["fatal","error","warn","info","debug","trace"]);c(ca,"formatDateTime");Ne=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=aa.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:Ue.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Ue.destination({dest:"/dev/null"})}),Ue({level:this.logLevel,timestamp:Ue.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:Ue.stdSerializers?.err||(t=>t)}},Ue.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:nt.gray}],[30,{name:"INFO",color:nt.blue}],[40,{name:"WARN",color:nt.yellow}],[50,{name:"ERROR",color:nt.red}],[60,{name:"FATAL",color:nt.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=ca(new Date),s=t.get(e.level)||{name:"UNKNOWN",color:c(a=>a,"color")},o=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}] ${o} ${i}`}initLogFile(e){this.logFilePath=ee.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),W.existsSync(this.logFilePath)||W.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||!W.existsSync(this.logFilePath)))try{W.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=ee.dirname(this.logFilePath),t=ee.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=ee.join(e,`${t}.${s}.log`),i=ee.join(e,`${t}.${s+1}.log`);W.existsSync(o)&&(s===this.maxLogFiles-1?W.unlinkSync(o):W.renameSync(o,i))}let r=ee.join(e,`${t}.1.log`);W.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=ee.dirname(this.logFilePath),t=ee.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=ee.join(e,`${t}.${r}.log`);W.existsSync(s)&&W.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}},Ve=null,At="info";c(la,"createLogger");c(Us,"getLogger");c(ga,"setGlobalLogger");c(ua,"setGlobalLogLevel");c(pa,"getGlobalLogLevel");u=Us()});import{EventEmitter as ha}from"events";function P(){return We||(We=new Dr),We}function Ws(){We&&(We.destroy(),We=null)}var Dr,We,H=f(()=>{"use strict";y();Dr=class extends ha{static{c(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=u.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(o){throw this.emit("error",o),o}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")}},We=null;c(P,"getEventBus");c(Ws,"destroyEventBus")});import{SSEClientTransport as ma}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as da}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as fa}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as Ca}from"eventsource";function va(){return u}function Ea(n){switch(va().debug(`[TransportFactory] \u521B\u5EFA ${n.type} transport for ${n.name}`),n.type){case"stdio":return Sa(n);case"sse":return Ta(n);case"streamable-http":return ya(n);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function Sa(n){if(!n.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new da({command:n.command,args:n.args||[],env:n.env})}function Ta(n){if(!n.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Ma(n);return new ma(e,t)}function ya(n){if(!n.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Pa(n);return new fa(e,t)}function Ma(n){let e={};return n.apiKey?e.headers={Authorization:`Bearer ${n.apiKey}`,...n.headers}:n.headers&&(e.headers=n.headers),e}function Pa(n){let e={};return n.apiKey?e.headers={Authorization:`Bearer ${n.apiKey}`,...n.headers}:n.headers&&(e.headers=n.headers),e}function Ra(n){if(!n.name||typeof n.name!="string")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(n.type&&!Object.values(Be).includes(n.type))throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`);if(!n.type)throw new Error("\u4F20\u8F93\u7C7B\u578B\u672A\u8BBE\u7F6E\uFF0C\u8FD9\u5E94\u8BE5\u5728 inferTransportType \u4E2D\u5904\u7406");switch(n.type){case"stdio":if(!n.command)throw new Error("stdio \u7C7B\u578B\u9700\u8981 command \u5B57\u6BB5");break;case"sse":if(n.url===void 0||n.url===null)throw new Error(`${n.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;case"streamable-http":if(n.url===void 0||n.url===null)throw new Error(`${n.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function wa(){return["stdio","sse","streamable-http"]}var Ot,_r=f(()=>{"use strict";y();qe();typeof global<"u"&&!global.EventSource&&(global.EventSource=Ca);c(va,"getLogger");c(Ea,"createTransport");c(Sa,"createStdioTransport");c(Ta,"createSSETransport");c(ya,"createStreamableHTTPTransport");c(Ma,"createSSEOptions");c(Pa,"createStreamableHTTPOptions");c(Ra,"validateConfig");c(wa,"getSupportedTypes");Ot={create:Ea,validateConfig:Ra,getSupportedTypes:wa}});import{Client as ba}from"@modelcontextprotocol/sdk/client/index.js";var Be,Ge,qe=f(()=>{"use strict";y();H();_r();Be=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(Be||{}),Ge=class{static{c(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";logger;connectionTimeout=null;initialized=!1;eventBus=P();pingOptions;pingTimer=null;lastPingTime=null;isPinging=!1;constructor(e){this.logger=u;let t=this.inferTransportType(e);this.config=t,this.validateConfig(),this.pingOptions={enabled:!0,interval:6e4,startDelay:5e3,...e.ping}}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(){Ot.validateConfig(this.config)}async connect(){if(this.connectionState==="connecting")throw new Error("\u8FDE\u63A5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5B8C\u6210");return this.cleanupConnection(),this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",this.logWithTag("debug",`\u6B63\u5728\u8FDE\u63A5 MCP \u670D\u52A1: ${this.config.name}`),new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.config.timeout||1e4}ms)`);this.handleConnectionError(r),t(r)},this.config.timeout||1e4);try{this.client=new ba({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{tools:{}}}),this.transport=Ot.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.lastPingTime=null,this.isPinging=!1,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.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:0})}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}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.stopPingMonitoring(),this.cleanupConnection(),this.connectionState="disconnected",this.eventBus.emitEvent("mcp:service:disconnected",{serviceName:this.config.name,reason:"\u624B\u52A8\u65AD\u5F00",disconnectionTime:new Date})}getTools(){return Array.from(this.tools.values())}async callTool(e,t){if(!this.client)throw new Error(`\u670D\u52A1 ${this.config.name} \u672A\u8FDE\u63A5`);if(!this.tools.has(e))throw new Error(`\u5DE5\u5177 ${e} \u5728\u670D\u52A1 ${this.config.name} \u4E2D\u4E0D\u5B58\u5728`);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,connectionState:this.connectionState,pingEnabled:this.pingOptions.enabled,lastPingTime:this.lastPingTime||void 0,isPinging:this.isPinging}}isConnected(){return this.connectionState==="connected"&&this.initialized}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{await this.client.listTools();let t=performance.now()-e;this.lastPingTime=new Date,this.logger.debug(`${this.config.name} ping\u6210\u529F\uFF0C\u5EF6\u8FDF: ${t.toFixed(2)}ms`)}catch(t){this.logger.debug(`${this.config.name} ping\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}finally{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}}}});import{isAbsolute as Ia,resolve as $a}from"path";function Gs(n){try{let t=new URL(n).pathname;return t.endsWith("/sse")?"sse":t.endsWith("/mcp")?"streamable-http":"streamable-http"}catch(e){return Xe.warn(`URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B: ${n}`,e),"streamable-http"}}function Xs(n,e){Xe.debug(`\u8F6C\u6362\u914D\u7F6E: ${n}`,e);try{if(!n||typeof n!="string")throw new D("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new D("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",n);let t=Aa(n,e);return Da(t),Xe.debug(`\u914D\u7F6E\u8F6C\u6362\u6210\u529F: ${n} -> ${t.type}`),t}catch(t){throw Xe.error(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${n}`,t),t instanceof D?t:new D(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,n)}}function Aa(n,e){if(xa(e))return Oa(n,e);if("type"in e)switch(e.type){case"sse":return Bs(n,e);case"streamable-http":return qs(n,e);default:throw new D(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${e.type}`,n)}if("url"in e){if(e.url===void 0||e.url===null)throw new D("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",n);if(Gs(e.url||"")==="sse"){let s={...e,type:"sse"};return Bs(n,s)}let r={...e,type:"streamable-http"};return qs(n,r)}throw new D("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",n)}function Oa(n,e){if(!e.command)throw new D("\u672C\u5730\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5",n);let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=(e.args||[]).map(s=>{if(Na(s)){let o=$a(t,s);return Xe.debug(`\u89E3\u6790\u76F8\u5BF9\u8DEF\u5F84: ${s} -> ${o}`),o}return s});return{name:n,type:"stdio",command:e.command,args:r,env:e.env,ping:{enabled:!0,interval:6e4,startDelay:5e3},timeout:3e4}}function Bs(n,e){if(e.url===void 0||e.url===null)throw new D("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.type==="sse"?"sse":Gs(e.url||""),r=e.url?La(e.url):!1,s={name:n,type:t,url:e.url,ping:t==="sse"?{enabled:!0,interval:6e4,startDelay:5e3}:{enabled:!1,interval:6e4,startDelay:1e4},timeout:3e4};return r&&(s.modelScopeAuth=!0),Xe.info(`[ConfigAdapter] \u670D\u52A1 ${n} URL: ${e.url}\uFF0C\u63A8\u65AD\u7C7B\u578B: ${t}${r?" (ModelScope)":""}`),s}function qs(n,e){if(e.url===void 0||e.url===null)throw new D("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.url||"";return{name:n,type:"streamable-http",url:t,ping:{enabled:!1,interval:6e4,startDelay:1e4},timeout:3e4}}function Na(n){return Ia(n)?!1:!!(n.startsWith("./")||n.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(n))}function xa(n){return"command"in n&&typeof n.command=="string"}function La(n){return n.includes("modelscope.net")||n.includes("modelscope.cn")}function Da(n){if(!n.name||typeof n.name!="string")throw new D("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(n.type&&!Object.values(Be).includes(n.type))throw new D(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`);if(!n.type)throw new D("\u4F20\u8F93\u7C7B\u578B\u672A\u6307\u5B9A\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6216\u542F\u7528\u81EA\u52A8\u63A8\u65AD");switch(n.type){case"stdio":if(!n.command)throw new D("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(n.url===void 0||n.url===null)throw new D("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(n.url===void 0||n.url===null)throw new D("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new D(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}var Xe,D,Js=f(()=>{"use strict";y();qe();Xe=u.withTag("ConfigAdapter");c(Gs,"inferTransportTypeFromUrl");D=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{c(this,"ConfigValidationError")}};c(Xs,"convertLegacyToNew");c(Aa,"convertByConfigType");c(Oa,"convertLocalConfig");c(Bs,"convertSSEConfig");c(qs,"convertStreamableHTTPConfig");c(Na,"isRelativePath");c(xa,"isLocalConfig");c(La,"isModelScopeURL");c(Da,"validateNewConfig")});var Ys=f(()=>{"use strict";y();qe()});var Ks=f(()=>{"use strict";Js();Ys()});function _a(n){if(!n||typeof n!="object")throw new Error("\u670D\u52A1\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u6709\u6548\u7684\u5BF9\u8C61");if("command"in n&&typeof n.command=="string")return"stdio";if("type"in n&&n.type==="sse")return"sse";if("type"in n&&n.type==="streamable-http"||"url"in n&&typeof n.url=="string")return"streamable-http";throw new Error("\u65E0\u6CD5\u8BC6\u522B\u7684 MCP \u670D\u52A1\u914D\u7F6E\u7C7B\u578B\u3002\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5\uFF08stdio\uFF09\u3001type: 'sse' \u5B57\u6BB5\uFF08sse\uFF09\u6216 url \u5B57\u6BB5\uFF08streamable-http\uFF09")}function kr(n,e){if(!e||typeof e!="object")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61`};try{switch(_a(e)){case"stdio":if(!e.command||typeof e.command!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 command \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(!Array.isArray(e.args))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 args \u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4`};if(e.env&&typeof e.env!="object")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 env \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"sse":if(e.type!=="sse")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 type \u5B57\u6BB5\u5FC5\u987B\u662F "sse"`};if(!e.url||typeof e.url!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};break;case"streamable-http":if(!e.url||typeof e.url!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(e.type&&e.type!=="streamable-http")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 type \u5B57\u6BB5\u5982\u679C\u5B58\u5728\uFF0C\u5FC5\u987B\u662F "streamable-http"`};break;default:return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u7C7B\u578B\u65E0\u6CD5\u8BC6\u522B`}}return{valid:!0}}catch(t){return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u65E0\u6548: ${t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF"}`}}}function S(n){return`${n.slice(0,30)}...${n.slice(-10)}`}var Nt=f(()=>{"use strict";c(_a,"getMcpServerCommunicationType");c(kr,"validateMcpServerConfig");c(S,"sliceEndpoint")});var to={};Se(to,{ConfigManager:()=>Lt,configManager:()=>m});import{copyFileSync as ka,existsSync as xt,readFileSync as ja,writeFileSync as Ha}from"fs";import{dirname as Fa,resolve as xe}from"path";import{fileURLToPath as za}from"url";import*as Dt from"comment-json";import Zs from"dayjs";import jr from"json5";import*as eo from"json5-writer";var Qs,Hr,Lt,m,te=f(()=>{"use strict";H();Nt();y();Qs=Fa(za(import.meta.url)),Hr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},Lt=class n{static{c(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=P();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[xe(Qs,"templates","default","xiaozhi.config.json"),xe(Qs,"..","templates","default","xiaozhi.config.json"),xe(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>xt(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=xe(e,r);if(xt(s))return s}return xe(e,"xiaozhi.config.json")}getConfigFileFormat(e){return e.endsWith(".json5")?"json5":e.endsWith(".jsonc")?"jsonc":"json"}static getInstance(){return n.instance||(n.instance=new n),n.instance}configExists(){let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),t=["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"];for(let r of t){let s=xe(e,r);if(xt(s))return!0}return!1}initConfig(e="json"){if(!xt(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=xe(t,r);ka(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=ja(e,"utf8").replace(/^\uFEFF/,""),o;switch(t){case"json5":o=jr.parse(s),this.json5Writer=eo.load(s);break;case"jsonc":o=Dt.parse(s);break;default:o=JSON.parse(s);break}return this.validateConfig(o),o}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 o=kr(r,s);if(!o.valid)throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A${o.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 o=r.filter(i=>i!==e);t.mcpEndpoint=o,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=kr(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 o=t.customMCP.tools.findIndex(i=>i.name===s.name);o!==-1&&t.customMCP.tools.splice(o,1)}t.customMCP.tools.length===0&&(t.customMCP=void 0)}this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date}),u.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(o=>!t.includes(o));if(s.length>0){for(let o of s)delete e.mcpServerConfig[o];this.saveConfig(e),u.info(`\u5DF2\u6E05\u7406 ${s.length} \u4E2A\u65E0\u6548\u7684\u670D\u52A1\u5DE5\u5177\u914D\u7F6E: ${s.join(", ")}`)}}setToolEnabled(e,t,r,s){let o=this.getMutableConfig();o.mcpServerConfig||(o.mcpServerConfig={}),o.mcpServerConfig[e]||(o.mcpServerConfig[e]={tools:{}}),o.mcpServerConfig[e].tools[t]={...o.mcpServerConfig[e].tools[t],enable:r,...s&&{description:s}},this.saveConfig(o)}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=jr.stringify(e,null,2))}catch(o){console.warn("\u4F7F\u7528 json5-writer \u4FDD\u5B58\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON5 \u683C\u5F0F:",o),s=jr.stringify(e,null,2)}break;case"jsonc":try{s=Dt.stringify(e,null,2)}catch(o){console.warn("\u4F7F\u7528 comment-json \u4FDD\u5B58\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u6807\u51C6 JSON \u683C\u5F0F:",o),s=JSON.stringify(e,null,2)}break;default:s=JSON.stringify(e,null,2);break}Ha(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??Hr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??Hr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??Hr.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,o=t,i=r;await Promise.all([this._updateMCPServerToolStats(s,o,i),this.updateCustomMCPToolStats(s,o,i)]),u.debug(`\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}/${o}`)}else{let s=e,o=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(s,i,o),u.debug(`CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5DF2\u66F4\u65B0: ${s}`)}}catch(s){if(typeof t=="string"&&r){let o=e,i=t;u.error(`\u66F4\u65B0\u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${o}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let o=e;u.error(`\u66F4\u65B0 CustomMCP \u5DE5\u5177\u4F7F\u7528\u7EDF\u8BA1\u5931\u8D25 (${o}): ${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 u.warn(`CustomMCP \u5DE5\u5177\u7F3A\u5C11\u6709\u6548\u7684 name \u5B57\u6BB5: ${JSON.stringify(t)}`),!1;if(!t.description||typeof t.description!="string")return u.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 description \u5B57\u6BB5`),!1;if(!t.inputSchema||typeof t.inputSchema!="object")return u.warn(`CustomMCP \u5DE5\u5177 ${t.name} \u7F3A\u5C11\u6709\u6548\u7684 inputSchema \u5B57\u6BB5`),!1;if(!t.handler||typeof t.handler!="object")return u.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 u.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 u.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"?(u.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?(u.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 Coze \u5904\u7406\u5668\u5FC5\u987B\u63D0\u4F9B workflow_id \u6216 bot_id`),!1):!0:(u.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 proxy \u5904\u7406\u5668\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u5E73\u53F0: ${t.platform}`),!1):(u.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 u.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 u.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)?(u.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"?(u.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"?(u.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"?(u.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)?(u.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?(u.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:(u.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):(u.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"?(u.warn(`CustomMCP \u5DE5\u5177 ${e} \u7684 mcp \u5904\u7406\u5668\u7F3A\u5C11 config \u5B57\u6BB5`),!1):!t.config.serviceName||typeof t.config.serviceName!="string"?(u.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"?(u.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 u.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),u.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(o=>o.name)),s=e.filter(o=>!r.has(o.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}),u.debug(`\u6210\u529F\u6279\u91CF\u6DFB\u52A0 ${s.length} \u4E2A\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177: ${s.map(o=>o.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),u.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(o=>o.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),u.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}),u.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 o=this.getMutableConfig();o.mcpServerConfig||(o.mcpServerConfig={}),o.mcpServerConfig[e]||(o.mcpServerConfig[e]={tools:{}}),o.mcpServerConfig[e].tools[t]||(o.mcpServerConfig[e].tools[t]={enable:!0});let i=o.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=Zs(r).format("YYYY-MM-DD HH:mm:ss")),this.saveConfig(o)}async updateCustomMCPToolStats(e,t,r){try{let s,o,i=!0,a;if(typeof r=="string"){let O=e;s=`${O}__${t}`,o=r,a=`${O}/${t}`}else s=e,o=t,i=r||!0,a=s;let l=this.getCustomMCPTools(),g=l.findIndex(O=>O.name===s);if(g===-1)return;let p=[...l],h=p[g];h.stats||(h.stats={});let E=h.stats.usageCount||0,d=h.stats.lastUsedTime;i&&(h.stats.usageCount=E+1),(!d||new Date(o)>new Date(d))&&(h.stats.lastUsedTime=Zs(o).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(p)}catch(s){if(typeof r=="string"){let o=e,i=t;u.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${o}/${i}): ${s instanceof Error?s.message:String(s)}`)}else{let o=e;u.error(`\u66F4\u65B0 customMCP \u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25 (${o}): ${s instanceof Error?s.message:String(s)}`)}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return u.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)),u.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),u.debug(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(s){throw u.error(`\u5DE5\u5177 ${e} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,s),s}finally{this.releaseStatsUpdateLock(r)}}async updateMCPServerToolStatsWithLock(e,t,r,s=!0){let o=`mcpserver_${e}_${t}`;if(await this.acquireStatsUpdateLock(o))try{await this.updateMCPServerToolStats(e,t,r,s),u.debug(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5B8C\u6210`)}catch(i){throw u.error(`MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u66F4\u65B0\u5931\u8D25:`,i),i}finally{this.releaseStatsUpdateLock(o)}}clearAllStatsUpdateLocks(){let e=this.statsUpdateLocks.size;this.statsUpdateLocks.clear();for(let t of this.statsUpdateLockTimeouts.values())clearTimeout(t);this.statsUpdateLockTimeouts.clear(),e>0&&u.info(`\u5DF2\u6E05\u7406 ${e} \u4E2A\u7EDF\u8BA1\u66F4\u65B0\u9501`)}getStatsUpdateLocks(){return Array.from(this.statsUpdateLocks.keys())}getToolCallLogConfig(){return this.getConfig().toolCallLog||{}}updateToolCallLogConfig(e){let t=this.getMutableConfig();t.toolCallLog||(t.toolCallLog={}),Object.assign(t.toolCallLog,e),this.saveConfig(t)}getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}},m=Lt.getInstance()});var pe,it=f(()=>{"use strict";y();te();H();pe=class{static{c(this,"ConfigService")}logger;eventBus;constructor(){this.logger=u.withTag("ConfigService"),this.eventBus=P()}async getConfig(){try{let e=m.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!==m.getMcpEndpoint()&&m.updateMcpEndpoint(e.mcpEndpoint);let r=m.getMcpServers();for(let[s,o]of Object.entries(e.mcpServers))JSON.stringify(r[s])!==JSON.stringify(o)&&m.updateMcpServer(s,o);for(let s of Object.keys(r))s in e.mcpServers||(m.removeMcpServer(s),m.removeServerToolsConfig(s));if(e.connection&&m.updateConnectionConfig(e.connection),e.modelscope&&m.updateModelScopeConfig(e.modelscope),e.webUI&&m.updateWebUIConfig(e.webUI),e.mcpServerConfig)for(let[s,o]of Object.entries(e.mcpServerConfig))for(let[i,a]of Object.entries(o.tools))m.setToolEnabled(s,i,a.enable);if(e?.platforms)for(let[s,o]of Object.entries(e.platforms))m.updatePlatformConfig(s,o);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 m.getMcpEndpoint()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",e),e}}getMcpEndpoints(){try{return m.getMcpEndpoints()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",e),e}}getMcpServers(){try{return m.getMcpServers()}catch(e){throw this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",e),e}}getConnectionConfig(){try{return m.getConnectionConfig()}catch(e){throw this.logger.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",e),e}}getWebUIPort(){try{return m.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 m.configExists()}async reloadConfig(){try{this.logger.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E"),m.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 m.getConfigPath()}}});var _t,ro=f(()=>{"use strict";y();it();_t=class{static{c(this,"ConfigApiHandler")}logger;configService;constructor(){this.logger=u.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 Ua(n,e=3,t=1e3){for(let r=1;r<=e;r++)try{return await n()}catch(s){if(r===e)throw s;let o=t*2**(r-1);u.warn(`\u6263\u5B50 API \u8C03\u7528\u5931\u8D25\uFF0C${o}ms \u540E\u91CD\u8BD5 (${r}/${e})`,s),await new Promise(i=>setTimeout(i,o))}throw new Error("Max retry attempts exceeded")}function Va(n,e){let t=n.status;return t===401?new he("\u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6263\u5B50 API Token \u914D\u7F6E","AUTH_FAILED",401,e):t===429?new he("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED",429,e):t>=500?new he("\u6263\u5B50\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","SERVER_ERROR",t,e):new he(e?.msg||`API \u8C03\u7528\u5931\u8D25: ${n.statusText}`,"API_ERROR",t,e)}var Fr,he,kt,zr=f(()=>{"use strict";y();Fr=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())}}},he=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(Ua,"retryWithBackoff");c(Va,"handleCozeApiError");kt=class{static{c(this,"CozeApiService")}cache=new Fr;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 u.debug("\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868"),t;u.info("\u83B7\u53D6\u6263\u5B50\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await this.request("/v1/workspaces");if(r.code!==0)throw new he(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"),u.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 o=`workflows:${t}:${r}:${s}`,i=this.cache.get(o);if(i)return u.debug(`\u4ECE\u7F13\u5B58\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868: ${t}`),i;u.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 he(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(o,g,"workflows"),u.info(`\u6210\u529F\u83B7\u53D6 ${g.items.length} \u4E2A\u5DE5\u4F5C\u6D41\uFF0ChasMore: ${g.hasMore}`),g}async request(e){return Ua(async()=>{let t=`${this.API_BASE_URL}${e}`;u.debug(`\u53D1\u8D77\u6263\u5B50 API \u8BF7\u6C42: ${t}`);let r=new AbortController,s=setTimeout(()=>r.abort(),this.TIMEOUT);try{let o=await fetch(t,{headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},signal:r.signal});clearTimeout(s);let i;try{i=await o.json()}catch(a){throw u.error("\u89E3\u6790\u54CD\u5E94 JSON \u5931\u8D25:",a),new he("\u54CD\u5E94\u6570\u636E\u683C\u5F0F\u9519\u8BEF","PARSE_ERROR",o.status)}if(!o.ok)throw Va(o,i);return i}catch(o){throw clearTimeout(s),o instanceof Error&&o.name==="AbortError"?new he(`\u8BF7\u6C42\u8D85\u65F6 (${this.TIMEOUT}ms)`,"TIMEOUT",void 0):o}},this.RETRY_ATTEMPTS)}clearCache(e){this.cache.clear(e),u.info(`\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58${e?` (\u6A21\u5F0F: ${e})`:""}`)}getCacheStats(){return this.cache.getStats()}}});function jt(n,e){return{success:!0,data:n,message:e}}function F(n,e,t){return{success:!1,message:n,error:e?{code:e,details:t}:void 0}}function Ht(){let n=m.getCozeToken();if(!n)throw new Error("\u6263\u5B50 API Token \u672A\u914D\u7F6E\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E platforms.coze.token");return new kt(n)}var Le,so=f(()=>{"use strict";y();te();zr();c(jt,"createSuccessResponse");c(F,"createErrorResponse");c(Ht,"getCozeApiService");Le=class{static{c(this,"CozeApiHandler")}static async getWorkspaces(e){try{if(u.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return u.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 Ht().getWorkspaces();return u.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(jt({workspaces:r}))}catch(t){return u.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(u.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return u.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 u.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 o={workspace_id:t,page_num:r,page_size:s},a=await Ht().getWorkflows(o);u.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${a.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=m.getCustomMCPTools(),g=a.items.map(p=>{let h=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===p.workflow_id);return{...p,isAddedAsTool:!!h,toolName:h?.name||null}});return u.info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${g.filter(p=>p.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.json(jt({items:g,has_more:a.hasMore,page_num:r,page_size:s,total_count:a.items.length}))}catch(t){return u.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(u.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!m.isCozeConfigValid())return u.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=Ht(),s=r.getCacheStats();r.clearCache(t);let o=r.getCacheStats();return u.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${s.size} \u9879\uFF0C\u6E05\u9664\u540E: ${o.size} \u9879`),e.json(jt({cleared:s.size-o.size,remaining:o.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return u.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(u.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!m.isCozeConfigValid())return u.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=Ht().getCacheStats();return e.json(jt(r))}catch(t){return u.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 Ft,oo=f(()=>{"use strict";y();it();Ft=class{static{c(this,"HeartbeatHandler")}logger;statusService;notificationService;configService;constructor(e,t){this.logger=u.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 Te,no=f(()=>{"use strict";y();H();Te=class{static{c(this,"MCPEndpointApiHandler")}logger;xiaozhiConnectionManager;configManager;eventBus;constructor(e,t){this.logger=u.withTag("MCPEndpointApiHandler"),this.xiaozhiConnectionManager=e,this.configManager=t,this.eventBus=P()}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(o){this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",o);let i=this.createErrorResponse(t,o instanceof Error?o.message:"JSON\u89E3\u6790\u5931\u8D25");return{ok:!1,response:e.json(i,500)}}let s=r.endpoint;if(!s||typeof s!="string"){let o=this.createErrorResponse("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",s);return{ok:!1,response:e.json(o,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 o=this.xiaozhiConnectionManager.getConnectionStatus().find(i=>i.endpoint===r);if(!o){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(o))}catch(s){this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",s);let o=this.createErrorResponse("ENDPOINT_STATUS_READ_ERROR",s instanceof Error?s.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",r);return e.json(o,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 o=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!o){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(o.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 o=this.createErrorResponse("ENDPOINT_CONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",r);return e.json(o,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 o=this.xiaozhiConnectionManager.getConnectionStatus().find(p=>p.endpoint===r);if(!o){let p=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(p,404)}if(!o.connected){let p=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(p,409)}await this.xiaozhiConnectionManager.disconnectEndpoint(r);let a=this.xiaozhiConnectionManager.getConnectionStatus().find(p=>p.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 o=this.createErrorResponse("ENDPOINT_DISCONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",r);return e.json(o,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 o=this.xiaozhiConnectionManager.getConnectionStatus().find(g=>g.endpoint===r);if(!o){let g=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(g,404)}o.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 o=this.createErrorResponse("ENDPOINT_RECONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25",r);return e.json(o,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 o="ENDPOINT_ADD_ERROR",i=500;s instanceof Error&&(s.message.includes("\u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D")?(o="ENDPOINT_ALREADY_IN_CONFIG",i=409):s.message.includes("\u5DF2\u5B58\u5728")?(o="ENDPOINT_ALREADY_EXISTS",i=409):s.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(o="INVALID_ENDPOINT",i=400));let a=this.createErrorResponse(o,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 o=this.xiaozhiConnectionManager.getConnectionStatus().find(a=>a.endpoint===r);if(!o){let a=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(a,404)}o.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 o="ENDPOINT_REMOVE_ERROR",i=500;s instanceof Error&&(s.message.includes("\u4E0D\u5B58\u5728")?(o="ENDPOINT_NOT_FOUND",i=404):s.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(o="INVALID_ENDPOINT",i=400));let a=this.createErrorResponse(o,s instanceof Error?s.message:"\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25",r);return e.json(a,i)}}}});var Je,Ur=f(()=>{"use strict";y();Je=class{static{c(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=u}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,o=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=${o}`),{jsonrpc:"2.0",result:{serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"},capabilities:{tools:{},logging:{}},protocolVersion:o},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){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{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.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{createHash as Wa}from"crypto";function ye(n,e){let t=Wa("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function De(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Ie(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>6e4||e-t>n.ttl||n.status==="failed")}var Me,zt=f(()=>{"use strict";c(ye,"generateCacheKey");c(De,"isCacheExpired");c(Ie,"shouldCleanupCache");Me={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});var Ut,io=f(()=>{"use strict";zt();Ut=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}`)})},Me.CLEANUP_INTERVAL),this.logger.debug(`[CacheLifecycle] \u542F\u52A8\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${Me.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",o){let i={result:r,timestamp:new Date().toISOString(),ttl:Me.CACHE_TTL,status:s,consumed:!1,taskId:o,retryCount:0};return this.logger.debug(`[CacheLifecycle] \u521B\u5EFA\u7F13\u5B58\u6761\u76EE: ${e}, \u72B6\u6001: ${s}`),i}updateCacheStatus(e,t,r,s,o){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),o&&r==="failed"&&(i.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${o}`}]},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 De(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,o=t||r.map(([i])=>i);for(let i of o){let a=e.customMCPResults[i];a&&Ie(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}/${o.length}`),{cleaned:s,total:o.length}}cleanupExpiredCache(e){if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[s,o]of t)De(o.timestamp,o.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[o,i]of t)if(i.consumed){let a=new Date(i.timestamp).getTime();s-a>6e4&&(delete e.customMCPResults[o],r++,this.logger.debug(`[CacheLifecycle] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${o}`))}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(o=>o.status==="pending").length,this.statistics.completedTasks=t.filter(o=>o.status==="completed").length,this.statistics.failedTasks=t.filter(o=>o.status==="failed").length,this.statistics.consumedEntries=t.filter(o=>o.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}`),De(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 Vt,ao=f(()=>{"use strict";Vt=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),o=`${e}_${r}_${s}`;return this.logger.debug(`[TaskState] \u751F\u6210\u4EFB\u52A1ID: ${o}`),o}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(o=>/^\d+$/.test(o));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 o={taskId:e,toolName:t,arguments:r,status:s,startTime:new Date().toISOString()};return this.activeTasks.set(e,o),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}`),o}updateTaskStatus(e,t,r,s){let o=this.activeTasks.get(e);if(!o)return this.logger.warn(`[TaskState] \u4EFB\u52A1\u4E0D\u5B58\u5728: ${e}`),!1;let i=o.status;return o.status=t,(t==="completed"||t==="failed")&&(o.endTime=new Date().toISOString()),r&&(o.result=r),s&&(o.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,o]of this.activeTasks.entries())if(o.status==="completed"||o.status==="failed"){let i=o.endTime?new Date(o.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,o=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,p)=>{let h=this.getTaskExecutionTime(p.taskId)||0;return g+h},0)/a.length:0;return{total:t,pending:r,completed:s,failed:o,consumed:i,averageExecutionTime:l}}getTaskHistory(e){return e?this.taskHistory.filter(t=>t.taskId===e):[...this.taskHistory]}recordStateTransition(e,t,r,s){let o={from:t,to:r,reason:s,timestamp:new Date().toISOString(),taskId:e};this.taskHistory.push(o),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"},o=`${e}->${t}`;return s[o]||"\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 o=this.generateTaskId(s.toolName,s.arguments);this.createTask(o,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 co(n,e){return{content:[{type:"text",text:e?Ba(e,n):lo(n)}],isError:!1,taskId:n,status:"timeout",message:"\u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D",nextAction:"\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210"}}function Ba(n,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
4
4
 
5
5
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
6
6
  - \u4EFB\u52A1ID: ${e}
@@ -11,37 +11,32 @@ var pa=Object.create;var ot=Object.defineProperty;var da=Object.getOwnPropertyDe
11
11
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
12
12
  1. \u4F7F\u7528\u76F8\u540C\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
13
13
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
14
- 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:Cn(e)};return t[o]||t.default}function Cn(o){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
14
+ 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:lo(e)};return t[n]||t.default}function lo(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
15
15
 
16
16
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
17
- - \u4EFB\u52A1ID: ${o}
17
+ - \u4EFB\u52A1ID: ${n}
18
18
  - \u72B6\u6001: \u5904\u7406\u4E2D
19
19
  - \u5EFA\u8BAE: \u8BF7\u7B49\u5F8530\u79D2\u540E\u91CD\u8BD5\u67E5\u8BE2
20
20
 
21
21
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
22
22
  1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
23
23
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
24
- 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var ct,Br=f(()=>{"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(nc,"getToolSpecificTimeoutMessage");c(Cn,"getDefaultTimeoutMessage")});var vn=f(()=>{"use strict"});var Sn=f(()=>{"use strict";Wt();vn();Br()});import{createHash as oc}from"crypto";import{existsSync as lt,mkdirSync as ic,readFileSync as En,renameSync as ac,writeFileSync as Tn}from"fs";import{dirname as cc,resolve as yn}from"path";import lc from"dayjs";var Te,Gt=f(()=>{"use strict";T();Sn();Te=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=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return lc().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(!lt(this.cachePath)){let e=cc(this.cachePath);lt(e)||(ic(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(!lt(this.cachePath))return await this.createInitialCache();let e=En(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{Tn(r,t,"utf8"),ac(r,e)}catch(s){try{lt(r)&&Tn(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return oc("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:lt(this.cachePath)?En(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=we(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=we(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=we(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=we(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=we(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)De(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(h=>h.status==="pending").length,n=t.filter(h=>h.status==="completed").length,i=t.filter(h=>h.status==="failed").length,a=t.filter(h=>h.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 gt,qr=f(()=>{"use strict";dn();mn();T();te();Wt();Br();k();Gt();gt=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;cacheLifecycleManager;taskStateManager;mcpServiceManager;TIMEOUT=be.TIMEOUT;CACHE_TTL=be.CACHE_TTL;CLEANUP_INTERVAL=be.CLEANUP_INTERVAL;cleanupTimer;activeTasks=new Map;eventBus=P();constructor(e,t){this.logger=u,this.cacheManager=e||new Te,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&&!Je(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,h=setTimeout(()=>g.abort(),a);try{let p=await fetch(i,{method:"POST",headers:l,body:JSON.stringify(t)});if(clearTimeout(h),!p.ok){let m=await p.text();throw new Error(`Coze API \u8BF7\u6C42\u5931\u8D25 (${p.status}): ${m}`)}let S=await p.json();return this.logger.debug("[CustomMCP] Coze API \u54CD\u5E94:",S),S}catch(p){throw clearTimeout(h),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[h,p]of Object.entries(t))p!=null&&l.append(h,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,h=setTimeout(()=>g.abort(),s),p=await fetch(e,{...t,signal:g.signal});if(clearTimeout(h),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",h,p=!1;try{if(e.script.includes(`
25
- `)||e.script.length>200){let A=await n.mkdtemp(i.join(a.tmpdir(),"xiaozhi-script-")),ge=this.getScriptExtension(g);h=i.join(A,`script${ge}`),await n.writeFile(h,e.script,"utf8"),p=!0}else{h=e.script;try{await n.access(h)}catch{throw new Error(`\u811A\u672C\u6587\u4EF6\u4E0D\u5B58\u5728: ${h}`)}}let S={...process.env,...e.env,XIAOZHI_ARGUMENTS:JSON.stringify(t)},m=this.buildScriptCommand(g,h);return this.logger.debug(`[CustomMCP] \u6267\u884C\u811A\u672C\u547D\u4EE4: ${m.join(" ")}`),new Promise((A,ge)=>{let ce=r(m[0],m.slice(1),{env:S,stdio:["pipe","pipe","pipe"]}),$t="",_="";ce.stdout?.on("data",ue=>{$t+=ue.toString()}),ce.stderr?.on("data",ue=>{_+=ue.toString()});let At=setTimeout(()=>{ce.kill("SIGTERM"),ge(new Error(`\u811A\u672C\u6267\u884C\u8D85\u65F6 (${l}ms)`))},l);ce.on("close",ue=>{clearTimeout(At),ue===0?A($t.trim()):ge(new Error(`\u811A\u672C\u6267\u884C\u5931\u8D25 (\u9000\u51FA\u7801: ${ue}): ${_.trim()}`))}),ce.on("error",ue=>{clearTimeout(At),ge(new Error(`\u811A\u672C\u6267\u884C\u9519\u8BEF: ${ue.message}`))}),t&&Object.keys(t).length>0&&(ce.stdin?.write(JSON.stringify(t)),ce.stdin?.end())})}finally{if(p&&h)try{await n.unlink(h),await n.rmdir(i.dirname(h))}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(`
26
- `);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];De(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||{}))De(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 we(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]}}}});var Xt,Mn=f(()=>{"use strict";T();k();Xt=class{static{c(this,"ToolSyncManager")}configManager;logger;syncLocks=new Map;eventBus=P();constructor(e,t=u){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 h={};g.usageCount!==void 0&&(h.usageCount=g.usageCount),g.lastUsedTime&&(h.lastUsedTime=g.lastUsedTime),Object.keys(h).length>0&&(await this.updateCustomMCPToolStats(a,h),this.logger.debug(`\u5DF2\u540C\u6B65\u5DE5\u5177 ${a} \u7684\u7EDF\u8BA1\u4FE1\u606F: ${JSON.stringify(h)}`))}}}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 Gr,Ye,ut,w,Xr,Ke,Le=f(()=>{"use strict";Gr={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},Ye={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"},w={GENERAL_ERROR:"GENERAL_ERROR",CONFIG_ERROR:"CONFIG_ERROR",SERVICE_ERROR:"SERVICE_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",FILE_ERROR:"FILE_ERROR",PROCESS_ERROR:"PROCESS_ERROR",NETWORK_ERROR:"NETWORK_ERROR",PERMISSION_ERROR:"PERMISSION_ERROR"},Xr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3},Ke={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var W,_e,D,b,R,ye,de=f(()=>{"use strict";Le();W=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)}},_e=class o extends W{static{c(this,"ConfigError")}constructor(e,t){super(e,w.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"])}},D=class o extends W{static{c(this,"ServiceError")}constructor(e,t){super(e,w.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"])}},b=class o extends W{static{c(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,w.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 W{static{c(this,"FileError")}constructor(e,t,r){let s=t?`${e}: ${t}`:e;super(s,w.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"])}},ye=class o extends W{static{c(this,"ProcessError")}constructor(e,t,r){let s=t?`${e} (PID: ${t})`:e;super(s,w.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 F from"fs";import re from"path";var I,ht=f(()=>{"use strict";de();I=class o{static{c(this,"FileUtils")}static exists(e){try{return F.existsSync(e)}catch{return!1}}static ensureDir(e){try{F.existsSync(e)||F.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 F.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=re.dirname(e);o.ensureDir(s),F.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=re.dirname(t);o.ensureDir(s),F.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)&&F.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=F.readdirSync(e);for(let n of s){if(r.exclude?.includes(n))continue;let i=re.join(e,n),a=re.join(t,n);F.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)&&F.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=F.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=F.readdirSync(e),s=[];for(let n of r){if(!t.includeHidden&&n.startsWith("."))continue;let i=re.join(e,n);if(s.push(i),t.recursive&&F.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 re.join(r,i)}static checkPermissions(e,t=F.constants.R_OK|F.constants.W_OK){try{return F.accessSync(e,t),!0}catch{return!1}}static getExtension(e){return re.extname(e).toLowerCase()}static getBaseName(e){return re.basename(e,re.extname(e))}static normalizePath(e){return re.normalize(e)}static resolvePath(e,t){return t?re.resolve(t,e):re.resolve(e)}}});import{realpathSync as gc}from"fs";import{tmpdir as uc}from"os";import N from"path";import{fileURLToPath as Pn}from"url";var O,Ie=f(()=>{"use strict";Le();ht();O=class o{static{c(this,"PathUtils")}static getPidFile(){let e=process.env[Ye.DIR_ENV_VAR]||process.cwd();return N.join(e,`.${Gr.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return N.join(t,Gr.LOG_FILE)}static getConfigDir(){return process.env[Ye.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=o.getConfigDir();return N.join(e,ut.WORK_DIR)}static getTemplatesDir(){let e=Pn(import.meta.url),t=N.dirname(e);return[N.join(t,ut.TEMPLATES_DIR),N.join(t,"..","..","..",ut.TEMPLATES_DIR),N.join(t,"..","..","..","..",ut.TEMPLATES_DIR)]}static findTemplatesDir(){let e=o.getTemplatesDir();for(let t of e)if(I.exists(t))return t;return null}static getTemplatePath(e){let t=o.findTemplatesDir();if(!t)return null;let r=N.join(t,e);return I.exists(r)?r:null}static getScriptDir(){let e=Pn(import.meta.url);return N.dirname(e)}static getProjectRoot(){let e=o.getScriptDir();return N.join(e,"..","..","..")}static getDistDir(){let e=o.getProjectRoot();return N.join(e,"dist")}static getRelativePath(e){let t=o.getProjectRoot();return N.relative(t,e)}static resolveConfigPath(e){let t=o.getConfigDir();if(e)return N.join(t,`xiaozhi.config.${e}`);for(let r of Ye.FILE_NAMES){let s=N.join(t,r);if(I.exists(s))return s}return N.join(t,Ye.FILE_NAMES[2])}static getDefaultConfigPath(){let e=o.getProjectRoot();return N.join(e,Ye.DEFAULT_FILE)}static validatePath(e){return!N.normalize(e).includes("..")}static ensurePathWithin(e,t){let r=N.resolve(t,e),s=N.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 N.join(process.cwd(),`${e}.js`);let r;try{r=gc(t)}catch{r=t}let s=N.dirname(r);return N.join(s,`${e}.js`)}static getMcpServerProxyPath(){return o.getExecutablePath("mcpServerProxy")}static getWebServerStandalonePath(){return o.getExecutablePath("WebServerStandalone")}static createSafePath(...e){let t=N.join(...e),r=N.normalize(t);if(r.includes("..")||r.includes("~"))throw new Error(`\u4E0D\u5B89\u5168\u7684\u8DEF\u5F84: ${r}`);return r}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||uc()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import*as Qe from"fs";import*as ke from"path";import Jt from"pino";var Ze,Jr=f(()=>{"use strict";Ie();T();Ze=class{static{c(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e.maxRecords??100,e.logFilePath)this.logFilePath=ke.resolve(ke.normalize(e.logFilePath));else{let r=t||O.getTempDir();this.logFilePath=ke.join(ke.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),u.debug(`ToolCallLogger \u521D\u59CB\u5316: maxRecords=${this.maxRecords}, path=${this.logFilePath}`)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:c(r=>{try{let s=JSON.parse(r),n=this.formatConsoleMessage(s);u.info(`[\u5DE5\u5177\u8C03\u7528] ${n}`)}catch{u.info(`[\u5DE5\u5177\u8C03\u7528] ${r.trim()}`)}},"write")}});try{t.push({level:"info",stream:Jt.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){u.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6:",r)}return Jt({level:"info",timestamp:Jt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((r,s)=>({level:s}),"level")},base:null},Jt.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,s=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${s}`}async cleanupOldRecords(){try{if(!Qe.existsSync(this.logFilePath))return;let t=Qe.readFileSync(this.logFilePath,"utf8").trim().split(`
27
- `).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,s=t.slice(r),n=s.join(`
24
+ 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var at,Vr=f(()=>{"use strict";at=class n extends Error{static{c(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};c(co,"createTimeoutResponse");c(Ba,"getToolSpecificTimeoutMessage");c(lo,"getDefaultTimeoutMessage")});var go=f(()=>{"use strict"});var uo=f(()=>{"use strict";zt();go();Vr()});import{createHash as qa}from"crypto";import{existsSync as ct,mkdirSync as Ga,readFileSync as po,renameSync as Xa,writeFileSync as ho}from"fs";import{dirname as Ja,resolve as mo}from"path";import Ya from"dayjs";var Pe,Wt=f(()=>{"use strict";y();uo();Pe=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=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ya().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return mo(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return mo(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!ct(this.cachePath)){let e=Ja(this.cachePath);ct(e)||(Ga(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(),o=this.generateConfigHash(r),i={tools:t.map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:o,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(!ct(this.cachePath))return await this.createInitialCache();let e=po(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{ho(r,t,"utf8"),Xa(r,e)}catch(s){try{ct(r)&&ho(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return qa("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:ct(this.cachePath)?po(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 o of s.tools)t.push({...o,name:`${r}__${o.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",o,i=3e5){try{let a=await this.loadExtendedCache(),l=ye(e,t),g={result:r,timestamp:new Date().toISOString(),ttl:i,status:s,consumed:!1,taskId:o,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=ye(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return null;let o=r.customMCPResults[s],i=Date.now(),a=new Date(o.timestamp).getTime();return i-a>o.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):o}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,o){try{let i=await this.loadExtendedCache(),a=ye(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),o&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${o}`}]},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=ye(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return!1;let o=r.customMCPResults[s];return o.consumed||(o.consumed=!0,o.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=ye(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,o]of t)Ie(o)&&(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(p=>p.status==="pending").length,o=t.filter(p=>p.status==="completed").length,i=t.filter(p=>p.status==="failed").length,a=t.filter(p=>p.consumed).length,l=o>0?a/o*100:0,g=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:s,completedTasks:o,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 lt,Wr=f(()=>{"use strict";io();ao();y();te();zt();Vr();H();Wt();lt=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;cacheLifecycleManager;taskStateManager;mcpServiceManager;TIMEOUT=Me.TIMEOUT;CACHE_TTL=Me.CACHE_TTL;CLEANUP_INTERVAL=Me.CLEANUP_INTERVAL;cleanupTimer;activeTasks=new Map;eventBus=P();constructor(e,t){this.logger=u,this.cacheManager=e||new Pe,this.mcpServiceManager=t,this.cacheLifecycleManager=new Ut(this.logger),this.taskStateManager=new Vt(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=m.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||m.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 o=await this.getCompletedResult(e,t);if(o)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),o;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 at){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}`),co(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 o=await this.callToolByType(r,t);return await this.markTaskAsCompleted(s,o),o}catch(o){throw await this.markTaskAsFailed(s,o),o}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new at(`\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 o=s.customMCPResults[r];return o.status==="completed"&&!o.consumed&&!De(o.timestamp,o.ttl)?o.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 o=this.buildCozeRequest(s,t),i=await this.sendCozeRequest(s,o);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`,{response:i}),this.processCozeResponse(e.name,i)}catch(o){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,o),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`}],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="",o=m.getConfig().platforms?.coze?.token;if(!o)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 ${o}`,...e.headers};this.logger.debug(`[CustomMCP] \u53D1\u9001 Coze \u8BF7\u6C42\u5230: ${i}`,{headers:{...l},body:t});let g=new AbortController,p=setTimeout(()=>g.abort(),a);try{let h=await fetch(i,{method:"POST",headers:l,body:JSON.stringify(t)});if(clearTimeout(p),!h.ok){let d=await h.text();throw new Error(`Coze API \u8BF7\u6C42\u5931\u8D25 (${h.status}): ${d}`)}let E=await h.json();return this.logger.debug("[CustomMCP] Coze API \u54CD\u5E94:",E),E}catch(h){throw clearTimeout(p),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),o=this.getFunction(s,r.function),i=await this.executeFunction(o,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,o={...r.context,logger:this.logger,arguments:t},i=Promise.resolve().then(()=>e.length>1?e(t,o):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:o}=this.buildHttpRequest(r,t),i=await this.sendHttpRequest(s,o,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 o,i=e.url;if(r!=="GET")e.body_template?o=this.replaceTemplateVariables(e.body_template,t):o=JSON.stringify(t);else{let l=new URLSearchParams;for(let[p,h]of Object.entries(t))h!=null&&l.append(p,String(h));let g=l.toString();g&&(i+=(i.includes("?")?"&":"?")+g)}return{url:i,requestOptions:{method:r,headers:s,body:o}}}async sendHttpRequest(e,t,r){let s=r.timeout||3e4,o=r.retry_count||0,i=r.retry_delay||1e3,a=null;for(let l=0;l<=o;l++){try{this.logger.debug(`[CustomMCP] \u53D1\u9001 HTTP \u8BF7\u6C42 (\u5C1D\u8BD5 ${l+1}/${o+1}): ${e}`,{method:t.method,headers:t.headers});let g=new AbortController,p=setTimeout(()=>g.abort(),s),h=await fetch(e,{...t,signal:g.signal});if(clearTimeout(p),h.ok||l===o)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}/${o+1}):`,a.message),l===o)throw a}l<o&&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")||"",o;if(s.includes("application/json")?o=await t.json():o=await t.text(),!t.ok)return{content:[{type:"text",text:`HTTP \u8BF7\u6C42\u5931\u8D25 (${t.status}): ${typeof o=="string"?o:JSON.stringify(o)}`}],isError:!0};let i=o;return r.response_mapping&&(i=this.extractResponseData(o,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,o]of Object.entries(t)){let i=`{{${s}}}`,a=typeof o=="string"?o:JSON.stringify(o);r=r.replace(new RegExp(i.replace(/[{}]/g,"\\$&"),"g"),a)}return r}extractResponseData(e,t){if(!t)return e;let r=c((s,o)=>{if(!o)return s;let i=o.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"),o=await import("fs/promises"),i=await import("path"),a=await import("os"),l=e.timeout||3e4,g=e.interpreter||"node",p,h=!1;try{if(e.script.includes(`
25
+ `)||e.script.length>200){let O=await o.mkdtemp(i.join(a.tmpdir(),"xiaozhi-script-")),ge=this.getScriptExtension(g);p=i.join(O,`script${ge}`),await o.writeFile(p,e.script,"utf8"),h=!0}else{p=e.script;try{await o.access(p)}catch{throw new Error(`\u811A\u672C\u6587\u4EF6\u4E0D\u5B58\u5728: ${p}`)}}let E={...process.env,...e.env,XIAOZHI_ARGUMENTS:JSON.stringify(t)},d=this.buildScriptCommand(g,p);return this.logger.debug(`[CustomMCP] \u6267\u884C\u811A\u672C\u547D\u4EE4: ${d.join(" ")}`),new Promise((O,ge)=>{let ce=r(d[0],d.slice(1),{env:E,stdio:["pipe","pipe","pipe"]}),bt="",k="";ce.stdout?.on("data",ue=>{bt+=ue.toString()}),ce.stderr?.on("data",ue=>{k+=ue.toString()});let It=setTimeout(()=>{ce.kill("SIGTERM"),ge(new Error(`\u811A\u672C\u6267\u884C\u8D85\u65F6 (${l}ms)`))},l);ce.on("close",ue=>{clearTimeout(It),ue===0?O(bt.trim()):ge(new Error(`\u811A\u672C\u6267\u884C\u5931\u8D25 (\u9000\u51FA\u7801: ${ue}): ${k.trim()}`))}),ce.on("error",ue=>{clearTimeout(It),ge(new Error(`\u811A\u672C\u6267\u884C\u9519\u8BEF: ${ue.message}`))}),t&&Object.keys(t).length>0&&(ce.stdin?.write(JSON.stringify(t)),ce.stdin?.end())})}finally{if(h&&p)try{await o.unlink(p),await o.rmdir(i.dirname(p))}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 o=s.flatMap(a=>a.content),i=s.some(a=>a.isError);return{content:o,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 o of e.tools)try{this.logger.debug(`[CustomMCP] \u6267\u884C\u94FE\u5F0F\u5DE5\u5177\u4E2D\u7684: ${o}`);let i=await this.callToolRecursive(o,s);if(r.push(i),i.isError){if(e.error_handling==="stop")break;if(e.error_handling==="retry"){this.logger.warn(`[CustomMCP] \u5DE5\u5177 ${o} \u6267\u884C\u5931\u8D25\uFF0C\u5C1D\u8BD5\u91CD\u8BD5`);let a=await this.callToolRecursive(o,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(`
26
+ `);if(a)try{s=JSON.parse(a)}catch{s={input:a,...t}}}}catch(i){let a={content:[{type:"text",text:`\u5DE5\u5177 ${o} \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(o){return{content:[{type:"text",text:`\u5DE5\u5177 ${s} \u6267\u884C\u5F02\u5E38: ${o instanceof Error?o.message:String(o)}`}],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 o=s.customMCPResults[r];Ie(o)&&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),o={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,o),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[o,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[o,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,o]of Object.entries(e.customMCPResults||{}))Ie(o)&&(e.customMCPResults?.[s]&&delete e.customMCPResults[s],t=!0,r++,o.taskId&&this.activeTasks.delete(o.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 ye(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),o={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(s,o),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]}}}});var Bt,fo=f(()=>{"use strict";y();H();Bt=class{static{c(this,"ToolSyncManager")}configManager;logger;syncLocks=new Map;eventBus=P();constructor(e,t=u){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 o=r.length-s.length;this.logger.info(`\u6210\u529F\u4ECEcustomMCP\u4E2D\u79FB\u9664\u670D\u52A1 ${e} \u7684 ${o} \u4E2A\u5DE5\u5177`),this.eventBus.emitEvent("tool-sync:service-tools-removed",{serviceName:e,removedCount:o,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 o=this.configManager.getCustomMCPTools(),i=new Set(o.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 o=e[s.name];o&&o.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(),o=new Map(s.map(i=>[i.name,i]));for(let i of t){let a=`${e}__${i.name}`,l=o.get(a),g=r[i.name];if(l&&g&&(!l.stats||!l.stats.usageCount&&!l.stats.lastUsedTime)){let p={};g.usageCount!==void 0&&(p.usageCount=g.usageCount),g.lastUsedTime&&(p.lastUsedTime=g.lastUsedTime),Object.keys(p).length>0&&(await this.updateCustomMCPToolStats(a,p),this.logger.debug(`\u5DF2\u540C\u6B65\u5DE5\u5177 ${a} \u7684\u7EDF\u8BA1\u4FE1\u606F: ${JSON.stringify(p)}`))}}}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 o=[...r],i=o[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(o)}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 Co=f(()=>{"use strict";y()});var Br,Ye,gt,w,qr,Ke,_e=f(()=>{"use strict";Br={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},Ye={FILE_NAMES:["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"],DEFAULT_FILE:"xiaozhi.config.default.json",DIR_ENV_VAR:"XIAOZHI_CONFIG_DIR"},gt={WORK_DIR:".xiaozhi",TEMPLATES_DIR:"templates",LOGS_DIR:"logs"},w={GENERAL_ERROR:"GENERAL_ERROR",CONFIG_ERROR:"CONFIG_ERROR",SERVICE_ERROR:"SERVICE_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",FILE_ERROR:"FILE_ERROR",PROCESS_ERROR:"PROCESS_ERROR",NETWORK_ERROR:"NETWORK_ERROR",PERMISSION_ERROR:"PERMISSION_ERROR"},qr={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3},Ke={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var B,ke,L,b,R,Re,me=f(()=>{"use strict";_e();B=class n extends Error{constructor(t,r,s=1,o){super(t);this.code=r;this.exitCode=s;this.suggestions=o;this.name="CLIError",Error.captureStackTrace&&Error.captureStackTrace(this,n)}static{c(this,"CLIError")}static withSuggestions(t,r,s){return new n(t,r,1,s)}},ke=class n extends B{static{c(this,"ConfigError")}constructor(e,t){super(e,w.CONFIG_ERROR,1,t),this.name="ConfigError"}static configNotFound(){return new n("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728",['\u8BF7\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6'])}static invalidFormat(e){return new n(`\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F: ${e}`,["\u652F\u6301\u7684\u683C\u5F0F: json, json5, jsonc"])}},L=class n extends B{static{c(this,"ServiceError")}constructor(e,t){super(e,w.SERVICE_ERROR,1,t),this.name="ServiceError"}static alreadyRunning(e){return new n(`\u670D\u52A1\u5DF2\u7ECF\u5728\u8FD0\u884C (PID: ${e})`,['\u8BF7\u5148\u8FD0\u884C "xiaozhi stop" \u505C\u6B62\u73B0\u6709\u670D\u52A1','\u6216\u8005\u4F7F\u7528 "xiaozhi restart" \u91CD\u542F\u670D\u52A1'])}static autoRestarting(e){return new n(`\u68C0\u6D4B\u5230\u670D\u52A1\u5DF2\u5728\u8FD0\u884C (PID: ${e})\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u542F...`,["\u5982\u679C\u4E0D\u5E0C\u671B\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u4F7F\u7528 xiaozhi stop \u624B\u52A8\u505C\u6B62\u670D\u52A1"])}static notRunning(){return new n("\u670D\u52A1\u672A\u8FD0\u884C",['\u8BF7\u8FD0\u884C "xiaozhi start" \u542F\u52A8\u670D\u52A1'])}static startFailed(e){return new n(`\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${e}`,["\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u662F\u5426\u6B63\u786E","\u786E\u4FDD\u7AEF\u53E3\u672A\u88AB\u5360\u7528","\u67E5\u770B\u65E5\u5FD7\u6587\u4EF6\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F"])}},b=class n extends B{static{c(this,"ValidationError")}constructor(e,t){super(`\u9A8C\u8BC1\u5931\u8D25: ${t} - ${e}`,w.VALIDATION_ERROR,1),this.name="ValidationError"}static invalidPort(e){return new n(`\u7AEF\u53E3\u53F7\u5FC5\u987B\u5728 1-65535 \u8303\u56F4\u5185\uFF0C\u5F53\u524D\u503C: ${e}`,"port")}static requiredField(e){return new n("\u5FC5\u586B\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A",e)}},R=class n extends B{static{c(this,"FileError")}constructor(e,t,r){let s=t?`${e}: ${t}`:e;super(s,w.FILE_ERROR,1,r),this.name="FileError"}static notFound(e){return new n("\u6587\u4EF6\u4E0D\u5B58\u5728",e,["\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u662F\u5426\u6B63\u786E"])}static permissionDenied(e){return new n("\u6743\u9650\u4E0D\u8DB3",e,["\u68C0\u67E5\u6587\u4EF6\u6743\u9650\u6216\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"])}static alreadyExists(e){return new n("\u6587\u4EF6\u5DF2\u5B58\u5728",e,["\u4F7F\u7528\u4E0D\u540C\u7684\u6587\u4EF6\u540D\u6216\u5220\u9664\u73B0\u6709\u6587\u4EF6"])}},Re=class n extends B{static{c(this,"ProcessError")}constructor(e,t,r){let s=t?`${e} (PID: ${t})`:e;super(s,w.PROCESS_ERROR,1,r),this.name="ProcessError"}static killFailed(e){return new n("\u65E0\u6CD5\u7EC8\u6B62\u8FDB\u7A0B",e,["\u8FDB\u7A0B\u53EF\u80FD\u5DF2\u7ECF\u505C\u6B62\u6216\u6743\u9650\u4E0D\u8DB3"])}static notFound(e){return new n("\u8FDB\u7A0B\u4E0D\u5B58\u5728",e)}}});import z from"fs";import re from"path";var I,ut=f(()=>{"use strict";me();I=class n{static{c(this,"FileUtils")}static exists(e){try{return z.existsSync(e)}catch{return!1}}static ensureDir(e){try{z.existsSync(e)||z.mkdirSync(e,{recursive:!0})}catch{throw new R("\u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55",e)}}static readFile(e,t="utf8"){try{if(!n.exists(e))throw R.notFound(e);return z.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&&n.exists(e))throw R.alreadyExists(e);let s=re.dirname(e);n.ensureDir(s),z.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(!n.exists(e))throw R.notFound(e);if(!r?.overwrite&&n.exists(t))throw R.alreadyExists(t);let s=re.dirname(t);n.ensureDir(s),z.copyFileSync(e,t)}catch(s){throw s instanceof R?s:new R("\u65E0\u6CD5\u590D\u5236\u6587\u4EF6",e)}}static deleteFile(e){try{n.exists(e)&&z.unlinkSync(e)}catch{throw new R("\u65E0\u6CD5\u5220\u9664\u6587\u4EF6",e)}}static copyDirectory(e,t,r={}){try{if(!n.exists(e))throw R.notFound(e);n.ensureDir(t);let s=z.readdirSync(e);for(let o of s){if(r.exclude?.includes(o))continue;let i=re.join(e,o),a=re.join(t,o);z.statSync(i).isDirectory()?r.recursive!==!1&&n.copyDirectory(i,a,r):n.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{n.exists(e)&&z.rmSync(e,{recursive:t.recursive??!0,force:!0})}catch{throw new R("\u65E0\u6CD5\u5220\u9664\u76EE\u5F55",e)}}static getFileInfo(e){try{if(!n.exists(e))throw R.notFound(e);let t=z.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(!n.exists(e))throw R.notFound(e);let r=z.readdirSync(e),s=[];for(let o of r){if(!t.includeHidden&&o.startsWith("."))continue;let i=re.join(e,o);if(s.push(i),t.recursive&&z.statSync(i).isDirectory()){let a=n.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(),o=Math.random().toString(36).substring(2),i=`${e}${s}-${o}${t}`;return re.join(r,i)}static checkPermissions(e,t=z.constants.R_OK|z.constants.W_OK){try{return z.accessSync(e,t),!0}catch{return!1}}static getExtension(e){return re.extname(e).toLowerCase()}static getBaseName(e){return re.basename(e,re.extname(e))}static normalizePath(e){return re.normalize(e)}static resolvePath(e,t){return t?re.resolve(t,e):re.resolve(e)}}});import{realpathSync as Ka}from"fs";import{tmpdir as Za}from"os";import N from"path";import{fileURLToPath as vo}from"url";var $,$e=f(()=>{"use strict";_e();ut();$=class n{static{c(this,"PathUtils")}static getPidFile(){let e=process.env[Ye.DIR_ENV_VAR]||process.cwd();return N.join(e,`.${Br.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return N.join(t,Br.LOG_FILE)}static getConfigDir(){return process.env[Ye.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=n.getConfigDir();return N.join(e,gt.WORK_DIR)}static getTemplatesDir(){let e=vo(import.meta.url),t=N.dirname(e);return[N.join(t,gt.TEMPLATES_DIR),N.join(t,"..","..","..",gt.TEMPLATES_DIR),N.join(t,"..","..","..","..",gt.TEMPLATES_DIR)]}static findTemplatesDir(){let e=n.getTemplatesDir();for(let t of e)if(I.exists(t))return t;return null}static getTemplatePath(e){let t=n.findTemplatesDir();if(!t)return null;let r=N.join(t,e);return I.exists(r)?r:null}static getScriptDir(){let e=vo(import.meta.url);return N.dirname(e)}static getProjectRoot(){let e=n.getScriptDir();return N.join(e,"..","..","..")}static getDistDir(){let e=n.getProjectRoot();return N.join(e,"dist")}static getRelativePath(e){let t=n.getProjectRoot();return N.relative(t,e)}static resolveConfigPath(e){let t=n.getConfigDir();if(e)return N.join(t,`xiaozhi.config.${e}`);for(let r of Ye.FILE_NAMES){let s=N.join(t,r);if(I.exists(s))return s}return N.join(t,Ye.FILE_NAMES[2])}static getDefaultConfigPath(){let e=n.getProjectRoot();return N.join(e,Ye.DEFAULT_FILE)}static validatePath(e){return!N.normalize(e).includes("..")}static ensurePathWithin(e,t){let r=N.resolve(t,e),s=N.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 N.join(process.cwd(),`${e}.js`);let r;try{r=Ka(t)}catch{r=t}let s=N.dirname(r);return N.join(s,`${e}.js`)}static getMcpServerProxyPath(){return n.getExecutablePath("mcpServerProxy")}static getWebServerStandalonePath(){return n.getExecutablePath("WebServerStandalone")}static createSafePath(...e){let t=N.join(...e),r=N.normalize(t);if(r.includes("..")||r.includes("~"))throw new Error(`\u4E0D\u5B89\u5168\u7684\u8DEF\u5F84: ${r}`);return r}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||Za()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import*as Qe from"fs";import*as je from"path";import qt from"pino";var Ze,Gr=f(()=>{"use strict";$e();y();Ze=class{static{c(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e.maxRecords??100,e.logFilePath)this.logFilePath=je.resolve(je.normalize(e.logFilePath));else{let r=t||$.getTempDir();this.logFilePath=je.join(je.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),u.debug(`ToolCallLogger \u521D\u59CB\u5316: maxRecords=${this.maxRecords}, path=${this.logFilePath}`)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:c(r=>{try{let s=JSON.parse(r),o=this.formatConsoleMessage(s);u.info(`[\u5DE5\u5177\u8C03\u7528] ${o}`)}catch{u.info(`[\u5DE5\u5177\u8C03\u7528] ${r.trim()}`)}},"write")}});try{t.push({level:"info",stream:qt.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){u.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6:",r)}return qt({level:"info",timestamp:qt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((r,s)=>({level:s}),"level")},base:null},qt.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,s=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${s}`}async cleanupOldRecords(){try{if(!Qe.existsSync(this.logFilePath))return;let t=Qe.readFileSync(this.logFilePath,"utf8").trim().split(`
27
+ `).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,s=t.slice(r),o=s.join(`
28
28
  `)+(s.length>0?`
29
- `:"");Qe.writeFileSync(this.logFilePath,n,"utf8"),u.debug(`\u5DF2\u6E05\u7406 ${r} \u6761\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\uFF0C\u4FDD\u7559\u6700\u65B0 ${this.maxRecords} \u6761`)}catch(e){u.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25:",e)}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){u.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t)}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}}});var pt,Rn,Yt=f(()=>{"use strict";T();te();qr();k();Gt();Be();Mn();Jr();pt=class{static{c(this,"MCPServiceManager")}services=new Map;configs={};logger;tools=new Map;customMCPHandler;cacheManager;toolSyncManager;eventBus=P();toolCallLogger;retryTimers=new Map;failedServices=new Set;constructor(e){this.logger=u,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 Te(r),this.customMCPHandler=new gt,this.toolSyncManager=new Xt(d,this.logger);let s=d.getToolCallLogConfig(),n=d.getConfigDir();this.toolCallLogger=new Ze(s,n),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(a){this.logger.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",a)}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}this.logger.info(`[MCPManager] \u5F00\u59CB\u5E76\u884C\u542F\u52A8 ${e.length} \u4E2A MCP \u670D\u52A1`);let t=e.map(async([a])=>{try{return await this.startService(a),{serviceName:a,success:!0,error:null}}catch(l){return{serviceName:a,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),s=0,n=0,i=[];for(let a of r)a.status==="fulfilled"?a.value.success?s++:(n++,i.push(a.value.serviceName)):n++;this.logger.info(`[MCPManager] \u670D\u52A1\u542F\u52A8\u5B8C\u6210 - \u6210\u529F: ${s}, \u5931\u8D25: ${n}`),i.length>0&&(this.logger.warn(`[MCPManager] \u4EE5\u4E0B\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${i.join(", ")}`),n===e.length&&this.logger.warn("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25\uFF0C\u4F46\u7CFB\u7EDF\u5C06\u7EE7\u7EED\u8FD0\u884C\u4EE5\u4FBF\u91CD\u8BD5")),i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r=new qe(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),this.services.delete(e),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)try{if(s.isConnected()){let n=s.getTools();for(let i of n)try{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})}catch(a){this.logger.warn(`[MCPManager] \u68C0\u67E5\u5DE5\u5177 ${r}.${i.name} \u542F\u7528\u72B6\u6001\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177:`,a)}}}catch(n){this.logger.warn(`[MCPManager] \u83B7\u53D6\u670D\u52A1 ${r} \u7684\u5DE5\u5177\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u670D\u52A1:`,n)}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)try{e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name})}catch(s){this.logger.warn(`[MCPManager] \u5904\u7406 CustomMCP \u5DE5\u5177 ${r.name} \u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177:`,s)}return this.logger.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${e.length} \u4E2A\u53EF\u7528\u5DE5\u5177`),e}getServiceNameForTool(e){return e.handler?.type==="mcp"?e.handler.config.serviceName:"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config.serviceName;case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"?t.handler.config.toolName:e:r?.originalName||e}async callTool(e,t){let r=Date.now(),s="unknown",n=e;try{let i;if(this.customMCPHandler.hasTool(e)){let a=this.customMCPHandler.getToolInfo(e);s=this.getLogServerName(a),n=this.getOriginalToolName(e,a),a?.handler?.type==="mcp"?(i=await this.callMCPTool(e,a.handler.config,t),this.updateToolStatsSafe(e,a.handler.config.serviceName,a.handler.config.toolName,!0)):(i=await this.customMCPHandler.callTool(e,t),this.logger.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let a=this.tools.get(e);if(!a)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);s=a.serviceName,n=a.originalName;let l=this.services.get(a.serviceName);if(!l)throw new Error(`\u670D\u52A1 ${a.serviceName} \u4E0D\u53EF\u7528`);if(!l.isConnected())throw new Error(`\u670D\u52A1 ${a.serviceName} \u672A\u8FDE\u63A5`);i=await l.callTool(a.originalName,t||{}),this.logger.debug(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,i),this.updateToolStatsSafe(e,a.serviceName,a.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:n,serverName:s,arguments:t,result:i,success:i.isError!==!0,duration:Date.now()-r}),i}catch(i){if(this.toolCallLogger.recordToolCall({toolName:n,serverName:s,arguments:t,result:null,success:!1,duration:Date.now()-r,error:i instanceof Error?i.message:String(i)}),this.customMCPHandler.hasTool(e)){let a=this.customMCPHandler.getToolInfo(e);a?.handler?.type==="mcp"?this.updateToolStatsSafe(e,a.handler.config.serviceName,a.handler.config.toolName,!1):(this.updateToolStatsSafe(e,"customMCP",e,!1),this.logger.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,i.message))}else{let a=this.tools.get(e);a&&(this.updateToolStatsSafe(e,a.serviceName,a.originalName,!1),this.logger.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,i.message))}throw i}}async updateToolStats(e,t,r,s){try{let n=new Date().toISOString();s?(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`)):(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} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,n),n}}async updateToolStatsSafe(e,t,r,s){try{await this.updateToolStats(e,t,r,s)}catch(n){let i=s?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F";this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} ${i}\u5931\u8D25:`,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..."),this.stopAllServiceRetries();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 S=n[p.name];S?i[p.name]={...S,description:p.description||S.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]),S=Object.keys(i).filter(m=>{let A=n[m],ge=i[m];return A&&A.description!==ge.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(", ")}`),S.length>0&&this.logger.debug(` - \u66F4\u65B0\u5DE5\u5177: ${S.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}scheduleFailedServicesRetry(e){if(e.length===0)return;this.logger.info(`[MCPManager] \u5B89\u6392 ${e.length} \u4E2A\u5931\u8D25\u670D\u52A1\u7684\u91CD\u8BD5`);let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e)),this.logger.debug(`[MCPManager] \u5B89\u6392\u670D\u52A1 ${e} \u5728 ${t}ms \u540E\u91CD\u8BD5`);let s=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,s)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e),this.logger.info(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u6210\u529F`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){this.logger.error("[MCPManager] \u5237\u65B0CustomMCPHandler\u5931\u8D25:",t)}}catch(t){this.logger.error(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u5931\u8D25:`,t.message);let r=this.getRetryDelay(e),s=Math.min(r*2,3e5);this.logger.debug(`[MCPManager] \u670D\u52A1 ${e} \u4E0B\u6B21\u91CD\u8BD5\u5C06\u5728 ${s}ms \u540E\u8FDB\u884C`),this.scheduleServiceRetry(e,s)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,s)=>r+s.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e),this.logger.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`)),this.failedServices.delete(e)}stopAllServiceRetries(){this.logger.info("[MCPManager] \u505C\u6B62\u6240\u6709\u670D\u52A1\u91CD\u8BD5");for(let[e,t]of this.retryTimers)clearTimeout(t),this.logger.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}},Rn=pt});async function hc(){return new Rn}async function wn(){if(me&&X==="initialized")return me;if(le&&X==="initializing")return le;X==="failed"&&Yr(),X="initializing",le=hc();try{return me=await le,X="initialized",mt=`mcp-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,dt=null,me}catch(o){throw X="failed",dt=o,le=null,console.error("\u274C MCPServiceManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",o.message),o}}async function bn(){if(X==="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..."),X="cleanup";try{if(le){try{await(await le).stopAllServices()}catch(o){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",o.message)}le=null}me&&(await me.stopAllServices(),me=null),X="not_initialized",dt=null,mt=null}catch(o){throw console.error("\u274C MCPServiceManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",o.message),Yr(),o}}function Yr(){console.log("\u{1F504} \u91CD\u7F6E MCPServiceManager \u5355\u4F8B\u72B6\u6001"),me=null,le=null,X="not_initialized",dt=null,mt=null}function pc(){return X==="initialized"&&me!==null}function dc(){return{state:X,initializationTime:mt?new Date:void 0,lastError:dt||void 0,instanceId:mt||void 0}}async function mc(){return console.log("\u{1F504} \u5F3A\u5236\u91CD\u65B0\u521D\u59CB\u5316 MCPServiceManager \u5355\u4F8B..."),await bn(),wn()}function fc(){return me}async function Cc(){if(X==="initialized")return!0;if(X==="initializing"&&le)try{return await le,!0}catch{return!1}return!1}var me,le,X,dt,mt,Z,Kt=f(()=>{"use strict";Yt();me=null,le=null,X="not_initialized",dt=null,mt=null;c(hc,"createInstance");c(wn,"getInstance");c(bn,"cleanup");c(Yr,"reset");c(pc,"isInitialized");c(dc,"getStatus");c(mc,"forceReinitialize");c(fc,"getCurrentInstance");c(Cc,"waitForInitialization");Z={getInstance:wn,cleanup:bn,reset:Yr,isInitialized:pc,getStatus:dc,forceReinitialize:mc,getCurrentInstance:fc,waitForInitialization:Cc};process.on("exit",()=>{Z.isInitialized()&&(console.log("\u{1F504} \u8FDB\u7A0B\u9000\u51FA\uFF0C\u6B63\u5728\u6E05\u7406 MCPServiceManager \u5355\u4F8B..."),Z.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 Z.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 Z.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});import{randomUUID as vc}from"crypto";var Zt,In=f(()=>{"use strict";Wr();T();Kt();Zt=class{static{c(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=u.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 Z.getInstance();this.mcpMessageHandler=new Xe(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 S=await e.req.text();if(S.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(S),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 h=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:h===null}),h===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.toString()}}):e.json(h,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 h=await e.req.text();if(h.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(h),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(h){this.logger.warn(`SSE \u5199\u5165\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${t}`,h),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=vc(),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(),h=new AbortController,p={id:t,sessionId:r,response:new Response(a),connectedAt:s,lastActivity:s,writer:g,abortController:h,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 S=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),h.signal.addEventListener("abort",m),S}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}
29
+ `:"");Qe.writeFileSync(this.logFilePath,o,"utf8"),u.debug(`\u5DF2\u6E05\u7406 ${r} \u6761\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\uFF0C\u4FDD\u7559\u6700\u65B0 ${this.maxRecords} \u6761`)}catch(e){u.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25:",e)}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){u.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t)}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}}});var Eo={};Se(Eo,{MCPServiceManager:()=>Gt,default:()=>Xr});import{EventEmitter as Qa}from"events";var Gt,Xr,Xt=f(()=>{"use strict";Ur();y();te();Wr();H();Wt();qe();fo();Co();Gr();Gt=class extends Qa{static{c(this,"MCPServiceManager")}services=new Map;configs={};logger;tools=new Map;customMCPHandler;cacheManager;toolSyncManager;eventBus=P();toolCallLogger;retryTimers=new Map;failedServices=new Set;transportAdapters=new Map;messageHandler;isRunning=!1;config;constructor(e){super(),this.logger=u,e&&this.isUnifiedServerConfig(e)?(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info",...e},this.configs=e.configs||{}):(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info"},this.configs=e||{});let r=process.env.NODE_ENV==="test"||process.env.VITEST==="true"?`/tmp/xiaozhi-test-${Date.now()}-${Math.random().toString(36).substring(2,11)}/xiaozhi.cache.json`:void 0;this.cacheManager=new Pe(r),this.customMCPHandler=new lt,this.toolSyncManager=new Bt(m,this.logger);let s=m.getToolCallLogConfig(),o=m.getConfigDir();this.toolCallLogger=new Ze(s,o),this.setupEventListeners(),this.messageHandler=new Je(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",async e=>{await this.handleServiceConnected(e)}),this.eventBus.onEvent("mcp:service:disconnected",async e=>{await this.handleServiceDisconnected(e)}),this.eventBus.onEvent("mcp:service:connection:failed",async e=>{await this.handleServiceConnectionFailed(e)}),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(a){this.logger.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",a)}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}this.logger.info(`[MCPManager] \u5F00\u59CB\u5E76\u884C\u542F\u52A8 ${e.length} \u4E2A MCP \u670D\u52A1`);let t=e.map(async([a])=>{try{return await this.startService(a),{serviceName:a,success:!0,error:null}}catch(l){return{serviceName:a,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),s=0,o=0,i=[];for(let a of r)a.status==="fulfilled"?a.value.success?s++:(o++,i.push(a.value.serviceName)):o++;this.logger.info(`[MCPManager] \u670D\u52A1\u542F\u52A8\u5B8C\u6210 - \u6210\u529F: ${s}, \u5931\u8D25: ${o}`),i.length>0&&(this.logger.warn(`[MCPManager] \u4EE5\u4E0B\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${i.join(", ")}`),o===e.length&&this.logger.warn("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25\uFF0C\u4F46\u7CFB\u7EDF\u5C06\u7EE7\u7EED\u8FD0\u884C\u4EE5\u4FBF\u91CD\u8BD5")),i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r=new Ge(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(o=>o.name).join(", "))}catch(r){throw this.logger.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25:`,r.message),this.services.delete(e),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(o=>{this.logger.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)});for(let o of r){let i=`${e}__${o.name}`;this.tools.set(i,{serviceName:e,originalName:o.name,tool:o})}}await this.syncToolsConfigToFile()}getAllTools(){let e=[];for(let[r,s]of this.services)try{if(s.isConnected()){let o=s.getTools();for(let i of o)try{if(!m.isToolEnabled(r,i.name))continue;let l=`${r}__${i.name}`;e.push({name:l,description:i.description||"",inputSchema:i.inputSchema,serviceName:r,originalName:i.name})}catch(a){this.logger.warn(`[MCPManager] \u68C0\u67E5\u5DE5\u5177 ${r}.${i.name} \u542F\u7528\u72B6\u6001\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177:`,a)}}}catch(o){this.logger.warn(`[MCPManager] \u83B7\u53D6\u670D\u52A1 ${r} \u7684\u5DE5\u5177\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u670D\u52A1:`,o)}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)try{e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name})}catch(s){this.logger.warn(`[MCPManager] \u5904\u7406 CustomMCP \u5DE5\u5177 ${r.name} \u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177:`,s)}return this.logger.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${e.length} \u4E2A\u53EF\u7528\u5DE5\u5177`),e}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t){let r=Date.now(),s="unknown",o=e;try{let i;if(this.customMCPHandler.hasTool(e)){let a=this.customMCPHandler.getToolInfo(e);a&&(s=this.getLogServerName(a),o=this.getOriginalToolName(e,a)),a?.handler?.type==="mcp"?(i=await this.callMCPTool(e,a.handler.config,t),this.updateToolStatsSafe(e,a.handler.config.serviceName,a.handler.config.toolName,!0)):(i=await this.customMCPHandler.callTool(e,t),this.logger.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let a=this.tools.get(e);if(!a)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);s=a.serviceName,o=a.originalName;let l=this.services.get(a.serviceName);if(!l)throw new Error(`\u670D\u52A1 ${a.serviceName} \u4E0D\u53EF\u7528`);if(!l.isConnected())throw new Error(`\u670D\u52A1 ${a.serviceName} \u672A\u8FDE\u63A5`);i=await l.callTool(a.originalName,t||{}),this.logger.debug(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,i),this.updateToolStatsSafe(e,a.serviceName,a.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:o,serverName:s,arguments:t,result:i,success:i.isError!==!0,duration:Date.now()-r}),i}catch(i){if(this.toolCallLogger.recordToolCall({toolName:o,serverName:s,arguments:t,result:null,success:!1,duration:Date.now()-r,error:i instanceof Error?i.message:String(i)}),this.customMCPHandler.hasTool(e)){let a=this.customMCPHandler.getToolInfo(e);a?.handler?.type==="mcp"?this.updateToolStatsSafe(e,a.handler.config.serviceName,a.handler.config.toolName,!1):(this.updateToolStatsSafe(e,"customMCP",e,!1),this.logger.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,i.message))}else{let a=this.tools.get(e);a&&(this.updateToolStatsSafe(e,a.serviceName,a.originalName,!1),this.logger.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25:`,i.message))}throw i}}async updateToolStats(e,t,r,s){try{let o=new Date().toISOString();s?(await this.updateCustomMCPToolStats(e,o),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,o),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)):(await this.updateCustomMCPToolLastUsedTime(e,o),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,o),this.logger.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F`))}catch(o){throw this.logger.error(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} \u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:`,o),o}}async updateToolStatsSafe(e,t,r,s){try{await this.updateToolStats(e,t,r,s)}catch(o){let i=s?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F";this.logger.warn(`[MCPManager] \u66F4\u65B0\u5DE5\u5177 ${e} ${i}\u5931\u8D25:`,o)}}async updateCustomMCPToolStats(e,t){try{await m.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 m.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 m.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 m.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:o}=t;this.logger.debug(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${s}.${o}`);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(o,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..."),this.stopAllServiceRetries();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{m.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(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=m.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=m.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 o=this.enhanceServiceConfig(r);this.configs[s]=o,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=m.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let s=r.getTools();if(s.length===0)continue;let o=e[t]?.tools||{},i={};for(let h of s){let E=o[h.name];E?i[h.name]={...E,description:h.description||E.description||""}:i[h.name]={description:h.description||"",enable:!0}}let a=s.map(h=>h.name),g=Object.keys(o).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(o,i)){m.updateServerToolsConfig(t,i);let h=Object.keys(i).filter(d=>!o[d]),E=Object.keys(i).filter(d=>{let O=o[d],ge=i[d];return O&&O.description!==ge.description});this.logger.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),h.length>0&&this.logger.debug(` - \u65B0\u589E\u5DE5\u5177: ${h.join(", ")}`),E.length>0&&this.logger.debug(` - \u66F4\u65B0\u5DE5\u5177: ${E.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 o=s.filter(a=>!r.includes(a)),i=r.filter(a=>!s.includes(a));if(o.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}scheduleFailedServicesRetry(e){if(e.length===0)return;this.logger.info(`[MCPManager] \u5B89\u6392 ${e.length} \u4E2A\u5931\u8D25\u670D\u52A1\u7684\u91CD\u8BD5`);let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e)),this.logger.debug(`[MCPManager] \u5B89\u6392\u670D\u52A1 ${e} \u5728 ${t}ms \u540E\u91CD\u8BD5`);let s=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,s)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e),this.logger.info(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u6210\u529F`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){this.logger.error("[MCPManager] \u5237\u65B0CustomMCPHandler\u5931\u8D25:",t)}}catch(t){this.logger.error(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u5931\u8D25:`,t.message);let r=this.getRetryDelay(e),s=Math.min(r*2,3e5);this.logger.debug(`[MCPManager] \u670D\u52A1 ${e} \u4E0B\u6B21\u91CD\u8BD5\u5C06\u5728 ${s}ms \u540E\u8FDB\u884C`),this.scheduleServiceRetry(e,s)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,s)=>r+s.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e),this.logger.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`)),this.failedServices.delete(e)}stopAllServiceRetries(){this.logger.info("[MCPManager] \u505C\u6B62\u6240\u6709\u670D\u52A1\u91CD\u8BD5");for(let[e,t]of this.retryTimers)clearTimeout(t),this.logger.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);this.logger.info(`\u6CE8\u518C\u4F20\u8F93\u9002\u914D\u5668: ${e}`);try{await t.initialize(),this.transportAdapters.set(e,t),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 startTransports(){this.logger.info("\u542F\u52A8\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668");let e=[],t=[];for(let[r,s]of this.transportAdapters)try{await s.start(),e.push(r),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668 ${r} \u542F\u52A8\u6210\u529F`)}catch(o){t.push(r),this.logger.error(`\u4F20\u8F93\u9002\u914D\u5668 ${r} \u542F\u52A8\u5931\u8D25`,o)}if(e.length===0&&t.length>0){let r=`\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5931\u8D25\uFF0C\u5931\u8D25\u7684\u9002\u914D\u5668: ${t.join(", ")}`;throw this.logger.error(r),new Error(r)}t.length>0&&this.logger.warn(`\u90E8\u5206\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5931\u8D25\uFF0C\u6210\u529F: ${e.join(", ")}, \u5931\u8D25: ${t.join(", ")}`),this.logger.info(`\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5B8C\u6210\uFF0C\u6210\u529F: ${e.length}, \u5931\u8D25: ${t.length}`)}async stopTransports(){this.logger.info("\u505C\u6B62\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668");try{for(let[e,t]of this.transportAdapters)try{await t.stop(),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)}}catch(e){throw this.logger.error("\u4F20\u8F93\u9002\u914D\u5668\u505C\u6B62\u5931\u8D25",e),e}}getTransportAdapters(){return new Map(this.transportAdapters)}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");this.logger.info("\u542F\u52A8 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.startAllServices(),await this.startTransports(),this.isRunning=!0,this.logger.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw this.logger.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u5931\u8D25",e),e}}async stop(){if(this.isRunning){this.logger.info("\u505C\u6B62 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.stopTransports(),await this.stopAllServices(),this.isRunning=!1,this.logger.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw this.logger.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u5931\u8D25",e),e}}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});for(let[t,r]of this.transportAdapters)e.push({id:r.getConnectionId(),name:t,state:r.getState()});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,transportCount:this.getTransportAdapters().size,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames(),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,o=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:o};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}isServerRunning(){return this.isRunning}isUnifiedServerConfig(e){return e!==null&&typeof e=="object"&&"configs"in e}async routeMessage(e){let t=await this.messageHandler.handleMessage(e);return t===null?null:{jsonrpc:"2.0",method:"response",params:t,id:t.id}}async initialize(){await this.start()}getToolRegistry(){return this}getConnectionManager(){return this}},Xr=Gt});async function ec(){return new Xr}async function So(){if(de&&X==="initialized")return de;if(le&&X==="initializing")return le;X==="failed"&&Jr(),X="initializing",le=ec();try{return de=await le,X="initialized",ht=`mcp-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,pt=null,de}catch(n){throw X="failed",pt=n,le=null,console.error("\u274C MCPServiceManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",n.message),n}}async function To(){if(X==="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..."),X="cleanup";try{if(le){try{await(await le).stopAllServices()}catch(n){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",n.message)}le=null}de&&(await de.stopAllServices(),de=null),X="not_initialized",pt=null,ht=null}catch(n){throw console.error("\u274C MCPServiceManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",n.message),Jr(),n}}function Jr(){console.log("\u{1F504} \u91CD\u7F6E MCPServiceManager \u5355\u4F8B\u72B6\u6001"),de=null,le=null,X="not_initialized",pt=null,ht=null}function tc(){return X==="initialized"&&de!==null}function rc(){return{state:X,initializationTime:ht?new Date:void 0,lastError:pt||void 0,instanceId:ht||void 0}}async function sc(){return console.log("\u{1F504} \u5F3A\u5236\u91CD\u65B0\u521D\u59CB\u5316 MCPServiceManager \u5355\u4F8B..."),await To(),So()}function oc(){return de}async function nc(){if(X==="initialized")return!0;if(X==="initializing"&&le)try{return await le,!0}catch{return!1}return!1}var de,le,X,pt,ht,Z,Jt=f(()=>{"use strict";Xt();de=null,le=null,X="not_initialized",pt=null,ht=null;c(ec,"createInstance");c(So,"getInstance");c(To,"cleanup");c(Jr,"reset");c(tc,"isInitialized");c(rc,"getStatus");c(sc,"forceReinitialize");c(oc,"getCurrentInstance");c(nc,"waitForInitialization");Z={getInstance:So,cleanup:To,reset:Jr,isInitialized:tc,getStatus:rc,forceReinitialize:sc,getCurrentInstance:oc,waitForInitialization:nc};process.on("exit",()=>{Z.isInitialized()&&(console.log("\u{1F504} \u8FDB\u7A0B\u9000\u51FA\uFF0C\u6B63\u5728\u6E05\u7406 MCPServiceManager \u5355\u4F8B..."),Z.reset())});process.on("uncaughtException",async n=>{console.error("\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF0C\u6E05\u7406 MCPServiceManager \u5355\u4F8B:",n);try{await Z.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}});process.on("unhandledRejection",async n=>{console.error("\u{1F4A5} \u672A\u5904\u7406\u7684Promise\u62D2\u7EDD\uFF0C\u6E05\u7406 MCPServiceManager \u5355\u4F8B:",n);try{await Z.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});import{randomUUID as ic}from"crypto";var Yt,yo=f(()=>{"use strict";Ur();y();Jt();Yt=class{static{c(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=u.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 Z.getInstance();this.mcpMessageHandler=new Je(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 o=e.req.header("content-length");if(o&&Number.parseInt(o)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Request too large: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header("content-type")?.includes("application/json"))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Content-Type must be application/json");let 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 E=await e.req.text();if(E.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);g=JSON.parse(E),r=g.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(g))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",r);if(await this.initializeMessageHandler(),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let p=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:p===null}),p===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":h.toString()}}):e.json(p,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":h.toString()})}catch(s){this.metrics.errorCount++;let o=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:o,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 o=this.clients.get(t);if(!o)return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Invalid or missing sessionId",null);o.lastActivity=new Date;let i=e.req.header("content-length");if(i&&Number.parseInt(i)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`);let a;try{let p=await e.req.text();if(p.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(p),s=a.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(a))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",s);if(await this.initializeMessageHandler(),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let l=await this.mcpMessageHandler.handleMessage(a);if(o.messageCount++,this.metrics.totalMessages++,l!==null&&o.writer&&o.isAlive)try{await this.sendSSEEvent(o.writer,"message",JSON.stringify(l))}catch(p){this.logger.warn(`SSE \u5199\u5165\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${t}`,p),o.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:o.messageCount,isNotification:l===null}),new Response(null,{status:202,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":g.toString()}})}catch(o){this.metrics.errorCount++;let i=Date.now()-r;this.logger.error(`\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519 (\u4F1A\u8BDD: ${t}):`,{error:o instanceof Error?o.message:String(o),messageId:s,responseTime:i,stack:o instanceof Error?o.stack:void 0});let a=o instanceof Error?o.message:String(o);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=ic(),s=new Date,o=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:o,remoteAddress:i});let{readable:a,writable:l}=new TransformStream,g=l.getWriter(),p=new AbortController,h={id:t,sessionId:r,response:new Response(a),connectedAt:s,lastActivity:s,writer:g,abortController:p,isAlive:!0,messageCount:0,userAgent:o,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(O){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,O),h.isAlive=!1}this.startHeartbeat(h);let E=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"}}),d=c(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",d),p.signal.addEventListener("abort",d),E}catch(t){return this.metrics.errorCount++,this.logger.error("\u5904\u7406 MCP GET \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),e.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:null},500)}}startHeartbeat(e){e.heartbeatInterval&&clearInterval(e.heartbeatInterval),e.heartbeatInterval=setInterval(async()=>{if(!e.isAlive||!e.writer){this.stopHeartbeat(e);return}try{await this.sendSSEEvent(e.writer,"heartbeat",JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId})),this.logger.debug(`\u5FC3\u8DF3\u53D1\u9001\u6210\u529F: ${e.sessionId}`)}catch(t){this.logger.warn(`\u5FC3\u8DF3\u53D1\u9001\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${e.sessionId}`,t),e.isAlive=!1,this.stopHeartbeat(e)}},this.config.heartbeatInterval)}stopHeartbeat(e){e.heartbeatInterval&&(clearInterval(e.heartbeatInterval),e.heartbeatInterval=void 0)}async sendSSEEvent(e,t,r){try{let s=`event: ${t}
30
30
  data: ${r}
31
31
 
32
- `;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.debug(`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 x,Qt,Kr,Zr,Qr,zd,On=f(()=>{"use strict";x=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}})}},Qt=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof x)}handle(e,t){return x.fromError(e,"INTERNAL_ERROR","system")}},Kr=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 x.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Zr=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 x.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},Qr=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Kr),this.registerHandler(new Zr),this.registerHandler(new Qt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof x)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new Qt().handle(e,t)}},zd=new Qr});var er,ft,se,$n=f(()=>{"use strict";T();On();k();er=class{static{c(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=u.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 x)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=x.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?n=x.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?n=x.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?n=x.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):n=x.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=x.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 h=r,p=await this.addMCPServersBatch(h),S=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:p.addedCount,failedCount:p.failedCount,duration:S}),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});let r=ft.normalizeTypeField(t);try{let s=se.validateServiceName(e);if(!s.isValid){let g=x.validationError("INVALID_SERVICE_NAME",s.errors.join(", "),{serverName:e,errors:s.errors});throw this.logger.error("addMCPServerSingle",{validationError:g,serverName:e,phase:"name_validation"}),g}if(se.checkServiceExists(e,this.configManager)){let g=x.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:g,serverName:e,phase:"existence_check"}),g}let n=se.validateConfig(r);if(!n.isValid){let g=x.configError("INVALID_CONFIG",n.errors.join(", "),{serverName:e,config:r,errors:n.errors});throw this.logger.error("addMCPServerSingle",{configError:g,serverName:e,phase:"config_validation"}),g}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let i=this.createMCPServiceConfig(e,r);this.mcpServiceManager.addServiceConfig(i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let a=this.getServiceStatus(e),l=this.getServiceTools(e);return P().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(g=>g.name),timestamp:new Date}),{...a,tools:l.map(g=>g.name)}}catch(s){let n=this.handleError(s,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:n,serverName:e}),n}}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}`),P().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)&&P().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=se.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!se.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),P().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=se.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!se.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 x.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 x.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[h,p]of Object.entries(t)){let S=ft.normalizeTypeField(p);try{let m=await this.addMCPServerSingle(h,S);s.push({name:h,success:!0,config:S,tools:m.tools,status:m.status}),n.push(h),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:h,toolsCount:m.tools?.length||0})}catch(m){let A=this.handleError(m,"addMCPServersBatch",{serverName:h,serverConfig:S});s.push({name:h,success:!1,error:A.message,config:S}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:h,error:A.message})}}let a=n.length,l=r.length-a;if(a===0)throw x.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");P().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 x?a:x.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=se.validateServiceName(s);if(!i.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(se.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let a=ft.normalizeTypeField(n),l=se.validateConfig(a);l.isValid||t.push(`\u670D\u52A1 "${s}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let 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),P().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})}},ft=class o{static{c(this,"TypeFieldNormalizer")}static normalizeTypeField(e){if(!e||typeof e!="object")return e;let t=JSON.parse(JSON.stringify(e));if(!("type"in t))return t;let r=t.type;if(r==="sse"||r==="streamable-http")return t;let s;return r==="streamableHttp"||r==="streamable_http"?s="streamable-http":r==="s_se"||r==="s-se"?s="sse":s=o.convertToKebabCase(r),(s==="sse"||s==="streamable-http")&&(t.type=s),t}static convertToKebabCase(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}},se=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 tr,An=f(()=>{"use strict";T();at();k();tr=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;configService;statusService;eventBus;constructor(e,t){this.logger=u.withTag("RealtimeNotificationHandler"),this.notificationService=e,this.configService=new he,this.statusService=t,this.eventBus=P()}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)}}});var Sc,Ec,rr,Nn=f(()=>{"use strict";Le();Sc={[w.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[w.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[w.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[w.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[w.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[w.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[w.PERMISSION_ERROR]:"\u5C1D\u8BD5\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"},Ec={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"]},rr=class{static{c(this,"ERROR_MESSAGES")}static getHelpMessage(e){return Sc[e]}static getSolutions(e){return Ec[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[w.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[w.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[w.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[w.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[w.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[w.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[w.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[w.NETWORK_ERROR,w.FILE_ERROR,w.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[w.VALIDATION_ERROR]:"low",[w.FILE_ERROR]:"medium",[w.CONFIG_ERROR]:"medium",[w.NETWORK_ERROR]:"medium",[w.SERVICE_ERROR]:"high",[w.PROCESS_ERROR]:"high",[w.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});import J from"chalk";var sr,xn=f(()=>{"use strict";Nn();de();sr=class o{static{c(this,"ErrorHandler")}static handle(e){e instanceof W?o.handleCLIError(e):o.handleUnknownError(e),process.exit(1)}static handleCLIError(e){if(console.error(J.red(`\u274C \u9519\u8BEF: ${e.message}`)),process.env.DEBUG&&console.error(J.gray(`\u9519\u8BEF\u7801: ${e.code}`)),e.suggestions&&e.suggestions.length>0){console.log(J.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of e.suggestions)console.log(J.gray(` ${r}`))}let t=rr.getHelpMessage(e.code);t&&console.log(J.blue(`\u2139\uFE0F ${t}`))}static handleUnknownError(e){console.error(J.red(`\u274C \u672A\u77E5\u9519\u8BEF: ${e.message}`)),process.env.DEBUG||process.env.NODE_ENV==="development"?(console.error(J.gray("\u5806\u6808\u4FE1\u606F:")),console.error(J.gray(e.stack))):console.log(J.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 W?r:r instanceof Error?new W(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new W(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof W?r:r instanceof Error?new W(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new W(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static warn(e,t){if(console.warn(J.yellow(`\u26A0\uFE0F \u8B66\u544A: ${e}`)),t&&t.length>0){console.log(J.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of t)console.log(J.gray(` ${r}`))}}static info(e){console.log(J.blue(`\u2139\uFE0F ${e}`))}static success(e){console.log(J.green(`\u2705 ${e}`))}}});var et,es=f(()=>{"use strict";et=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+=`
32
+ `;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.debug(`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(o){this.logger.debug("\u5173\u95ED SSE writer \u65F6\u51FA\u9519:",o)}this.clients.delete(e),this.metrics.activeConnections=this.clients.size}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let s=r??`error-${Date.now()}`,o={jsonrpc:"2.0",error:{code:e,message:t},id:s};return new Response(JSON.stringify(o),{status:400,headers:{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05"}})}getStatus(){return{connectedClients:this.clients.size,maxClients:this.config.maxClients,isInitialized:this.mcpMessageHandler!==null,metrics:this.config.enableMetrics?this.metrics:void 0,config:{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval,maxMessageSize:this.config.maxMessageSize}}}getDetailedStatus(){let e=Array.from(this.clients.values()).map(t=>({id:t.id,sessionId:t.sessionId,connectedAt:t.connectedAt.toISOString(),lastActivity:t.lastActivity.toISOString(),messageCount:t.messageCount,isAlive:t.isAlive,userAgent:t.userAgent,remoteAddress:t.remoteAddress}));return{...this.getStatus(),clients:e,startTime:this.startTime.toISOString()}}async broadcastMessage(e,t){let r;try{r=JSON.stringify(t)}catch(o){throw this.logger.error("\u5E7F\u64AD\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25:",{error:o instanceof Error?o.message:String(o),data:t}),new Error(`\u5E7F\u64AD\u6D88\u606F\u65E0\u6CD5\u5E8F\u5217\u5316: ${o instanceof Error?o.message:String(o)}`)}let s=[];for(let[o,i]of this.clients.entries()){if(!i.isAlive||!i.writer){s.push(o);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: ${o}`,a),i.isAlive=!1,s.push(o)}}for(let o of s)this.handleClientDisconnect(o,"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 x,Kt,Yr,Kr,Zr,_m,Mo=f(()=>{"use strict";x=class n extends Error{static{c(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",s="system",o={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=s,this.timestamp=new Date().toISOString(),this.details={...o,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,code:this.code,message:this.message,severity:this.severity,category:this.category,details:this.details,timestamp:this.timestamp}}static configError(e,t,r={}){return new n(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new n(e,t,"high","connection",r)}static operationError(e,t,r={}){return new n(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new n(e,t,"high","system",r)}static validationError(e,t,r={}){return new n(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new n(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},Kt=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof x)}handle(e,t){return x.fromError(e,"INTERNAL_ERROR","system")}},Yr=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 x.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Kr=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 x.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},Zr=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Yr),this.registerHandler(new Kr),this.registerHandler(new Kt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof x)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new Kt().handle(e,t)}},_m=new Zr});var Zt,mt,se,Po=f(()=>{"use strict";y();Mo();H();Zt=class{static{c(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=u.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 x)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let o;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?o=x.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?o=x.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?o=x.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?o=x.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):o=x.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:o,operation:t,context:r}),o}let s=x.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 p=r,h=await this.addMCPServersBatch(p),E=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:h.addedCount,failedCount:h.failedCount,duration:E}),e.json(this.createSuccessResponse(h,h.message),201)}let s=r,{name:o,config:i}=s,a=await this.addMCPServerSingle(o,i),l=Date.now()-t;this.logger.info("addMCPServer",{serverName:o,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 o=this.handleError(s,"addMCPServer",{requestData:r}),i=this.createErrorResponse(o.code,o.message,void 0,{error:o.details}),a=500;return o.category==="validation"?a=400:o.category==="configuration"?o.code==="SERVER_ALREADY_EXISTS"?a=409:a=400:o.category==="connection"&&(a=500),e.json(i,a)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=mt.normalizeTypeField(t);try{let s=se.validateServiceName(e);if(!s.isValid){let g=x.validationError("INVALID_SERVICE_NAME",s.errors.join(", "),{serverName:e,errors:s.errors});throw this.logger.error("addMCPServerSingle",{validationError:g,serverName:e,phase:"name_validation"}),g}if(se.checkServiceExists(e,this.configManager)){let g=x.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:g,serverName:e,phase:"existence_check"}),g}let o=se.validateConfig(r);if(!o.isValid){let g=x.configError("INVALID_CONFIG",o.errors.join(", "),{serverName:e,config:r,errors:o.errors});throw this.logger.error("addMCPServerSingle",{configError:g,serverName:e,phase:"config_validation"}),g}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let i=this.createMCPServiceConfig(e,r);this.mcpServiceManager.addServiceConfig(i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let a=this.getServiceStatus(e),l=this.getServiceTools(e);return P().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(g=>g.name),timestamp:new Date}),{...a,tools:l.map(g=>g.name)}}catch(s){let o=this.handleError(s,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:o,serverName:e}),o}}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(o){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,o)}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}`),P().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)),o=r.tools.filter(i=>!t.tools.includes(i));(s.length>0||o.length>0)&&P().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:s,removedTools:o,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=se.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!se.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),P().emitEvent("mcp:server:removed",{serverName:t,affectedTools:s,timestamp:new Date});let o=this.createSuccessResponse({name:t,operation:"removed",affectedTools:s},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F");return e.json(o,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=se.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!se.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),o=this.createSuccessResponse(s,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F");return e.json(o,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 o={servers:s,total:s.length},i=this.createSuccessResponse(o,"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 x.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let s=[],o=[],i=this.validateBatchServers(t);if(!i.isValid)throw x.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[p,h]of Object.entries(t)){let E=mt.normalizeTypeField(h);try{let d=await this.addMCPServerSingle(p,E);s.push({name:p,success:!0,config:E,tools:d.tools,status:d.status}),o.push(p),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:p,toolsCount:d.tools?.length||0})}catch(d){let O=this.handleError(d,"addMCPServersBatch",{serverName:p,serverConfig:E});s.push({name:p,success:!1,error:O.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:p,error:O.message})}}let a=o.length,l=r.length-a;if(a===0)throw x.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");P().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:a,failedCount:l,successfullyAddedServers:o,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 o.length>0&&await this.rollbackBatchAdd(o),a instanceof x?a:x.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,o]of Object.entries(e)){let i=se.validateServiceName(s);if(!i.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(se.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let a=mt.normalizeTypeField(o),l=se.validateConfig(a);l.isValid||t.push(`\u670D\u52A1 "${s}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let s of e)try{try{await this.mcpServiceManager.stopService(s)}catch(o){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${s} \u5931\u8D25:`,o)}this.mcpServiceManager.removeServiceConfig(s),this.configManager.removeMcpServer(s),t.push(s),P().emitEvent("mcp:server:rollback",{serverName:s,timestamp:new Date})}catch(o){let i=this.handleError(o,"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})}},mt=class n{static{c(this,"TypeFieldNormalizer")}static normalizeTypeField(e){if(!e||typeof e!="object")return e;let t=JSON.parse(JSON.stringify(e));if(!("type"in t))return t;let r=t.type;if(r==="sse"||r==="streamable-http")return t;let s;return r==="streamableHttp"||r==="streamable_http"?s="streamable-http":r==="s_se"||r==="s-se"?s="sse":s=n.convertToKebabCase(r),(s==="sse"||s==="streamable-http")&&(t.type=s),t}static convertToKebabCase(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}},se=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 Qt,Ro=f(()=>{"use strict";y();it();H();Qt=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;configService;statusService;eventBus;constructor(e,t){this.logger=u.withTag("RealtimeNotificationHandler"),this.notificationService=e,this.configService=new pe,this.statusService=t,this.eventBus=P()}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)}}});var ac,cc,er,wo=f(()=>{"use strict";_e();ac={[w.CONFIG_ERROR]:'\u8FD0\u884C "xiaozhi --help" \u67E5\u770B\u914D\u7F6E\u76F8\u5173\u547D\u4EE4',[w.SERVICE_ERROR]:'\u8FD0\u884C "xiaozhi status" \u68C0\u67E5\u670D\u52A1\u72B6\u6001',[w.VALIDATION_ERROR]:"\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u662F\u5426\u6B63\u786E",[w.FILE_ERROR]:"\u68C0\u67E5\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650",[w.PROCESS_ERROR]:"\u68C0\u67E5\u8FDB\u7A0B\u72B6\u6001\u548C\u6743\u9650",[w.NETWORK_ERROR]:"\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u9632\u706B\u5899\u8BBE\u7F6E",[w.PERMISSION_ERROR]:"\u5C1D\u8BD5\u4F7F\u7528\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C"},cc={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"]},er=class{static{c(this,"ERROR_MESSAGES")}static getHelpMessage(e){return ac[e]}static getSolutions(e){return cc[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[w.CONFIG_ERROR]:"\u914D\u7F6E\u6587\u4EF6\u76F8\u5173\u9519\u8BEF",[w.SERVICE_ERROR]:"\u670D\u52A1\u8FD0\u884C\u76F8\u5173\u9519\u8BEF",[w.VALIDATION_ERROR]:"\u8F93\u5165\u9A8C\u8BC1\u9519\u8BEF",[w.FILE_ERROR]:"\u6587\u4EF6\u64CD\u4F5C\u9519\u8BEF",[w.PROCESS_ERROR]:"\u8FDB\u7A0B\u7BA1\u7406\u9519\u8BEF",[w.NETWORK_ERROR]:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF",[w.PERMISSION_ERROR]:"\u6743\u9650\u4E0D\u8DB3\u9519\u8BEF"}[e]||"\u672A\u77E5\u9519\u8BEF"}static isRecoverable(e){return[w.NETWORK_ERROR,w.FILE_ERROR,w.SERVICE_ERROR].includes(e)}static getSeverity(e){return{[w.VALIDATION_ERROR]:"low",[w.FILE_ERROR]:"medium",[w.CONFIG_ERROR]:"medium",[w.NETWORK_ERROR]:"medium",[w.SERVICE_ERROR]:"high",[w.PROCESS_ERROR]:"high",[w.PERMISSION_ERROR]:"critical"}[e]||"medium"}}});import J from"chalk";var tr,bo=f(()=>{"use strict";wo();me();tr=class n{static{c(this,"ErrorHandler")}static handle(e){e instanceof B?n.handleCLIError(e):n.handleUnknownError(e),process.exit(1)}static handleCLIError(e){if(console.error(J.red(`\u274C \u9519\u8BEF: ${e.message}`)),process.env.DEBUG&&console.error(J.gray(`\u9519\u8BEF\u7801: ${e.code}`)),e.suggestions&&e.suggestions.length>0){console.log(J.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of e.suggestions)console.log(J.gray(` ${r}`))}let t=er.getHelpMessage(e.code);t&&console.log(J.blue(`\u2139\uFE0F ${t}`))}static handleUnknownError(e){console.error(J.red(`\u274C \u672A\u77E5\u9519\u8BEF: ${e.message}`)),process.env.DEBUG||process.env.NODE_ENV==="development"?(console.error(J.gray("\u5806\u6808\u4FE1\u606F:")),console.error(J.gray(e.stack))):console.log(J.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 B?r:r instanceof Error?new B(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new B(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof B?r:r instanceof Error?new B(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new B(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static warn(e,t){if(console.warn(J.yellow(`\u26A0\uFE0F \u8B66\u544A: ${e}`)),t&&t.length>0){console.log(J.yellow("\u{1F4A1} \u5EFA\u8BAE:"));for(let r of t)console.log(J.gray(` ${r}`))}}static info(e){console.log(J.blue(`\u2139\uFE0F ${e}`))}static success(e){console.log(J.green(`\u2705 ${e}`))}}});var et,Qr=f(()=>{"use strict";et=class{static{c(this,"FormatUtils")}static formatUptime(e){let t=Math.floor(e/1e3),r=Math.floor(t/60),s=Math.floor(r/60),o=Math.floor(s/24);return o>0?`${o}\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 o=`${e}://${t}:${r}`;return s?`${o}${s}`:o}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+=`
33
33
  \u5806\u6808\u4FE1\u606F:
34
34
  ${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join(`
35
- `)}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(`
36
- `)}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{execSync as Dn}from"child_process";var Q,Ct=f(()=>{"use strict";Le();de();Q=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=Dn(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:Xr.PROCESS_STOP}).toLowerCase():t=Dn(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:Xr.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 ye(`\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 ne,nr=f(()=>{"use strict";de();ne=class o{static{c(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw b.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new b(`\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 b.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new b(`\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 b(`\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 b(`\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 b(`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 b(`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 b('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new b("\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 b("\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 b("\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 b(`\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 b(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new b(`\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 b(`\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 b(`\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 b(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${s}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new b(`\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 b(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import or from"fs";import fe from"path";import{fileURLToPath as Ln}from"url";var Oe,ts=f(()=>{"use strict";de();Oe=class o{static{c(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(o.cachedVersion)return o.cachedVersion;try{let e=Ln(import.meta.url),t=fe.dirname(e),r=[fe.join(t,"package.json"),fe.join(t,"..","package.json"),fe.join(t,"..","..","..","package.json"),fe.join(t,"..","..","..","..","package.json")];for(let s of r)if(or.existsSync(s)){let n=JSON.parse(or.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=Ln(import.meta.url),t=fe.dirname(e),r=[fe.join(t,"package.json"),fe.join(t,"..","package.json"),fe.join(t,"..","..","..","package.json"),fe.join(t,"..","..","..","..","package.json")];for(let s of r)if(or.existsSync(s)){let n=JSON.parse(or.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 _n={};Re(_n,{ProcessManagerImpl:()=>rs});var rs,kn=f(()=>{"use strict";de();ht();es();Ie();Ct();rs=class{static{c(this,"ProcessManagerImpl")}getPidFilePath(){return O.getPidFile()}readPidFile(){try{let e=this.getPidFilePath();if(!I.exists(e))return null;let t=I.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();I.writeFile(s,r,{overwrite:!0})}catch{throw new R("\u65E0\u6CD5\u5199\u5165 PID \u6587\u4EF6",this.getPidFilePath())}}isXiaozhiProcess(e){return Q.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=et.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 Q.killProcess(e)}catch(t){throw new ye(`\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 ye(`\u65E0\u6CD5\u505C\u6B62\u8FDB\u7A0B: ${t instanceof Error?t.message:String(t)}`,e)}}cleanupPidFile(){try{let e=this.getPidFilePath();I.exists(e)&&I.deleteFile(e)}catch(e){console.warn("\u6E05\u7406 PID \u6587\u4EF6\u5931\u8D25:",e)}}processExists(e){return Q.processExists(e)}cleanupContainerState(){if(Q.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 Hn={};Re(Hn,{DaemonManagerImpl:()=>ss});import{spawn as jn}from"child_process";import ir from"fs";var ss,Fn=f(()=>{"use strict";de();Ie();Ct();ss=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 D.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 D(`\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}async stopDaemon(){try{let e=this.processManager.getServiceStatus();if(!e.running)throw D.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile(),this.currentDaemon=null,this.logger.info("\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62")}catch(e){throw new D(`\u505C\u6B62\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restartDaemon(e,t={}){try{this.processManager.getServiceStatus().running&&(await this.stopDaemon(),await new Promise(s=>setTimeout(s,1e3))),await this.startDaemon(e,t)}catch(r){throw new D(`\u91CD\u542F\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}getDaemonStatus(){return this.processManager.getServiceStatus()}async attachToLogs(e="xiaozhi.log"){try{let t=O.getLogFile();if(!ir.existsSync(t))throw new D("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:s}=Q.getTailCommand(t),n=jn(r,s,{stdio:"inherit"});process.on("SIGINT",()=>{console.log(`
37
- \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 D(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${i.message}`)})}catch(t){throw new D(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}async spawnDaemonProcess(e,t){let s=[O.getWebServerStandalonePath()];t.openBrowser&&s.push("--open-browser");let n={...process.env,XIAOZHI_CONFIG_DIR:O.getConfigDir(),XIAOZHI_DAEMON:"true",...t.env},i=jn("node",s,{detached:!0,stdio:["ignore","pipe","pipe"],env:n,cwd:t.cwd||process.cwd()});if(!i.pid)throw new ye("\u65E0\u6CD5\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B",0);return i}async setupLogging(e,t){try{let r=O.getLogFile(),n=(await import("path")).dirname(r);ir.existsSync(n)||ir.mkdirSync(n,{recursive:!0});let i=ir.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let a=new Date().toISOString();i.write(`
35
+ `)}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(" | "),o=r.map(a=>"-".repeat(a)).join("-|-"),i=e.map(a=>t.map((l,g)=>String(a[l]).padEnd(r[g])).join(" | "));return[s,o,...i].join(`
36
+ `)}static formatProgressBar(e,t,r=20){let s=Math.min(e/t,1),o=Math.floor(s*r),i=r-o,a="\u2588".repeat(o)+"\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{execSync as Io}from"child_process";var Q,dt=f(()=>{"use strict";_e();me();Q=class n{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!n.isWindows()}static isXiaozhiProcess(e){try{if(process.env.XIAOZHI_CONTAINER==="true"||process.env.NODE_ENV==="test")return process.kill(e,0),!0;try{let t="";return n.isWindows()?t=Io(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:qr.PROCESS_STOP}).toLowerCase():t=Io(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:qr.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(o=>setTimeout(o,100));try{process.kill(e,0),r++}catch{return}}try{process.kill(e,0),process.kill(e,"SIGKILL"),await new Promise(o=>setTimeout(o,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:n.getCurrentPlatform(),arch:process.arch,nodeVersion:process.version,isContainer:process.env.XIAOZHI_CONTAINER==="true"}}static getEnvVar(e,t){return process.env[e]||t}static setEnvVar(e,t){process.env[e]=t}static isContainerEnvironment(){return process.env.XIAOZHI_CONTAINER==="true"}static isTestEnvironment(){return process.env.NODE_ENV==="test"}static isDevelopmentEnvironment(){return process.env.NODE_ENV==="development"}static getTailCommand(e){return n.isWindows()?{command:"powershell",args:["-Command",`Get-Content -Path "${e}" -Wait`]}:{command:"tail",args:["-f",e]}}}});var oe,rr=f(()=>{"use strict";me();oe=class n{static{c(this,"Validation")}static validatePort(e){if(!Number.isInteger(e)||e<1||e>65535)throw b.invalidPort(e)}static validateConfigFormat(e){let t=["json","json5","jsonc"];if(!t.includes(e))throw new b(`\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 b.requiredField(t)}static validateStringLength(e,t,r={}){if(r.min!==void 0&&e.length<r.min)throw new b(`\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 b(`\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 b(`\u65E0\u6548\u7684 URL \u683C\u5F0F: ${e}`,t)}}static validateWebSocketUrl(e,t="websocket_url"){n.validateUrl(e,t);let r=new URL(e);if(!["ws:","wss:"].includes(r.protocol))throw new b(`WebSocket URL \u5FC5\u987B\u4F7F\u7528 ws:// \u6216 wss:// \u534F\u8BAE\uFF0C\u5F53\u524D\u534F\u8BAE: ${r.protocol}`,t)}static validateHttpUrl(e,t="http_url"){n.validateUrl(e,t);let r=new URL(e);if(!["http:","https:"].includes(r.protocol))throw new b(`HTTP URL \u5FC5\u987B\u4F7F\u7528 http:// \u6216 https:// \u534F\u8BAE\uFF0C\u5F53\u524D\u534F\u8BAE: ${r.protocol}`,t)}static validateProjectName(e){n.validateRequired(e,"projectName"),n.validateStringLength(e,"projectName",{min:1,max:100});let t=/[<>:"/\\|?*]/,r=e.split("").some(s=>s.charCodeAt(0)<32);if(t.test(e)||r)throw new b('\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: < > : " / \\ | ? * \u4EE5\u53CA\u63A7\u5236\u5B57\u7B26',"projectName");if(e.startsWith("."))throw new b("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4EE5\u70B9\u5F00\u5934","projectName")}static validateTemplateName(e){if(n.validateRequired(e,"templateName"),n.validateStringLength(e,"templateName",{min:1,max:50}),!/^[a-zA-Z0-9_-]+$/.test(e))throw new b("\u6A21\u677F\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u8FDE\u5B57\u7B26\u548C\u4E0B\u5212\u7EBF","templateName")}static validateEnvVarName(e){if(n.validateRequired(e,"envVarName"),!/^[A-Z_][A-Z0-9_]*$/.test(e))throw new b("\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 b(`\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 b(`\u503C\u4E0D\u80FD\u5C0F\u4E8E ${r.min}\uFF0C\u5F53\u524D\u503C: ${e}`,t);if(r.max!==void 0&&e>r.max)throw new b(`\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 b(`\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 b(`\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 b(`\u7F3A\u5C11\u5FC5\u9700\u7684\u5C5E\u6027: ${s}`,r)}static validateEnum(e,t,r){if(!t.includes(e))throw new b(`\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 b(`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${r instanceof Error?r.message:String(r)}`,t)}}}});import sr from"fs";import fe from"path";import{fileURLToPath as $o}from"url";var Ae,es=f(()=>{"use strict";me();Ae=class n{static{c(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(n.cachedVersion)return n.cachedVersion;try{let e=$o(import.meta.url),t=fe.dirname(e),r=[fe.join(t,"package.json"),fe.join(t,"..","package.json"),fe.join(t,"..","..","..","package.json"),fe.join(t,"..","..","..","..","package.json")];for(let s of r)if(sr.existsSync(s)){let o=JSON.parse(sr.readFileSync(s,"utf8"));if(o.version)return n.cachedVersion=o.version,o.version}return n.cachedVersion="unknown","unknown"}catch(e){return console.warn("\u65E0\u6CD5\u4ECE package.json \u8BFB\u53D6\u7248\u672C\u4FE1\u606F:",e),n.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=$o(import.meta.url),t=fe.dirname(e),r=[fe.join(t,"package.json"),fe.join(t,"..","package.json"),fe.join(t,"..","..","..","package.json"),fe.join(t,"..","..","..","..","package.json")];for(let s of r)if(sr.existsSync(s)){let o=JSON.parse(sr.readFileSync(s,"utf8"));return{version:o.version||"unknown",name:o.name,description:o.description,author:o.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),o=Math.max(r.length,s.length);for(let i=0;i<o;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(){n.cachedVersion=null}}});var Ao={};Se(Ao,{ProcessManagerImpl:()=>ts});var ts,Oo=f(()=>{"use strict";me();ut();Qr();$e();dt();ts=class{static{c(this,"ProcessManagerImpl")}getPidFilePath(){return $.getPidFile()}readPidFile(){try{let e=this.getPidFilePath();if(!I.exists(e))return null;let t=I.readFile(e).trim(),[r,s,o]=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:o||"foreground"}}catch{return this.cleanupPidFile(),null}}writePidFile(e,t){try{let r=`${e}|${Date.now()}|${t}`,s=this.getPidFilePath();I.writeFile(s,r,{overwrite:!0})}catch{throw new R("\u65E0\u6CD5\u5199\u5165 PID \u6587\u4EF6",this.getPidFilePath())}}isXiaozhiProcess(e){return Q.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=et.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 Q.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();I.exists(e)&&I.deleteFile(e)}catch(e){console.warn("\u6E05\u7406 PID \u6587\u4EF6\u5931\u8D25:",e)}}processExists(e){return Q.processExists(e)}cleanupContainerState(){if(Q.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 xo={};Se(xo,{DaemonManagerImpl:()=>rs});import{spawn as No}from"child_process";import or from"fs";var rs,Lo=f(()=>{"use strict";me();$e();dt();rs=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 L.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 L(`\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 L.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 L(`\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 L(`\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=$.getLogFile();if(!or.existsSync(t))throw new L("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:s}=Q.getTailCommand(t),o=No(r,s,{stdio:"inherit"});process.on("SIGINT",()=>{console.log(`
37
+ \u65AD\u5F00\u8FDE\u63A5\uFF0C\u670D\u52A1\u7EE7\u7EED\u5728\u540E\u53F0\u8FD0\u884C`),o.kill(),process.exit(0)}),o.on("exit",()=>{process.exit(0)}),o.on("error",i=>{throw new L(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${i.message}`)})}catch(t){throw new L(`\u8FDE\u63A5\u65E5\u5FD7\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}async spawnDaemonProcess(e,t){let s=[$.getWebServerStandalonePath()];t.openBrowser&&s.push("--open-browser");let o={...process.env,XIAOZHI_CONFIG_DIR:$.getConfigDir(),XIAOZHI_DAEMON:"true",...t.env},i=No("node",s,{detached:!0,stdio:["ignore","pipe","pipe"],env:o,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=$.getLogFile(),o=(await import("path")).dirname(r);or.existsSync(o)||or.mkdirSync(o,{recursive:!0});let i=or.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let a=new Date().toISOString();i.write(`
38
38
  [${a}] \u5B88\u62A4\u8FDB\u7A0B\u542F\u52A8 (PID: ${e.pid})
39
- `)}catch(r){this.logger.warn(`\u8BBE\u7F6E\u65E5\u5FD7\u91CD\u5B9A\u5411\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}}setupEventHandlers(e){e.on("exit",(t,r)=>{t!==0&&t!==null?this.logger.error(`\u5B88\u62A4\u8FDB\u7A0B\u5F02\u5E38\u9000\u51FA (\u4EE3\u7801: ${t}, \u4FE1\u53F7: ${r})`):this.logger.info("\u5B88\u62A4\u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA"),this.processManager.cleanupPidFile(),this.currentDaemon=null}),e.on("error",t=>{this.logger.error(`\u5B88\u62A4\u8FDB\u7A0B\u9519\u8BEF: ${t.message}`),this.processManager.cleanupPidFile(),this.currentDaemon=null}),e.on("disconnect",()=>{this.logger.info("\u5B88\u62A4\u8FDB\u7A0B\u65AD\u5F00\u8FDE\u63A5")})}async checkHealth(){try{let e=this.getDaemonStatus();if(!e.running||!e.pid)return!1;let t=this.processManager.getProcessInfo(e.pid);return t.exists&&t.isXiaozhi}catch{return!1}}getCurrentDaemon(){return this.currentDaemon}cleanup(){if(this.currentDaemon){try{this.currentDaemon.kill("SIGTERM")}catch(e){this.logger.warn(`\u6E05\u7406\u5B88\u62A4\u8FDB\u7A0B\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}this.currentDaemon=null}}}});var tt,vt=f(()=>{"use strict";T();tt=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=u}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{EventEmitter as zn}from"events";var ns,os,ar,Un=f(()=>{"use strict";Wr();T();Yt();vt();ns=class{static{c(this,"ToolRegistry")}serviceManager;logger;constructor(e){this.serviceManager=e,this.logger=u}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 zn{static{c(this,"ConnectionManager")}connections=new Map;logger;constructor(){super(),this.logger=u}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")}},ar=class extends zn{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=u,this.serviceManager=new pt,this.messageHandler=new Xe(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}}});import{randomUUID as Tc}from"crypto";import as from"express";var cr,Vn=f(()=>{"use strict";vt();cr=class extends tt{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=as(),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(as.json({limit:"10mb"})),this.app.use(as.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=Tc();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
40
- data: /messages?sessionId=${s}
41
-
42
- `),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}
43
-
44
- `),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 Wn=f(()=>{"use strict";vt()});import nf,{WebSocketServer as of}from"ws";var Bn=f(()=>{"use strict";vt()});async function qn(o={name:"http"}){u.info("\u521B\u5EFA HTTP \u6A21\u5F0F\u670D\u52A1\u5668");let e=new ar;await e.initialize();let t=e.getMessageHandler(),r=new cr(t,o);return await e.registerTransport("http",r),u.info("HTTP \u6A21\u5F0F\u670D\u52A1\u5668\u521B\u5EFA\u6210\u529F"),e}var Gn=f(()=>{"use strict";Un();T();Vn();Wn();Bn();c(qn,"createHTTPServer")});import Ce from"ws";var H,Me,lr=f(()=>{"use strict";Lt();T();H=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{c(this,"ToolCallError")}},Me=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=u,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 Ce(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===Ce.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===Ce.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===Ce.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===Ce.OPEN?"OPEN":this.ws?.readyState===Ce.CONNECTING?"CONNECTING":this.ws?.readyState===Ce.CLOSING?"CLOSING":this.ws?.readyState===Ce.CLOSED?"CLOSED":"UNKNOWN"}),(!this.connectionStatus||this.ws?.readyState!==Ce.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 H(-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 H(-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 H?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 H(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.name||typeof e.name!="string")throw new H(-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 H(-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 H?s=i:s=new H(-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 H(-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 H(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${t}`)):l.message?.includes("\u670D\u52A1")&&l.message?.includes("\u4E0D\u53EF\u7528")?i(new H(-32001,l.message)):l.message?.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?i(new H(-32001,l.message)):l.message?.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?i(new H(-32001,l.message)):i(new H(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l.message}`))})})}handleToolCallError(e,t,r){let s;e instanceof H?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===Ce.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 Xn={};Re(Xn,{MCPServer:()=>cs});import{EventEmitter as yc}from"events";var B,cs,Jn=f(()=>{"use strict";Gn();T();lr();te();B=new Ae,cs=class extends yc{static{c(this,"MCPServer")}unifiedServer=null;proxyMCPServer=null;port;isStarted=!1;constructor(e=3e3){super(),this.port=e}async initializeUnifiedServer(){if(!this.unifiedServer){B.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 qn(e),this.unifiedServer.on("started",()=>this.emit("started")),this.unifiedServer.on("stopped",()=>this.emit("stopped")),this.unifiedServer.on("connectionRegistered",t=>{this.emit("connectionRegistered",t)}),B.debug("\u7EDF\u4E00 MCP \u670D\u52A1\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw B.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){B.warn("\u4ECE\u914D\u7F6E\u4E2D\u8BFB\u53D6\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25:",t)}e?(this.proxyMCPServer=new Me(e),this.unifiedServer&&this.proxyMCPServer.setServiceManager(this.unifiedServer.getServiceManager()),await this.proxyMCPServer.connect(),B.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")):B.debug("\u672A\u914D\u7F6E\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\uFF0C\u8DF3\u8FC7\u8FDE\u63A5")}catch(e){B.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}}async start(){if(this.isStarted){B.warn("\u670D\u52A1\u5668\u5DF2\u542F\u52A8");return}try{await this.initializeUnifiedServer(),this.unifiedServer&&await this.unifiedServer.start(),this.initializeMCPClient().catch(e=>{B.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}),this.isStarted=!0,this.emit("started"),B.info("MCP \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F")}catch(e){throw B.error("\u542F\u52A8 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}async stop(){if(!this.isStarted){B.warn("\u670D\u52A1\u5668\u672A\u542F\u52A8");return}try{B.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"),B.info("MCP \u670D\u52A1\u5668\u5DF2\u505C\u6B62")}catch(e){throw B.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)}}});var Yn={};Re(Yn,{ServiceManagerImpl:()=>ls});var ls,Kn=f(()=>{"use strict";de();Ie();Ct();nr();ls=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 D?t:D.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw D.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile()}catch(e){throw e instanceof D?e:new D(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async restart(e){try{this.getStatus().running&&(await this.stop(),await new Promise(r=>setTimeout(r,1e3))),await this.start(e)}catch(t){throw new D(`\u91CD\u542F\u670D\u52A1\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}getStatus(){return this.processManager.getServiceStatus()}validateStartOptions(e){if(e.port!==void 0&&ne.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new D(`\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F: ${e.mode}`)}checkEnvironment(){if(!this.configManager.configExists())throw _e.configNotFound();try{if(!this.configManager.getConfig())throw new _e("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof _e?e:new _e(`\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=O.getExecutablePath("cli"),n=r("node",[s,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:O.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(()=>(Jn(),Xn)),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=O.getMcpServerProxyPath(),s=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:O.getConfigDir()}});this.processManager.savePidInfo(s.pid,"foreground")}async startWebServerInDaemon(e){let{spawn:t}=await import("child_process"),r=O.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(r))throw new D(`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:O.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(()=>(us(),gs)),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=Q.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 Zn={};Re(Zn,{TemplateManagerImpl:()=>hs});import Mc from"fs";import je from"path";var hs,Qn=f(()=>{"use strict";de();ht();Ie();nr();hs=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=O.findTemplatesDir();if(!e)return[];let t=[],r=Mc.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",O.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(ne.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=O.getTemplatePath(e);if(!t)return null;let r=je.join(t,"template.json"),s={};if(I.exists(r))try{let a=I.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 b?t:new R(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:je.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=je.resolve(e.targetPath);if(I.exists(s))throw R.alreadyExists(s);I.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 b?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=je.join(t.path,s);if(!I.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 I.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let s=je.relative(e,r);return!s.startsWith(".")&&s!=="template.json"&&!s.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){ne.validateRequired(e.targetPath,"targetPath"),ne.validateRequired(e.projectName,"projectName"),ne.validateProjectName(e.projectName),e.templateName&&ne.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{I.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=je.join(e,t);return I.exists(n)?[n]:[]}let r=I.listDirectory(e,{recursive:!0}),s=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(n=>{let i=je.relative(e,n);return s.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=I.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&&I.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 ds(){return ps.create()}var ps,eo=f(()=>{"use strict";xn();ht();es();Ie();Ct();nr();ts();T();te();ps=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",()=>Oe),e.registerSingleton("platformUtils",()=>Q),e.registerSingleton("formatUtils",()=>et),e.registerSingleton("fileUtils",()=>I),e.registerSingleton("pathUtils",()=>O),e.registerSingleton("validation",()=>ne),e.registerSingleton("configManager",()=>d),e.registerSingleton("logger",()=>u),e.registerSingleton("errorHandler",()=>sr),e.registerSingleton("processManager",()=>{let t=(kn(),Nt(_n));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(Fn(),Nt(Hn)),r=e.get("processManager"),s=e.get("logger");return new t.DaemonManagerImpl(r,s)}),e.registerSingleton("serviceManager",()=>{let t=(Kn(),Nt(Yn)),r=e.get("processManager"),s=e.get("configManager"),n=e.get("logger");return new t.ServiceManagerImpl(r,s,n)}),e.registerSingleton("templateManager",()=>{let t=(Qn(),Nt(Zn));return new t.TemplateManagerImpl}),e}};c(ds,"createContainer")});import{spawn as gr}from"child_process";var ur,to=f(()=>{"use strict";eo();T();k();ur=class{static{c(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u.withTag("ServiceApiHandler"),this.statusService=e,this.eventBus=P()}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 ds()).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 ds()).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 Pc}from"fs/promises";import{dirname as Rc,join as Y}from"path";import{fileURLToPath as wc}from"url";var pr,ro=f(()=>{"use strict";T();pr=class{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=u.withTag("StaticFileHandler"),this.initializeWebPath()}initializeWebPath(){try{let e=Rc(wc(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[Y(e,"..","..","apps","frontend","dist"),Y(e,"..","apps","frontend","dist"),Y(e,"..","..","apps","frontend"),Y(e,"..","apps","frontend"),Y(e,"..","..","web","dist"),Y(e,"..","web","dist"),Y(e,"..","..","web"),Y(e,"..","web"),Y(e,"..","..","..","apps","frontend","dist"),Y(e,"..","..","..","apps","frontend"),Y(e,"..","..","..","web","dist"),Y(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.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=Y(this.webPath,r);if(!hr(s)){let i=Y(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 Pc(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=`
39
+ `)}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 Ce from"ws";var j,we,nr=f(()=>{"use strict";Nt();y();j=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{c(this,"ToolCallError")}},we=class{static{c(this,"ProxyMCPServer")}endpointUrl;ws=null;logger;connectionStatus=!1;serverInitialized=!1;serviceManager=null;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=u,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(){if(!this.serviceManager){this.logger.debug("MCPServiceManager \u672A\u8BBE\u7F6E\uFF0C\u8DF3\u8FC7\u5DE5\u5177\u540C\u6B65");return}try{let e=this.serviceManager.getAllTools(),t=new Map;for(let r of e)t.set(r.name,{name:r.name,description:r.description,inputSchema:r.inputSchema});this.tools=t,this.logger.info(`\u5DF2\u4ECE MCPServiceManager \u540C\u6B65 ${this.tools.size} \u4E2A\u5DE5\u5177`)}catch(e){this.logger.error(`\u540C\u6B65\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}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: ${S(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 Ce(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===Ce.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===Ce.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===Ce.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===Ce.OPEN?"OPEN":this.ws?.readyState===Ce.CONNECTING?"CONNECTING":this.ws?.readyState===Ce.CLOSING?"CLOSING":this.ws?.readyState===Ce.CLOSED?"CLOSED":"UNKNOWN"}),(!this.connectionStatus||this.ws?.readyState!==Ce.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 j(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=null;try{let s=this.validateToolCallParams(e.params);if(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}),!this.serviceManager)throw new j(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E");let o=await this.executeToolWithRetry(s.name,s.arguments||{});this.sendResponse(t,{content:o.content||[{type:"text",text:JSON.stringify(o)}],isError:o.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 o=s instanceof j?s.code:-32e3,i=s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF";this.recordCallEnd(r,!1,o,i)}this.handleToolCallError(s,t,r?.duration||0)}}validateToolCallParams(e){if(!e||typeof e!="object")throw new j(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let t=e;if(!t.name||typeof t.name!="string")throw new j(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(t.arguments!==void 0&&(typeof t.arguments!="object"||Array.isArray(t.arguments)))throw new j(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");return{name:t.name,arguments:t.arguments}}async executeToolWithRetry(e,t){let r=null;for(let s=1;s<=this.retryConfig.maxAttempts;s++)try{return await this.executeToolWithTimeout(e,t,this.toolCallConfig.timeout)}catch(o){if(o instanceof j?r=o:r=new j(-32e3,o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"),this.retryConfig.retryableErrors.includes(r.code)&&s<this.retryConfig.maxAttempts){let i=Math.min(this.retryConfig.initialDelay*this.retryConfig.backoffMultiplier**(s-1),this.retryConfig.maxDelay);this.logger.warn(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25\uFF0C\u5C06\u5728 ${i}ms \u540E\u91CD\u8BD5 (${s}/${this.retryConfig.maxAttempts})`,{toolName:e,error:r.message,attempt:s,delay:i}),await new Promise(a=>setTimeout(a,i));continue}break}throw r}async executeToolWithTimeout(e,t,r=3e4){return new Promise((s,o)=>{let i=setTimeout(()=>{o(new j(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),o(new j(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E"));return}this.serviceManager.callTool(e,t).then(a=>{clearTimeout(i),s(a)}).catch(a=>{clearTimeout(i);let l=a instanceof Error?a.message:String(a);l.includes("\u672A\u627E\u5230\u5DE5\u5177")?o(new j(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?o(new j(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?o(new j(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?o(new j(-32001,l)):o(new j(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let s;e instanceof j?s={code:e.code,message:e.message,data:e.data}:s={code:-32e3,message:e instanceof Error?e.message:"\u672A\u77E5\u9519\u8BEF",data:{originalError:String(e)||"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===Ce.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,o)=>s+(o.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 Do={};Se(Do,{MCPServer:()=>ss});import{EventEmitter as lc}from"events";var _,ss,_o=f(()=>{"use strict";y();nr();te();_=new Ne,ss=class extends lc{static{c(this,"MCPServer")}serviceManager=null;proxyMCPServer=null;webServer=null;port;isStarted=!1;constructor(e=3e3){super(),this.port=e}async initializeServiceManager(){if(!this.serviceManager){_.info("\u521D\u59CB\u5316 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{let{MCPServiceManager:e}=await Promise.resolve().then(()=>(Xt(),Eo));this.serviceManager=new e,await this.serviceManager.start(),_.info(`MCP \u670D\u52A1\u7BA1\u7406\u5668\u521B\u5EFA\u6210\u529F\uFF0C\u7AEF\u53E3: ${this.port}`),this.serviceManager.on("started",()=>this.emit("started")),this.serviceManager.on("stopped",()=>this.emit("stopped")),this.serviceManager.on("transportRegistered",t=>{this.emit("connectionRegistered",t)}),_.debug("MCP \u670D\u52A1\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw _.error("\u521D\u59CB\u5316 MCP \u670D\u52A1\u7BA1\u7406\u5668\u5931\u8D25",e),e}}}async initializeWebServer(){if(!this.webServer){_.info("\u521D\u59CB\u5316 Web \u670D\u52A1\u5668");try{let{WebServer:e}=await Promise.resolve().then(()=>(ar(),ir));this.webServer=new e(this.port),await this.webServer.start(),_.info(`Web \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F\uFF0C\u7AEF\u53E3: ${this.port}`)}catch(e){throw _.error("\u521D\u59CB\u5316 Web \u670D\u52A1\u5668\u5931\u8D25",e),e}}}async initializeMCPClient(){try{let e=null;try{m.configExists()&&(e=m.getMcpEndpoints().find(r=>r&&!r.includes("<\u8BF7\u586B\u5199"))||null)}catch(t){_.warn("\u4ECE\u914D\u7F6E\u4E2D\u8BFB\u53D6\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25:",t)}e?(this.proxyMCPServer=new we(e),this.serviceManager&&this.proxyMCPServer.setServiceManager(this.serviceManager),await this.proxyMCPServer.connect(),_.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F")):_.debug("\u672A\u914D\u7F6E\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\uFF0C\u8DF3\u8FC7\u8FDE\u63A5")}catch(e){_.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}}async start(){if(this.isStarted){_.warn("\u670D\u52A1\u5668\u5DF2\u542F\u52A8");return}try{await this.initializeServiceManager(),await this.initializeWebServer(),this.initializeMCPClient().catch(e=>{_.error("\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",e)}),this.isStarted=!0,this.emit("started"),_.info(`MCP \u670D\u52A1\u5668\u542F\u52A8\u6210\u529F\uFF0C\u7AEF\u53E3: ${this.port}`)}catch(e){throw _.error("\u542F\u52A8 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}async stop(){if(!this.isStarted){_.warn("\u670D\u52A1\u5668\u672A\u542F\u52A8");return}try{_.info("\u505C\u6B62 MCP \u670D\u52A1\u5668"),this.webServer&&(await this.webServer.stop(),this.webServer=null),this.serviceManager&&await this.serviceManager.stop(),this.proxyMCPServer&&(this.proxyMCPServer.disconnect(),this.proxyMCPServer=null),this.isStarted=!1,this.emit("stopped"),_.info("MCP \u670D\u52A1\u5668\u5DF2\u505C\u6B62")}catch(e){throw _.error("\u505C\u6B62 MCP \u670D\u52A1\u5668\u5931\u8D25:",e),e}}getServiceManager(){return this.serviceManager||null}getMessageHandler(){return this.serviceManager?.getMessageHandler()||null}getStatus(){return this.serviceManager?{...this.serviceManager.getStatus(),port:this.port,mode:"mcp-server",proxyConnected:this.proxyMCPServer!==null}:{isRunning:!1,port:this.port,mode:"mcp-server"}}isRunning(){return this.isStarted&&(this.serviceManager?.isServerRunning()||!1)&&this.webServer!==null}}});var ko={};Se(ko,{ServiceManagerImpl:()=>os});var os,jo=f(()=>{"use strict";me();$e();dt();rr();os=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 L?t:L.startFailed(t instanceof Error?t.message:String(t))}}async stop(){try{let e=this.getStatus();if(!e.running)throw L.notRunning();await this.processManager.gracefulKillProcess(e.pid),this.processManager.cleanupPidFile()}catch(e){throw e instanceof L?e:new L(`\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 L(`\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&&oe.validatePort(e.port),e.mode&&!["normal","mcp-server","stdio"].includes(e.mode))throw new L(`\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():await this.startWebServerInForeground()}async startMcpServerMode(e){let t=e.port||3e3,{spawn:r}=await import("child_process");if(e.daemon){let s=$.getExecutablePath("cli"),o=r("node",[s,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:$.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(o.pid,"daemon"),o.unref(),console.log(`\u2705 MCP Server \u5DF2\u5728\u540E\u53F0\u542F\u52A8 (PID: ${o.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(()=>(_o(),Do)),o=new s(t),i=c(async()=>{await o.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i),await o.start()}}async startStdioMode(e){let{spawn:t}=await import("child_process"),r=$.getMcpServerProxyPath(),s=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:$.getConfigDir()}});this.processManager.savePidInfo(s.pid,"foreground")}async startWebServerInDaemon(){let{spawn:e}=await import("child_process"),t=$.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(t))throw new L(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`);let o=e("node",[t],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:$.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(o.pid,"daemon"),o.unref(),console.log(`\u2705 \u540E\u53F0\u670D\u52A1\u5DF2\u542F\u52A8 (PID: ${o.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(){let{WebServer:e}=await Promise.resolve().then(()=>(ar(),ir)),t=new e,r=c(async()=>{await t.stop(),this.processManager.cleanupPidFile(),process.exit(0)},"cleanup");process.on("SIGINT",r),process.on("SIGTERM",r),this.processManager.savePidInfo(process.pid,"foreground"),await t.start()}async openBrowserUrl(e){try{let{spawn:t}=await import("child_process"),r=Q.getCurrentPlatform(),s,o;r==="darwin"?(s="open",o=[e]):r==="win32"?(s="start",o=["",e]):(s="xdg-open",o=[e]),t(s,o,{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 Ho={};Se(Ho,{TemplateManagerImpl:()=>ns});import gc from"fs";import He from"path";var ns,Fo=f(()=>{"use strict";me();ut();$e();rr();ns=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=$.findTemplatesDir();if(!e)return[];let t=[],r=gc.readdirSync(e,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);for(let s of r)try{let o=await this.getTemplateInfo(s);o&&t.push(o)}catch{console.warn(`\u8DF3\u8FC7\u65E0\u6548\u6A21\u677F: ${s}`)}return t}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",$.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(oe.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=$.getTemplatePath(e);if(!t)return null;let r=He.join(t,"template.json"),s={};if(I.exists(r))try{let a=I.readFile(r);s=JSON.parse(a)}catch{console.warn(`\u6A21\u677F\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}`)}let o=this.getTemplateFiles(t),i={name:e,path:t,description:s.description||`${e} \u6A21\u677F`,version:s.version||"1.0.0",author:s.author,files:o};return this.templateCache.set(e,i),i}catch(t){throw t instanceof b?t:new R(`\u65E0\u6CD5\u83B7\u53D6\u6A21\u677F\u4FE1\u606F: ${e}`,"")}}async copyTemplate(e,t){await this.createProject({templateName:e,targetPath:t,projectName:He.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=He.resolve(e.targetPath);if(I.exists(s))throw R.alreadyExists(s);I.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 b?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 o=He.join(t.path,s);if(!I.exists(o))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 I.listDirectory(e,{recursive:!0,includeHidden:!1}).filter(r=>{let s=He.relative(e,r);return!s.startsWith(".")&&s!=="template.json"&&!s.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){oe.validateRequired(e.targetPath,"targetPath"),oe.validateRequired(e.projectName,"projectName"),oe.validateProjectName(e.projectName),e.templateName&&oe.validateTemplateName(e.templateName)}async copyTemplateFiles(e,t,r){try{I.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 o of s){let i=this.findFilesByPattern(e,o);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 o=He.join(e,t);return I.exists(o)?[o]:[]}let r=I.listDirectory(e,{recursive:!0}),s=new RegExp(t.replace(/\*\*/g,".*").replace(/\*/g,"[^/]*"));return r.filter(o=>{let i=He.relative(e,o);return s.test(i)})}catch{return[]}}async replaceVariablesInFile(e,t){try{let r=I.readFile(e),s=!1;for(let[o,i]of Object.entries(t)){let a=new RegExp(`{{\\s*${o}\\s*}}`,"g");a.test(r)&&(r=r.replace(a,i),s=!0)}s&&I.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 as(){return is.create()}var is,zo=f(()=>{"use strict";bo();ut();Qr();$e();dt();rr();es();y();te();is=class n{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 n;return e.registerSingleton("versionUtils",()=>Ae),e.registerSingleton("platformUtils",()=>Q),e.registerSingleton("formatUtils",()=>et),e.registerSingleton("fileUtils",()=>I),e.registerSingleton("pathUtils",()=>$),e.registerSingleton("validation",()=>oe),e.registerSingleton("configManager",()=>m),e.registerSingleton("logger",()=>u),e.registerSingleton("errorHandler",()=>tr),e.registerSingleton("processManager",()=>{let t=(Oo(),$t(Ao));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(Lo(),$t(xo)),r=e.get("processManager"),s=e.get("logger");return new t.DaemonManagerImpl(r,s)}),e.registerSingleton("serviceManager",()=>{let t=(jo(),$t(ko)),r=e.get("processManager"),s=e.get("configManager"),o=e.get("logger");return new t.ServiceManagerImpl(r,s,o)}),e.registerSingleton("templateManager",()=>{let t=(Fo(),$t(Ho));return new t.TemplateManagerImpl}),e}};c(as,"createContainer")});import{spawn as cr}from"child_process";var lr,Uo=f(()=>{"use strict";zo();y();H();lr=class{static{c(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u.withTag("ServiceApiHandler"),this.statusService=e,this.eventBus=P()}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 as()).get("serviceManager").getStatus();if(!r.running){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),cr("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",o=["restart"];s&&o.push("--daemon"),cr("xiaozhi",o,{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"),cr("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"),cr("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 as()).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 gr}from"fs";import{readFile as uc}from"fs/promises";import{dirname as pc,join as Y}from"path";import{fileURLToPath as hc}from"url";var ur,Vo=f(()=>{"use strict";y();ur=class{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=u.withTag("StaticFileHandler"),this.initializeWebPath()}initializeWebPath(){try{let e=pc(hc(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[Y(e,"..","..","apps","frontend","dist"),Y(e,"..","apps","frontend","dist"),Y(e,"..","..","apps","frontend"),Y(e,"..","apps","frontend"),Y(e,"..","..","web","dist"),Y(e,"..","web","dist"),Y(e,"..","..","web"),Y(e,"..","web"),Y(e,"..","..","..","apps","frontend","dist"),Y(e,"..","..","..","apps","frontend"),Y(e,"..","..","..","web","dist"),Y(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=gr(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=Y(this.webPath,r);if(!gr(s)){let i=Y(this.webPath,"index.html");return gr(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 o=this.getContentType(s);return this.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${s}, Content-Type: ${o}`),this.serveFile(e,s,o)}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 uc(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=`
45
40
  <!DOCTYPE html>
46
41
  <html>
47
42
  <head>
@@ -98,6 +93,6 @@ data: /messages?sessionId=${s}
98
93
  </div>
99
94
  </body>
100
95
  </html>
101
- `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&hr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var dr,so=f(()=>{"use strict";T();dr=class{static{c(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=u.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 rt,no=f(()=>{"use strict";rt=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(rt||{})});import bc from"ajv";import mr from"dayjs";var fr,oo=f(()=>{"use strict";T();te();no();Gt();Kt();fr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=u.withTag("ToolApiHandler"),this.ajv=new bc({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)),!Z.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 Z.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 Te().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 h={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:g,toolName:l.name.split("__").slice(1).join("__")}}};a.push(h)}return this.logger.debug(`\u4ECE ${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 h=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(p=>{let S=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 ${S} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${A}`}if(p.keyword==="enum"){let A=p.params?.allowedValues||[];return`\u53C2\u6570 ${S} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${A.join(", ")}`}return`\u53C2\u6570 ${S} ${m}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,h),new Error(h)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(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(rt).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(rt).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 _=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(_,400)}if(!Z.isInitialized()){let _=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(_,503)}let a=await Z.getInstance();try{await this.validateServiceAndTool(a,r,s)}catch(_){let At=_ instanceof Error?_.message:String(_),ue=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",At);return e.json(ue,404)}let g=await new Te().getAllCachedTools(),h=`${r}__${s}`,p=g.find(_=>_.name===h);if(!p){let _=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`);return e.json(_,404)}let S=n||h,m=d.getCustomMCPTools();if(new Set(m.map(_=>_.name)).has(S)){let _=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${S}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(_,409)}let ge={name:S,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(ge),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`);let ce=d.getServerToolsConfig(r);ce?.toolName&&(ce[s].enable=!0,d.updateServerToolsConfig(r,ce),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: ${S}`);let $t={tool:ge,toolName:S,toolType:"mcp",addedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse($t,`MCP \u5DE5\u5177 "${S}" \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(rt).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(rt).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 h=this.generateInputSchema(s,a),p={...g,description:i||g.description,inputSchema:h};d.updateCustomMCPTool(t,p),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let S={tool:p,toolName:t,toolType:"coze",updatedAt:mr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(S,`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),h={name:i,description:a,inputSchema:l,handler:g};return this.validateGeneratedTool(h),h}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[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}}});import*as vr from"fs";var Cr,io=f(()=>{"use strict";Le();Ie();T();Jr();Cr=class{static{c(this,"ToolCallLogService")}logger;configDir;constructor(e){this.logger=u.withTag("ToolCallLogService"),this.configDir=e||O.getConfigDir()}getLogFilePath(){return new Ze({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!vr.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=vr.readFileSync(e,"utf8").trim().split(`
102
- `).filter(n=>n.trim()!==""),s=[];for(let n of r)try{let i=JSON.parse(n);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp||this.logger.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233, \u5DF2\u4FDD\u6301\u4E3A undefined:",n),s.push(i)}catch{this.logger.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C:",n)}return s.sort((n,i)=>(i.timestamp||0)-(n.timestamp||0)),s}catch(t){throw this.logger.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25:",t),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(s=>s.toolName.toLowerCase().includes(t.toolName.toLowerCase()))),t.serverName&&(r=r.filter(s=>s.serverName?.toLowerCase().includes(t.serverName.toLowerCase()))),t.success!==void 0&&(r=r.filter(s=>s.success===t.success)),t.startDate||t.endDate){let s=t.startDate?new Date(t.startDate).getTime():0,n=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let a=i.timestamp||0;return a>=s&&a<=n})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),s=r.length,n=Math.min(e.limit||Ke.DEFAULT_LIMIT,Ke.MAX_LIMIT),i=e.offset||0,a=r.slice(i,i+n),l=i+n<s;return this.logger.debug(`\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7: ${a.length}/${s} \u6761\u8BB0\u5F55`),{records:a,total:s,hasMore:l}}}});import{z as $e}from"zod";var Ic,Sr,ao=f(()=>{"use strict";Le();T();io();Ic=$e.object({limit:$e.string().optional().transform(o=>o?Number.parseInt(o,10):void 0).refine(o=>o===void 0||o>=1&&o<=Ke.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Ke.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:$e.string().optional().transform(o=>o?Number.parseInt(o,10):void 0).refine(o=>o===void 0||o>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:$e.string().optional(),serverName:$e.string().optional(),success:$e.string().optional().transform(o=>o?o.toLowerCase()==="true":void 0),startDate:$e.string().optional().refine(o=>{if(!o)return!0;let e=Date.parse(o);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:$e.string().optional().refine(o=>{if(!o)return!0;let e=Date.parse(o);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(o=>!o.startDate||!o.endDate?!0:new Date(o.startDate)<=new Date(o.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),Sr=class{static{c(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new Cr}createSuccessResponse(e){let t={success:!0,data:e};return Response.json(t)}createErrorResponse(e,t,r){let s={success:!1,error:{code:e,message:t,details:r}};return Response.json(s,{status:this.getHttpStatusCode(e)})}getHttpStatusCode(e){switch(e){case"INVALID_QUERY_PARAMETERS":return 400;case"LOG_FILE_NOT_FOUND":return 404;case"LOG_FILE_READ_ERROR":return 500;default:return 500}}parseAndValidateQueryParams(e){let t=e.req.query(),r=Ic.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.map(s=>({field:s.path.join("."),message:s.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return this.createErrorResponse("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error);let r=await this.toolCallLogService.getToolCallLogs(t.data);return u.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){u.error("\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF";return r.includes("\u4E0D\u5B58\u5728")?this.createErrorResponse("LOG_FILE_NOT_FOUND",r):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?this.createErrorResponse("LOG_FILE_READ_ERROR",r):this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r})}}}});var St=y((_C,co)=>{"use strict";var Oc="2.0.0",$c=Number.MAX_SAFE_INTEGER||9007199254740991,Ac=16,Nc=250,xc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];co.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Ac,MAX_SAFE_BUILD_LENGTH:Nc,MAX_SAFE_INTEGER:$c,RELEASE_TYPES:xc,SEMVER_SPEC_VERSION:Oc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Et=y((kC,lo)=>{"use strict";var Dc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...o)=>console.error("SEMVER",...o):()=>{};lo.exports=Dc});var st=y((ve,go)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:ms,MAX_SAFE_BUILD_LENGTH:Lc,MAX_LENGTH:_c}=St(),kc=Et();ve=go.exports={};var jc=ve.re=[],Hc=ve.safeRe=[],C=ve.src=[],Fc=ve.safeSrc=[],v=ve.t={},zc=0,fs="[a-zA-Z0-9-]",Uc=[["\\s",1],["\\d",_c],[fs,Lc]],Vc=c(o=>{for(let[e,t]of Uc)o=o.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return o},"makeSafeRegex"),M=c((o,e,t)=>{let r=Vc(e),s=zc++;kc(o,s,e),v[o]=s,C[s]=e,Fc[s]=r,jc[s]=new RegExp(e,t?"g":void 0),Hc[s]=new RegExp(r,t?"g":void 0)},"createToken");M("NUMERICIDENTIFIER","0|[1-9]\\d*");M("NUMERICIDENTIFIERLOOSE","\\d+");M("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${fs}*`);M("MAINVERSION",`(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})`);M("MAINVERSIONLOOSE",`(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASEIDENTIFIER",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIER]})`);M("PRERELEASEIDENTIFIERLOOSE",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASE",`(?:-(${C[v.PRERELEASEIDENTIFIER]}(?:\\.${C[v.PRERELEASEIDENTIFIER]})*))`);M("PRERELEASELOOSE",`(?:-?(${C[v.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${C[v.PRERELEASEIDENTIFIERLOOSE]})*))`);M("BUILDIDENTIFIER",`${fs}+`);M("BUILD",`(?:\\+(${C[v.BUILDIDENTIFIER]}(?:\\.${C[v.BUILDIDENTIFIER]})*))`);M("FULLPLAIN",`v?${C[v.MAINVERSION]}${C[v.PRERELEASE]}?${C[v.BUILD]}?`);M("FULL",`^${C[v.FULLPLAIN]}$`);M("LOOSEPLAIN",`[v=\\s]*${C[v.MAINVERSIONLOOSE]}${C[v.PRERELEASELOOSE]}?${C[v.BUILD]}?`);M("LOOSE",`^${C[v.LOOSEPLAIN]}$`);M("GTLT","((?:<|>)?=?)");M("XRANGEIDENTIFIERLOOSE",`${C[v.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);M("XRANGEIDENTIFIER",`${C[v.NUMERICIDENTIFIER]}|x|X|\\*`);M("XRANGEPLAIN",`[v=\\s]*(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:${C[v.PRERELEASE]})?${C[v.BUILD]}?)?)?`);M("XRANGEPLAINLOOSE",`[v=\\s]*(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:${C[v.PRERELEASELOOSE]})?${C[v.BUILD]}?)?)?`);M("XRANGE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAIN]}$`);M("XRANGELOOSE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAINLOOSE]}$`);M("COERCEPLAIN",`(^|[^\\d])(\\d{1,${ms}})(?:\\.(\\d{1,${ms}}))?(?:\\.(\\d{1,${ms}}))?`);M("COERCE",`${C[v.COERCEPLAIN]}(?:$|[^\\d])`);M("COERCEFULL",C[v.COERCEPLAIN]+`(?:${C[v.PRERELEASE]})?(?:${C[v.BUILD]})?(?:$|[^\\d])`);M("COERCERTL",C[v.COERCE],!0);M("COERCERTLFULL",C[v.COERCEFULL],!0);M("LONETILDE","(?:~>?)");M("TILDETRIM",`(\\s*)${C[v.LONETILDE]}\\s+`,!0);ve.tildeTrimReplace="$1~";M("TILDE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAIN]}$`);M("TILDELOOSE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAINLOOSE]}$`);M("LONECARET","(?:\\^)");M("CARETTRIM",`(\\s*)${C[v.LONECARET]}\\s+`,!0);ve.caretTrimReplace="$1^";M("CARET",`^${C[v.LONECARET]}${C[v.XRANGEPLAIN]}$`);M("CARETLOOSE",`^${C[v.LONECARET]}${C[v.XRANGEPLAINLOOSE]}$`);M("COMPARATORLOOSE",`^${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]})$|^$`);M("COMPARATOR",`^${C[v.GTLT]}\\s*(${C[v.FULLPLAIN]})$|^$`);M("COMPARATORTRIM",`(\\s*)${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]}|${C[v.XRANGEPLAIN]})`,!0);ve.comparatorTrimReplace="$1$2$3";M("HYPHENRANGE",`^\\s*(${C[v.XRANGEPLAIN]})\\s+-\\s+(${C[v.XRANGEPLAIN]})\\s*$`);M("HYPHENRANGELOOSE",`^\\s*(${C[v.XRANGEPLAINLOOSE]})\\s+-\\s+(${C[v.XRANGEPLAINLOOSE]})\\s*$`);M("STAR","(<|>)?=?\\s*\\*");M("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");M("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Er=y((HC,uo)=>{"use strict";var Wc=Object.freeze({loose:!0}),Bc=Object.freeze({}),qc=c(o=>o?typeof o!="object"?Wc:o:Bc,"parseOptions");uo.exports=qc});var Cs=y((zC,mo)=>{"use strict";var ho=/^[0-9]+$/,po=c((o,e)=>{if(typeof o=="number"&&typeof e=="number")return o===e?0:o<e?-1:1;let t=ho.test(o),r=ho.test(e);return t&&r&&(o=+o,e=+e),o===e?0:t&&!r?-1:r&&!t?1:o<e?-1:1},"compareIdentifiers"),Gc=c((o,e)=>po(e,o),"rcompareIdentifiers");mo.exports={compareIdentifiers:po,rcompareIdentifiers:Gc}});var z=y((VC,Co)=>{"use strict";var Tr=Et(),{MAX_LENGTH:fo,MAX_SAFE_INTEGER:yr}=St(),{safeRe:Mr,t:Pr}=st(),Xc=Er(),{compareIdentifiers:vs}=Cs(),Ss=class o{static{c(this,"SemVer")}constructor(e,t){if(t=Xc(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>fo)throw new TypeError(`version is longer than ${fo} characters`);Tr("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Mr[Pr.LOOSE]:Mr[Pr.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>yr||this.major<0)throw new TypeError("Invalid major version");if(this.minor>yr||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>yr||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<yr)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(Tr("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(Tr("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 vs(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(Tr("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 vs(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?Mr[Pr.PRERELEASELOOSE]:Mr[Pr.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]),vs(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}};Co.exports=Ss});var He=y((BC,So)=>{"use strict";var vo=z(),Jc=c((o,e,t=!1)=>{if(o instanceof vo)return o;try{return new vo(o,e)}catch(r){if(!t)return null;throw r}},"parse");So.exports=Jc});var To=y((GC,Eo)=>{"use strict";var Yc=He(),Kc=c((o,e)=>{let t=Yc(o,e);return t?t.version:null},"valid");Eo.exports=Kc});var Mo=y((JC,yo)=>{"use strict";var Zc=He(),Qc=c((o,e)=>{let t=Zc(o.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");yo.exports=Qc});var wo=y((KC,Ro)=>{"use strict";var Po=z(),el=c((o,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new Po(o instanceof Po?o.version:o,t).inc(e,r,s).version}catch{return null}},"inc");Ro.exports=el});var Oo=y((QC,Io)=>{"use strict";var bo=He(),tl=c((o,e)=>{let t=bo(o,null,!0),r=bo(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 h=l?"pre":"";return t.major!==r.major?h+"major":t.minor!==r.minor?h+"minor":t.patch!==r.patch?h+"patch":"prerelease"},"diff");Io.exports=tl});var Ao=y((tv,$o)=>{"use strict";var rl=z(),sl=c((o,e)=>new rl(o,e).major,"major");$o.exports=sl});var xo=y((sv,No)=>{"use strict";var nl=z(),ol=c((o,e)=>new nl(o,e).minor,"minor");No.exports=ol});var Lo=y((ov,Do)=>{"use strict";var il=z(),al=c((o,e)=>new il(o,e).patch,"patch");Do.exports=al});var ko=y((av,_o)=>{"use strict";var cl=He(),ll=c((o,e)=>{let t=cl(o,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");_o.exports=ll});var oe=y((lv,Ho)=>{"use strict";var jo=z(),gl=c((o,e,t)=>new jo(o,t).compare(new jo(e,t)),"compare");Ho.exports=gl});var zo=y((uv,Fo)=>{"use strict";var ul=oe(),hl=c((o,e,t)=>ul(e,o,t),"rcompare");Fo.exports=hl});var Vo=y((pv,Uo)=>{"use strict";var pl=oe(),dl=c((o,e)=>pl(o,e,!0),"compareLoose");Uo.exports=dl});var Rr=y((mv,Bo)=>{"use strict";var Wo=z(),ml=c((o,e,t)=>{let r=new Wo(o,t),s=new Wo(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");Bo.exports=ml});var Go=y((Cv,qo)=>{"use strict";var fl=Rr(),Cl=c((o,e)=>o.sort((t,r)=>fl(t,r,e)),"sort");qo.exports=Cl});var Jo=y((Sv,Xo)=>{"use strict";var vl=Rr(),Sl=c((o,e)=>o.sort((t,r)=>vl(r,t,e)),"rsort");Xo.exports=Sl});var Tt=y((Tv,Yo)=>{"use strict";var El=oe(),Tl=c((o,e,t)=>El(o,e,t)>0,"gt");Yo.exports=Tl});var wr=y((Mv,Ko)=>{"use strict";var yl=oe(),Ml=c((o,e,t)=>yl(o,e,t)<0,"lt");Ko.exports=Ml});var Es=y((Rv,Zo)=>{"use strict";var Pl=oe(),Rl=c((o,e,t)=>Pl(o,e,t)===0,"eq");Zo.exports=Rl});var Ts=y((bv,Qo)=>{"use strict";var wl=oe(),bl=c((o,e,t)=>wl(o,e,t)!==0,"neq");Qo.exports=bl});var br=y((Ov,ei)=>{"use strict";var Il=oe(),Ol=c((o,e,t)=>Il(o,e,t)>=0,"gte");ei.exports=Ol});var Ir=y((Av,ti)=>{"use strict";var $l=oe(),Al=c((o,e,t)=>$l(o,e,t)<=0,"lte");ti.exports=Al});var ys=y((xv,ri)=>{"use strict";var Nl=Es(),xl=Ts(),Dl=Tt(),Ll=br(),_l=wr(),kl=Ir(),jl=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 Nl(o,t,r);case"!=":return xl(o,t,r);case">":return Dl(o,t,r);case">=":return Ll(o,t,r);case"<":return _l(o,t,r);case"<=":return kl(o,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");ri.exports=jl});var ni=y((Lv,si)=>{"use strict";var Hl=z(),Fl=He(),{safeRe:Or,t:$r}=st(),zl=c((o,e)=>{if(o instanceof Hl)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?Or[$r.COERCEFULL]:Or[$r.COERCE]);else{let l=e.includePrerelease?Or[$r.COERCERTLFULL]:Or[$r.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 Fl(`${r}.${s}.${n}${i}${a}`,e)},"coerce");si.exports=zl});var ii=y((kv,oi)=>{"use strict";var Ms=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}};oi.exports=Ms});var ie=y((Hv,gi)=>{"use strict";var Ul=/\s+/g,Ps=class o{static{c(this,"Range")}constructor(e,t){if(t=Wl(t),e instanceof o)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new o(e.raw,t);if(e instanceof Rs)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(Ul," "),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=>!ci(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&&Kl(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&&Jl)|(this.options.loose&&Yl))+":"+e,s=ai.get(r);if(s)return s;let n=this.options.loose,i=n?q[U.HYPHENRANGELOOSE]:q[U.HYPHENRANGE];e=e.replace(i,ag(this.options.includePrerelease)),$("hyphen replace",e),e=e.replace(q[U.COMPARATORTRIM],ql),$("comparator trim",e),e=e.replace(q[U.TILDETRIM],Gl),$("tilde trim",e),e=e.replace(q[U.CARETTRIM],Xl),$("caret trim",e);let a=e.split(" ").map(p=>Zl(p,this.options)).join(" ").split(/\s+/).map(p=>ig(p,this.options));n&&(a=a.filter(p=>($("loose invalid filter",p,this.options),!!p.match(q[U.COMPARATORLOOSE])))),$("range list",a);let l=new Map,g=a.map(p=>new Rs(p,this.options));for(let p of g){if(ci(p))return[p];l.set(p.value,p)}l.size>1&&l.has("")&&l.delete("");let h=[...l.values()];return ai.set(r,h),h}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Range is required");return this.set.some(r=>li(r,t)&&e.set.some(s=>li(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 Bl(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(cg(this.set[t],e,this.options))return!0;return!1}};gi.exports=Ps;var Vl=ii(),ai=new Vl,Wl=Er(),Rs=yt(),$=Et(),Bl=z(),{safeRe:q,t:U,comparatorTrimReplace:ql,tildeTrimReplace:Gl,caretTrimReplace:Xl}=st(),{FLAG_INCLUDE_PRERELEASE:Jl,FLAG_LOOSE:Yl}=St(),ci=c(o=>o.value==="<0.0.0-0","isNullSet"),Kl=c(o=>o.value==="","isAny"),li=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"),Zl=c((o,e)=>(o=o.replace(q[U.BUILD],""),$("comp",o,e),o=tg(o,e),$("caret",o),o=Ql(o,e),$("tildes",o),o=sg(o,e),$("xrange",o),o=og(o,e),$("stars",o),o),"parseComparator"),G=c(o=>!o||o.toLowerCase()==="x"||o==="*","isX"),Ql=c((o,e)=>o.trim().split(/\s+/).map(t=>eg(t,e)).join(" "),"replaceTildes"),eg=c((o,e)=>{let t=e.loose?q[U.TILDELOOSE]:q[U.TILDE];return o.replace(t,(r,s,n,i,a)=>{$("tilde",o,r,s,n,i,a);let l;return G(s)?l="":G(n)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:G(i)?l=`>=${s}.${n}.0 <${s}.${+n+1}.0-0`:a?($("replaceTilde pr",a),l=`>=${s}.${n}.${i}-${a} <${s}.${+n+1}.0-0`):l=`>=${s}.${n}.${i} <${s}.${+n+1}.0-0`,$("tilde return",l),l})},"replaceTilde"),tg=c((o,e)=>o.trim().split(/\s+/).map(t=>rg(t,e)).join(" "),"replaceCarets"),rg=c((o,e)=>{$("caret",o,e);let t=e.loose?q[U.CARETLOOSE]:q[U.CARET],r=e.includePrerelease?"-0":"";return o.replace(t,(s,n,i,a,l)=>{$("caret",o,s,n,i,a,l);let g;return G(n)?g="":G(i)?g=`>=${n}.0.0${r} <${+n+1}.0.0-0`:G(a)?n==="0"?g=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:l?($("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`):($("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`),$("caret return",g),g})},"replaceCaret"),sg=c((o,e)=>($("replaceXRanges",o,e),o.split(/\s+/).map(t=>ng(t,e)).join(" ")),"replaceXRanges"),ng=c((o,e)=>{o=o.trim();let t=e.loose?q[U.XRANGELOOSE]:q[U.XRANGE];return o.replace(t,(r,s,n,i,a,l)=>{$("xRange",o,r,s,n,i,a,l);let g=G(n),h=g||G(i),p=h||G(a),S=p;return s==="="&&S&&(s=""),l=e.includePrerelease?"-0":"",g?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&S?(h&&(i=0),a=0,s===">"?(s=">=",h?(n=+n+1,i=0,a=0):(i=+i+1,a=0)):s==="<="&&(s="<",h?n=+n+1:i=+i+1),s==="<"&&(l="-0"),r=`${s+n}.${i}.${a}${l}`):h?r=`>=${n}.0.0${l} <${+n+1}.0.0-0`:p&&(r=`>=${n}.${i}.0${l} <${n}.${+i+1}.0-0`),$("xRange return",r),r})},"replaceXRange"),og=c((o,e)=>($("replaceStars",o,e),o.trim().replace(q[U.STAR],"")),"replaceStars"),ig=c((o,e)=>($("replaceGTE0",o,e),o.trim().replace(q[e.includePrerelease?U.GTE0PRE:U.GTE0],"")),"replaceGTE0"),ag=c(o=>(e,t,r,s,n,i,a,l,g,h,p,S)=>(G(r)?t="":G(s)?t=`>=${r}.0.0${o?"-0":""}`:G(n)?t=`>=${r}.${s}.0${o?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${o?"-0":""}`,G(g)?l="":G(h)?l=`<${+g+1}.0.0-0`:G(p)?l=`<${g}.${+h+1}.0-0`:S?l=`<=${g}.${h}.${p}-${S}`:o?l=`<${g}.${h}.${+p+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),cg=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[r].semver),o[r].semver!==Rs.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 yt=y((zv,fi)=>{"use strict";var Mt=Symbol("SemVer ANY"),Is=class o{static{c(this,"Comparator")}static get ANY(){return Mt}constructor(e,t){if(t=ui(t),e instanceof o){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),bs("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Mt?this.value="":this.value=this.operator+this.semver.version,bs("comp",this)}parse(e){let t=this.options.loose?hi[pi.COMPARATORLOOSE]:hi[pi.COMPARATOR],r=e.match(t);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new di(r[2],this.options.loose):this.semver=Mt}toString(){return this.value}test(e){if(bs("Comparator.test",e,this.options.loose),this.semver===Mt||e===Mt)return!0;if(typeof e=="string")try{e=new di(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 mi(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new mi(this.value,t).test(e.semver):(t=ui(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(">")))}};fi.exports=Is;var ui=Er(),{safeRe:hi,t:pi}=st(),ws=ys(),bs=Et(),di=z(),mi=ie()});var Pt=y((Vv,Ci)=>{"use strict";var lg=ie(),gg=c((o,e,t)=>{try{e=new lg(e,t)}catch{return!1}return e.test(o)},"satisfies");Ci.exports=gg});var Si=y((Bv,vi)=>{"use strict";var ug=ie(),hg=c((o,e)=>new ug(o,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");vi.exports=hg});var Ti=y((Gv,Ei)=>{"use strict";var pg=z(),dg=ie(),mg=c((o,e,t)=>{let r=null,s=null,n=null;try{n=new dg(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},"maxSatisfying");Ei.exports=mg});var Mi=y((Jv,yi)=>{"use strict";var fg=z(),Cg=ie(),vg=c((o,e,t)=>{let r=null,s=null,n=null;try{n=new Cg(e,t)}catch{return null}return o.forEach(i=>{n.test(i)&&(!r||s.compare(i)===1)&&(r=i,s=new fg(r,t))}),r},"minSatisfying");yi.exports=vg});var wi=y((Kv,Ri)=>{"use strict";var Os=z(),Sg=ie(),Pi=Tt(),Eg=c((o,e)=>{o=new Sg(o,e);let t=new Os("0.0.0");if(o.test(t)||(t=new Os("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 Os(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!n||Pi(a,n))&&(n=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),n&&(!t||Pi(t,n))&&(t=n)}return t&&o.test(t)?t:null},"minVersion");Ri.exports=Eg});var Ii=y((Qv,bi)=>{"use strict";var Tg=ie(),yg=c((o,e)=>{try{return new Tg(o,e).range||"*"}catch{return null}},"validRange");bi.exports=yg});var Ar=y((tS,Ni)=>{"use strict";var Mg=z(),Ai=yt(),{ANY:Pg}=Ai,Rg=ie(),wg=Pt(),Oi=Tt(),$i=wr(),bg=Ir(),Ig=br(),Og=c((o,e,t,r)=>{o=new Mg(o,r),e=new Rg(e,r);let s,n,i,a,l;switch(t){case">":s=Oi,n=bg,i=$i,a=">",l=">=";break;case"<":s=$i,n=Ig,i=Oi,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(wg(o,e,r))return!1;for(let g=0;g<e.set.length;++g){let h=e.set[g],p=null,S=null;if(h.forEach(m=>{m.semver===Pg&&(m=new Ai(">=0.0.0")),p=p||m,S=S||m,s(m.semver,p.semver,r)?p=m:i(m.semver,S.semver,r)&&(S=m)}),p.operator===a||p.operator===l||(!S.operator||S.operator===a)&&n(o,S.semver))return!1;if(S.operator===l&&i(o,S.semver))return!1}return!0},"outside");Ni.exports=Og});var Di=y((sS,xi)=>{"use strict";var $g=Ar(),Ag=c((o,e,t)=>$g(o,e,">",t),"gtr");xi.exports=Ag});var _i=y((oS,Li)=>{"use strict";var Ng=Ar(),xg=c((o,e,t)=>Ng(o,e,"<",t),"ltr");Li.exports=xg});var Hi=y((aS,ji)=>{"use strict";var ki=ie(),Dg=c((o,e,t)=>(o=new ki(o,t),e=new ki(e,t),o.intersects(e,t)),"intersects");ji.exports=Dg});var zi=y((lS,Fi)=>{"use strict";var Lg=Pt(),_g=oe();Fi.exports=(o,e,t)=>{let r=[],s=null,n=null,i=o.sort((h,p)=>_g(h,p,t));for(let h of i)Lg(h,e,t)?(n=h,s||(s=h)):(n&&r.push([s,n]),n=null,s=null);s&&r.push([s,null]);let a=[];for(let[h,p]of r)h===p?a.push(h):!p&&h===i[0]?a.push("*"):p?h===i[0]?a.push(`<=${p}`):a.push(`${h} - ${p}`):a.push(`>=${h}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Gi=y((gS,qi)=>{"use strict";var Ui=ie(),As=yt(),{ANY:$s}=As,Rt=Pt(),Ns=oe(),kg=c((o,e,t={})=>{if(o===e)return!0;o=new Ui(o,t),e=new Ui(e,t);let r=!1;e:for(let s of o.set){for(let n of e.set){let i=Hg(s,n,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),jg=[new As(">=0.0.0-0")],Vi=[new As(">=0.0.0")],Hg=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=jg:o=Vi}if(e.length===1&&e[0].semver===$s){if(t.includePrerelease)return!0;e=Vi}let r=new Set,s,n;for(let m of o)m.operator===">"||m.operator===">="?s=Wi(s,m,t):m.operator==="<"||m.operator==="<="?n=Bi(n,m,t):r.add(m.semver);if(r.size>1)return null;let i;if(s&&n){if(i=Ns(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&&!Rt(m,String(s),t)||n&&!Rt(m,String(n),t))return null;for(let A of e)if(!Rt(m,String(A),t))return!1;return!0}let a,l,g,h,p=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1,S=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(h=h||m.operator===">"||m.operator===">=",g=g||m.operator==="<"||m.operator==="<=",s){if(S&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===S.major&&m.semver.minor===S.minor&&m.semver.patch===S.patch&&(S=!1),m.operator===">"||m.operator===">="){if(a=Wi(s,m,t),a===m&&a!==s)return!1}else if(s.operator===">="&&!Rt(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=Bi(n,m,t),l===m&&l!==n)return!1}else if(n.operator==="<="&&!Rt(n.semver,String(m),t))return!1}if(!m.operator&&(n||s)&&i!==0)return!1}return!(s&&g&&!n&&i!==0||n&&h&&!s&&i!==0||S||p)},"simpleSubset"),Wi=c((o,e,t)=>{if(!o)return e;let r=Ns(o.semver,e.semver,t);return r>0?o:r<0||e.operator===">"&&o.operator===">="?e:o},"higherGT"),Bi=c((o,e,t)=>{if(!o)return e;let r=Ns(o.semver,e.semver,t);return r<0?o:r>0||e.operator==="<"&&o.operator==="<="?e:o},"lowerLT");qi.exports=kg});var Ki=y((hS,Yi)=>{"use strict";var xs=st(),Xi=St(),Fg=z(),Ji=Cs(),zg=He(),Ug=To(),Vg=Mo(),Wg=wo(),Bg=Oo(),qg=Ao(),Gg=xo(),Xg=Lo(),Jg=ko(),Yg=oe(),Kg=zo(),Zg=Vo(),Qg=Rr(),eu=Go(),tu=Jo(),ru=Tt(),su=wr(),nu=Es(),ou=Ts(),iu=br(),au=Ir(),cu=ys(),lu=ni(),gu=yt(),uu=ie(),hu=Pt(),pu=Si(),du=Ti(),mu=Mi(),fu=wi(),Cu=Ii(),vu=Ar(),Su=Di(),Eu=_i(),Tu=Hi(),yu=zi(),Mu=Gi();Yi.exports={parse:zg,valid:Ug,clean:Vg,inc:Wg,diff:Bg,major:qg,minor:Gg,patch:Xg,prerelease:Jg,compare:Yg,rcompare:Kg,compareLoose:Zg,compareBuild:Qg,sort:eu,rsort:tu,gt:ru,lt:su,eq:nu,neq:ou,gte:iu,lte:au,cmp:cu,coerce:lu,Comparator:gu,Range:uu,satisfies:hu,toComparators:pu,maxSatisfying:du,minSatisfying:mu,minVersion:fu,validRange:Cu,outside:vu,gtr:Su,ltr:Eu,intersects:Tu,simplifyRange:yu,subset:Mu,SemVer:Fg,re:xs.re,src:xs.src,tokens:xs.t,SEMVER_SPEC_VERSION:Xi.SEMVER_SPEC_VERSION,RELEASE_TYPES:Xi.RELEASE_TYPES,compareIdentifiers:Ji.compareIdentifiers,rcompareIdentifiers:Ji.rcompareIdentifiers}});import{exec as Pu,spawn as Ru}from"child_process";import{promisify as wu}from"util";var wt,Zi,Fe,Ds=f(()=>{"use strict";T();k();wt=va(Ki(),1),Zi=wu(Pu),Fe=class{static{c(this,"NPMManager")}logger=u.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||P()}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=Ru("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 Zi("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 Zi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(n=>n&&typeof n=="string"&&wt.default.valid(n));return e!=="all"&&(s=s.filter(n=>{let i=wt.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)=>wt.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=wt.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 Qi}from"zod";var bu,Nr,ea=f(()=>{"use strict";T();k();Ds();bu=Qi.object({version:Qi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Nr=class{static{c(this,"UpdateApiHandler")}npmManager;logger=u.withTag("UpdateApiHandler");eventBus=P();activeInstalls=new Map;constructor(){this.npmManager=new Fe(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=bu.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 xr,ta=f(()=>{"use strict";ts();T();Ds();xr=class{static{c(this,"VersionApiHandler")}logger;constructor(){this.logger=u.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=Oe.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=Oe.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"),Oe.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 ra=f(()=>{"use strict";gn();un();hn();pn();In();$n();An();to();ro();so();oo();ao();ea();ta()});var Dr,sa=f(()=>{"use strict";T();k();Dr=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=u.withTag("StatusService"),this.eventBus=P()}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 Lr,na=f(()=>{"use strict";T();te();k();Lr=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=u.withTag("NotificationService"),this.eventBus=P(),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()}}});import{EventEmitter as Iu}from"events";import{z as Pe}from"zod";var Ou,$u,bt,Ls=f(()=>{"use strict";T();lr();k();Lt();Ou={reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4,errorRecoveryEnabled:!0,errorNotificationEnabled:!0,serviceAddedDelayMs:2e3,serviceRemovedDelayMs:2e3,batchAddedDelayMs:3e3},$u=Pe.object({reconnectInterval:Pe.number().min(100,"reconnectInterval \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 100 \u7684\u6570\u5B57").optional(),maxReconnectAttempts:Pe.number().min(0,"maxReconnectAttempts \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),connectionTimeout:Pe.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),errorRecoveryEnabled:Pe.boolean().optional(),errorNotificationEnabled:Pe.boolean().optional(),serviceAddedDelayMs:Pe.number().min(0,"serviceAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),serviceRemovedDelayMs:Pe.number().min(0,"serviceRemovedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),batchAddedDelayMs:Pe.number().min(0,"batchAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional()}).strict(),bt=class extends Iu{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=u,this.eventBus=P(),this.options={...Ou,...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=$u.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 h of a)await this.removeEndpoint(h);for(let h of i)await this.addEndpoint(h);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 Me(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 Me(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 Au(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 bt(d,o)}async function oa(o){if(Se&&K==="initialized")return Se;if(ae&&K==="initializing")return ae;K==="failed"&&_s(),K="initializing",ae=Au(o);try{return Se=await ae,K="initialized",Ot=`xiaozhi-connection-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,It=null,Se}catch(e){throw K="failed",It=e,ae=null,console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",e.message),e}}async function ia(){if(K!=="cleanup"){K="cleanup";try{if(ae){try{await(await ae).cleanup()}catch(o){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",o.message)}ae=null}Se&&(await Se.cleanup(),Se=null),K="not_initialized",It=null,Ot=null}catch(o){throw console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",o.message),_s(),o}}}function _s(){ae&&(ae=null),Se=null,K="not_initialized",It=null,Ot=null}function Nu(){return K==="initialized"&&Se!==null}function xu(){return{state:K,initializationTime:Ot?new Date:void 0,lastError:It||void 0,instanceId:Ot||void 0}}async function Du(o){return await ia(),oa(o)}function Lu(){return Se}async function _u(){if(K==="initialized")return!0;if(K==="initializing"&&ae)try{return await ae,!0}catch{return!1}return!1}var Se,ae,K,It,Ot,nt,aa=f(()=>{"use strict";te();Ls();Se=null,ae=null,K="not_initialized",It=null,Ot=null;c(Au,"createInstance");c(oa,"getInstance");c(ia,"cleanup");c(_s,"reset");c(Nu,"isInitialized");c(xu,"getStatus");c(Du,"forceReinitialize");c(Lu,"getCurrentInstance");c(_u,"waitForInitialization");nt={getInstance:oa,cleanup:ia,reset:_s,isInitialized:Nu,getStatus:xu,forceReinitialize:Du,getCurrentInstance:Lu,waitForInitialization:_u};process.on("exit",()=>{nt.isInitialized()&&nt.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 nt.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 nt.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});function ju(){return u}function ks(o,e,t){let r=new Date,s=o.message.toLowerCase(),n="unknown",i="UNKNOWN_ERROR",a=!1,l="manual_intervention";s.includes("connection")||s.includes("connect")||s.includes("econnrefused")||s.includes("enotfound")?(n="connection",i="CONNECTION_FAILED",a=!0,l="reconnect"):s.includes("transport")||s.includes("stdio")||s.includes("sse")||s.includes("http")?(n="transport",i="TRANSPORT_ERROR",a=!0,l="restart_service"):s.includes("tool")||s.includes("method not found")||s.includes("invalid params")?(n="tool_call",i="TOOL_CALL_ERROR",a=!0,l="retry"):s.includes("config")||s.includes("invalid")||s.includes("missing")?(n="configuration",i="CONFIG_ERROR",a=!1,l="manual_intervention"):s.includes("timeout")||s.includes("timed out")?(n="timeout",i="TIMEOUT_ERROR",a=!0,l="retry"):s.includes("auth")||s.includes("unauthorized")||s.includes("forbidden")?(n="authentication",i="AUTH_ERROR",a=!1,l="manual_intervention"):(s.includes("network")||s.includes("fetch")||s.includes("request failed"))&&(n="network",i="NETWORK_ERROR",a=!0,l="retry");let g={category:n,code:i,message:o.message,serviceName:e,timestamp:r,recoverable:a,recoveryStrategy:l,originalError:o,context:t};return Hu(e,g),g}function Hu(o,e){_r.has(o)||_r.set(o,[]);let t=_r.get(o);t.push(e),t.length>ku&&t.shift(),ju().debug(`[ErrorHandler] \u8BB0\u5F55\u9519\u8BEF\u5386\u53F2: ${o} - ${e.code}`)}function Fu(o){let e=_r.get(o)||[],r=Date.now()-3600*1e3,s=e.filter(a=>a.timestamp.getTime()>r),n=new Map,i=new Map;for(let a of e)n.set(a.category,(n.get(a.category)||0)+1),i.set(a.code,(i.get(a.code)||0)+1);return{serviceName:o,totalErrors:e.length,errorsByCategory:n,errorsByCode:i,lastError:e[e.length-1],errorRate:s.length}}function js(o){return Fu(o.serviceName).errorRate>10||!o.recoverable||o.category==="authentication"||o.category==="configuration"}var _r,ku,Hs=f(()=>{"use strict";T();_r=new Map,ku=100;c(ju,"getLogger");c(ks,"categorizeError");c(Hu,"recordError");c(Fu,"getErrorStatistics");c(js,"shouldAlert")});import{existsSync as zu,readFileSync as ca}from"fs";import{watch as Uu}from"chokidar";var zs,Fs,SE,la=f(()=>{"use strict";T();Hs();zs=class{static{c(this,"ConfigWatcherClass")}logger;watcher=null;callbacks=new Set;currentConfigs=new Map;watchedPath=null;options;debounceTimer=null;backupConfigs=[];constructor(e){this.logger=u,this.options={debounceMs:1e3,validateOnChange:!0,backupOnChange:!0,autoReload:!0,ignoreInitial:!0,...e}}startWatching(e){if(this.watcher&&(this.logger.warn("\u914D\u7F6E\u76D1\u542C\u5668\u5DF2\u5728\u8FD0\u884C\uFF0C\u5148\u505C\u6B62\u73B0\u6709\u76D1\u542C"),this.stopWatching()),!zu(e))throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`);this.watchedPath=e,this.logger.info(`\u5F00\u59CB\u76D1\u542C\u914D\u7F6E\u6587\u4EF6: ${e}`);try{this.loadInitialConfig(e)}catch(t){throw this.logger.error("\u52A0\u8F7D\u521D\u59CB\u914D\u7F6E\u5931\u8D25:",t),t}this.watcher=Uu(e,{persistent:!0,ignoreInitial:this.options.ignoreInitial,awaitWriteFinish:{stabilityThreshold:100,pollInterval:100}}),this.watcher.on("change",t=>{this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u53D8\u66F4: ${t}`),this.handleConfigChange(t)}),this.watcher.on("error",t=>{this.logger.error("\u914D\u7F6E\u6587\u4EF6\u76D1\u542C\u9519\u8BEF:",t);let r=ks(t instanceof Error?t:new Error(String(t)),"ConfigWatcher");js(r)&&this.logger.error("\u914D\u7F6E\u76D1\u542C\u5668\u53D1\u751F\u4E25\u91CD\u9519\u8BEF\uFF0C\u9700\u8981\u4EBA\u5DE5\u5E72\u9884")})}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null,this.logger.info("\u5DF2\u505C\u6B62\u914D\u7F6E\u6587\u4EF6\u76D1\u542C")),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watchedPath=null}onConfigChange(e){this.callbacks.add(e),this.logger.debug("\u5DF2\u6DFB\u52A0\u914D\u7F6E\u53D8\u66F4\u56DE\u8C03")}removeConfigChangeCallback(e){this.callbacks.delete(e),this.logger.debug("\u5DF2\u79FB\u9664\u914D\u7F6E\u53D8\u66F4\u56DE\u8C03")}async reloadConfig(){if(!this.watchedPath)throw new Error("\u672A\u8BBE\u7F6E\u76D1\u542C\u8DEF\u5F84\uFF0C\u65E0\u6CD5\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E");this.logger.info("\u624B\u52A8\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E"),await this.handleConfigChange(this.watchedPath)}validateConfig(e){let t={valid:!0,errors:[],warnings:[]},r=new Set;for(let s of e){if(!s.name){t.valid=!1,t.errors.push("\u670D\u52A1\u914D\u7F6E\u7F3A\u5C11 name \u5B57\u6BB5");continue}if(!s.type){t.valid=!1,t.errors.push(`\u670D\u52A1 ${s.name} \u7F3A\u5C11 type \u5B57\u6BB5`);continue}switch(r.has(s.name)?(t.valid=!1,t.errors.push(`\u91CD\u590D\u7684\u670D\u52A1\u540D: ${s.name}`)):r.add(s.name),s.type){case"stdio":s.command||(t.valid=!1,t.errors.push(`stdio \u670D\u52A1 ${s.name} \u7F3A\u5C11 command \u5B57\u6BB5`));break;case"sse":case"streamable-http":s.url||(t.valid=!1,t.errors.push(`${s.type} \u670D\u52A1 ${s.name} \u7F3A\u5C11 url \u5B57\u6BB5`));break}s.timeout&&s.timeout<=0&&t.warnings.push(`\u670D\u52A1 ${s.name} \u7684 timeout \u503C\u5E94\u8BE5\u5927\u4E8E 0`),s.retryAttempts&&s.retryAttempts<0&&t.warnings.push(`\u670D\u52A1 ${s.name} \u7684 retryAttempts \u503C\u4E0D\u5E94\u8BE5\u5C0F\u4E8E 0`)}return t}getCurrentConfigs(){return Array.from(this.currentConfigs.values())}getBackupConfigs(){return[...this.backupConfigs]}restoreFromBackup(){if(this.backupConfigs.length===0)throw new Error("\u6CA1\u6709\u53EF\u7528\u7684\u5907\u4EFD\u914D\u7F6E");return this.logger.info("\u6062\u590D\u5230\u5907\u4EFD\u914D\u7F6E"),[...this.backupConfigs]}updateOptions(e){this.options={...this.options,...e},this.logger.info("\u914D\u7F6E\u76D1\u542C\u5668\u9009\u9879\u5DF2\u66F4\u65B0")}getOptions(){return{...this.options}}loadInitialConfig(e){try{let t=ca(e,"utf-8"),r=JSON.parse(t),s=[];if(r.mcpServices&&Array.isArray(r.mcpServices))s=r.mcpServices;else if(Array.isArray(r))s=r;else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u5E94\u5305\u542B mcpServices \u6570\u7EC4");if(this.options.validateOnChange){let n=this.validateConfig(s);if(!n.valid)throw new Error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25: ${n.errors.join(", ")}`);n.warnings.length>0&&this.logger.warn(`\u914D\u7F6E\u8B66\u544A: ${n.warnings.join(", ")}`)}this.currentConfigs.clear();for(let n of s)this.currentConfigs.set(n.name,n);this.options.backupOnChange&&(this.backupConfigs=[...s]),this.logger.info(`\u5DF2\u52A0\u8F7D ${s.length} \u4E2A\u670D\u52A1\u914D\u7F6E`)}catch(t){throw this.logger.error("\u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:",t),t}}async handleConfigChange(e){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{try{await this.processConfigChange(e)}catch(t){this.logger.error("\u5904\u7406\u914D\u7F6E\u53D8\u66F4\u5931\u8D25:",t)}},this.options.debounceMs)}async processConfigChange(e){this.logger.info("\u5904\u7406\u914D\u7F6E\u6587\u4EF6\u53D8\u66F4");try{let t=ca(e,"utf-8"),r=JSON.parse(t),s=[];if(r.mcpServices&&Array.isArray(r.mcpServices))s=r.mcpServices;else if(Array.isArray(r))s=r;else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E");if(this.options.validateOnChange){let i=this.validateConfig(s);if(!i.valid){this.logger.error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25: ${i.errors.join(", ")}`);return}i.warnings.length>0&&this.logger.warn(`\u914D\u7F6E\u8B66\u544A: ${i.warnings.join(", ")}`)}let n=this.compareConfigs(Array.from(this.currentConfigs.values()),s);this.options.backupOnChange&&(this.backupConfigs=Array.from(this.currentConfigs.values())),this.currentConfigs.clear();for(let i of s)this.currentConfigs.set(i.name,i);for(let i of n)await this.notifyConfigChange(i);if(n.length>0){let i={type:"reloaded",allConfigs:s,timestamp:new Date,filePath:e};await this.notifyConfigChange(i)}this.logger.info(`\u914D\u7F6E\u53D8\u66F4\u5904\u7406\u5B8C\u6210\uFF0C\u5171 ${n.length} \u4E2A\u53D8\u66F4`)}catch(t){this.logger.error("\u5904\u7406\u914D\u7F6E\u53D8\u66F4\u5931\u8D25:",t);let r=ks(t,"ConfigWatcher");js(r)&&this.logger.error("\u914D\u7F6E\u53D8\u66F4\u5904\u7406\u53D1\u751F\u4E25\u91CD\u9519\u8BEF\uFF0C\u53EF\u80FD\u9700\u8981\u56DE\u6EDA\u914D\u7F6E")}}compareConfigs(e,t){let r=[],s=new Map(e.map(i=>[i.name,i])),n=new Map(t.map(i=>[i.name,i]));for(let[i,a]of n){let l=s.get(i);l?JSON.stringify(l)!==JSON.stringify(a)&&r.push({type:"modified",serviceName:i,oldConfig:l,newConfig:a,timestamp:new Date,filePath:this.watchedPath}):r.push({type:"added",serviceName:i,newConfig:a,timestamp:new Date,filePath:this.watchedPath})}for(let[i,a]of s)n.has(i)||r.push({type:"removed",serviceName:i,oldConfig:a,timestamp:new Date,filePath:this.watchedPath});return r}async notifyConfigChange(e){this.logger.debug(`\u901A\u77E5\u914D\u7F6E\u53D8\u66F4: ${e.type} - ${e.serviceName||"\u5168\u90E8"}`);let t=Array.from(this.callbacks).map(async r=>{try{await r(e)}catch(s){this.logger.error("\u914D\u7F6E\u53D8\u66F4\u56DE\u8C03\u6267\u884C\u5931\u8D25:",s)}});await Promise.all(t)}},Fs=null,SE=(Fs||(Fs=new zs),Fs)});var Vs,Us,ga,Ws=f(()=>{"use strict";T();Vs=class{static{c(this,"PerformanceMonitorClass")}metrics=new Map;timers=new Map;logger;MAX_LATENCY_HISTORY=100;constructor(){this.logger=u}initializeService(e){if(!this.metrics.has(e)){let t=new Date;this.metrics.set(e,{serviceName:e,connectionLatency:0,averageToolCallLatency:0,toolCallLatencies:new Map,successRate:1,errorRate:0,totalOperations:0,successfulOperations:0,failedOperations:0,lastUpdated:t,uptime:0,startTime:t}),this.logger.debug(`[PerformanceMonitor] \u521D\u59CB\u5316\u670D\u52A1 ${e} \u7684\u6027\u80FD\u6307\u6807`)}}startTiming(e,t,r="tool_call"){let s=`${e}-${t}-${Date.now()}-${Math.random()}`,n={id:s,operation:t,serviceName:e,startTime:performance.now(),type:r};return this.timers.set(s,n),this.logger.debug(`[PerformanceMonitor] \u5F00\u59CB\u8BA1\u65F6: ${e} - ${t} (${s})`),s}endTiming(e,t=!0){let r=this.timers.get(e);if(!r)return this.logger.warn(`[PerformanceMonitor] \u672A\u627E\u5230\u8BA1\u65F6\u5668: ${e}`),0;let n=performance.now()-r.startTime;return this.initializeService(r.serviceName),this.recordPerformance(r,n,t),this.timers.delete(e),this.logger.debug(`[PerformanceMonitor] \u7ED3\u675F\u8BA1\u65F6: ${r.serviceName} - ${r.operation} = ${n.toFixed(2)}ms (${t?"\u6210\u529F":"\u5931\u8D25"})`),n}recordSuccess(e,t,r){this.initializeService(e);let s=this.metrics.get(e);s.successfulOperations++,s.totalOperations++,this.updateRates(s),r!==void 0&&t&&this.recordToolCallLatency(e,t,r),s.lastUpdated=new Date,this.logger.debug(`[PerformanceMonitor] \u8BB0\u5F55\u6210\u529F\u64CD\u4F5C: ${e} - ${t}`)}recordError(e,t){this.initializeService(e);let r=this.metrics.get(e);r.failedOperations++,r.totalOperations++,this.updateRates(r),r.lastUpdated=new Date,this.logger.debug(`[PerformanceMonitor] \u8BB0\u5F55\u5931\u8D25\u64CD\u4F5C: ${e} - ${t}`)}recordConnectionLatency(e,t){this.initializeService(e);let r=this.metrics.get(e);r.connectionLatency=t,r.lastUpdated=new Date,this.logger.debug(`[PerformanceMonitor] \u8BB0\u5F55\u8FDE\u63A5\u5EF6\u8FDF: ${e} = ${t.toFixed(2)}ms`)}getMetrics(e){let t=this.metrics.get(e);return t&&(t.uptime=Date.now()-t.startTime.getTime(),this.updateAverageToolCallLatency(t)),t}getAllMetrics(){let e=new Map;for(let[t,r]of this.metrics)r.uptime=Date.now()-r.startTime.getTime(),this.updateAverageToolCallLatency(r),e.set(t,{...r});return e}getPerformanceReport(){let e=Array.from(this.getAllMetrics().values()),t=e.reduce((n,i)=>n+i.totalOperations,0),r=e.length>0?e.reduce((n,i)=>n+i.successRate,0)/e.length:0,s=e.length>0?e.reduce((n,i)=>n+i.errorRate,0)/e.length:0;return{summary:{totalServices:e.length,averageSuccessRate:r,averageErrorRate:s,totalOperations:t},services:e}}clearMetrics(e){if(e){this.metrics.delete(e);for(let[t,r]of this.timers)r.serviceName===e&&this.timers.delete(t);this.logger.info(`[PerformanceMonitor] \u5DF2\u6E05\u7406\u670D\u52A1 ${e} \u7684\u6027\u80FD\u6570\u636E`)}else this.metrics.clear(),this.timers.clear(),this.logger.info("[PerformanceMonitor] \u5DF2\u6E05\u7406\u6240\u6709\u6027\u80FD\u6570\u636E")}recordPerformance(e,t,r){let s=this.metrics.get(e.serviceName);switch(e.type){case"connection":s.connectionLatency=t;break;case"tool_call":this.recordToolCallLatency(e.serviceName,e.operation,t);break}s.totalOperations++,r?s.successfulOperations++:s.failedOperations++,this.updateRates(s),s.lastUpdated=new Date}recordToolCallLatency(e,t,r){let s=this.metrics.get(e);s.toolCallLatencies.has(t)||s.toolCallLatencies.set(t,[]);let n=s.toolCallLatencies.get(t);n.push(r),n.length>this.MAX_LATENCY_HISTORY&&n.shift(),this.updateAverageToolCallLatency(s)}updateRates(e){e.totalOperations>0?(e.successRate=e.successfulOperations/e.totalOperations,e.errorRate=e.failedOperations/e.totalOperations):(e.successRate=1,e.errorRate=0)}updateAverageToolCallLatency(e){let t=0,r=0;for(let s of e.toolCallLatencies.values())t+=s.reduce((n,i)=>n+i,0),r+=s.length;e.averageToolCallLatency=r>0?t/r:0}},Us=null,ga=(Us||(Us=new Vs),Us)});var qs,Bs,bE,ua=f(()=>{"use strict";T();Ws();qs=class{static{c(this,"HealthCheckerClass")}logger;config;intervalId=null;healthHistory=new Map;MAX_HISTORY=50;constructor(e){this.logger=u,this.config={interval:3e4,timeout:5e3,maxErrorRate:.1,maxResponseTime:2e3,retryAttempts:3,autoRecover:!0,...e}}async checkService(e){let t=e.getConfig().name,r=performance.now();this.logger.debug(`[HealthChecker] \u5F00\u59CB\u5065\u5EB7\u68C0\u67E5: ${t}`);let s={serviceName:t,healthy:!0,lastCheck:new Date,issues:[],uptime:0,responseTime:0,connectionStable:!1,errorRate:0,lastError:void 0};try{let n=e.isConnected();n?s.connectionStable=!0:(s.healthy=!1,s.issues.push("\u670D\u52A1\u672A\u8FDE\u63A5"));let i=ga.getMetrics(t);i&&(s.uptime=i.uptime,s.errorRate=i.errorRate,s.responseTime=i.averageToolCallLatency,i.errorRate>this.config.maxErrorRate&&(s.healthy=!1,s.issues.push(`\u9519\u8BEF\u7387\u8FC7\u9AD8: ${(i.errorRate*100).toFixed(1)}%`)),i.averageToolCallLatency>this.config.maxResponseTime&&(s.healthy=!1,s.issues.push(`\u54CD\u5E94\u65F6\u95F4\u8FC7\u957F: ${i.averageToolCallLatency.toFixed(0)}ms`)));try{let a=e.getTools(),l=performance.now();s.responseTime=l-r,a.length===0&&n&&(s.healthy=!1,s.issues.push("\u672A\u53D1\u73B0\u53EF\u7528\u5DE5\u5177"))}catch(a){let l=performance.now();s.responseTime=l-r,s.healthy=!1,s.issues.push(`\u5DE5\u5177\u68C0\u67E5\u5931\u8D25: ${a.message}`),s.lastError=a.message}return this.recordHealthHistory(t,s),this.logger.debug(`[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u5B8C\u6210: ${t} - ${s.healthy?"\u5065\u5EB7":"\u4E0D\u5065\u5EB7"} (${s.responseTime.toFixed(0)}ms)`),s}catch(n){let i=performance.now();return s.responseTime=i-r,s.healthy=!1,s.issues.push(`\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38: ${n.message}`),s.lastError=n.message,this.recordHealthHistory(t,s),this.logger.error(`[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u5F02\u5E38: ${t}`,n),s}}async checkAllServices(e){let t=new Map,r=e.getAllServices();this.logger.debug(`[HealthChecker] \u5F00\u59CB\u68C0\u67E5 ${r.size} \u4E2A\u670D\u52A1\u7684\u5065\u5EB7\u72B6\u6001`);let s=Array.from(r.entries()).map(async([n,i])=>{try{let a=await this.checkService(i);t.set(n,a),!a.healthy&&this.config.autoRecover&&await this.attemptRecovery(i,a)}catch(a){this.logger.error(`[HealthChecker] \u68C0\u67E5\u670D\u52A1 ${n} \u65F6\u53D1\u751F\u9519\u8BEF:`,a),t.set(n,{serviceName:n,healthy:!1,lastCheck:new Date,issues:[`\u68C0\u67E5\u5931\u8D25: ${a.message}`],uptime:0,responseTime:0,connectionStable:!1,errorRate:1,lastError:a.message})}});return await Promise.all(s),this.logger.info(`[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u5B8C\u6210: ${t.size} \u4E2A\u670D\u52A1\uFF0C${Array.from(t.values()).filter(n=>n.healthy).length} \u4E2A\u5065\u5EB7`),t}startPeriodicCheck(e){if(this.intervalId){this.logger.warn("[HealthChecker] \u5B9A\u671F\u5065\u5EB7\u68C0\u67E5\u5DF2\u5728\u8FD0\u884C");return}this.logger.info(`[HealthChecker] \u5F00\u59CB\u5B9A\u671F\u5065\u5EB7\u68C0\u67E5\uFF0C\u95F4\u9694: ${this.config.interval}ms`),this.intervalId=setInterval(async()=>{try{await this.checkAllServices(e)}catch(t){this.logger.error("[HealthChecker] \u5B9A\u671F\u5065\u5EB7\u68C0\u67E5\u5931\u8D25:",t)}},this.config.interval)}stopPeriodicCheck(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.logger.info("[HealthChecker] \u5DF2\u505C\u6B62\u5B9A\u671F\u5065\u5EB7\u68C0\u67E5"))}getHealthReport(e){let t=Array.from(e.values()),r=t.filter(l=>l.healthy),s=t.filter(l=>!l.healthy),n=t.reduce((l,g)=>l+g.responseTime,0),i=t.reduce((l,g)=>l+g.errorRate,0),a=t.reduce((l,g)=>l+g.issues.length,0);return{timestamp:new Date,overallHealth:s.length===0,totalServices:t.length,healthyServices:r.length,unhealthyServices:s.length,services:t,summary:{averageResponseTime:t.length>0?n/t.length:0,averageErrorRate:t.length>0?i/t.length:0,totalIssues:a}}}getHealthHistory(e){return this.healthHistory.get(e)||[]}clearHealthHistory(e){e?(this.healthHistory.delete(e),this.logger.info(`[HealthChecker] \u5DF2\u6E05\u7406\u670D\u52A1 ${e} \u7684\u5065\u5EB7\u5386\u53F2`)):(this.healthHistory.clear(),this.logger.info("[HealthChecker] \u5DF2\u6E05\u7406\u6240\u6709\u5065\u5EB7\u5386\u53F2"))}updateConfig(e){this.config={...this.config,...e},this.logger.info("[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u914D\u7F6E\u5DF2\u66F4\u65B0")}getConfig(){return{...this.config}}recordHealthHistory(e,t){this.healthHistory.has(e)||this.healthHistory.set(e,[]);let r=this.healthHistory.get(e);r.push({...t}),r.length>this.MAX_HISTORY&&r.shift()}async attemptRecovery(e,t){let r=t.serviceName;this.logger.info(`[HealthChecker] \u5C1D\u8BD5\u6062\u590D\u4E0D\u5065\u5EB7\u7684\u670D\u52A1: ${r}`);try{e.isConnected()||(this.logger.info(`[HealthChecker] \u5C1D\u8BD5\u91CD\u65B0\u8FDE\u63A5\u670D\u52A1: ${r}`),await e.reconnect(),await new Promise(n=>setTimeout(n,1e3)),(await this.checkService(e)).healthy?this.logger.info(`[HealthChecker] \u670D\u52A1 ${r} \u6062\u590D\u6210\u529F`):this.logger.warn(`[HealthChecker] \u670D\u52A1 ${r} \u6062\u590D\u5931\u8D25`))}catch(s){this.logger.error(`[HealthChecker] \u6062\u590D\u670D\u52A1 ${r} \u65F6\u53D1\u751F\u9519\u8BEF:`,s)}}},Bs=null,bE=(Bs||(Bs=new qs),Bs)});var ha=f(()=>{"use strict";at();sa();na();Yt();Kt();k();Ls();aa();la();Hs();ua();Ws();Be();jr();qr();Vr()});var gs={};Re(gs,{WebServer:()=>Gs});import{createServer as Vu}from"http";import{serve as Wu}from"@hono/node-server";import{Hono as Bu}from"hono";import{cors as qu}from"hono/cors";import{WebSocketServer as Gu}from"ws";var Gs,us=f(()=>{"use strict";nn();ra();T();lr();te();ha();Gs=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;toolCallLogApiHandler;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=u.withTag("WebServer"),this.eventBus=P(),this.configService=new he,this.statusService=new Dr,this.notificationService=new Lr,this.configApiHandler=new Ht,this.statusApiHandler=new dr(this.statusService),this.serviceApiHandler=new ur(this.statusService),this.toolApiHandler=new fr,this.toolCallLogApiHandler=new Sr,this.versionApiHandler=new xr,this.staticFileHandler=new pr,this.mcpRouteHandler=new Zt,this.realtimeNotificationHandler=new tr(this.notificationService,this.statusService),this.heartbeatHandler=new Vt(this.statusService,this.notificationService),this.app=new Bu,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 Z.getInstance(),this.mcpServerApiHandler=new er(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=tn(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 nt.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 Me(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 Ee(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 Ee(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 Ee(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 Ee(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 Ee(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 Ee(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 h=Math.min(s*i**(l-1),n);this.logger.info(`${t} - ${h}ms \u540E\u91CD\u8BD5...`),await this.sleep(h)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",qu({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 Nr;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/tool-calls/logs",t=>this.toolCallLogApiHandler.getToolCallLogs(t)),this.app?.get("/api/coze/workspaces",t=>xe.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>xe.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>xe.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>xe.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=Wu({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:Vu});this.httpServer=e,this.wss=new Gu({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(),Ks(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});import{spawn as Ju}from"child_process";async function Xu(){let o=await Promise.resolve().then(()=>(us(),gs)),e=await Promise.resolve().then(()=>(te(),ln)),t=await Promise.resolve().then(()=>(T(),Ys));return{WebServer:o.WebServer,configManager:e.configManager,logger:t.logger}}c(Xu,"importModules");async function Yu(){let e=process.argv.slice(2).includes("--open-browser");try{let{WebServer:t,configManager:r,logger:s}=await Xu();process.env.XIAOZHI_CONFIG_DIR&&(s.initLogFile(process.env.XIAOZHI_CONFIG_DIR),s.enableFileLogging(!0));let n=new t;if(await n.start(),s.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F"),e){let l=`http://localhost:${r.getWebUIPort()}`;await Ku(l)}let i=c(async()=>{s.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await n.stop(),process.exit(0)},"cleanup");process.on("SIGINT",i),process.on("SIGTERM",i)}catch(t){console.error("WebServer \u542F\u52A8\u5931\u8D25:",t),process.exit(1)}}c(Yu,"main");async function Ku(o){try{let e=process.platform,t,r;e==="darwin"?(t="open",r=[o]):e==="win32"?(t="start",r=["",o]):(t="xdg-open",r=[o]),Ju(t,r,{detached:!0,stdio:"ignore"}),console.log(`\u5DF2\u5C1D\u8BD5\u6253\u5F00\u6D4F\u89C8\u5668: ${o}`)}catch(e){console.warn("\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\u5931\u8D25:",e)}}c(Ku,"openBrowserUrl");import.meta.url===`file://${process.argv[1]}`&&Yu();
96
+ `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&gr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var pr,Wo=f(()=>{"use strict";y();pr=class{static{c(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=u.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 tt,Bo=f(()=>{"use strict";tt=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(tt||{})});import mc from"ajv";import hr from"dayjs";var mr,qo=f(()=>{"use strict";y();te();Bo();Wt();Jt();mr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=u.withTag("ToolApiHandler"),this.ajv=new mc({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:o}=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(o)),!Z.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 Z.getInstance();await this.validateServiceAndTool(i,r,s),r==="customMCP"&&await this.validateCustomMCPArguments(i,s,o||{});let a;if(r==="customMCP")a=await i.callTool(s,o||{});else{let l=`${r}__${s}`;a=await i.callTool(l,o||{})}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 o=this.createErrorResponse(s,r);return e.json(o,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!m.configExists()){let o=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(o,404)}let t=[],r="";try{t=m.getCustomMCPTools(),r=m.getConfigPath()}catch(o){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",o);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!m.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let o=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(o,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=m.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=m.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let 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=m.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),s=await new Pe().getAllCachedTools(),o=m.getConfig(),i=new Set(Object.keys(o.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 p={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:g,toolName:l.name.split("__").slice(1).join("__")}}};a.push(p)}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(o=>o.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 o=e.getCustomMCPTools().find(i=>i.name===r);o&&!o.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),o&&!o.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 o=e.getCustomMCPTools().find(l=>l.name===t);if(!o)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!o.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(o.inputSchema);if(!i(r)){let p=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(h=>{let E=h.instancePath||h.schemaPath||"",d=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 O=h.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${O}`}if(h.keyword==="enum"){let O=h.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${O.join(", ")}`}return`\u53C2\u6570 ${E} ${d}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,p),new Error(p)}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(tt).includes(r)){let o=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(tt).join(", ")}`);return e.json(o,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,s);case"coze":return await this.handleAddCozeTool(e,s);case"http":case"function":{let o=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(o,501)}default:{let o=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(o,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:o,parameterConfig:i}=t,a=this.performPreChecks(r,s,o);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,s,o,i);return m.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:s,customName:o,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${s}`),!r||!s){let k=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(k,400)}if(!Z.isInitialized()){let k=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(k,503)}let a=await Z.getInstance();try{await this.validateServiceAndTool(a,r,s)}catch(k){let It=k instanceof Error?k.message:String(k),ue=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",It);return e.json(ue,404)}let g=await new Pe().getAllCachedTools(),p=`${r}__${s}`,h=g.find(k=>k.name===p);if(!h){let k=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`);return e.json(k,404)}let E=o||p,d=m.getCustomMCPTools();if(new Set(d.map(k=>k.name)).has(E)){let k=this.createErrorResponse("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${E}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`);return e.json(k,409)}let ge={name:E,description:i||h.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:h.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:hr().format("YYYY-MM-DD HH:mm:ss")}};m.addCustomMCPTool(ge),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`);let ce=m.getServerToolsConfig(r);ce?.toolName&&(ce[s].enable=!0,m.updateServerToolsConfig(r,ce),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: ${E}`);let bt={tool:ge,toolName:E,toolType:"mcp",addedAt:hr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(bt,`MCP \u5DE5\u5177 "${E}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:s,customDescription:o,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,s,o);if(a)return e.json(a.errorResponse,a.statusCode);let l=this.convertWorkflowToTool(r,s,o,i);m.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:hr().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 o=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(o,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 o=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(o,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:o}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${s}`),!Object.values(tt).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(tt).join(", ")}`);return e.json(i,400)}switch(s){case"coze":return await this.handleUpdateCozeTool(e,t,o);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:o,customDescription:i,parameterConfig:a}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=m.getCustomMCPTools().find(d=>d.name===t);if(!g){let d=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(d,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let d=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(d,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 p=this.generateInputSchema(s,a),h={...g,description:i||g.description,inputSchema:p};m.updateCustomMCPTool(t,h),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:h,toolName:t,toolType:"coze",updatedAt:hr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(E,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`))}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`)}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("UPDATE_CUSTOM_TOOL_ERROR",`\u66F4\u65B0\u5DE5\u5177\u914D\u7F6E\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t){let o=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(o,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let s=m.getCustomMCPTools().find(o=>o.name===t);if(s&&s.handler.type==="mcp"){let o=s.handler.config;if(o.serviceName&&o.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${o.serviceName}/${o.toolName}`);let i=m.getServerToolsConfig(o.serviceName);i?.[o.toolName]&&(i[o.toolName].enable=!1,m.updateServerToolsConfig(o.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${o.serviceName}/${o.toolName}`))}}return m.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:s}=this.handleRemoveToolError(t);return e.json(s,r)}}convertWorkflowToTool(e,t,r,s){this.validateWorkflowData(e);let o=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(o),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,s),g=this.createHttpHandler(e),p={name:i,description:a,inputSchema:l,handler:g};return this.validateGeneratedTool(p),p}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,o]of Object.entries(t))r=r.replace(new RegExp(s,"g"),o);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 o=e[r];if(!o||typeof o!="string"||o.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:o}of t){let i=e[r];if(i&&i.length>o)throw new Error(`${s}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${o}\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=m.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),s=e,o=1;for(;r.has(s);)if(s=`${e}_${o}`,o++,o>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=m.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!m.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),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 o=this.checkSystemStatus();if(o)return o;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=m.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=m.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,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}}});import*as fr from"fs";var dr,Go=f(()=>{"use strict";_e();$e();y();Gr();dr=class{static{c(this,"ToolCallLogService")}logger;configDir;constructor(e){this.logger=u.withTag("ToolCallLogService"),this.configDir=e||$.getConfigDir()}getLogFilePath(){return new Ze({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!fr.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=fr.readFileSync(e,"utf8").trim().split(`
97
+ `).filter(o=>o.trim()!==""),s=[];for(let o of r)try{let i=JSON.parse(o);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp||this.logger.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233, \u5DF2\u4FDD\u6301\u4E3A undefined:",o),s.push(i)}catch{this.logger.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C:",o)}return s.sort((o,i)=>(i.timestamp||0)-(o.timestamp||0)),s}catch(t){throw this.logger.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25:",t),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(s=>s.toolName.toLowerCase().includes(t.toolName.toLowerCase()))),t.serverName&&(r=r.filter(s=>s.serverName?.toLowerCase().includes(t.serverName.toLowerCase()))),t.success!==void 0&&(r=r.filter(s=>s.success===t.success)),t.startDate||t.endDate){let s=t.startDate?new Date(t.startDate).getTime():0,o=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let a=i.timestamp||0;return a>=s&&a<=o})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),s=r.length,o=Math.min(e.limit||Ke.DEFAULT_LIMIT,Ke.MAX_LIMIT),i=e.offset||0,a=r.slice(i,i+o),l=i+o<s;return this.logger.debug(`\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7: ${a.length}/${s} \u6761\u8BB0\u5F55`),{records:a,total:s,hasMore:l}}}});import{z as Oe}from"zod";var dc,Cr,Xo=f(()=>{"use strict";_e();y();Go();dc=Oe.object({limit:Oe.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=Ke.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Ke.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Oe.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:Oe.string().optional(),serverName:Oe.string().optional(),success:Oe.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Oe.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:Oe.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(n=>!n.startDate||!n.endDate?!0:new Date(n.startDate)<=new Date(n.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),Cr=class{static{c(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new dr}createSuccessResponse(e){let t={success:!0,data:e};return Response.json(t)}createErrorResponse(e,t,r){let s={success:!1,error:{code:e,message:t,details:r}};return Response.json(s,{status:this.getHttpStatusCode(e)})}getHttpStatusCode(e){switch(e){case"INVALID_QUERY_PARAMETERS":return 400;case"LOG_FILE_NOT_FOUND":return 404;case"LOG_FILE_READ_ERROR":return 500;default:return 500}}parseAndValidateQueryParams(e){let t=e.req.query(),r=dc.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.map(s=>({field:s.path.join("."),message:s.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return this.createErrorResponse("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error);let r=await this.toolCallLogService.getToolCallLogs(t.data);return u.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){u.error("\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF";return r.includes("\u4E0D\u5B58\u5728")?this.createErrorResponse("LOG_FILE_NOT_FOUND",r):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?this.createErrorResponse("LOG_FILE_READ_ERROR",r):this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r})}}}});var ft=T((Kf,Jo)=>{"use strict";var fc="2.0.0",Cc=Number.MAX_SAFE_INTEGER||9007199254740991,vc=16,Ec=250,Sc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Jo.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:vc,MAX_SAFE_BUILD_LENGTH:Ec,MAX_SAFE_INTEGER:Cc,RELEASE_TYPES:Sc,SEMVER_SPEC_VERSION:fc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Ct=T((Zf,Yo)=>{"use strict";var Tc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>console.error("SEMVER",...n):()=>{};Yo.exports=Tc});var rt=T((ve,Ko)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:cs,MAX_SAFE_BUILD_LENGTH:yc,MAX_LENGTH:Mc}=ft(),Pc=Ct();ve=Ko.exports={};var Rc=ve.re=[],wc=ve.safeRe=[],C=ve.src=[],bc=ve.safeSrc=[],v=ve.t={},Ic=0,ls="[a-zA-Z0-9-]",$c=[["\\s",1],["\\d",Mc],[ls,yc]],Ac=c(n=>{for(let[e,t]of $c)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),M=c((n,e,t)=>{let r=Ac(e),s=Ic++;Pc(n,s,e),v[n]=s,C[s]=e,bc[s]=r,Rc[s]=new RegExp(e,t?"g":void 0),wc[s]=new RegExp(r,t?"g":void 0)},"createToken");M("NUMERICIDENTIFIER","0|[1-9]\\d*");M("NUMERICIDENTIFIERLOOSE","\\d+");M("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${ls}*`);M("MAINVERSION",`(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})`);M("MAINVERSIONLOOSE",`(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASEIDENTIFIER",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIER]})`);M("PRERELEASEIDENTIFIERLOOSE",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIERLOOSE]})`);M("PRERELEASE",`(?:-(${C[v.PRERELEASEIDENTIFIER]}(?:\\.${C[v.PRERELEASEIDENTIFIER]})*))`);M("PRERELEASELOOSE",`(?:-?(${C[v.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${C[v.PRERELEASEIDENTIFIERLOOSE]})*))`);M("BUILDIDENTIFIER",`${ls}+`);M("BUILD",`(?:\\+(${C[v.BUILDIDENTIFIER]}(?:\\.${C[v.BUILDIDENTIFIER]})*))`);M("FULLPLAIN",`v?${C[v.MAINVERSION]}${C[v.PRERELEASE]}?${C[v.BUILD]}?`);M("FULL",`^${C[v.FULLPLAIN]}$`);M("LOOSEPLAIN",`[v=\\s]*${C[v.MAINVERSIONLOOSE]}${C[v.PRERELEASELOOSE]}?${C[v.BUILD]}?`);M("LOOSE",`^${C[v.LOOSEPLAIN]}$`);M("GTLT","((?:<|>)?=?)");M("XRANGEIDENTIFIERLOOSE",`${C[v.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);M("XRANGEIDENTIFIER",`${C[v.NUMERICIDENTIFIER]}|x|X|\\*`);M("XRANGEPLAIN",`[v=\\s]*(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:${C[v.PRERELEASE]})?${C[v.BUILD]}?)?)?`);M("XRANGEPLAINLOOSE",`[v=\\s]*(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:${C[v.PRERELEASELOOSE]})?${C[v.BUILD]}?)?)?`);M("XRANGE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAIN]}$`);M("XRANGELOOSE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAINLOOSE]}$`);M("COERCEPLAIN",`(^|[^\\d])(\\d{1,${cs}})(?:\\.(\\d{1,${cs}}))?(?:\\.(\\d{1,${cs}}))?`);M("COERCE",`${C[v.COERCEPLAIN]}(?:$|[^\\d])`);M("COERCEFULL",C[v.COERCEPLAIN]+`(?:${C[v.PRERELEASE]})?(?:${C[v.BUILD]})?(?:$|[^\\d])`);M("COERCERTL",C[v.COERCE],!0);M("COERCERTLFULL",C[v.COERCEFULL],!0);M("LONETILDE","(?:~>?)");M("TILDETRIM",`(\\s*)${C[v.LONETILDE]}\\s+`,!0);ve.tildeTrimReplace="$1~";M("TILDE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAIN]}$`);M("TILDELOOSE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAINLOOSE]}$`);M("LONECARET","(?:\\^)");M("CARETTRIM",`(\\s*)${C[v.LONECARET]}\\s+`,!0);ve.caretTrimReplace="$1^";M("CARET",`^${C[v.LONECARET]}${C[v.XRANGEPLAIN]}$`);M("CARETLOOSE",`^${C[v.LONECARET]}${C[v.XRANGEPLAINLOOSE]}$`);M("COMPARATORLOOSE",`^${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]})$|^$`);M("COMPARATOR",`^${C[v.GTLT]}\\s*(${C[v.FULLPLAIN]})$|^$`);M("COMPARATORTRIM",`(\\s*)${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]}|${C[v.XRANGEPLAIN]})`,!0);ve.comparatorTrimReplace="$1$2$3";M("HYPHENRANGE",`^\\s*(${C[v.XRANGEPLAIN]})\\s+-\\s+(${C[v.XRANGEPLAIN]})\\s*$`);M("HYPHENRANGELOOSE",`^\\s*(${C[v.XRANGEPLAINLOOSE]})\\s+-\\s+(${C[v.XRANGEPLAINLOOSE]})\\s*$`);M("STAR","(<|>)?=?\\s*\\*");M("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");M("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var vr=T((eC,Zo)=>{"use strict";var Oc=Object.freeze({loose:!0}),Nc=Object.freeze({}),xc=c(n=>n?typeof n!="object"?Oc:n:Nc,"parseOptions");Zo.exports=xc});var gs=T((rC,tn)=>{"use strict";var Qo=/^[0-9]+$/,en=c((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=Qo.test(n),r=Qo.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),Lc=c((n,e)=>en(e,n),"rcompareIdentifiers");tn.exports={compareIdentifiers:en,rcompareIdentifiers:Lc}});var U=T((oC,sn)=>{"use strict";var Er=Ct(),{MAX_LENGTH:rn,MAX_SAFE_INTEGER:Sr}=ft(),{safeRe:Tr,t:yr}=rt(),Dc=vr(),{compareIdentifiers:us}=gs(),ps=class n{static{c(this,"SemVer")}constructor(e,t){if(t=Dc(t),e instanceof n){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>rn)throw new TypeError(`version is longer than ${rn} characters`);Er("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Tr[yr.LOOSE]:Tr[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 o=+s;if(o>=0&&o<Sr)return o}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(Er("SemVer.compare",this.version,this.options,e),!(e instanceof n)){if(typeof e=="string"&&e===this.version)return 0;e=new n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof n||(e=new n(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof n||(e=new n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],s=e.prerelease[t];if(Er("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 us(r,s)}while(++t)}compareBuild(e){e instanceof n||(e=new n(e,this.options));let t=0;do{let r=this.build[t],s=e.build[t];if(Er("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 us(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?Tr[yr.PRERELEASELOOSE]:Tr[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 o=this.prerelease.length;for(;--o>=0;)typeof this.prerelease[o]=="number"&&(this.prerelease[o]++,o=-2);if(o===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(s)}}if(t){let o=[t,s];r===!1&&(o=[t]),us(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=o):this.prerelease=o}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};sn.exports=ps});var Fe=T((iC,nn)=>{"use strict";var on=U(),_c=c((n,e,t=!1)=>{if(n instanceof on)return n;try{return new on(n,e)}catch(r){if(!t)return null;throw r}},"parse");nn.exports=_c});var cn=T((cC,an)=>{"use strict";var kc=Fe(),jc=c((n,e)=>{let t=kc(n,e);return t?t.version:null},"valid");an.exports=jc});var gn=T((gC,ln)=>{"use strict";var Hc=Fe(),Fc=c((n,e)=>{let t=Hc(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");ln.exports=Fc});var hn=T((pC,pn)=>{"use strict";var un=U(),zc=c((n,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new un(n instanceof un?n.version:n,t).inc(e,r,s).version}catch{return null}},"inc");pn.exports=zc});var fn=T((mC,dn)=>{"use strict";var mn=Fe(),Uc=c((n,e)=>{let t=mn(n,null,!0),r=mn(e,null,!0),s=t.compare(r);if(s===0)return null;let o=s>0,i=o?t:r,a=o?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 p=l?"pre":"";return t.major!==r.major?p+"major":t.minor!==r.minor?p+"minor":t.patch!==r.patch?p+"patch":"prerelease"},"diff");dn.exports=Uc});var vn=T((fC,Cn)=>{"use strict";var Vc=U(),Wc=c((n,e)=>new Vc(n,e).major,"major");Cn.exports=Wc});var Sn=T((vC,En)=>{"use strict";var Bc=U(),qc=c((n,e)=>new Bc(n,e).minor,"minor");En.exports=qc});var yn=T((SC,Tn)=>{"use strict";var Gc=U(),Xc=c((n,e)=>new Gc(n,e).patch,"patch");Tn.exports=Xc});var Pn=T((yC,Mn)=>{"use strict";var Jc=Fe(),Yc=c((n,e)=>{let t=Jc(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Mn.exports=Yc});var ne=T((PC,wn)=>{"use strict";var Rn=U(),Kc=c((n,e,t)=>new Rn(n,t).compare(new Rn(e,t)),"compare");wn.exports=Kc});var In=T((wC,bn)=>{"use strict";var Zc=ne(),Qc=c((n,e,t)=>Zc(e,n,t),"rcompare");bn.exports=Qc});var An=T((IC,$n)=>{"use strict";var el=ne(),tl=c((n,e)=>el(n,e,!0),"compareLoose");$n.exports=tl});var Mr=T((AC,Nn)=>{"use strict";var On=U(),rl=c((n,e,t)=>{let r=new On(n,t),s=new On(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");Nn.exports=rl});var Ln=T((NC,xn)=>{"use strict";var sl=Mr(),ol=c((n,e)=>n.sort((t,r)=>sl(t,r,e)),"sort");xn.exports=ol});var _n=T((LC,Dn)=>{"use strict";var nl=Mr(),il=c((n,e)=>n.sort((t,r)=>nl(r,t,e)),"rsort");Dn.exports=il});var vt=T((_C,kn)=>{"use strict";var al=ne(),cl=c((n,e,t)=>al(n,e,t)>0,"gt");kn.exports=cl});var Pr=T((jC,jn)=>{"use strict";var ll=ne(),gl=c((n,e,t)=>ll(n,e,t)<0,"lt");jn.exports=gl});var hs=T((FC,Hn)=>{"use strict";var ul=ne(),pl=c((n,e,t)=>ul(n,e,t)===0,"eq");Hn.exports=pl});var ms=T((UC,Fn)=>{"use strict";var hl=ne(),ml=c((n,e,t)=>hl(n,e,t)!==0,"neq");Fn.exports=ml});var Rr=T((WC,zn)=>{"use strict";var dl=ne(),fl=c((n,e,t)=>dl(n,e,t)>=0,"gte");zn.exports=fl});var wr=T((qC,Un)=>{"use strict";var Cl=ne(),vl=c((n,e,t)=>Cl(n,e,t)<=0,"lte");Un.exports=vl});var ds=T((XC,Vn)=>{"use strict";var El=hs(),Sl=ms(),Tl=vt(),yl=Rr(),Ml=Pr(),Pl=wr(),Rl=c((n,e,t,r)=>{switch(e){case"===":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n===t;case"!==":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n!==t;case"":case"=":case"==":return El(n,t,r);case"!=":return Sl(n,t,r);case">":return Tl(n,t,r);case">=":return yl(n,t,r);case"<":return Ml(n,t,r);case"<=":return Pl(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Vn.exports=Rl});var Bn=T((YC,Wn)=>{"use strict";var wl=U(),bl=Fe(),{safeRe:br,t:Ir}=rt(),Il=c((n,e)=>{if(n instanceof wl)return n;if(typeof n=="number"&&(n=String(n)),typeof n!="string")return null;e=e||{};let t=null;if(!e.rtl)t=n.match(e.includePrerelease?br[Ir.COERCEFULL]:br[Ir.COERCE]);else{let l=e.includePrerelease?br[Ir.COERCERTLFULL]:br[Ir.COERCERTL],g;for(;(g=l.exec(n))&&(!t||t.index+t[0].length!==n.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],s=t[3]||"0",o=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return bl(`${r}.${s}.${o}${i}${a}`,e)},"coerce");Wn.exports=Il});var Gn=T((ZC,qn)=>{"use strict";var fs=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}};qn.exports=fs});var ie=T((ev,Kn)=>{"use strict";var $l=/\s+/g,Cs=class n{static{c(this,"Range")}constructor(e,t){if(t=Ol(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof vs)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($l," "),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=>!Jn(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&&jl(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&&_l)|(this.options.loose&&kl))+":"+e,s=Xn.get(r);if(s)return s;let o=this.options.loose,i=o?q[V.HYPHENRANGELOOSE]:q[V.HYPHENRANGE];e=e.replace(i,Xl(this.options.includePrerelease)),A("hyphen replace",e),e=e.replace(q[V.COMPARATORTRIM],xl),A("comparator trim",e),e=e.replace(q[V.TILDETRIM],Ll),A("tilde trim",e),e=e.replace(q[V.CARETTRIM],Dl),A("caret trim",e);let a=e.split(" ").map(h=>Hl(h,this.options)).join(" ").split(/\s+/).map(h=>Gl(h,this.options));o&&(a=a.filter(h=>(A("loose invalid filter",h,this.options),!!h.match(q[V.COMPARATORLOOSE])))),A("range list",a);let l=new Map,g=a.map(h=>new vs(h,this.options));for(let h of g){if(Jn(h))return[h];l.set(h.value,h)}l.size>1&&l.has("")&&l.delete("");let p=[...l.values()];return Xn.set(r,p),p}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Yn(r,t)&&e.set.some(s=>Yn(s,t)&&r.every(o=>s.every(i=>o.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Nl(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Jl(this.set[t],e,this.options))return!0;return!1}};Kn.exports=Cs;var Al=Gn(),Xn=new Al,Ol=vr(),vs=Et(),A=Ct(),Nl=U(),{safeRe:q,t:V,comparatorTrimReplace:xl,tildeTrimReplace:Ll,caretTrimReplace:Dl}=rt(),{FLAG_INCLUDE_PRERELEASE:_l,FLAG_LOOSE:kl}=ft(),Jn=c(n=>n.value==="<0.0.0-0","isNullSet"),jl=c(n=>n.value==="","isAny"),Yn=c((n,e)=>{let t=!0,r=n.slice(),s=r.pop();for(;t&&r.length;)t=r.every(o=>s.intersects(o,e)),s=r.pop();return t},"isSatisfiable"),Hl=c((n,e)=>(n=n.replace(q[V.BUILD],""),A("comp",n,e),n=Ul(n,e),A("caret",n),n=Fl(n,e),A("tildes",n),n=Wl(n,e),A("xrange",n),n=ql(n,e),A("stars",n),n),"parseComparator"),G=c(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),Fl=c((n,e)=>n.trim().split(/\s+/).map(t=>zl(t,e)).join(" "),"replaceTildes"),zl=c((n,e)=>{let t=e.loose?q[V.TILDELOOSE]:q[V.TILDE];return n.replace(t,(r,s,o,i,a)=>{A("tilde",n,r,s,o,i,a);let l;return G(s)?l="":G(o)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:G(i)?l=`>=${s}.${o}.0 <${s}.${+o+1}.0-0`:a?(A("replaceTilde pr",a),l=`>=${s}.${o}.${i}-${a} <${s}.${+o+1}.0-0`):l=`>=${s}.${o}.${i} <${s}.${+o+1}.0-0`,A("tilde return",l),l})},"replaceTilde"),Ul=c((n,e)=>n.trim().split(/\s+/).map(t=>Vl(t,e)).join(" "),"replaceCarets"),Vl=c((n,e)=>{A("caret",n,e);let t=e.loose?q[V.CARETLOOSE]:q[V.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(s,o,i,a,l)=>{A("caret",n,s,o,i,a,l);let g;return G(o)?g="":G(i)?g=`>=${o}.0.0${r} <${+o+1}.0.0-0`:G(a)?o==="0"?g=`>=${o}.${i}.0${r} <${o}.${+i+1}.0-0`:g=`>=${o}.${i}.0${r} <${+o+1}.0.0-0`:l?(A("replaceCaret pr",l),o==="0"?i==="0"?g=`>=${o}.${i}.${a}-${l} <${o}.${i}.${+a+1}-0`:g=`>=${o}.${i}.${a}-${l} <${o}.${+i+1}.0-0`:g=`>=${o}.${i}.${a}-${l} <${+o+1}.0.0-0`):(A("no pr"),o==="0"?i==="0"?g=`>=${o}.${i}.${a}${r} <${o}.${i}.${+a+1}-0`:g=`>=${o}.${i}.${a}${r} <${o}.${+i+1}.0-0`:g=`>=${o}.${i}.${a} <${+o+1}.0.0-0`),A("caret return",g),g})},"replaceCaret"),Wl=c((n,e)=>(A("replaceXRanges",n,e),n.split(/\s+/).map(t=>Bl(t,e)).join(" ")),"replaceXRanges"),Bl=c((n,e)=>{n=n.trim();let t=e.loose?q[V.XRANGELOOSE]:q[V.XRANGE];return n.replace(t,(r,s,o,i,a,l)=>{A("xRange",n,r,s,o,i,a,l);let g=G(o),p=g||G(i),h=p||G(a),E=h;return s==="="&&E&&(s=""),l=e.includePrerelease?"-0":"",g?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&E?(p&&(i=0),a=0,s===">"?(s=">=",p?(o=+o+1,i=0,a=0):(i=+i+1,a=0)):s==="<="&&(s="<",p?o=+o+1:i=+i+1),s==="<"&&(l="-0"),r=`${s+o}.${i}.${a}${l}`):p?r=`>=${o}.0.0${l} <${+o+1}.0.0-0`:h&&(r=`>=${o}.${i}.0${l} <${o}.${+i+1}.0-0`),A("xRange return",r),r})},"replaceXRange"),ql=c((n,e)=>(A("replaceStars",n,e),n.trim().replace(q[V.STAR],"")),"replaceStars"),Gl=c((n,e)=>(A("replaceGTE0",n,e),n.trim().replace(q[e.includePrerelease?V.GTE0PRE:V.GTE0],"")),"replaceGTE0"),Xl=c(n=>(e,t,r,s,o,i,a,l,g,p,h,E)=>(G(r)?t="":G(s)?t=`>=${r}.0.0${n?"-0":""}`:G(o)?t=`>=${r}.${s}.0${n?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,G(g)?l="":G(p)?l=`<${+g+1}.0.0-0`:G(h)?l=`<${g}.${+p+1}.0-0`:E?l=`<=${g}.${p}.${h}-${E}`:n?l=`<${g}.${p}.${+h+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),Jl=c((n,e,t)=>{for(let r=0;r<n.length;r++)if(!n[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<n.length;r++)if(A(n[r].semver),n[r].semver!==vs.ANY&&n[r].semver.prerelease.length>0){let s=n[r].semver;if(s.major===e.major&&s.minor===e.minor&&s.patch===e.patch)return!0}return!1}return!0},"testSet")});var Et=T((rv,si)=>{"use strict";var St=Symbol("SemVer ANY"),Ts=class n{static{c(this,"Comparator")}static get ANY(){return St}constructor(e,t){if(t=Zn(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Ss("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===St?this.value="":this.value=this.operator+this.semver.version,Ss("comp",this)}parse(e){let t=this.options.loose?Qn[ei.COMPARATORLOOSE]:Qn[ei.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 ti(r[2],this.options.loose):this.semver=St}toString(){return this.value}test(e){if(Ss("Comparator.test",e,this.options.loose),this.semver===St||e===St)return!0;if(typeof e=="string")try{e=new ti(e,this.options)}catch{return!1}return Es(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new ri(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new ri(this.value,t).test(e.semver):(t=Zn(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("=")||Es(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Es(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};si.exports=Ts;var Zn=vr(),{safeRe:Qn,t:ei}=rt(),Es=ds(),Ss=Ct(),ti=U(),ri=ie()});var Tt=T((ov,oi)=>{"use strict";var Yl=ie(),Kl=c((n,e,t)=>{try{e=new Yl(e,t)}catch{return!1}return e.test(n)},"satisfies");oi.exports=Kl});var ii=T((iv,ni)=>{"use strict";var Zl=ie(),Ql=c((n,e)=>new Zl(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");ni.exports=Ql});var ci=T((cv,ai)=>{"use strict";var eg=U(),tg=ie(),rg=c((n,e,t)=>{let r=null,s=null,o=null;try{o=new tg(e,t)}catch{return null}return n.forEach(i=>{o.test(i)&&(!r||s.compare(i)===-1)&&(r=i,s=new eg(r,t))}),r},"maxSatisfying");ai.exports=rg});var gi=T((gv,li)=>{"use strict";var sg=U(),og=ie(),ng=c((n,e,t)=>{let r=null,s=null,o=null;try{o=new og(e,t)}catch{return null}return n.forEach(i=>{o.test(i)&&(!r||s.compare(i)===1)&&(r=i,s=new sg(r,t))}),r},"minSatisfying");li.exports=ng});var hi=T((pv,pi)=>{"use strict";var ys=U(),ig=ie(),ui=vt(),ag=c((n,e)=>{n=new ig(n,e);let t=new ys("0.0.0");if(n.test(t)||(t=new ys("0.0.0-0"),n.test(t)))return t;t=null;for(let r=0;r<n.set.length;++r){let s=n.set[r],o=null;s.forEach(i=>{let a=new ys(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!o||ui(a,o))&&(o=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),o&&(!t||ui(t,o))&&(t=o)}return t&&n.test(t)?t:null},"minVersion");pi.exports=ag});var di=T((mv,mi)=>{"use strict";var cg=ie(),lg=c((n,e)=>{try{return new cg(n,e).range||"*"}catch{return null}},"validRange");mi.exports=lg});var $r=T((fv,Ei)=>{"use strict";var gg=U(),vi=Et(),{ANY:ug}=vi,pg=ie(),hg=Tt(),fi=vt(),Ci=Pr(),mg=wr(),dg=Rr(),fg=c((n,e,t,r)=>{n=new gg(n,r),e=new pg(e,r);let s,o,i,a,l;switch(t){case">":s=fi,o=mg,i=Ci,a=">",l=">=";break;case"<":s=Ci,o=dg,i=fi,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(hg(n,e,r))return!1;for(let g=0;g<e.set.length;++g){let p=e.set[g],h=null,E=null;if(p.forEach(d=>{d.semver===ug&&(d=new vi(">=0.0.0")),h=h||d,E=E||d,s(d.semver,h.semver,r)?h=d:i(d.semver,E.semver,r)&&(E=d)}),h.operator===a||h.operator===l||(!E.operator||E.operator===a)&&o(n,E.semver))return!1;if(E.operator===l&&i(n,E.semver))return!1}return!0},"outside");Ei.exports=fg});var Ti=T((vv,Si)=>{"use strict";var Cg=$r(),vg=c((n,e,t)=>Cg(n,e,">",t),"gtr");Si.exports=vg});var Mi=T((Sv,yi)=>{"use strict";var Eg=$r(),Sg=c((n,e,t)=>Eg(n,e,"<",t),"ltr");yi.exports=Sg});var wi=T((yv,Ri)=>{"use strict";var Pi=ie(),Tg=c((n,e,t)=>(n=new Pi(n,t),e=new Pi(e,t),n.intersects(e,t)),"intersects");Ri.exports=Tg});var Ii=T((Pv,bi)=>{"use strict";var yg=Tt(),Mg=ne();bi.exports=(n,e,t)=>{let r=[],s=null,o=null,i=n.sort((p,h)=>Mg(p,h,t));for(let p of i)yg(p,e,t)?(o=p,s||(s=p)):(o&&r.push([s,o]),o=null,s=null);s&&r.push([s,null]);let a=[];for(let[p,h]of r)p===h?a.push(p):!h&&p===i[0]?a.push("*"):h?p===i[0]?a.push(`<=${h}`):a.push(`${p} - ${h}`):a.push(`>=${p}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var Li=T((Rv,xi)=>{"use strict";var $i=ie(),Ps=Et(),{ANY:Ms}=Ps,yt=Tt(),Rs=ne(),Pg=c((n,e,t={})=>{if(n===e)return!0;n=new $i(n,t),e=new $i(e,t);let r=!1;e:for(let s of n.set){for(let o of e.set){let i=wg(s,o,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Rg=[new Ps(">=0.0.0-0")],Ai=[new Ps(">=0.0.0")],wg=c((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Ms){if(e.length===1&&e[0].semver===Ms)return!0;t.includePrerelease?n=Rg:n=Ai}if(e.length===1&&e[0].semver===Ms){if(t.includePrerelease)return!0;e=Ai}let r=new Set,s,o;for(let d of n)d.operator===">"||d.operator===">="?s=Oi(s,d,t):d.operator==="<"||d.operator==="<="?o=Ni(o,d,t):r.add(d.semver);if(r.size>1)return null;let i;if(s&&o){if(i=Rs(s.semver,o.semver,t),i>0)return null;if(i===0&&(s.operator!==">="||o.operator!=="<="))return null}for(let d of r){if(s&&!yt(d,String(s),t)||o&&!yt(d,String(o),t))return null;for(let O of e)if(!yt(d,String(O),t))return!1;return!0}let a,l,g,p,h=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1,E=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1;h&&h.prerelease.length===1&&o.operator==="<"&&h.prerelease[0]===0&&(h=!1);for(let d of e){if(p=p||d.operator===">"||d.operator===">=",g=g||d.operator==="<"||d.operator==="<=",s){if(E&&d.semver.prerelease&&d.semver.prerelease.length&&d.semver.major===E.major&&d.semver.minor===E.minor&&d.semver.patch===E.patch&&(E=!1),d.operator===">"||d.operator===">="){if(a=Oi(s,d,t),a===d&&a!==s)return!1}else if(s.operator===">="&&!yt(s.semver,String(d),t))return!1}if(o){if(h&&d.semver.prerelease&&d.semver.prerelease.length&&d.semver.major===h.major&&d.semver.minor===h.minor&&d.semver.patch===h.patch&&(h=!1),d.operator==="<"||d.operator==="<="){if(l=Ni(o,d,t),l===d&&l!==o)return!1}else if(o.operator==="<="&&!yt(o.semver,String(d),t))return!1}if(!d.operator&&(o||s)&&i!==0)return!1}return!(s&&g&&!o&&i!==0||o&&p&&!s&&i!==0||E||h)},"simpleSubset"),Oi=c((n,e,t)=>{if(!n)return e;let r=Rs(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),Ni=c((n,e,t)=>{if(!n)return e;let r=Rs(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");xi.exports=Pg});var ji=T((bv,ki)=>{"use strict";var ws=rt(),Di=ft(),bg=U(),_i=gs(),Ig=Fe(),$g=cn(),Ag=gn(),Og=hn(),Ng=fn(),xg=vn(),Lg=Sn(),Dg=yn(),_g=Pn(),kg=ne(),jg=In(),Hg=An(),Fg=Mr(),zg=Ln(),Ug=_n(),Vg=vt(),Wg=Pr(),Bg=hs(),qg=ms(),Gg=Rr(),Xg=wr(),Jg=ds(),Yg=Bn(),Kg=Et(),Zg=ie(),Qg=Tt(),eu=ii(),tu=ci(),ru=gi(),su=hi(),ou=di(),nu=$r(),iu=Ti(),au=Mi(),cu=wi(),lu=Ii(),gu=Li();ki.exports={parse:Ig,valid:$g,clean:Ag,inc:Og,diff:Ng,major:xg,minor:Lg,patch:Dg,prerelease:_g,compare:kg,rcompare:jg,compareLoose:Hg,compareBuild:Fg,sort:zg,rsort:Ug,gt:Vg,lt:Wg,eq:Bg,neq:qg,gte:Gg,lte:Xg,cmp:Jg,coerce:Yg,Comparator:Kg,Range:Zg,satisfies:Qg,toComparators:eu,maxSatisfying:tu,minSatisfying:ru,minVersion:su,validRange:ou,outside:nu,gtr:iu,ltr:au,intersects:cu,simplifyRange:lu,subset:gu,SemVer:bg,re:ws.re,src:ws.src,tokens:ws.t,SEMVER_SPEC_VERSION:Di.SEMVER_SPEC_VERSION,RELEASE_TYPES:Di.RELEASE_TYPES,compareIdentifiers:_i.compareIdentifiers,rcompareIdentifiers:_i.rcompareIdentifiers}});import{exec as uu,spawn as pu}from"child_process";import{promisify as hu}from"util";var Mt,Hi,ze,bs=f(()=>{"use strict";y();H();Mt=na(ji(),1),Hi=hu(uu),ze=class{static{c(this,"NPMManager")}logger=u.withTag("NPMManager");eventBus;constructor(e){this.eventBus=e||P()}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=pu("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((o,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()}),o();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 Hi("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 Hi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(o=>o&&typeof o=="string"&&Mt.default.valid(o));return e!=="all"&&(s=s.filter(o=>{let i=Mt.default.prerelease(o);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((o,i)=>Mt.default.rcompare(o,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=Mt.default.gt(r,e)}catch(o){this.logger.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25:",o),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 Fi}from"zod";var mu,Ar,zi=f(()=>{"use strict";y();H();bs();mu=Fi.object({version:Fi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Ar=class{static{c(this,"UpdateApiHandler")}npmManager;logger=u.withTag("UpdateApiHandler");eventBus=P();activeInstalls=new Map;constructor(){this.npmManager=new ze(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=mu.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version: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,Ui=f(()=>{"use strict";es();y();bs();Or=class{static{c(this,"VersionApiHandler")}logger;constructor(){this.logger=u.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=Ae.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=Ae.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"),Ae.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 o=await new ze().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${o.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:o,type:t,total:o.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 ze().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 Vi=f(()=>{"use strict";ro();so();oo();no();yo();Po();Ro();Uo();Vo();Wo();qo();Xo();zi();Ui()});var Nr,Wi=f(()=>{"use strict";y();H();Nr=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=u.withTag("StatusService"),this.eventBus=P()}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 xr,Bi=f(()=>{"use strict";y();te();H();xr=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=u.withTag("NotificationService"),this.eventBus=P(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=m.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send: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,o]of this.clients)this.sendMessageToClient(o,r,s)}sendToClient(e,t,r){let s={type:t,data:r,timestamp:Date.now()},o=this.clients.get(e);o?this.sendMessageToClient(o,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()}}});import{EventEmitter as du}from"events";import{z as be}from"zod";var fu,Cu,Pt,Is=f(()=>{"use strict";y();nr();H();Nt();fu={reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4,errorRecoveryEnabled:!0,errorNotificationEnabled:!0,serviceAddedDelayMs:2e3,serviceRemovedDelayMs:2e3,batchAddedDelayMs:3e3},Cu=be.object({reconnectInterval:be.number().min(100,"reconnectInterval \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 100 \u7684\u6570\u5B57").optional(),maxReconnectAttempts:be.number().min(0,"maxReconnectAttempts \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),connectionTimeout:be.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),errorRecoveryEnabled:be.boolean().optional(),errorNotificationEnabled:be.boolean().optional(),serviceAddedDelayMs:be.number().min(0,"serviceAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),serviceRemovedDelayMs:be.number().min(0,"serviceRemovedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),batchAddedDelayMs:be.number().min(0,"batchAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional()}).strict(),Pt=class extends du{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=u,this.eventBus=P(),this.options={...fu,...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,o]of this.connections)e.push(this.connectSingleEndpoint(s,o));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 ${S(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 ${S(e)} \u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D`);this.logger.debug(`\u52A8\u6001\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9: ${S(e)}`);try{this.configManager.addMcpEndpoint(e);try{let t=this.getCurrentTools();await this.createConnection(e,t);let r=this.connections.get(e);if(!r)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);await this.connectSingleEndpoint(e,r),this.logger.info(`\u6DFB\u52A0\u63A5\u5165\u70B9\u6210\u529F\uFF1A ${S(e)}`)}catch(t){try{this.configManager.removeMcpEndpoint(e),this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u6210\u529F: ${S(e)}`)}catch(r){this.logger.error(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u5931\u8D25: ${S(e)}`,r)}throw this.connections.delete(e),this.connectionStates.delete(e),this.logger.error(`\u6DFB\u52A0\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${S(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 ${S(e)}`,t),t}}async removeEndpoint(e){if(!this.connections.has(e)){this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9 ${S(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: ${S(e)}`);try{let t=this.connections.get(e);if(!t)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);this.configManager.removeMcpEndpoint(e);try{await this.disconnectSingleEndpoint(e,t),this.connections.delete(e),this.connectionStates.delete(e);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${S(e)}`)}catch(r){try{this.configManager.addMcpEndpoint(e),this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u6210\u529F: ${S(e)}`)}catch(s){this.logger.error(`\u914D\u7F6E\u6587\u4EF6\u56DE\u6EDA\u5931\u8D25: ${S(e)}`,s)}throw this.logger.error(`\u79FB\u9664\u5C0F\u667A\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${S(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 ${S(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: ${S(e)}`);return}this.logger.info(`\u65AD\u5F00\u8FDE\u63A5\u63A5\u5165\u70B9: ${S(e)}`);try{await this.disconnectSingleEndpoint(e,t)}catch(r){throw this.logger.error(`\u65AD\u5F00\u8FDE\u63A5\u63A5\u5165\u70B9\u5931\u8D25\uFF1A ${S(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 ${S(e)} \u5DF2\u8FDE\u63A5\uFF0C\u65E0\u9700\u91CD\u8FDE`);return}this.logger.info(`\u624B\u52A8\u89E6\u53D1\u91CD\u8FDE: ${S(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 ${S(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 ${S(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,o,i="connection-manager"){this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:t,operation:r,success:s,message:o,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 ${S(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);if(this.connectionStates.get(e)?.connected){this.logger.debug(`\u63A5\u5165\u70B9 ${S(e)} \u5DF2\u8FDE\u63A5\uFF0C\u8DF3\u8FC7\u8FDE\u63A5`);return}this.logger.info(`\u8FDE\u63A5\u5DF2\u5B58\u5728\u7684\u63A5\u5165\u70B9: ${S(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,recentReconnectHistory:[]};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=Cu.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 o=Array.from(this.connections.keys()),i=r.filter(g=>!o.includes(g)),a=o.filter(g=>!r.includes(g)),l=o.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 p of a)await this.removeEndpoint(p);for(let p of i)await this.addEndpoint(p);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 o={type:"options_updated",data:{oldOptions:s,newOptions:e},timestamp:new Date};this.emit("configChange",o),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 ${S(s)} \u9884\u70ED\u5B8C\u6210`)}catch(o){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${S(s)} \u9884\u70ED\u5931\u8D25:`,o)}});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: ${S(e)}`);try{let r=new we(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: ${S(e)}`)}catch(r){throw this.logger.error(`\u521B\u5EFA\u8FDE\u63A5\u5B9E\u4F8B\u5931\u8D25 ${S(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: ${S(e)}`);this.logger.debug(`\u8FDE\u63A5\u5C0F\u667A\u63A5\u5165\u70B9: ${S(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: ${S(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 ${S(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: ${S(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: ${S(e)}`)}catch(s){this.logger.error(`\u5C0F\u667A\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25 ${S(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: ${S(e)}`)}catch(r){this.logger.error(`\u5DE5\u5177\u540C\u6B65\u5931\u8D25 ${S(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 ${S(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: ${S(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: ${S(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 ${S(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 ${S(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: ${S(s)}`)}catch(o){this.logger.error(`\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25: ${S(s)}`,o)}});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: ${S(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: ${S(e)}`,r),r}}async connectToEndpoint(e){if(this.connections.has(e)){this.logger.debug(`\u63A5\u5165\u70B9\u5DF2\u5B58\u5728\u8FDE\u63A5: ${S(e)}`);return}this.logger.debug(`\u8FDE\u63A5\u63A5\u5165\u70B9: ${S(e)}`);try{let t=new we(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: ${S(e)}`)}catch(t){throw this.connections.delete(e),this.connectionStates.delete(e),this.logger.error(`\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25: ${S(e)}`,t),t}}}});async function vu(n){if(n){let r=["loadBalanceStrategy","reconnectStrategy","maxReconnectDelay","reconnectBackoffMultiplier","jitterEnabled"].filter(s=>s in n);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 Pt(m,n)}async function qi(n){if(Ee&&K==="initialized")return Ee;if(ae&&K==="initializing")return ae;K==="failed"&&$s(),K="initializing",ae=vu(n);try{return Ee=await ae,K="initialized",wt=`xiaozhi-connection-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,Rt=null,Ee}catch(e){throw K="failed",Rt=e,ae=null,console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u521D\u59CB\u5316\u5931\u8D25:",e.message),e}}async function Gi(){if(K!=="cleanup"){K="cleanup";try{if(ae){try{await(await ae).cleanup()}catch(n){console.error("\u6E05\u7406\u521D\u59CB\u5316\u4E2D\u7684\u5B9E\u4F8B\u5931\u8D25:",n.message)}ae=null}Ee&&(await Ee.cleanup(),Ee=null),K="not_initialized",Rt=null,wt=null}catch(n){throw console.error("\u274C IndependentXiaozhiConnectionManager \u5355\u4F8B\u6E05\u7406\u5931\u8D25:",n.message),$s(),n}}}function $s(){ae&&(ae=null),Ee=null,K="not_initialized",Rt=null,wt=null}function Eu(){return K==="initialized"&&Ee!==null}function Su(){return{state:K,initializationTime:wt?new Date:void 0,lastError:Rt||void 0,instanceId:wt||void 0}}async function Tu(n){return await Gi(),qi(n)}function yu(){return Ee}async function Mu(){if(K==="initialized")return!0;if(K==="initializing"&&ae)try{return await ae,!0}catch{return!1}return!1}var Ee,ae,K,Rt,wt,st,Xi=f(()=>{"use strict";te();Is();Ee=null,ae=null,K="not_initialized",Rt=null,wt=null;c(vu,"createInstance");c(qi,"getInstance");c(Gi,"cleanup");c($s,"reset");c(Eu,"isInitialized");c(Su,"getStatus");c(Tu,"forceReinitialize");c(yu,"getCurrentInstance");c(Mu,"waitForInitialization");st={getInstance:qi,cleanup:Gi,reset:$s,isInitialized:Eu,getStatus:Su,forceReinitialize:Tu,getCurrentInstance:yu,waitForInitialization:Mu};process.on("exit",()=>{st.isInitialized()&&st.reset()});process.on("uncaughtException",async n=>{console.error("\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF0C\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B:",n);try{await st.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}});process.on("unhandledRejection",async n=>{console.error("\u{1F4A5} \u672A\u5904\u7406\u7684Promise\u62D2\u7EDD\uFF0C\u6E05\u7406 IndependentXiaozhiConnectionManager \u5355\u4F8B:",n);try{await st.cleanup()}catch(e){console.error("\u6E05\u7406\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e)}})});function Ru(){return u}function As(n,e,t){let r=new Date,s=n.message.toLowerCase(),o="unknown",i="UNKNOWN_ERROR",a=!1,l="manual_intervention";s.includes("connection")||s.includes("connect")||s.includes("econnrefused")||s.includes("enotfound")?(o="connection",i="CONNECTION_FAILED",a=!0,l="reconnect"):s.includes("transport")||s.includes("stdio")||s.includes("sse")||s.includes("http")?(o="transport",i="TRANSPORT_ERROR",a=!0,l="restart_service"):s.includes("tool")||s.includes("method not found")||s.includes("invalid params")?(o="tool_call",i="TOOL_CALL_ERROR",a=!0,l="retry"):s.includes("config")||s.includes("invalid")||s.includes("missing")?(o="configuration",i="CONFIG_ERROR",a=!1,l="manual_intervention"):s.includes("timeout")||s.includes("timed out")?(o="timeout",i="TIMEOUT_ERROR",a=!0,l="retry"):s.includes("auth")||s.includes("unauthorized")||s.includes("forbidden")?(o="authentication",i="AUTH_ERROR",a=!1,l="manual_intervention"):(s.includes("network")||s.includes("fetch")||s.includes("request failed"))&&(o="network",i="NETWORK_ERROR",a=!0,l="retry");let g={category:o,code:i,message:n.message,serviceName:e,timestamp:r,recoverable:a,recoveryStrategy:l,originalError:n,context:t};return wu(e,g),g}function wu(n,e){Lr.has(n)||Lr.set(n,[]);let t=Lr.get(n);t.push(e),t.length>Pu&&t.shift(),Ru().debug(`[ErrorHandler] \u8BB0\u5F55\u9519\u8BEF\u5386\u53F2: ${n} - ${e.code}`)}function bu(n){let e=Lr.get(n)||[],r=Date.now()-3600*1e3,s=e.filter(a=>a.timestamp.getTime()>r),o=new Map,i=new Map;for(let a of e)o.set(a.category,(o.get(a.category)||0)+1),i.set(a.code,(i.get(a.code)||0)+1);return{serviceName:n,totalErrors:e.length,errorsByCategory:o,errorsByCode:i,lastError:e[e.length-1],errorRate:s.length}}function Os(n){return bu(n.serviceName).errorRate>10||!n.recoverable||n.category==="authentication"||n.category==="configuration"}var Lr,Pu,Ns=f(()=>{"use strict";y();Lr=new Map,Pu=100;c(Ru,"getLogger");c(As,"categorizeError");c(wu,"recordError");c(bu,"getErrorStatistics");c(Os,"shouldAlert")});import{existsSync as Iu,readFileSync as Ji}from"fs";import{watch as $u}from"chokidar";var Ls,xs,LE,Yi=f(()=>{"use strict";y();Ns();Ls=class{static{c(this,"ConfigWatcherClass")}logger;watcher=null;callbacks=new Set;currentConfigs=new Map;watchedPath=null;options;debounceTimer=null;backupConfigs=[];constructor(e){this.logger=u,this.options={debounceMs:1e3,validateOnChange:!0,backupOnChange:!0,autoReload:!0,ignoreInitial:!0,...e}}startWatching(e){if(this.watcher&&(this.logger.warn("\u914D\u7F6E\u76D1\u542C\u5668\u5DF2\u5728\u8FD0\u884C\uFF0C\u5148\u505C\u6B62\u73B0\u6709\u76D1\u542C"),this.stopWatching()),!Iu(e))throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`);this.watchedPath=e,this.logger.info(`\u5F00\u59CB\u76D1\u542C\u914D\u7F6E\u6587\u4EF6: ${e}`);try{this.loadInitialConfig(e)}catch(t){throw this.logger.error("\u52A0\u8F7D\u521D\u59CB\u914D\u7F6E\u5931\u8D25:",t),t}this.watcher=$u(e,{persistent:!0,ignoreInitial:this.options.ignoreInitial,awaitWriteFinish:{stabilityThreshold:100,pollInterval:100}}),this.watcher.on("change",t=>{this.logger.debug(`\u914D\u7F6E\u6587\u4EF6\u53D8\u66F4: ${t}`),this.handleConfigChange(t)}),this.watcher.on("error",t=>{this.logger.error("\u914D\u7F6E\u6587\u4EF6\u76D1\u542C\u9519\u8BEF:",t);let r=As(t instanceof Error?t:new Error(String(t)),"ConfigWatcher");Os(r)&&this.logger.error("\u914D\u7F6E\u76D1\u542C\u5668\u53D1\u751F\u4E25\u91CD\u9519\u8BEF\uFF0C\u9700\u8981\u4EBA\u5DE5\u5E72\u9884")})}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null,this.logger.info("\u5DF2\u505C\u6B62\u914D\u7F6E\u6587\u4EF6\u76D1\u542C")),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watchedPath=null}onConfigChange(e){this.callbacks.add(e),this.logger.debug("\u5DF2\u6DFB\u52A0\u914D\u7F6E\u53D8\u66F4\u56DE\u8C03")}removeConfigChangeCallback(e){this.callbacks.delete(e),this.logger.debug("\u5DF2\u79FB\u9664\u914D\u7F6E\u53D8\u66F4\u56DE\u8C03")}async reloadConfig(){if(!this.watchedPath)throw new Error("\u672A\u8BBE\u7F6E\u76D1\u542C\u8DEF\u5F84\uFF0C\u65E0\u6CD5\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E");this.logger.info("\u624B\u52A8\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E"),await this.handleConfigChange(this.watchedPath)}validateConfig(e){let t={valid:!0,errors:[],warnings:[]},r=new Set;for(let s of e){if(!s.name){t.valid=!1,t.errors.push("\u670D\u52A1\u914D\u7F6E\u7F3A\u5C11 name \u5B57\u6BB5");continue}if(!s.type){t.valid=!1,t.errors.push(`\u670D\u52A1 ${s.name} \u7F3A\u5C11 type \u5B57\u6BB5`);continue}switch(r.has(s.name)?(t.valid=!1,t.errors.push(`\u91CD\u590D\u7684\u670D\u52A1\u540D: ${s.name}`)):r.add(s.name),s.type){case"stdio":s.command||(t.valid=!1,t.errors.push(`stdio \u670D\u52A1 ${s.name} \u7F3A\u5C11 command \u5B57\u6BB5`));break;case"sse":case"streamable-http":s.url||(t.valid=!1,t.errors.push(`${s.type} \u670D\u52A1 ${s.name} \u7F3A\u5C11 url \u5B57\u6BB5`));break}s.timeout&&s.timeout<=0&&t.warnings.push(`\u670D\u52A1 ${s.name} \u7684 timeout \u503C\u5E94\u8BE5\u5927\u4E8E 0`),s.retryAttempts&&s.retryAttempts<0&&t.warnings.push(`\u670D\u52A1 ${s.name} \u7684 retryAttempts \u503C\u4E0D\u5E94\u8BE5\u5C0F\u4E8E 0`)}return t}getCurrentConfigs(){return Array.from(this.currentConfigs.values())}getBackupConfigs(){return[...this.backupConfigs]}restoreFromBackup(){if(this.backupConfigs.length===0)throw new Error("\u6CA1\u6709\u53EF\u7528\u7684\u5907\u4EFD\u914D\u7F6E");return this.logger.info("\u6062\u590D\u5230\u5907\u4EFD\u914D\u7F6E"),[...this.backupConfigs]}updateOptions(e){this.options={...this.options,...e},this.logger.info("\u914D\u7F6E\u76D1\u542C\u5668\u9009\u9879\u5DF2\u66F4\u65B0")}getOptions(){return{...this.options}}loadInitialConfig(e){try{let t=Ji(e,"utf-8"),r=JSON.parse(t),s=[];if(r.mcpServices&&Array.isArray(r.mcpServices))s=r.mcpServices;else if(Array.isArray(r))s=r;else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u5E94\u5305\u542B mcpServices \u6570\u7EC4");if(this.options.validateOnChange){let o=this.validateConfig(s);if(!o.valid)throw new Error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25: ${o.errors.join(", ")}`);o.warnings.length>0&&this.logger.warn(`\u914D\u7F6E\u8B66\u544A: ${o.warnings.join(", ")}`)}this.currentConfigs.clear();for(let o of s)this.currentConfigs.set(o.name,o);this.options.backupOnChange&&(this.backupConfigs=[...s]),this.logger.info(`\u5DF2\u52A0\u8F7D ${s.length} \u4E2A\u670D\u52A1\u914D\u7F6E`)}catch(t){throw this.logger.error("\u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:",t),t}}async handleConfigChange(e){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{try{await this.processConfigChange(e)}catch(t){this.logger.error("\u5904\u7406\u914D\u7F6E\u53D8\u66F4\u5931\u8D25:",t)}},this.options.debounceMs)}async processConfigChange(e){this.logger.info("\u5904\u7406\u914D\u7F6E\u6587\u4EF6\u53D8\u66F4");try{let t=Ji(e,"utf-8"),r=JSON.parse(t),s=[];if(r.mcpServices&&Array.isArray(r.mcpServices))s=r.mcpServices;else if(Array.isArray(r))s=r;else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E");if(this.options.validateOnChange){let i=this.validateConfig(s);if(!i.valid){this.logger.error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25: ${i.errors.join(", ")}`);return}i.warnings.length>0&&this.logger.warn(`\u914D\u7F6E\u8B66\u544A: ${i.warnings.join(", ")}`)}let o=this.compareConfigs(Array.from(this.currentConfigs.values()),s);this.options.backupOnChange&&(this.backupConfigs=Array.from(this.currentConfigs.values())),this.currentConfigs.clear();for(let i of s)this.currentConfigs.set(i.name,i);for(let i of o)await this.notifyConfigChange(i);if(o.length>0){let i={type:"reloaded",allConfigs:s,timestamp:new Date,filePath:e};await this.notifyConfigChange(i)}this.logger.info(`\u914D\u7F6E\u53D8\u66F4\u5904\u7406\u5B8C\u6210\uFF0C\u5171 ${o.length} \u4E2A\u53D8\u66F4`)}catch(t){this.logger.error("\u5904\u7406\u914D\u7F6E\u53D8\u66F4\u5931\u8D25:",t);let r=As(t,"ConfigWatcher");Os(r)&&this.logger.error("\u914D\u7F6E\u53D8\u66F4\u5904\u7406\u53D1\u751F\u4E25\u91CD\u9519\u8BEF\uFF0C\u53EF\u80FD\u9700\u8981\u56DE\u6EDA\u914D\u7F6E")}}compareConfigs(e,t){let r=[],s=new Map(e.map(i=>[i.name,i])),o=new Map(t.map(i=>[i.name,i]));for(let[i,a]of o){let l=s.get(i);l?JSON.stringify(l)!==JSON.stringify(a)&&r.push({type:"modified",serviceName:i,oldConfig:l,newConfig:a,timestamp:new Date,filePath:this.watchedPath}):r.push({type:"added",serviceName:i,newConfig:a,timestamp:new Date,filePath:this.watchedPath})}for(let[i,a]of s)o.has(i)||r.push({type:"removed",serviceName:i,oldConfig:a,timestamp:new Date,filePath:this.watchedPath});return r}async notifyConfigChange(e){this.logger.debug(`\u901A\u77E5\u914D\u7F6E\u53D8\u66F4: ${e.type} - ${e.serviceName||"\u5168\u90E8"}`);let t=Array.from(this.callbacks).map(async r=>{try{await r(e)}catch(s){this.logger.error("\u914D\u7F6E\u53D8\u66F4\u56DE\u8C03\u6267\u884C\u5931\u8D25:",s)}});await Promise.all(t)}},xs=null,LE=(xs||(xs=new Ls),xs)});var _s,Ds,Ki,ks=f(()=>{"use strict";y();_s=class{static{c(this,"PerformanceMonitorClass")}metrics=new Map;timers=new Map;logger;MAX_LATENCY_HISTORY=100;constructor(){this.logger=u}initializeService(e){if(!this.metrics.has(e)){let t=new Date;this.metrics.set(e,{serviceName:e,connectionLatency:0,averageToolCallLatency:0,toolCallLatencies:new Map,successRate:1,errorRate:0,totalOperations:0,successfulOperations:0,failedOperations:0,lastUpdated:t,uptime:0,startTime:t}),this.logger.debug(`[PerformanceMonitor] \u521D\u59CB\u5316\u670D\u52A1 ${e} \u7684\u6027\u80FD\u6307\u6807`)}}startTiming(e,t,r="tool_call"){let s=`${e}-${t}-${Date.now()}-${Math.random()}`,o={id:s,operation:t,serviceName:e,startTime:performance.now(),type:r};return this.timers.set(s,o),this.logger.debug(`[PerformanceMonitor] \u5F00\u59CB\u8BA1\u65F6: ${e} - ${t} (${s})`),s}endTiming(e,t=!0){let r=this.timers.get(e);if(!r)return this.logger.warn(`[PerformanceMonitor] \u672A\u627E\u5230\u8BA1\u65F6\u5668: ${e}`),0;let o=performance.now()-r.startTime;return this.initializeService(r.serviceName),this.recordPerformance(r,o,t),this.timers.delete(e),this.logger.debug(`[PerformanceMonitor] \u7ED3\u675F\u8BA1\u65F6: ${r.serviceName} - ${r.operation} = ${o.toFixed(2)}ms (${t?"\u6210\u529F":"\u5931\u8D25"})`),o}recordSuccess(e,t,r){this.initializeService(e);let s=this.metrics.get(e);s.successfulOperations++,s.totalOperations++,this.updateRates(s),r!==void 0&&t&&this.recordToolCallLatency(e,t,r),s.lastUpdated=new Date,this.logger.debug(`[PerformanceMonitor] \u8BB0\u5F55\u6210\u529F\u64CD\u4F5C: ${e} - ${t}`)}recordError(e,t){this.initializeService(e);let r=this.metrics.get(e);r.failedOperations++,r.totalOperations++,this.updateRates(r),r.lastUpdated=new Date,this.logger.debug(`[PerformanceMonitor] \u8BB0\u5F55\u5931\u8D25\u64CD\u4F5C: ${e} - ${t}`)}recordConnectionLatency(e,t){this.initializeService(e);let r=this.metrics.get(e);r.connectionLatency=t,r.lastUpdated=new Date,this.logger.debug(`[PerformanceMonitor] \u8BB0\u5F55\u8FDE\u63A5\u5EF6\u8FDF: ${e} = ${t.toFixed(2)}ms`)}getMetrics(e){let t=this.metrics.get(e);return t&&(t.uptime=Date.now()-t.startTime.getTime(),this.updateAverageToolCallLatency(t)),t}getAllMetrics(){let e=new Map;for(let[t,r]of this.metrics)r.uptime=Date.now()-r.startTime.getTime(),this.updateAverageToolCallLatency(r),e.set(t,{...r});return e}getPerformanceReport(){let e=Array.from(this.getAllMetrics().values()),t=e.reduce((o,i)=>o+i.totalOperations,0),r=e.length>0?e.reduce((o,i)=>o+i.successRate,0)/e.length:0,s=e.length>0?e.reduce((o,i)=>o+i.errorRate,0)/e.length:0;return{summary:{totalServices:e.length,averageSuccessRate:r,averageErrorRate:s,totalOperations:t},services:e}}clearMetrics(e){if(e){this.metrics.delete(e);for(let[t,r]of this.timers)r.serviceName===e&&this.timers.delete(t);this.logger.info(`[PerformanceMonitor] \u5DF2\u6E05\u7406\u670D\u52A1 ${e} \u7684\u6027\u80FD\u6570\u636E`)}else this.metrics.clear(),this.timers.clear(),this.logger.info("[PerformanceMonitor] \u5DF2\u6E05\u7406\u6240\u6709\u6027\u80FD\u6570\u636E")}recordPerformance(e,t,r){let s=this.metrics.get(e.serviceName);switch(e.type){case"connection":s.connectionLatency=t;break;case"tool_call":this.recordToolCallLatency(e.serviceName,e.operation,t);break}s.totalOperations++,r?s.successfulOperations++:s.failedOperations++,this.updateRates(s),s.lastUpdated=new Date}recordToolCallLatency(e,t,r){let s=this.metrics.get(e);s.toolCallLatencies.has(t)||s.toolCallLatencies.set(t,[]);let o=s.toolCallLatencies.get(t);o.push(r),o.length>this.MAX_LATENCY_HISTORY&&o.shift(),this.updateAverageToolCallLatency(s)}updateRates(e){e.totalOperations>0?(e.successRate=e.successfulOperations/e.totalOperations,e.errorRate=e.failedOperations/e.totalOperations):(e.successRate=1,e.errorRate=0)}updateAverageToolCallLatency(e){let t=0,r=0;for(let s of e.toolCallLatencies.values())t+=s.reduce((o,i)=>o+i,0),r+=s.length;e.averageToolCallLatency=r>0?t/r:0}},Ds=null,Ki=(Ds||(Ds=new _s),Ds)});var Hs,js,UE,Zi=f(()=>{"use strict";y();ks();Hs=class{static{c(this,"HealthCheckerClass")}logger;config;intervalId=null;healthHistory=new Map;MAX_HISTORY=50;constructor(e){this.logger=u,this.config={interval:3e4,timeout:5e3,maxErrorRate:.1,maxResponseTime:2e3,retryAttempts:3,autoRecover:!0,...e}}async checkService(e){let t=e.getConfig().name,r=performance.now();this.logger.debug(`[HealthChecker] \u5F00\u59CB\u5065\u5EB7\u68C0\u67E5: ${t}`);let s={serviceName:t,healthy:!0,lastCheck:new Date,issues:[],uptime:0,responseTime:0,connectionStable:!1,errorRate:0,lastError:void 0};try{let o=e.isConnected();o?s.connectionStable=!0:(s.healthy=!1,s.issues.push("\u670D\u52A1\u672A\u8FDE\u63A5"));let i=Ki.getMetrics(t);i&&(s.uptime=i.uptime,s.errorRate=i.errorRate,s.responseTime=i.averageToolCallLatency,i.errorRate>this.config.maxErrorRate&&(s.healthy=!1,s.issues.push(`\u9519\u8BEF\u7387\u8FC7\u9AD8: ${(i.errorRate*100).toFixed(1)}%`)),i.averageToolCallLatency>this.config.maxResponseTime&&(s.healthy=!1,s.issues.push(`\u54CD\u5E94\u65F6\u95F4\u8FC7\u957F: ${i.averageToolCallLatency.toFixed(0)}ms`)));try{let a=e.getTools(),l=performance.now();s.responseTime=l-r,a.length===0&&o&&(s.healthy=!1,s.issues.push("\u672A\u53D1\u73B0\u53EF\u7528\u5DE5\u5177"))}catch(a){let l=performance.now();s.responseTime=l-r,s.healthy=!1,s.issues.push(`\u5DE5\u5177\u68C0\u67E5\u5931\u8D25: ${a.message}`),s.lastError=a.message}return this.recordHealthHistory(t,s),this.logger.debug(`[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u5B8C\u6210: ${t} - ${s.healthy?"\u5065\u5EB7":"\u4E0D\u5065\u5EB7"} (${s.responseTime.toFixed(0)}ms)`),s}catch(o){let i=performance.now();return s.responseTime=i-r,s.healthy=!1,s.issues.push(`\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38: ${o.message}`),s.lastError=o.message,this.recordHealthHistory(t,s),this.logger.error(`[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u5F02\u5E38: ${t}`,o),s}}async checkAllServices(e){let t=new Map,r=e.getAllServices();this.logger.debug(`[HealthChecker] \u5F00\u59CB\u68C0\u67E5 ${r.size} \u4E2A\u670D\u52A1\u7684\u5065\u5EB7\u72B6\u6001`);let s=Array.from(r.entries()).map(async([o,i])=>{try{let a=await this.checkService(i);t.set(o,a),!a.healthy&&this.config.autoRecover&&await this.attemptRecovery(i,a)}catch(a){this.logger.error(`[HealthChecker] \u68C0\u67E5\u670D\u52A1 ${o} \u65F6\u53D1\u751F\u9519\u8BEF:`,a),t.set(o,{serviceName:o,healthy:!1,lastCheck:new Date,issues:[`\u68C0\u67E5\u5931\u8D25: ${a.message}`],uptime:0,responseTime:0,connectionStable:!1,errorRate:1,lastError:a.message})}});return await Promise.all(s),this.logger.info(`[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u5B8C\u6210: ${t.size} \u4E2A\u670D\u52A1\uFF0C${Array.from(t.values()).filter(o=>o.healthy).length} \u4E2A\u5065\u5EB7`),t}startPeriodicCheck(e){if(this.intervalId){this.logger.warn("[HealthChecker] \u5B9A\u671F\u5065\u5EB7\u68C0\u67E5\u5DF2\u5728\u8FD0\u884C");return}this.logger.info(`[HealthChecker] \u5F00\u59CB\u5B9A\u671F\u5065\u5EB7\u68C0\u67E5\uFF0C\u95F4\u9694: ${this.config.interval}ms`),this.intervalId=setInterval(async()=>{try{await this.checkAllServices(e)}catch(t){this.logger.error("[HealthChecker] \u5B9A\u671F\u5065\u5EB7\u68C0\u67E5\u5931\u8D25:",t)}},this.config.interval)}stopPeriodicCheck(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.logger.info("[HealthChecker] \u5DF2\u505C\u6B62\u5B9A\u671F\u5065\u5EB7\u68C0\u67E5"))}getHealthReport(e){let t=Array.from(e.values()),r=t.filter(l=>l.healthy),s=t.filter(l=>!l.healthy),o=t.reduce((l,g)=>l+g.responseTime,0),i=t.reduce((l,g)=>l+g.errorRate,0),a=t.reduce((l,g)=>l+g.issues.length,0);return{timestamp:new Date,overallHealth:s.length===0,totalServices:t.length,healthyServices:r.length,unhealthyServices:s.length,services:t,summary:{averageResponseTime:t.length>0?o/t.length:0,averageErrorRate:t.length>0?i/t.length:0,totalIssues:a}}}getHealthHistory(e){return this.healthHistory.get(e)||[]}clearHealthHistory(e){e?(this.healthHistory.delete(e),this.logger.info(`[HealthChecker] \u5DF2\u6E05\u7406\u670D\u52A1 ${e} \u7684\u5065\u5EB7\u5386\u53F2`)):(this.healthHistory.clear(),this.logger.info("[HealthChecker] \u5DF2\u6E05\u7406\u6240\u6709\u5065\u5EB7\u5386\u53F2"))}updateConfig(e){this.config={...this.config,...e},this.logger.info("[HealthChecker] \u5065\u5EB7\u68C0\u67E5\u914D\u7F6E\u5DF2\u66F4\u65B0")}getConfig(){return{...this.config}}recordHealthHistory(e,t){this.healthHistory.has(e)||this.healthHistory.set(e,[]);let r=this.healthHistory.get(e);r.push({...t}),r.length>this.MAX_HISTORY&&r.shift()}async attemptRecovery(e,t){let r=t.serviceName;this.logger.info(`[HealthChecker] \u5C1D\u8BD5\u6062\u590D\u4E0D\u5065\u5EB7\u7684\u670D\u52A1: ${r}`);try{e.isConnected()||(this.logger.info(`[HealthChecker] \u5C1D\u8BD5\u91CD\u65B0\u8FDE\u63A5\u670D\u52A1: ${r}`),await e.connect(),await new Promise(o=>setTimeout(o,1e3)),(await this.checkService(e)).healthy?this.logger.info(`[HealthChecker] \u670D\u52A1 ${r} \u6062\u590D\u6210\u529F`):this.logger.warn(`[HealthChecker] \u670D\u52A1 ${r} \u6062\u590D\u5931\u8D25`))}catch(s){this.logger.error(`[HealthChecker] \u6062\u590D\u670D\u52A1 ${r} \u65F6\u53D1\u751F\u9519\u8BEF:`,s)}}},js=null,UE=(js||(js=new Hs),js)});var Qi=f(()=>{"use strict";it();Wi();Bi();Xt();Jt();H();Is();Xi();Yi();Ns();Zi();ks();qe();_r();Wr();zr()});var ir={};Se(ir,{WebServer:()=>Fs});import{createServer as Au}from"http";import{serve as Ou}from"@hono/node-server";import{Hono as Nu}from"hono";import{cors as xu}from"hono/cors";import{WebSocketServer as Lu}from"ws";var Fs,ar=f(()=>{"use strict";Ks();Vi();y();nr();te();Qi();Fs=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;configService;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;toolCallLogApiHandler;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??m.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=u.withTag("WebServer"),this.eventBus=P(),this.configService=new pe,this.statusService=new Nr,this.notificationService=new xr,this.configApiHandler=new _t,this.statusApiHandler=new pr(this.statusService),this.serviceApiHandler=new lr(this.statusService),this.toolApiHandler=new mr,this.toolCallLogApiHandler=new Cr,this.versionApiHandler=new Or,this.staticFileHandler=new ur,this.mcpRouteHandler=new Yt,this.realtimeNotificationHandler=new Qt(this.notificationService,this.statusService),this.heartbeatHandler=new Ft(this.statusService,this.notificationService),this.app=new Nu,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 Z.getInstance(),this.mcpServerApiHandler=new Zt(this.mcpServiceManager,m),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(!m.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");m.cleanupInvalidServerToolsConfig();let e=m.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let s=Xs(t,r);this.mcpServiceManager.addServiceConfig(t,s)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e,t){let s=(Array.isArray(e)?e:[e]).filter(o=>o&&!o.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(o){this.logger.error("\u274C \u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",o);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",o=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${o.type}`,o.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(o){this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",o),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 we(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(o){this.logger.error("\u274C \u7A7A\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",o)}}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 Te(this.xiaozhiConnectionManager,m).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 Te(this.xiaozhiConnectionManager,m).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 Te(this.xiaozhiConnectionManager,m).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 Te(this.xiaozhiConnectionManager,m).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 Te(this.xiaozhiConnectionManager,m).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 Te(this.xiaozhiConnectionManager,m).removeEndpoint(e)}async connectWithRetry(e,t,r=5,s=1e3,o=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 p=Math.min(s*i**(l-1),o);this.logger.info(`${t} - ${p}ms \u540E\u91CD\u8BD5...`),await this.sleep(p)}}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("*",xu({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 Ar;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/tool-calls/logs",t=>this.toolCallLogApiHandler.getToolCallLogs(t)),this.app?.get("/api/coze/workspaces",t=>Le.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>Le.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>Le.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>Le.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 o={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(o))}}),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=Ou({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:Au});this.httpServer=e,this.wss=new Lu({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(),Ws(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function Du(){let n=await Promise.resolve().then(()=>(ar(),ir)),e=await Promise.resolve().then(()=>(te(),to)),t=await Promise.resolve().then(()=>(y(),Vs));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}c(Du,"importModules");async function _u(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await Du();process.env.XIAOZHI_CONFIG_DIR&&(r.initLogFile(process.env.XIAOZHI_CONFIG_DIR),r.enableFileLogging(!0));let s=new e;await s.start(),r.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F");let o=c(async()=>{r.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await s.stop(),process.exit(0)},"cleanup");process.on("SIGINT",o),process.on("SIGTERM",o)}catch(e){console.error("WebServer \u542F\u52A8\u5931\u8D25:",e),process.exit(1)}}c(_u,"main");import.meta.url===`file://${process.argv[1]}`&&_u();
103
98
  //# sourceMappingURL=WebServerStandalone.js.map