xiaozhi-client 1.9.3-beta.1 → 1.9.3-rc.0

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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
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...
2
+ var ba=Object.create;var gt=Object.defineProperty;var Ia=Object.getOwnPropertyDescriptor;var Aa=Object.getOwnPropertyNames;var Na=Object.getPrototypeOf,$a=Object.prototype.hasOwnProperty;var c=(n,e)=>gt(n,"name",{value:e,configurable:!0});var d=(n,e)=>()=>(n&&(e=n(n=0)),e);var T=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Te=(n,e)=>{for(var t in e)gt(n,t,{get:e[t],enumerable:!0})},no=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Aa(e))!$a.call(n,s)&&s!==t&&gt(n,s,{get:()=>e[s],enumerable:!(r=Ia(e,s))||r.enumerable});return n};var Oa=(n,e,t)=>(t=n!=null?ba(Na(n)):{},no(e||!n||!n.__esModule?gt(t,"default",{value:n,enumerable:!0}):t,n)),Dt=n=>no(gt({},"__esModule",{value:!0}),n);function io(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function ye(n){return io(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var Ne,kt,pe=d(()=>{"use strict";Ne=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(Ne||{}),kt=(i=>(i.DISCONNECTED="disconnected",i.CONNECTING="connecting",i.CONNECTED="connected",i.RECONNECTING="reconnecting",i.FAILED="failed",i.ERROR="error",i))(kt||{});c(io,"isValidToolJSONSchema");c(ye,"ensureToolJSONSchema")});var Z,Xe=d(()=>{"use strict";(t=>{function n(r){if(!r||typeof r!="object")return r;let s=JSON.parse(JSON.stringify(r));if(!("type"in s))return s;let o=s.type;if(o==="sse"||o==="streamable-http")return s;let i;return o==="streamableHttp"||o==="streamable_http"?i="streamable-http":o==="s_se"||o==="s-se"?i="sse":i=e(o),(i==="sse"||i==="streamable-http")&&(s.type=i),s}t.normalizeTypeField=n,c(n,"normalizeTypeField");function e(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}c(e,"convertToKebabCase")})(Z||={})});function ut(n,e){try{let r=new URL(n).pathname;return r.endsWith("/sse")?"sse":r.endsWith("/mcp")?"streamable-http":(e?.serviceName,"streamable-http")}catch{return e?.serviceName,"streamable-http"}}function Wr(n){if(n.type)return Z.normalizeTypeField(n);if(n.command)return{...n,type:"stdio"};if(n.url!==void 0&&n.url!==null){let e=ut(n.url,{serviceName:n.name});return{...n,type:e}}throw new Error(`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${n.name} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`)}var _t=d(()=>{"use strict";Xe();pe();c(ut,"inferTransportTypeFromUrl");c(Wr,"inferTransportTypeFromConfig")});var co={};Te(co,{Logger:()=>De,createLogger:()=>ka,getGlobalLogLevel:()=>Ha,getLogger:()=>ao,logger:()=>u,setGlobalLogLevel:()=>ja,setGlobalLogger:()=>_a});import*as B from"fs";import*as Q from"path";import pt from"chalk";import Je from"pino";import{z as xa}from"zod";function Da(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 ka(n){return new De(n||jt)}function ao(){return Ye||(Ye=new De(jt)),Ye}function _a(n){Ye=n}function ja(n){jt=n,Ye&&Ye.setLevel(n)}function Ha(){return jt}var La,De,Ye,jt,u,y=d(()=>{"use strict";La=xa.enum(["fatal","error","warn","info","debug","trace"]);c(Da,"formatDateTime");De=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=La.safeParse(t);return r.success?r.data:"info"}createPinoInstance(){let e=[];if(!this.isDaemonMode){let t=this.createOptimizedConsoleStream();e.push({level:this.logLevel,stream:t})}return this.logFilePath&&e.push({level:this.logLevel,stream:Je.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Je.destination({dest:"/dev/null"})}),Je({level:this.logLevel,timestamp:Je.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:Je.stdSerializers?.err||(t=>t)}},Je.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:pt.gray}],[30,{name:"INFO",color:pt.blue}],[40,{name:"WARN",color:pt.yellow}],[50,{name:"ERROR",color:pt.red}],[60,{name:"FATAL",color:pt.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)}catch{}}formatConsoleMessageOptimized(e,t){let r=Da(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=Q.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),B.existsSync(this.logFilePath)||B.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(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||!B.existsSync(this.logFilePath)))try{B.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=Q.dirname(this.logFilePath),t=Q.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=Q.join(e,`${t}.${s}.log`),i=Q.join(e,`${t}.${s+1}.log`);B.existsSync(o)&&(s===this.maxLogFiles-1?B.unlinkSync(o):B.renameSync(o,i))}let r=Q.join(e,`${t}.1.log`);B.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=Q.dirname(this.logFilePath),t=Q.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=Q.join(e,`${t}.${r}.log`);B.existsSync(s)&&B.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}},Ye=null,jt="info";c(ka,"createLogger");c(ao,"getLogger");c(_a,"setGlobalLogger");c(ja,"setGlobalLogLevel");c(Ha,"getGlobalLogLevel");u=ao()});import{isAbsolute as za,resolve as Fa}from"path";function uo(n,e){ht.debug(`\u8F6C\u6362\u914D\u7F6E: ${n}`,e);try{if(!n||typeof n!="string")throw new k("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new k("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",n);let t=Z.normalizeTypeField(e),r=Ua(n,t);return qa(r),ht.debug(`\u914D\u7F6E\u8F6C\u6362\u6210\u529F: ${n} -> ${r.type}`),r}catch(t){throw ht.error(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${n}`,t),t instanceof k?t:new k(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,n)}}function Ua(n,e){if(Ba(e))return Va(n,e);if("type"in e)switch(e.type){case"sse":return lo(n,e);case"streamable-http":return go(n,e);default:throw new k(`\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 k("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",n);if(ut(e.url||"")==="sse"){let s={...e,type:"sse"};return lo(n,s)}let r={...e,type:"streamable-http"};return go(n,r)}throw new k("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",n)}function Va(n,e){if(!e.command)throw new k("\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(Wa(s)){let o=Fa(t,s);return ht.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,timeout:3e4}}function lo(n,e){if(e.url===void 0||e.url===null)throw new k("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.type==="sse"?"sse":ut(e.url||""),r=e.url?Br(e.url):!1,s={name:n,type:t,url:e.url,timeout:3e4,headers:e.headers};return r&&(s.modelScopeAuth=!0),ht.info(`[ConfigAdapter] \u670D\u52A1 ${n} URL: ${e.url}\uFF0C\u63A8\u65AD\u7C7B\u578B: ${t}${r?" (ModelScope)":""}`),s}function go(n,e){if(e.url===void 0||e.url===null)throw new k("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.url||"";return{name:n,type:"streamable-http",url:t,timeout:3e4,headers:e.headers}}function Wa(n){return za(n)?!1:!!(n.startsWith("./")||n.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(n))}function Ba(n){return"command"in n&&typeof n.command=="string"}function Br(n){return n.includes("modelscope.net")||n.includes("modelscope.cn")}function qa(n){if(!n.name||typeof n.name!="string")throw new k("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(n.type&&!Object.values(Ne).includes(n.type))throw new k(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`);if(!n.type)throw new k("\u4F20\u8F93\u7C7B\u578B\u672A\u6307\u5B9A\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6216\u542F\u7528\u81EA\u52A8\u63A8\u65AD");switch(n.type){case"stdio":if(!n.command)throw new k("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(n.url===void 0||n.url===null)throw new k("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(n.url===void 0||n.url===null)throw new k("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new k(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}var ht,k,qr=d(()=>{"use strict";pe();_t();y();Xe();ht=u.withTag("ConfigAdapter"),k=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{c(this,"ConfigValidationError")}};c(uo,"convertLegacyToNew");c(Ua,"convertByConfigType");c(Va,"convertLocalConfig");c(lo,"convertSSEConfig");c(go,"convertStreamableHTTPConfig");c(Wa,"isRelativePath");c(Ba,"isLocalConfig");c(Br,"isModelScopeURL");c(qa,"validateNewConfig")});import{EventEmitter as Ga}from"events";function P(){return Ke||(Ke=new Gr),Ke}function po(){Ke&&(Ke.destroy(),Ke=null)}var Gr,Ke,z=d(()=>{"use strict";y();Gr=class extends Ga{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")}},Ke=null;c(P,"getEventBus");c(po,"destroyEventBus")});function Xa(n){if(!n||typeof n!="object")throw new Error("\u670D\u52A1\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u6709\u6548\u7684\u5BF9\u8C61");if("command"in n&&typeof n.command=="string")return"stdio";if("type"in n&&n.type==="sse")return"sse";if("type"in n&&n.type==="streamable-http"||"url"in n&&typeof n.url=="string")return"streamable-http";throw new Error("\u65E0\u6CD5\u8BC6\u522B\u7684 MCP \u670D\u52A1\u914D\u7F6E\u7C7B\u578B\u3002\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5\uFF08stdio\uFF09\u3001type: 'sse' \u5B57\u6BB5\uFF08sse\uFF09\u6216 url \u5B57\u6BB5\uFF08streamable-http\uFF09")}function Xr(n,e){if(!e||typeof e!="object"||Array.isArray(e))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61`};try{let t=Xa(e),r=e;switch(t){case"stdio":if(!r.command||typeof r.command!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 command \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(!Array.isArray(r.args))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 args \u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4`};if(r.env&&(typeof r.env!="object"||Array.isArray(r.env)))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 env \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"sse":if(r.type!=="sse")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 type \u5B57\u6BB5\u5FC5\u987B\u662F "sse"`};if(!r.url||typeof r.url!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(r.headers&&(typeof r.headers!="object"||Array.isArray(r.headers)))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 headers \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;case"streamable-http":if(!r.url||typeof r.url!="string")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7F3A\u5C11\u5FC5\u9700\u7684 url \u5B57\u6BB5\u6216\u5B57\u6BB5\u7C7B\u578B\u4E0D\u6B63\u786E`};if(r.type&&r.type!=="streamable-http")return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 type \u5B57\u6BB5\u5982\u679C\u5B58\u5728\uFF0C\u5FC5\u987B\u662F "streamable-http"`};if(r.headers&&(typeof r.headers!="object"||Array.isArray(r.headers)))return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684 headers \u5B57\u6BB5\u5FC5\u987B\u662F\u5BF9\u8C61`};break;default:return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u7C7B\u578B\u65E0\u6CD5\u8BC6\u522B`}}return{valid:!0}}catch(t){return{valid:!1,error:`\u670D\u52A1 "${n}" \u7684\u914D\u7F6E\u65E0\u6548: ${t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF"}`}}}function E(n){return`${n.slice(0,30)}...${n.slice(-10)}`}var Ht=d(()=>{"use strict";c(Xa,"getMcpServerCommunicationType");c(Xr,"validateMcpServerConfig");c(E,"sliceEndpoint")});var Co={};Te(Co,{ConfigManager:()=>Ft,configManager:()=>m});import{copyFileSync as Ja,existsSync as zt,readFileSync as Ya,writeFileSync as Ka}from"fs";import{dirname as Za,resolve as ke}from"path";import{fileURLToPath as Qa}from"url";import*as Ut from"comment-json";import ho from"dayjs";import Jr from"json5";import*as fo from"json5-writer";var mo,Yr,Ft,m,ee=d(()=>{"use strict";z();Xe();Ht();y();mo=Za(Qa(import.meta.url)),Yr={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},Ft=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=[ke(mo,"templates","default","xiaozhi.config.json"),ke(mo,"..","templates","default","xiaozhi.config.json"),ke(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>zt(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=ke(e,r);if(zt(s))return s}return ke(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=ke(e,r);if(zt(s))return!0}return!1}initConfig(e="json"){if(!zt(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=ke(t,r);Ja(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=Ya(e,"utf8").replace(/^\uFEFF/,""),o;switch(t){case"json5":o=Jr.parse(s),this.json5Writer=fo.load(s);break;case"jsonc":o=Ut.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=Z.normalizeTypeField(s),i=Xr(r,o);if(!i.valid)throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A${i.error}`)}}getConfig(){return this.config=this.loadConfig(),JSON.parse(JSON.stringify(this.config))}getMutableConfig(){return this.config||(this.config=this.loadConfig()),this.config}getMcpEndpoint(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?e.mcpEndpoint[0]||"":e.mcpEndpoint}getMcpEndpoints(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?[...e.mcpEndpoint]:e.mcpEndpoint?[e.mcpEndpoint]:[]}getMcpServers(){return this.getConfig().mcpServers}getMcpServerConfig(){return this.getConfig().mcpServerConfig||{}}getServerToolsConfig(e){return this.getMcpServerConfig()[e]?.tools||{}}isToolEnabled(e,t){return this.getServerToolsConfig(e)[t]?.enable!==!1}updateMcpEndpoint(e){if(Array.isArray(e)){for(let r of e)if(!r||typeof r!="string")throw new Error("MCP \u7AEF\u70B9\u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}let t=this.getMutableConfig();t.mcpEndpoint=e,this.saveConfig(t)}addMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.includes(e))throw new Error(`MCP \u7AEF\u70B9 ${e} \u5DF2\u5B58\u5728`);let 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=Xr(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()):s=Jr.stringify(e,null,2)}catch{s=Jr.stringify(e,null,2)}break;case"jsonc":try{s=Ut.stringify(e,null,2)}catch{s=JSON.stringify(e,null,2)}break;default:s=JSON.stringify(e,null,2);break}Ka(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??Yr.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??Yr.heartbeatTimeout,reconnectInterval:t.reconnectInterval??Yr.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)}catch{}}updateWebUIConfig(e){let t=this.getMutableConfig();t.webUI||(t.webUI={}),Object.assign(t.webUI,e),this.saveConfig(t)}setWebUIPort(e){if(!Number.isInteger(e)||e<=0||e>65535)throw new Error("\u7AEF\u53E3\u53F7\u5FC5\u987B\u662F 1-65535 \u4E4B\u95F4\u7684\u6574\u6570");this.updateWebUIConfig({port:e})}updatePlatformConfig(e,t){let r=this.getMutableConfig();r.platforms||(r.platforms={}),r.platforms[e]=t,this.saveConfig(r)}getCozePlatformConfig(){let t=this.getConfig().platforms?.coze;return!t||!t.token?null:{token:t.token}}getCozeToken(){return this.getCozePlatformConfig()?.token||null}setCozePlatformConfig(e){if(!e.token||typeof e.token!="string"||e.token.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.updatePlatformConfig("coze",{token:e.token.trim()})}isCozeConfigValid(){let e=this.getCozePlatformConfig();return e!==null&&typeof e.token=="string"&&e.token.trim()!==""}async _updateMCPServerToolStats(e,t,r,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=ho(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 $=e;s=`${$}__${t}`,o=r,a=`${$}/${t}`}else s=e,o=t,i=r||!0,a=s;let l=this.getCustomMCPTools(),g=l.findIndex($=>$.name===s);if(g===-1)return;let p=[...l],h=p[g];h.stats||(h.stats={});let S=h.stats.usageCount||0,f=h.stats.lastUsedTime;i&&(h.stats.usageCount=S+1),(!f||new Date(o)>new Date(f))&&(h.stats.lastUsedTime=ho(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=Ft.getInstance()});import{createHash as ec}from"crypto";function Me(n,e){let t=ec("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function _e(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function $e(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 Pe,Vt=d(()=>{"use strict";c(Me,"generateCacheKey");c(_e,"isCacheExpired");c($e,"shouldCleanupCache");Pe={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});var Wt,vo=d(()=>{"use strict";Vt();Wt=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}`)})},Pe.CLEANUP_INTERVAL),this.logger.debug(`[CacheLifecycle] \u542F\u52A8\u81EA\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${Pe.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:Pe.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 _e(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&&$e(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)_e(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}`),_e(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 Bt,So=d(()=>{"use strict";Bt=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 Eo(n,e){return{content:[{type:"text",text:e?tc(e,n):To(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 tc(n,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
4
4
 
5
5
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
6
6
  - \u4EFB\u52A1ID: ${e}
@@ -11,7 +11,7 @@ var ea=Object.create;var ot=Object.defineProperty;var ta=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: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...
14
+ 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:To(e)};return t[n]||t.default}function To(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
15
15
 
16
16
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
17
17
  - \u4EFB\u52A1ID: ${n}
@@ -21,22 +21,23 @@ var ea=Object.create;var ot=Object.defineProperty;var ta=Object.getOwnPropertyDe
21
21
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
22
22
  1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
23
23
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
24
- 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var 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(`
24
+ 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var mt,Kr=d(()=>{"use strict";mt=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(Eo,"createTimeoutResponse");c(tc,"getToolSpecificTimeoutMessage");c(To,"getDefaultTimeoutMessage")});var yo=d(()=>{"use strict"});import{Hono as rc}from"hono";var Mo,qt=d(()=>{"use strict";Mo=c(()=>new rc,"createApp")});var Zr=d(()=>{"use strict";Vt();yo();Kr();qt()});import{createHash as sc}from"crypto";import{existsSync as dt,mkdirSync as oc,readFileSync as Po,renameSync as nc,writeFileSync as Ro}from"fs";import{dirname as ic,resolve as wo}from"path";import ac from"dayjs";var Re,Gt=d(()=>{"use strict";y();Zr();Re=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 ac().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return wo(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return wo(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!dt(this.cachePath)){let e=ic(this.cachePath);dt(e)||(oc(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(!dt(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{Ro(r,t,"utf8"),nc(r,e)}catch(s){try{dt(r)&&Ro(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return sc("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:dt(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=Me(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=Me(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=Me(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=Me(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=Me(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)$e(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 ft,Qr=d(()=>{"use strict";pe();vo();So();y();ee();Vt();Kr();z();Gt();ft=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;cacheLifecycleManager;taskStateManager;mcpServiceManager;TIMEOUT=Pe.TIMEOUT;CACHE_TTL=Pe.CACHE_TTL;CLEANUP_INTERVAL=Pe.CLEANUP_INTERVAL;cleanupTimer;activeTasks=new Map;eventBus=P();constructor(e,t){this.logger=u,this.cacheManager=e||new Re,this.mcpServiceManager=t,this.cacheLifecycleManager=new Wt(this.logger),this.taskStateManager=new Bt(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:ye(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 mt){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}`),Eo(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){let i=o instanceof Error?o:new Error(String(o));throw await this.markTaskAsFailed(s,i),o}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new mt(`\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&&!_e(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:{let r=e.handler.type;throw new Error(`\u4E0D\u652F\u6301\u7684\u5904\u7406\u5668\u7C7B\u578B: ${r}`)}}}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 f=await h.text();throw new Error(`Coze API \u8BF7\u6C42\u5931\u8D25 (${h.status}): ${f}`)}let S=await h.json();return this.logger.debug("[CustomMCP] Coze API \u54CD\u5E94:",S),S}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"){if(t==="default")r=e.default;else if(typeof e.default=="object"&&e.default!==null&&t in e.default){let s=e.default[t];typeof s=="function"&&(r=s)}}if(!r&&t in e&&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;if(r.response_mapping){let a=this.extractResponseData(o,r.response_mapping);a!==void 0&&(i=a)}return{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"&&a!==null&&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 $=await o.mkdtemp(i.join(a.tmpdir(),"xiaozhi-script-")),ge=this.getScriptExtension(g);p=i.join($,`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 S={...process.env,...e.env,XIAOZHI_ARGUMENTS:JSON.stringify(t)},f=this.buildScriptCommand(g,p);return this.logger.debug(`[CustomMCP] \u6267\u884C\u811A\u672C\u547D\u4EE4: ${f.join(" ")}`),new Promise(($,ge)=>{let ae=r(f[0],f.slice(1),{env:S,stdio:["pipe","pipe","pipe"]}),xt="",j="";ae.stdout?.on("data",ue=>{xt+=ue.toString()}),ae.stderr?.on("data",ue=>{j+=ue.toString()});let Lt=setTimeout(()=>{ae.kill("SIGTERM"),ge(new Error(`\u811A\u672C\u6267\u884C\u8D85\u65F6 (${l}ms)`))},l);ae.on("close",ue=>{clearTimeout(Lt),ue===0?$(xt.trim()):ge(new Error(`\u811A\u672C\u6267\u884C\u5931\u8D25 (\u9000\u51FA\u7801: ${ue}): ${j.trim()}`))}),ae.on("error",ue=>{clearTimeout(Lt),ge(new Error(`\u811A\u672C\u6267\u884C\u9519\u8BEF: ${ue.message}`))}),t&&Object.keys(t).length>0&&(ae.stdin?.write(JSON.stringify(t)),ae.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];$e(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||{})){let a=i;if(a.taskId===e){a.status="completed",a.result=t,a.timestamp=new Date().toISOString(),a.consumed=!1,(s.customMCPResults||{})[o]=a;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||{})){let a=i;if(a.taskId===e){a.status="failed",a.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${t.message}`}]},a.timestamp=new Date().toISOString(),a.consumed=!0,(r.customMCPResults||{})[o]=a;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||{})){let i=o;$e(i)&&(e.customMCPResults?.[s]&&delete e.customMCPResults[s],t=!0,r++,i.taskId&&this.activeTasks.delete(i.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 Me(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 Xt,bo=d(()=>{"use strict";y();z();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 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 es,Ze,Ct,w,ts,Qe,je=d(()=>{"use strict";es={NAME:"xiaozhi-mcp-service",DEFAULT_PORT:3e3,DEFAULT_WEB_UI_PORT:9999,PID_FILE:"xiaozhi.pid",LOG_FILE:"xiaozhi.log"},Ze={FILE_NAMES:["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"],DEFAULT_FILE:"xiaozhi.config.default.json",DIR_ENV_VAR:"XIAOZHI_CONFIG_DIR"},Ct={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"},ts={PROCESS_STOP:3e3,SERVICE_START:1e4,NETWORK_REQUEST:5e3,FILE_OPERATION:2e3},Qe={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var q,He,D,b,R,we,he=d(()=>{"use strict";je();q=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)}},He=class n extends q{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"])}},D=class n extends q{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 q{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 q{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"])}},we=class n extends q{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 U from"fs";import te from"path";var I,vt=d(()=>{"use strict";he();I=class n{static{c(this,"FileUtils")}static exists(e){try{return U.existsSync(e)}catch{return!1}}static ensureDir(e){try{U.existsSync(e)||U.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 U.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=te.dirname(e);n.ensureDir(s),U.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=te.dirname(t);n.ensureDir(s),U.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)&&U.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=U.readdirSync(e);for(let o of s){if(r.exclude?.includes(o))continue;let i=te.join(e,o),a=te.join(t,o);U.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)&&U.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=U.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=U.readdirSync(e),s=[];for(let o of r){if(!t.includeHidden&&o.startsWith("."))continue;let i=te.join(e,o);if(s.push(i),t.recursive&&U.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 te.join(r,i)}static checkPermissions(e,t=U.constants.R_OK|U.constants.W_OK){try{return U.accessSync(e,t),!0}catch{return!1}}static getExtension(e){return te.extname(e).toLowerCase()}static getBaseName(e){return te.basename(e,te.extname(e))}static normalizePath(e){return te.normalize(e)}static resolvePath(e,t){return t?te.resolve(t,e):te.resolve(e)}}});import{realpathSync as cc}from"fs";import{tmpdir as lc}from"os";import O from"path";import{fileURLToPath as Io}from"url";var A,Oe=d(()=>{"use strict";je();vt();A=class n{static{c(this,"PathUtils")}static getPidFile(){let e=process.env[Ze.DIR_ENV_VAR]||process.cwd();return O.join(e,`.${es.NAME}.pid`)}static getLogFile(e){let t=e||process.cwd();return O.join(t,es.LOG_FILE)}static getConfigDir(){return process.env[Ze.DIR_ENV_VAR]||process.cwd()}static getWorkDir(){let e=n.getConfigDir();return O.join(e,Ct.WORK_DIR)}static getTemplatesDir(){let e=Io(import.meta.url),t=O.dirname(e);return[O.join(t,Ct.TEMPLATES_DIR),O.join(t,"..","..","..",Ct.TEMPLATES_DIR),O.join(t,"..","..","..","..",Ct.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=O.join(t,e);return I.exists(r)?r:null}static getScriptDir(){let e=Io(import.meta.url);return O.dirname(e)}static getProjectRoot(){let e=n.getScriptDir();return O.join(e,"..","..","..")}static getDistDir(){let e=n.getProjectRoot();return O.join(e,"dist")}static getRelativePath(e){let t=n.getProjectRoot();return O.relative(t,e)}static resolveConfigPath(e){let t=n.getConfigDir();if(e)return O.join(t,`xiaozhi.config.${e}`);for(let r of Ze.FILE_NAMES){let s=O.join(t,r);if(I.exists(s))return s}return O.join(t,Ze.FILE_NAMES[2])}static getDefaultConfigPath(){let e=n.getProjectRoot();return O.join(e,Ze.DEFAULT_FILE)}static validatePath(e){return!O.normalize(e).includes("..")}static ensurePathWithin(e,t){let r=O.resolve(t,e),s=O.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 O.join(process.cwd(),`${e}.js`);let r;try{r=cc(t)}catch{r=t}let s=O.dirname(r);return O.join(s,`${e}.js`)}static getMcpServerProxyPath(){return n.getExecutablePath("mcpServerProxy")}static getWebServerStandalonePath(){return n.getExecutablePath("WebServerStandalone")}static createSafePath(...e){let t=O.join(...e),r=O.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||lc()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import*as tt from"fs";import*as ze from"path";import Jt from"pino";var et,rs=d(()=>{"use strict";Oe();y();et=class{static{c(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e.maxRecords??100,e.logFilePath)this.logFilePath=ze.resolve(ze.normalize(e.logFilePath));else{let r=t||A.getTempDir();this.logFilePath=ze.join(ze.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: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(!tt.existsSync(this.logFilePath))return;let t=tt.readFileSync(this.logFilePath,"utf8").trim().split(`
27
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,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}
29
+ `:"");tt.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 Fe,ss=d(()=>{"use strict";y();Fe=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}}});var me,Yt=d(()=>{"use strict";me=class{static{c(this,"TransportAdapter")}messageHandler;connectionId;config;state="disconnected";constructor(e,t){this.messageHandler=e,this.config=t,this.connectionId=this.generateConnectionId()}async handleIncomingMessage(e){try{let t=await this.messageHandler.handleMessage(e);t!==null&&await this.sendMessage(t)}catch(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}}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.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"||!t.method?null:t}catch{return null}}serializeMessage(e){try{return JSON.stringify(e)}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25: ${r}`)}}validateMessage(e){if(!e||typeof e!="object")return!1;let t=e;return!(t.jsonrpc!=="2.0"||t.method&&typeof t.method!="string"||!t.method&&!t.result&&!t.error)}createTimeoutPromise(e,t){return Promise.race([e,new Promise((r,s)=>{setTimeout(()=>{s(new Error(`\u64CD\u4F5C\u8D85\u65F6: ${t}ms`))},t)})])}}});var rt,Ao=d(()=>{"use strict";Yt();rt=class extends me{static{c(this,"StdioAdapter")}messageBuffer="";isRunning=!1;encoding;bufferSize;constructor(e,t={name:"stdio"}){super(e,t),this.encoding=t.encoding||"utf8",this.bufferSize=t.bufferSize||1024*1024}async initialize(){try{process.stdin.setEncoding(this.encoding),this.setupProcessHandlers(),this.setState("connecting")}catch(e){throw this.setState("error"),e}}async start(){if(!this.isRunning)try{this.isRunning=!0,this.setupStdioHandlers(),this.setState("connected")}catch(e){throw this.setState("error"),this.isRunning=!1,e}}async stop(){if(this.isRunning)try{this.isRunning=!1,this.removeStdioHandlers(),this.setState("disconnected")}catch(e){throw e}}async sendMessage(e){try{let t=this.serializeMessage(e);process.stdout.write(`${t}
30
+ `)}catch(t){throw t}}setupStdioHandlers(){process.stdin.on("data",this.handleStdinData.bind(this)),process.stdin.on("end",this.handleStdinEnd.bind(this)),process.stdin.on("error",this.handleStdinError.bind(this))}removeStdioHandlers(){process.stdin.removeListener("data",this.handleStdinData.bind(this)),process.stdin.removeListener("end",this.handleStdinEnd.bind(this)),process.stdin.removeListener("error",this.handleStdinError.bind(this))}async handleStdinData(e){try{if(this.messageBuffer+=e.toString(),this.messageBuffer.length>this.bufferSize){this.messageBuffer="";return}let t=this.messageBuffer.split(`
31
+ `);this.messageBuffer=t.pop()||"";for(let r of t){let s=r.trim();s&&await this.processMessageLine(s)}}catch{}}async processMessageLine(e){try{let t=this.parseMessage(e);t&&await this.handleIncomingMessage(t)}catch{let r=`parse-error-${Date.now()}`;try{let o=JSON.parse(e.trim());o&&(typeof o.id=="string"||typeof o.id=="number")&&(r=o.id)}catch{}let s={jsonrpc:"2.0",error:{code:-32700,message:"\u89E3\u6790\u9519\u8BEF",data:{originalLine:e.substring(0,100)}},id:r};await this.sendMessage(s)}}handleStdinEnd(){this.stop().catch(e=>{})}handleStdinError(e){this.setState("error")}setupProcessHandlers(){let e=c(()=>{this.stop().finally(()=>{process.exit(0)})},"handleExit");process.on("SIGINT",e),process.on("SIGTERM",e),process.on("uncaughtException",t=>{this.setState("error")}),process.on("unhandledRejection",(t,r)=>{})}getStatus(){return{isRunning:this.isRunning,bufferSize:this.messageBuffer.length,encoding:this.encoding,connectionId:this.connectionId,state:this.state}}clearBuffer(){this.messageBuffer=""}}});import No,{WebSocketServer as gc}from"ws";var st,$o=d(()=>{"use strict";Yt();st=class extends me{static{c(this,"WebSocketAdapter")}ws=null;wsServer=null;endpointUrl;mode;wsState="disconnected";reconnectOptions;reconnectState;connectionTimeout=null;compression;batchQueue=[];batchTimer=null;batchSize;batchTimeout;connections=new Map;maxConnections;constructor(e,t){super(e,t),this.endpointUrl=t.endpointUrl,this.mode=t.mode||"client",this.compression=t.compression||!1,this.batchSize=t.batchSize||10,this.batchTimeout=t.batchTimeout||100,this.maxConnections=t.maxConnections||100,this.reconnectOptions={enabled:!0,maxAttempts:5,initialInterval:1e3,maxInterval:3e4,backoffStrategy:"exponential",backoffMultiplier:1.5,timeout:1e4,jitter:!0,...t.reconnect},this.reconnectState={attempts:0,nextInterval:this.reconnectOptions.initialInterval,timer:null,lastError:null,isManualDisconnect:!1}}async initialize(){try{this.setState("connecting"),this.wsState="connecting",this.mode==="client"?await this.initializeClient():await this.initializeServer()}catch(e){throw this.setState("error"),this.wsState="failed",e}}async initializeClient(){return 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 No(this.endpointUrl),this.compression,this.ws.on("open",()=>{this.handleConnectionSuccess(),e()}),this.ws.on("message",r=>{this.handleIncomingData(r)}),this.ws.on("close",(r,s)=>{this.handleConnectionClose(r,s.toString())}),this.ws.on("error",r=>{this.handleConnectionError(r),t(r)})})}async initializeServer(){return new Promise((e,t)=>{try{let r=new URL(this.endpointUrl),s=Number.parseInt(r.port)||8080;this.wsServer=new gc({port:s,perMessageDeflate:this.compression}),this.wsServer.on("connection",(o,i)=>{this.handleNewConnection(o,i)}),this.wsServer.on("error",o=>{t(o)}),e()}catch(r){t(r)}})}async start(){if(this.wsState!=="connected")try{this.setState("connected"),this.wsState="connected"}catch(e){throw this.setState("error"),this.wsState="failed",e}}async stop(){try{this.reconnectState.isManualDisconnect=!0,this.reconnectState.timer&&(clearTimeout(this.reconnectState.timer),this.reconnectState.timer=null),this.batchTimer&&(clearTimeout(this.batchTimer),this.batchTimer=null),await this.flushBatchQueue(),this.ws&&(this.ws.close(),this.ws=null),this.wsServer&&(this.wsServer.close(),this.wsServer=null);for(let[e,t]of this.connections)t.close();this.connections.clear(),this.setState("disconnected"),this.wsState="disconnected"}catch(e){throw e}}async sendMessage(e){if(this.wsState!=="connected")throw new Error(`WebSocket \u672A\u8FDE\u63A5 (\u72B6\u6001: ${this.wsState})`);return this.batchSize>1?this.addToBatchQueue(e):this.sendMessageDirect(e)}async sendMessageDirect(e){try{let t=this.serializeMessage(e);if(this.mode==="client"&&this.ws)this.ws.send(t);else if(this.mode==="server")for(let r of this.connections.values())r.readyState===No.OPEN&&r.send(t)}catch(t){throw t}}async addToBatchQueue(e){return new Promise((t,r)=>{this.batchQueue.push({message:e,timestamp:Date.now(),resolve:t,reject:r}),this.batchQueue.length>=this.batchSize?this.flushBatchQueue():this.batchTimer||(this.batchTimer=setTimeout(()=>{this.flushBatchQueue()},this.batchTimeout))})}async flushBatchQueue(){if(this.batchQueue.length===0)return;this.batchTimer&&(clearTimeout(this.batchTimer),this.batchTimer=null);let e=this.batchQueue.splice(0);try{let r={jsonrpc:"2.0",method:"batch",params:{messages:e.map(s=>s.message)},id:`batch_${Date.now()}`};await this.sendMessageDirect(r);for(let s of e)s.resolve()}catch(t){for(let r of e)r.reject(t)}}async handleIncomingData(e){try{let t=e.toString(),r=this.parseMessage(t);if(r)if(r.method==="batch"&&r.params&&typeof r.params=="object"&&"messages"in r.params&&Array.isArray(r.params.messages)){let s=r.params.messages;for(let o of s)await this.handleIncomingMessage(o)}else await this.handleIncomingMessage(r)}catch{}}handleConnectionSuccess(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.setState("connected"),this.wsState="connected",this.reconnectState.attempts=0,this.reconnectState.nextInterval=this.reconnectOptions.initialInterval,this.reconnectState.lastError=null}handleConnectionError(e){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.reconnectState.lastError=e,this.setState("error"),this.wsState="failed",this.cleanupConnection()}handleConnectionClose(e,t){this.setState("disconnected"),this.wsState="disconnected",!this.reconnectState.isManualDisconnect&&(this.shouldReconnect()?this.scheduleReconnect():this.wsState="failed")}handleNewConnection(e,t){if(this.connections.size>=this.maxConnections){e.close(1013,"\u670D\u52A1\u5668\u7E41\u5FD9");return}let r=`${this.getConnectionId()}_${this.connections.size}`;this.connections.set(r,e),e.on("message",s=>{this.handleIncomingData(s)}),e.on("close",()=>{this.connections.delete(r)}),e.on("error",s=>{this.connections.delete(r)})}cleanupConnection(){this.ws&&(this.ws.removeAllListeners(),this.ws=null)}shouldReconnect(){return this.reconnectOptions.enabled&&this.reconnectState.attempts<this.reconnectOptions.maxAttempts&&!this.reconnectState.isManualDisconnect}scheduleReconnect(){this.wsState="reconnecting",this.reconnectState.attempts++;let e=this.calculateReconnectInterval();this.reconnectOptions.jitter&&(e+=Math.random()*1e3),this.reconnectState.timer=setTimeout(async()=>{try{await this.initializeClient()}catch{this.shouldReconnect()?this.scheduleReconnect():this.wsState="failed"}},e)}calculateReconnectInterval(){let{backoffStrategy:e,initialInterval:t,maxInterval:r,backoffMultiplier:s}=this.reconnectOptions,o=this.reconnectState.attempts,i;switch(e){case"linear":i=t+o*1e3;break;case"exponential":i=t*s**o;break;default:i=t;break}return Math.min(i,r)}getStatus(){return{wsState:this.wsState,connectionState:this.state,mode:this.mode,endpointUrl:this.endpointUrl,connectionCount:this.connections.size,reconnectAttempts:this.reconnectState.attempts,batchQueueSize:this.batchQueue.length,compression:this.compression}}async forceReconnect(){if(this.mode!=="client")throw new Error("\u53EA\u6709\u5BA2\u6237\u7AEF\u6A21\u5F0F\u652F\u6301\u91CD\u8FDE");this.reconnectState.attempts=0,this.reconnectState.isManualDisconnect=!1,this.ws&&this.ws.close(),await this.initializeClient()}}});var Kt=d(()=>{"use strict";Yt();Ao();$o()});import{EventEmitter as uc}from"events";var ot,Oo=d(()=>{"use strict";Ve();qr();ee();Qr();z();Gt();bo();rs();ss();Kt();ot=class extends uc{static{c(this,"MCPServiceManager")}services=new Map;configs={};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(),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 Re(r),this.customMCPHandler=new ft,this.toolSyncManager=new Xt(m);let s=m.getToolCallLogConfig(),o=m.getConfigDir();this.toolCallLogger=new et(s,o),this.setupEventListeners(),this.messageHandler=new Fe(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){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()}}catch{}}async handleServiceDisconnected(e){try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServerToolsUpdated(e){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()}}catch{}}async handleGeneralConfigUpdated(e){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()}catch{}}async startAllServices(){try{this.customMCPHandler.initialize()}catch{}let e=Object.entries(this.configs);if(e.length===0)return;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++;i.length>0&&e.length,i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r=new Ue(t);await r.connect(),this.services.set(e,r),await this.refreshToolsCache();let s=r.getTools()}catch(r){throw this.services.delete(e),r}}async stopService(e){let t=this.services.get(e);if(t)try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache()}catch(r){throw r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),s=this.configs[e];s&&this.cacheManager.writeCacheEntry(e,r,s).then(()=>{}).catch(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{}}}catch{}let t=[];try{t=this.customMCPHandler.getTools()}catch{t=[]}for(let r of t)try{e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name})}catch{}return e}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t){let r=Date.now(),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.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.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)}else{let a=this.tools.get(e);a&&this.updateToolStatsSafe(e,a.serviceName,a.originalName,!1)}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)):(await this.updateCustomMCPToolLastUsedTime(e,o),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,o))}catch(o){throw o}}async updateToolStatsSafe(e,t,r,s){try{await this.updateToolStats(e,t,r,s)}catch{let i=s?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F"}}async updateCustomMCPToolStats(e,t){try{await m.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await m.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await m.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(s){throw s}}async updateMCPServerToolLastUsedTime(e,t,r){try{await m.updateMCPServerToolStatsWithLock(e,t,r,!1)}catch(s){throw s}}async callMCPTool(e,t,r){let{serviceName:s,toolName:o}=t,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{return await i.callTool(o,r||{})}catch(a){throw a}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect()}catch{}try{this.customMCPHandler.cleanup()}catch{}try{m.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=m.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch{return{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{await this.customMCPHandler.reinitialize()}catch(e){throw e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch{return!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch{return[]}}isModelScopeService(e){return e.url?Br(e.url):!1}handleModelScopeAuth(e,t){if(e.headers?.Authorization)return;let s=m.getModelScopeApiKey();if(s){t.apiKey=s;return}let o=e.url||"\u672A\u77E5",i=e.name||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${i}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${o}\u8BF7\u9009\u62E9\u4EE5\u4E0B\u4EFB\u4E00\u65B9\u5F0F\u914D\u7F6E\u8BA4\u8BC1\uFF1A1. \u5728\u670D\u52A1\u914D\u7F6E\u4E2D\u6DFB\u52A0 headers.Authorization2. \u6216\u8005\u5728\u5168\u5C40\u914D\u7F6E\u4E2D\u8BBE\u7F6E modelscope.apiKey3. \u6216\u8005\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF MODELSCOPE_API_TOKEN\u83B7\u53D6 ModelScope API Key: https://modelscope.cn/my?myInfo=true`)}enhanceServiceConfig(e){let t={...e};try{return this.isModelScopeService(e)&&this.handleModelScopeAuth(e,t),t}catch(r){throw r}}addServiceConfig(e,t){let r,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}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(t);this.configs[e]=r}removeServiceConfig(e){delete this.configs[e]}async syncToolsConfigToFile(){try{let e=m.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let s=r.getTools();if(s.length===0)continue;let o=e[t]?.tools||{},i={};for(let h of s){let S=o[h.name];S?i[h.name]={...S,description:h.description||S.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.hasToolsConfigChanged(o,i)){m.updateServerToolsConfig(t,i);let h=Object.keys(i).filter(f=>!o[f]),S=Object.keys(i).filter(f=>{let $=o[f],ge=i[f];return $&&$.description!==ge.description});h.length>0,S.length>0,g.length>0}}}catch{}}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;let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e));let 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);try{await this.refreshCustomMCPHandlerPublic()}catch{}}catch{let r=this.getRetryDelay(e),s=Math.min(r*2,3e5);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.failedServices.delete(e)}stopAllServiceRetries(){for(let[e,t]of this.retryTimers)clearTimeout(t);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);try{await t.initialize(),this.transportAdapters.set(e,t),this.emit("transportRegistered",{name:e,adapter:t})}catch(r){throw r}}async startTransports(){let e=[],t=[];for(let[r,s]of this.transportAdapters)try{await s.start(),e.push(r)}catch{t.push(r)}if(e.length===0&&t.length>0){let r=`\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5931\u8D25\uFF0C\u5931\u8D25\u7684\u9002\u914D\u5668: ${t.join(", ")}`;throw new Error(r)}t.length>0}async stopTransports(){try{for(let[e,t]of this.transportAdapters)try{await t.stop()}catch{}}catch(e){throw e}}getTransportAdapters(){return new Map(this.transportAdapters)}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");try{await this.startAllServices(),await this.startTransports(),this.isRunning=!0,this.emit("started")}catch(e){throw e}}async stop(){if(this.isRunning)try{await this.stopTransports(),await this.stopAllServices(),this.isRunning=!1,this.emit("stopped")}catch(e){throw e}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});for(let[t,r]of this.transportAdapters)e.push({id:r.getConnectionId(),name:t,state:r.getState()});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,transportCount:this.getTransportAdapters().size,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames()}catch{e=0,t=[]}let r=this.tools.size+e,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}}});import{SSEClientTransport as pc}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as hc}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as mc}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as dc}from"eventsource";function xo(n){switch(n.type){case"stdio":return fc(n);case"sse":return Cc(n);case"streamable-http":return vc(n);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function fc(n){if(!n.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new hc({command:n.command,args:n.args||[],env:n.env})}function Cc(n){if(!n.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Sc(n);return new pc(e,t)}function vc(n){if(!n.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Ec(n);return new mc(e,t)}function Sc(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Ec(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Lo(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(Ne).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 Do(){return["stdio","sse","streamable-http"]}var St,Zt=d(()=>{"use strict";pe();typeof global<"u"&&!global.EventSource&&(global.EventSource=dc);c(xo,"createTransport");c(fc,"createStdioTransport");c(Cc,"createSSETransport");c(vc,"createStreamableHTTPTransport");c(Sc,"createSSEOptions");c(Ec,"createStreamableHTTPOptions");c(Lo,"validateConfig");c(Do,"getSupportedTypes");St={create:xo,validateConfig:Lo,getSupportedTypes:Do}});import{Client as Tc}from"@modelcontextprotocol/sdk/client/index.js";var Ue,ko=d(()=>{"use strict";z();Zt();pe();_t();Ue=class{static{c(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";connectionTimeout=null;initialized=!1;eventBus=P();constructor(e){this.config=Wr(e),this.validateConfig()}validateConfig(){St.validateConfig(this.config)}async connect(){if(this.connectionState==="connecting")throw new Error("\u8FDE\u63A5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5B8C\u6210");return this.cleanupConnection(),this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error(`\u8FDE\u63A5\u8D85\u65F6 (${this.config.timeout||1e4}ms)`);this.handleConnectionError(r),t(r)},this.config.timeout||1e4);try{this.client=new Tc({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{tools:{}}}),this.transport=St.create(this.config),this.client.connect(this.transport).then(async()=>{this.handleConnectionSuccess(),await this.refreshTools(),this.eventBus.emitEvent("mcp:service:connected",{serviceName:this.config.name,tools:this.getTools(),connectionTime:new Date}),e()}).catch(r=>{this.handleConnectionError(r),t(r)})}catch(r){this.handleConnectionError(r),t(r)}})}handleConnectionSuccess(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionState="connected",this.initialized=!0}handleConnectionError(e){this.connectionState="disconnected",this.initialized=!1,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection(),this.eventBus.emitEvent("mcp:service:connection:failed",{serviceName:this.config.name,error:e,attempt:0})}cleanupConnection(){if(this.client){try{this.client.close().catch(()=>{})}catch{}this.client=null}this.transport=null,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.initialized=!1}async refreshTools(){if(!this.client)throw new Error("\u5BA2\u6237\u7AEF\u672A\u521D\u59CB\u5316");try{let t=(await this.client.listTools()).tools||[];this.tools.clear();for(let r of t)this.tools.set(r.name,r)}catch(e){throw e}}async disconnect(){this.cleanupConnection(),this.connectionState="disconnected",this.eventBus.emitEvent("mcp:service:disconnected",{serviceName:this.config.name,reason:"\u624B\u52A8\u65AD\u5F00",disconnectionTime:new Date})}getTools(){return Array.from(this.tools.values())}async callTool(e,t){if(!this.client)throw new Error(`\u670D\u52A1 ${this.config.name} \u672A\u8FDE\u63A5`);if(!this.tools.has(e))throw new Error(`\u5DE5\u5177 ${e} \u5728\u670D\u52A1 ${this.config.name} \u4E2D\u4E0D\u5B58\u5728`);try{return await this.client.callTool({name:e,arguments:t||{}})}catch(r){throw r}}getConfig(){return this.config}getStatus(){return{name:this.config.name,connected:this.connectionState==="connected",initialized:this.initialized,transportType:this.config.type||"streamable-http",toolCount:this.tools.size,connectionState:this.connectionState}}isConnected(){return this.connectionState==="connected"&&this.initialized}}});var _o={};Te(_o,{ConnectionState:()=>kt,MCPMessageHandler:()=>Fe,MCPService:()=>Ue,MCPServiceManager:()=>ot,MCPTransportType:()=>Ne,StdioAdapter:()=>rt,TransportAdapter:()=>me,TransportFactory:()=>St,WebSocketAdapter:()=>st,createTransport:()=>xo,ensureToolJSONSchema:()=>ye,getSupportedTypes:()=>Do,inferTransportTypeFromConfig:()=>Wr,inferTransportTypeFromUrl:()=>ut,isValidToolJSONSchema:()=>io,validateConfig:()=>Lo});var Ve=d(()=>{"use strict";Oo();ko();pe();_t();Zt();ss();Kt()});var jo=d(()=>{"use strict";Ve();y();Xe()});var Ho=d(()=>{"use strict";qr();jo()});var ns,zo=d(()=>{"use strict";y();ns=c(async(n,e)=>{n.set("logger",u),await e()},"loggerMiddleware")});import{cors as yc}from"hono/cors";var is,Fo=d(()=>{"use strict";is=yc({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var L,ce,as,Uo=d(()=>{"use strict";y();L=c((n,e,t)=>({error:{code:n,message:e,details:t}}),"createErrorResponse"),ce=c((n,e)=>({success:!0,data:n,message:e}),"createSuccessResponse"),as=c((n,e)=>{let t;try{let s=e.get("logger");s?t=s:t=u}catch{t=u}t.error("HTTP request error:",n);let r=L("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?n.stack:void 0);return e.json(r,500)},"errorHandlerMiddleware")});async function Mc(){try{return re||(re=new ot),re}catch{return re=new ot,re}}async function Pc(){try{re&&(await re.stopAllServices(),re=null)}catch(n){throw re=null,n}}function Rc(){re=null}function wc(){return re!==null}function bc(){return re}var re,nt,cs=d(()=>{"use strict";Ve();re=null;c(Mc,"getInstance");c(Pc,"cleanup");c(Rc,"reset");c(wc,"isInitialized");c(bc,"getCurrentInstance");nt={getInstance:Mc,cleanup:Pc,reset:Rc,isInitialized:wc,getCurrentInstance:bc};process.on("uncaughtException",async n=>{try{await nt.cleanup()}catch{}});process.on("unhandledRejection",async n=>{try{await nt.cleanup()}catch{}})});var ls,gs=d(()=>{"use strict";y();cs();qt();ls=c(async(n,e)=>{if(!n.get("mcpServiceManager"))try{let t=n.get("logger")||u;t.debug("[MCPMiddleware] \u6B63\u5728\u521D\u59CB\u5316 MCPServiceManager \u5B9E\u4F8B");let r=await nt.getInstance();n.set("mcpServiceManager",r),t.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){(n.get("logger")||u).error("[MCPMiddleware] \u521D\u59CB\u5316 MCPServiceManager \u5931\u8D25:",t)}await e()},"mcpServiceManagerMiddleware")});var us=d(()=>{"use strict";zo();Fo();Uo();gs();qt()});var de,Et=d(()=>{"use strict";y();ee();z();de=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 Qt,Vo=d(()=>{"use strict";Qt=class{static{c(this,"AbstractApiHandler")}getLogger(e){let t=e.get("logger");if(!t)throw new Error("Logger not found in context. Ensure loggerMiddleware is registered.");return t}}});var er,Wo=d(()=>{"use strict";us();Et();Vo();er=class extends Qt{static{c(this,"ConfigApiHandler")}configService;constructor(){super(),this.configService=new de}async getConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=await this.configService.getConfig();return t.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(ce(r))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r);let s=L("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25");return e.json(s,500)}}async updateConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let r=await e.req.json();if(!r||typeof r!="object"){let s=L("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u914D\u7F6E\u5BF9\u8C61");return e.json(s,400)}return await this.configService.updateConfig(r,"http-api"),t.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(ce(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(r){t.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r);let s=L("CONFIG_UPDATE_ERROR",r instanceof Error?r.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25");return e.json(s,400)}}async getMcpEndpoint(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let r=this.configService.getMcpEndpoint();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(ce({endpoint:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",r);let s=L("MCP_ENDPOINT_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25");return e.json(s,500)}}async getMcpEndpoints(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let r=this.configService.getMcpEndpoints();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(ce({endpoints:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",r);let s=L("MCP_ENDPOINTS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25");return e.json(s,500)}}async getMcpServers(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let r=this.configService.getMcpServers();return t.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(ce({servers:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",r);let s=L("MCP_SERVERS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25");return e.json(s,500)}}async getConnectionConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let r=this.configService.getConnectionConfig();return t.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(ce({connection:r}))}catch(r){t.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",r);let s=L("CONNECTION_CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25");return e.json(s,500)}}async reloadConfig(e){let t=this.getLogger(e);try{t.info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42");let r=await this.configService.reloadConfig();return t.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(ce(r,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(r){t.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",r);let s=L("CONFIG_RELOAD_ERROR",r instanceof Error?r.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25");return e.json(s,500)}}async getConfigPath(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let r=this.configService.getConfigPath();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(ce({path:r}))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",r);let s=L("CONFIG_PATH_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25");return e.json(s,500)}}async checkConfigExists(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let r=this.configService.configExists();return t.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${r}`),e.json(ce({exists:r}))}catch(r){t.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",r);let s=L("CONFIG_EXISTS_CHECK_ERROR",r instanceof Error?r.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25");return e.json(s,500)}}}});async function Ac(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 Nc(n,e){let t=n.status;return t===401?new fe("\u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6263\u5B50 API Token \u914D\u7F6E","AUTH_FAILED",401,e):t===429?new fe("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED",429,e):t>=500?new fe("\u6263\u5B50\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","SERVER_ERROR",t,e):new fe(e?.msg||`API \u8C03\u7528\u5931\u8D25: ${n.statusText}`,"API_ERROR",t,e)}var ps,fe,tr,hs=d(()=>{"use strict";y();ps=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())}}},fe=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(Ac,"retryWithBackoff");c(Nc,"handleCozeApiError");tr=class{static{c(this,"CozeApiService")}cache=new ps;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 fe(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 fe(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 Ac(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 fe("\u54CD\u5E94\u6570\u636E\u683C\u5F0F\u9519\u8BEF","PARSE_ERROR",o.status)}if(!o.ok)throw Nc(o,i);return i}catch(o){throw clearTimeout(s),o instanceof Error&&o.name==="AbortError"?new fe(`\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 rr(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 sr(){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 tr(n)}var We,Bo=d(()=>{"use strict";y();ee();hs();c(rr,"createSuccessResponse");c(F,"createErrorResponse");c(sr,"getCozeApiService");We=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 sr().getWorkspaces();return u.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(rr({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 sr().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(S=>S.handler.type==="proxy"&&S.handler.platform==="coze"&&S.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(rr({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=sr(),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(rr({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=sr().getCacheStats();return e.json(rr(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 or,qo=d(()=>{"use strict";y();Et();or=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 de}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 be,Go=d(()=>{"use strict";y();z();be=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)}}}});import{randomUUID as $c}from"crypto";var nr,Xo=d(()=>{"use strict";Ve();y();nr=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(e){if(!this.mcpMessageHandler)try{let t=e.get("mcpServiceManager");if(!t)throw new Error("MCPServiceManager \u672A\u5728 Context \u4E2D\u627E\u5230\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u95F4\u4EF6\u914D\u7F6E");this.mcpMessageHandler=new Fe(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let 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 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")}if(!this.validateMessage(g))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",r);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let 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(e),!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=$c(),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($){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,$),h.isAlive=!1}this.startHeartbeat(h);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"}}),f=c(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",f),p.signal.addEventListener("abort",f),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}
30
32
  data: ${r}
31
33
 
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+=`
34
+ `;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,ir,ms,ds,fs,lf,Jo=d(()=>{"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}})}},ir=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof x)}handle(e,t){return x.fromError(e,"INTERNAL_ERROR","system")}},ms=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})}},ds=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})}},fs=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new ms),this.registerHandler(new ds),this.registerHandler(new ir)}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 ir().handle(e,t)}},lf=new fs});var ar,le,Yo=d(()=>{"use strict";y();Jo();z();Xe();ar=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),S=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:h.addedCount,failedCount:h.failedCount,duration:S}),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=Z.normalizeTypeField(t);try{let s=le.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(le.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=le.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){let t=this;return t.statusCache||(t.statusCache=new Map),t.statusCache.get(e)||null}updateStatusCache(e,t){let r=this;r.statusCache||(r.statusCache=new Map),r.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName"),r=le.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!le.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=le.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!le.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 S=Z.normalizeTypeField(h);try{let f=await this.addMCPServerSingle(p,S);s.push({name:p,success:!0,config:S,tools:f.tools,status:f.status}),o.push(p),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:p,toolsCount:f.tools?.length||0})}catch(f){let $=this.handleError(f,"addMCPServersBatch",{serverName:p,serverConfig:S});s.push({name:p,success:!1,error:$.message,config:S}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:p,error:$.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=le.validateServiceName(s);if(!i.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(le.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let a=Z.normalizeTypeField(o),l=le.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})}};(r=>{function n(s){let o=[];if(!s||typeof s!="object")return o.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:o};if("command"in s)(!s.command||typeof s.command!="string")&&o.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),s.args&&!Array.isArray(s.args)&&o.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),s.env&&typeof s.env!="object"&&o.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in s){(!s.url||typeof s.url!="string")&&o.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(s.url)}catch{o.push("URL \u683C\u5F0F\u65E0\u6548")}}else o.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:o.length===0,errors:o}}r.validateConfig=n,c(n,"validateConfig");function e(s){let o=[];return!s||typeof s!="string"?(o.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:o}):((s.length<1||s.length>50)&&o.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(s)||o.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:o.length===0,errors:o})}r.validateServiceName=e,c(e,"validateServiceName");function t(s,o){let i=o.getConfig();return i.mcpServers&&s in i.mcpServers}r.checkServiceExists=t,c(t,"checkServiceExists")})(le||={})});var cr,Ko=d(()=>{"use strict";y();Et();z();cr=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;configService;statusService;eventBus;constructor(e,t){this.logger=u.withTag("RealtimeNotificationHandler"),this.notificationService=e,this.configService=new de,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 Oc,xc,lr,Zo=d(()=>{"use strict";je();Oc={[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"},xc={config_not_found:['\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6',"\u68C0\u67E5\u5F53\u524D\u76EE\u5F55\u662F\u5426\u4E3A\u9879\u76EE\u6839\u76EE\u5F55","\u8BBE\u7F6E XIAOZHI_CONFIG_DIR \u73AF\u5883\u53D8\u91CF\u6307\u5B9A\u914D\u7F6E\u76EE\u5F55"],service_port_occupied:["\u68C0\u67E5\u7AEF\u53E3\u662F\u5426\u88AB\u5176\u4ED6\u7A0B\u5E8F\u5360\u7528",'\u4F7F\u7528 "lsof -i :\u7AEF\u53E3\u53F7" \u67E5\u770B\u7AEF\u53E3\u4F7F\u7528\u60C5\u51B5',"\u66F4\u6539\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u7AEF\u53E3\u8BBE\u7F6E"],permission_denied:["\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u6743\u9650","\u4F7F\u7528 sudo \u6216\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C","\u786E\u4FDD\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u6743\u9650"],service_start_failed:["\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u662F\u5426\u6B63\u786E","\u67E5\u770B\u65E5\u5FD7\u6587\u4EF6\u83B7\u53D6\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F","\u786E\u4FDD\u6240\u6709\u4F9D\u8D56\u670D\u52A1\u6B63\u5E38\u8FD0\u884C"]},lr=class{static{c(this,"ERROR_MESSAGES")}static getHelpMessage(e){return Oc[e]}static getSolutions(e){return xc[e]||[]}static formatError(e,t){return`${t?`[${t}] `:""}${e.message}`}static getFriendlyMessage(e){return{[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"chalk";var gr,Qo=d(()=>{"use strict";Zo();he();gr=class n{static{c(this,"ErrorHandler")}static handle(e){e instanceof q?n.handleCLIError(e):n.handleUnknownError(e),process.exit(1)}static handleCLIError(e){if(process.env.DEBUG,e.suggestions&&e.suggestions.length>0)for(let r of e.suggestions);let t=lr.getHelpMessage(e.code)}static handleUnknownError(e){process.env.DEBUG||process.env.NODE_ENV}static async handleAsync(e,t){try{return await e()}catch(r){throw r instanceof q?r:r instanceof Error?new q(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new q(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static handleSync(e,t){try{return e()}catch(r){throw r instanceof q?r:r instanceof Error?new q(`${t}\u5931\u8D25: ${r.message}`,"OPERATION_FAILED",1):new q(`${t}\u5931\u8D25: \u672A\u77E5\u9519\u8BEF`,"OPERATION_FAILED",1)}}static warn(e,t){if(t&&t.length>0)for(let r of t);}static info(e){}static success(e){}}});var it,Cs=d(()=>{"use strict";it=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
35
  \u5806\u6808\u4FE1\u606F:
34
36
  ${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join(`
35
37
  `)}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
+ `)}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 en}from"child_process";var K,Tt=d(()=>{"use strict";je();he();K=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=en(`tasklist /FI "PID eq ${e}" /FO CSV /NH`,{encoding:"utf8",timeout:ts.PROCESS_STOP}).toLowerCase():t=en(`ps -p ${e} -o comm=`,{encoding:"utf8",timeout:ts.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 we(`\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 se,ur=d(()=>{"use strict";he();se=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 pr from"fs";import Ce from"path";import{fileURLToPath as tn}from"url";var xe,vs=d(()=>{"use strict";he();xe=class n{static{c(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(n.cachedVersion)return n.cachedVersion;try{let e=tn(import.meta.url),t=Ce.dirname(e),r=[Ce.join(t,"package.json"),Ce.join(t,"..","package.json"),Ce.join(t,"..","..","..","package.json"),Ce.join(t,"..","..","..","..","package.json")];for(let s of r)if(pr.existsSync(s)){let o=JSON.parse(pr.readFileSync(s,"utf8"));if(o.version)return n.cachedVersion=o.version,o.version}return n.cachedVersion="unknown","unknown"}catch{return n.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=tn(import.meta.url),t=Ce.dirname(e),r=[Ce.join(t,"package.json"),Ce.join(t,"..","package.json"),Ce.join(t,"..","..","..","package.json"),Ce.join(t,"..","..","..","..","package.json")];for(let s of r)if(pr.existsSync(s)){let o=JSON.parse(pr.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 rn={};Te(rn,{ProcessManagerImpl:()=>Ss});var Ss,sn=d(()=>{"use strict";he();vt();Cs();Oe();Tt();Ss=class{static{c(this,"ProcessManagerImpl")}getPidFilePath(){return A.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 K.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=it.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 K.killProcess(e)}catch(t){throw new we(`\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 we(`\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{}}processExists(e){return K.processExists(e)}cleanupContainerState(){if(K.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 nn={};Te(nn,{DaemonManagerImpl:()=>Es});import{spawn as on}from"child_process";import hr from"fs";var Es,an=d(()=>{"use strict";he();Oe();Tt();Es=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=A.getLogFile();if(!hr.existsSync(t))throw new D("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728");let{command:r,args:s}=K.getTailCommand(t),o=on(r,s,{stdio:"inherit"});process.on("SIGINT",()=>{o.kill(),process.exit(0)}),o.on("exit",()=>{process.exit(0)}),o.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=[A.getWebServerStandalonePath()];t.openBrowser&&s.push("--open-browser");let o={...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir(),XIAOZHI_DAEMON:"true",...t.env},i=on("node",s,{detached:!0,stdio:["ignore","pipe","pipe"],env:o,cwd:t.cwd||process.cwd()});if(!i.pid)throw new we("\u65E0\u6CD5\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B",0);return i}async setupLogging(e,t){try{let r=A.getLogFile(),o=(await import("path")).dirname(r);hr.existsSync(o)||hr.mkdirSync(o,{recursive:!0});let i=hr.createWriteStream(r,{flags:"a"});e.stdout?.pipe(i),e.stderr?.pipe(i);let a=new Date().toISOString();i.write(`
38
39
  [${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}}}});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=`
40
+ `)}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 ve from"ws";var H,Ie,mr=d(()=>{"use strict";pe();Ht();y();H=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{c(this,"ToolCallError")}},Ie=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:ye(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: ${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 ve(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===ve.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===ve.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===ve.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===ve.OPEN?"OPEN":this.ws?.readyState===ve.CONNECTING?"CONNECTING":this.ws?.readyState===ve.CLOSING?"CLOSING":this.ws?.readyState===ve.CLOSED?"CLOSED":"UNKNOWN"}),(!this.connectionStatus||this.ws?.readyState!==ve.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);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 H(-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 H?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 H(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let t=e;if(!t.name||typeof t.name!="string")throw new H(-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 H(-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 H?r=o:r=new H(-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 H(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),o(new H(-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 H(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?o(new H(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?o(new H(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?o(new H(-32001,l)):o(new H(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let s;e instanceof H?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===ve.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 cn={};Te(cn,{MCPServer:()=>Ts});import{EventEmitter as Lc}from"events";var _,Ts,ln=d(()=>{"use strict";y();mr();ee();_=new De,Ts=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(()=>(Ve(),_o));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(()=>(fr(),dr));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 Ie(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 gn={};Te(gn,{ServiceManagerImpl:()=>ys});var ys,un=d(()=>{"use strict";he();Oe();Tt();ur();ys=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)try{await this.processManager.gracefulKillProcess(t.pid),this.processManager.cleanupPidFile(),await new Promise(r=>setTimeout(r,1e3))}catch{}switch(this.checkEnvironment(),e.mode){case"mcp-server":await this.startMcpServerMode(e);break;case"stdio":await this.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&&se.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 He.configNotFound();try{if(!this.configManager.getConfig())throw new He("\u914D\u7F6E\u6587\u4EF6\u65E0\u6548")}catch(e){throw e instanceof He?e:new He(`\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=A.getExecutablePath("cli"),o=r("node",[s,"start","--server",t.toString()],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir(),XIAOZHI_DAEMON:"true",MCP_SERVER_MODE:"true"}});this.processManager.savePidInfo(o.pid,"daemon"),o.unref(),process.exit(0)}else{let{MCPServer:s}=await Promise.resolve().then(()=>(ln(),cn)),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=A.getMcpServerProxyPath(),s=t("node",[r],{stdio:"inherit",env:{...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir()}});this.processManager.savePidInfo(s.pid,"foreground")}async startWebServerInDaemon(){let{spawn:e}=await import("child_process"),t=A.getWebServerStandalonePath();if(!(await import("fs")).default.existsSync(t))throw new D(`WebServer \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`);let o=e("node",[t],{detached:!0,stdio:["ignore","ignore","ignore"],env:{...process.env,XIAOZHI_CONFIG_DIR:A.getConfigDir(),XIAOZHI_DAEMON:"true"}});this.processManager.savePidInfo(o.pid,"daemon"),o.unref(),process.exit(0)}async startWebServerInForeground(){let{WebServer:e}=await Promise.resolve().then(()=>(fr(),dr)),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=K.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"})}catch{}}}});var pn={};Te(pn,{TemplateManagerImpl:()=>Ms});import Dc from"fs";import Be from"path";var Ms,hn=d(()=>{"use strict";he();vt();Oe();ur();Ms=class{static{c(this,"TemplateManagerImpl")}templateCache=new Map;async getAvailableTemplates(){try{let e=A.findTemplatesDir();if(!e)return[];let t=[],r=Dc.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{}return t}catch{throw new R("\u65E0\u6CD5\u8BFB\u53D6\u6A21\u677F\u76EE\u5F55",A.findTemplatesDir()||"")}}async getTemplateInfo(e){try{if(se.validateTemplateName(e),this.templateCache.has(e))return this.templateCache.get(e);let t=A.getTemplatePath(e);if(!t)return null;let r=Be.join(t,"template.json"),s={};if(I.exists(r))try{let a=I.readFile(r);s=JSON.parse(a)}catch{}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:Be.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=Be.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)}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=Be.join(t.path,s);if(!I.exists(o))return!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=Be.relative(e,r);return!s.startsWith(".")&&s!=="template.json"&&!s.includes("node_modules")})}catch{return[]}}validateCreateOptions(e){se.validateRequired(e.targetPath,"targetPath"),se.validateRequired(e.projectName,"projectName"),se.validateProjectName(e.projectName),e.templateName&&se.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{}}findFilesByPattern(e,t){try{if(!t.includes("*")){let o=Be.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=Be.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{}}}});async function Rs(){return Ps.create()}var Ps,mn=d(()=>{"use strict";Qo();vt();Cs();Oe();Tt();ur();vs();y();ee();Ps=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",()=>xe),e.registerSingleton("platformUtils",()=>K),e.registerSingleton("formatUtils",()=>it),e.registerSingleton("fileUtils",()=>I),e.registerSingleton("pathUtils",()=>A),e.registerSingleton("validation",()=>se),e.registerSingleton("configManager",()=>m),e.registerSingleton("logger",()=>u),e.registerSingleton("errorHandler",()=>gr),e.registerSingleton("processManager",()=>{let t=(sn(),Dt(rn));return new t.ProcessManagerImpl}),e.registerSingleton("daemonManager",()=>{let t=(an(),Dt(nn)),r=e.get("processManager"),s=e.get("logger");return new t.DaemonManagerImpl(r,s)}),e.registerSingleton("serviceManager",()=>{let t=(un(),Dt(gn)),r=e.get("processManager"),s=e.get("configManager"),o=e.get("logger");return new t.ServiceManagerImpl(r,s,o)}),e.registerSingleton("templateManager",()=>{let t=(hn(),Dt(pn));return new t.TemplateManagerImpl}),e}};c(Rs,"createContainer")});import{spawn as Cr}from"child_process";var vr,dn=d(()=>{"use strict";mn();y();z();vr=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 Rs()).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 Rs()).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 Sr}from"fs";import{readFile as kc}from"fs/promises";import{dirname as _c,join as J}from"path";import{fileURLToPath as jc}from"url";var Er,fn=d(()=>{"use strict";y();Er=class{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=u.withTag("StaticFileHandler"),this.initializeWebPath()}initializeWebPath(){try{let e=_c(jc(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[J(e,"..","..","apps","frontend","dist"),J(e,"..","apps","frontend","dist"),J(e,"..","..","apps","frontend"),J(e,"..","apps","frontend"),J(e,"..","..","web","dist"),J(e,"..","web","dist"),J(e,"..","..","web"),J(e,"..","web"),J(e,"..","..","..","apps","frontend","dist"),J(e,"..","..","..","apps","frontend"),J(e,"..","..","..","web","dist"),J(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=Sr(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=J(this.webPath,r);if(!Sr(s)){let i=J(this.webPath,"index.html");return Sr(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 kc(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=`
40
41
  <!DOCTYPE html>
41
42
  <html>
42
43
  <head>
@@ -93,6 +94,6 @@ ${e.stack}`),r}static formatList(e,t="\u2022"){return e.map(r=>`${t} ${r}`).join
93
94
  </div>
94
95
  </body>
95
96
  </html>
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();
97
+ `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&Sr(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var Tr,Cn=d(()=>{"use strict";y();Tr=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 at,vn=d(()=>{"use strict";at=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(at||{})});import Hc from"ajv";import yr from"dayjs";var Mr,Sn=d(()=>{"use strict";y();ee();vn();Gt();Mr=class{static{c(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=u.withTag("ToolApiHandler"),this.ajv=new Hc({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}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)}this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${s}\uFF0C\u53C2\u6570:`,JSON.stringify(o));let i=e.get("mcpServiceManager");if(!i){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}await this.validateServiceAndTool(i,r,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 Re().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 S=h.instancePath||h.schemaPath||"",f=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 $=h.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${S} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${$}`}if(h.keyword==="enum"){let $=h.params?.allowedValues||[];return`\u53C2\u6570 ${S} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${$.join(", ")}`}return`\u53C2\u6570 ${S} ${f}`}).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(at).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(at).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 j=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(j,400)}let a=e.get("mcpServiceManager");if(!a){let j=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(j,503)}try{await this.validateServiceAndTool(a,r,s)}catch(j){let Lt=j instanceof Error?j.message:String(j),ue=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Lt);return e.json(ue,404)}let g=await new Re().getAllCachedTools(),p=`${r}__${s}`,h=g.find(j=>j.name===p);if(!h){let j=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`);return e.json(j,404)}let S=o||p,f=m.getCustomMCPTools();if(new Set(f.map(j=>j.name)).has(S)){let j=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(j,409)}let ge={name:S,description:i||h.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:h.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:yr().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 ae=m.getServerToolsConfig(r);ae?.toolName&&(ae[s].enable=!0,m.updateServerToolsConfig(r,ae),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 xt={tool:ge,toolName:S,toolType:"mcp",addedAt:yr().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(xt,`MCP \u5DE5\u5177 "${S}" \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:yr().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(at).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(at).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(f=>f.name===t);if(!g){let f=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(f,404)}if(g.handler.type!=="proxy"||g.handler.platform!=="coze"){let f=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(f,400)}!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 S={tool:h,toolName:t,toolType:"coze",updatedAt:yr().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 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 Rr from"fs";var Pr,En=d(()=>{"use strict";je();Oe();y();rs();Pr=class{static{c(this,"ToolCallLogService")}logger;configDir;constructor(e){this.logger=u.withTag("ToolCallLogService"),this.configDir=e||A.getConfigDir()}getLogFilePath(){return new et({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!Rr.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=Rr.readFileSync(e,"utf8").trim().split(`
98
+ `).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||Qe.DEFAULT_LIMIT,Qe.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 Le}from"zod";var zc,wr,Tn=d(()=>{"use strict";je();y();En();zc=Le.object({limit:Le.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=Qe.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Qe.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Le.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:Le.string().optional(),serverName:Le.string().optional(),success:Le.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Le.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:Le.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"]}),wr=class{static{c(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new Pr}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=zc.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 yt=T((Rv,yn)=>{"use strict";var Fc="2.0.0",Uc=Number.MAX_SAFE_INTEGER||9007199254740991,Vc=16,Wc=250,Bc=["major","premajor","minor","preminor","patch","prepatch","prerelease"];yn.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Vc,MAX_SAFE_BUILD_LENGTH:Wc,MAX_SAFE_INTEGER:Uc,RELEASE_TYPES:Bc,SEMVER_SPEC_VERSION:Fc,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Mt=T((wv,Mn)=>{"use strict";var qc=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};Mn.exports=qc});var ct=T((Se,Pn)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:ws,MAX_SAFE_BUILD_LENGTH:Gc,MAX_LENGTH:Xc}=yt(),Jc=Mt();Se=Pn.exports={};var Yc=Se.re=[],Kc=Se.safeRe=[],C=Se.src=[],Zc=Se.safeSrc=[],v=Se.t={},Qc=0,bs="[a-zA-Z0-9-]",el=[["\\s",1],["\\d",Xc],[bs,Gc]],tl=c(n=>{for(let[e,t]of el)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),M=c((n,e,t)=>{let r=tl(e),s=Qc++;Jc(n,s,e),v[n]=s,C[s]=e,Zc[s]=r,Yc[s]=new RegExp(e,t?"g":void 0),Kc[s]=new RegExp(r,t?"g":void 0)},"createToken");M("NUMERICIDENTIFIER","0|[1-9]\\d*");M("NUMERICIDENTIFIERLOOSE","\\d+");M("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${bs}*`);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",`${bs}+`);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,${ws}})(?:\\.(\\d{1,${ws}}))?(?:\\.(\\d{1,${ws}}))?`);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);Se.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);Se.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);Se.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 br=T((Iv,Rn)=>{"use strict";var rl=Object.freeze({loose:!0}),sl=Object.freeze({}),ol=c(n=>n?typeof n!="object"?rl:n:sl,"parseOptions");Rn.exports=ol});var Is=T((Nv,In)=>{"use strict";var wn=/^[0-9]+$/,bn=c((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=wn.test(n),r=wn.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),nl=c((n,e)=>bn(e,n),"rcompareIdentifiers");In.exports={compareIdentifiers:bn,rcompareIdentifiers:nl}});var V=T((Ov,Nn)=>{"use strict";var Ir=Mt(),{MAX_LENGTH:An,MAX_SAFE_INTEGER:Ar}=yt(),{safeRe:Nr,t:$r}=ct(),il=br(),{compareIdentifiers:As}=Is(),Ns=class n{static{c(this,"SemVer")}constructor(e,t){if(t=il(t),e instanceof n){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>An)throw new TypeError(`version is longer than ${An} characters`);Ir("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Nr[$r.LOOSE]:Nr[$r.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>Ar||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Ar||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Ar||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<Ar)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(Ir("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(Ir("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 As(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(Ir("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 As(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?Nr[$r.PRERELEASELOOSE]:Nr[$r.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]),As(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}};Nn.exports=Ns});var qe=T((Lv,On)=>{"use strict";var $n=V(),al=c((n,e,t=!1)=>{if(n instanceof $n)return n;try{return new $n(n,e)}catch(r){if(!t)return null;throw r}},"parse");On.exports=al});var Ln=T((kv,xn)=>{"use strict";var cl=qe(),ll=c((n,e)=>{let t=cl(n,e);return t?t.version:null},"valid");xn.exports=ll});var kn=T((jv,Dn)=>{"use strict";var gl=qe(),ul=c((n,e)=>{let t=gl(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Dn.exports=ul});var Hn=T((zv,jn)=>{"use strict";var _n=V(),pl=c((n,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new _n(n instanceof _n?n.version:n,t).inc(e,r,s).version}catch{return null}},"inc");jn.exports=pl});var Un=T((Uv,Fn)=>{"use strict";var zn=qe(),hl=c((n,e)=>{let t=zn(n,null,!0),r=zn(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");Fn.exports=hl});var Wn=T((Wv,Vn)=>{"use strict";var ml=V(),dl=c((n,e)=>new ml(n,e).major,"major");Vn.exports=dl});var qn=T((qv,Bn)=>{"use strict";var fl=V(),Cl=c((n,e)=>new fl(n,e).minor,"minor");Bn.exports=Cl});var Xn=T((Xv,Gn)=>{"use strict";var vl=V(),Sl=c((n,e)=>new vl(n,e).patch,"patch");Gn.exports=Sl});var Yn=T((Yv,Jn)=>{"use strict";var El=qe(),Tl=c((n,e)=>{let t=El(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Jn.exports=Tl});var oe=T((Zv,Zn)=>{"use strict";var Kn=V(),yl=c((n,e,t)=>new Kn(n,t).compare(new Kn(e,t)),"compare");Zn.exports=yl});var ei=T((eS,Qn)=>{"use strict";var Ml=oe(),Pl=c((n,e,t)=>Ml(e,n,t),"rcompare");Qn.exports=Pl});var ri=T((rS,ti)=>{"use strict";var Rl=oe(),wl=c((n,e)=>Rl(n,e,!0),"compareLoose");ti.exports=wl});var Or=T((oS,oi)=>{"use strict";var si=V(),bl=c((n,e,t)=>{let r=new si(n,t),s=new si(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");oi.exports=bl});var ii=T((iS,ni)=>{"use strict";var Il=Or(),Al=c((n,e)=>n.sort((t,r)=>Il(t,r,e)),"sort");ni.exports=Al});var ci=T((cS,ai)=>{"use strict";var Nl=Or(),$l=c((n,e)=>n.sort((t,r)=>Nl(r,t,e)),"rsort");ai.exports=$l});var Pt=T((gS,li)=>{"use strict";var Ol=oe(),xl=c((n,e,t)=>Ol(n,e,t)>0,"gt");li.exports=xl});var xr=T((pS,gi)=>{"use strict";var Ll=oe(),Dl=c((n,e,t)=>Ll(n,e,t)<0,"lt");gi.exports=Dl});var $s=T((mS,ui)=>{"use strict";var kl=oe(),_l=c((n,e,t)=>kl(n,e,t)===0,"eq");ui.exports=_l});var Os=T((fS,pi)=>{"use strict";var jl=oe(),Hl=c((n,e,t)=>jl(n,e,t)!==0,"neq");pi.exports=Hl});var Lr=T((vS,hi)=>{"use strict";var zl=oe(),Fl=c((n,e,t)=>zl(n,e,t)>=0,"gte");hi.exports=Fl});var Dr=T((ES,mi)=>{"use strict";var Ul=oe(),Vl=c((n,e,t)=>Ul(n,e,t)<=0,"lte");mi.exports=Vl});var xs=T((yS,di)=>{"use strict";var Wl=$s(),Bl=Os(),ql=Pt(),Gl=Lr(),Xl=xr(),Jl=Dr(),Yl=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 Wl(n,t,r);case"!=":return Bl(n,t,r);case">":return ql(n,t,r);case">=":return Gl(n,t,r);case"<":return Xl(n,t,r);case"<=":return Jl(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");di.exports=Yl});var Ci=T((PS,fi)=>{"use strict";var Kl=V(),Zl=qe(),{safeRe:kr,t:_r}=ct(),Ql=c((n,e)=>{if(n instanceof Kl)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?kr[_r.COERCEFULL]:kr[_r.COERCE]);else{let l=e.includePrerelease?kr[_r.COERCERTLFULL]:kr[_r.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 Zl(`${r}.${s}.${o}${i}${a}`,e)},"coerce");fi.exports=Ql});var Si=T((wS,vi)=>{"use strict";var Ls=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}};vi.exports=Ls});var ne=T((IS,Mi)=>{"use strict";var eg=/\s+/g,Ds=class n{static{c(this,"Range")}constructor(e,t){if(t=rg(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof ks)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e.trim().replace(eg," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(s=>!Ti(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&&lg(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&&ag)|(this.options.loose&&cg))+":"+e,s=Ei.get(r);if(s)return s;let o=this.options.loose,i=o?G[W.HYPHENRANGELOOSE]:G[W.HYPHENRANGE];e=e.replace(i,Sg(this.options.includePrerelease)),N("hyphen replace",e),e=e.replace(G[W.COMPARATORTRIM],og),N("comparator trim",e),e=e.replace(G[W.TILDETRIM],ng),N("tilde trim",e),e=e.replace(G[W.CARETTRIM],ig),N("caret trim",e);let a=e.split(" ").map(h=>gg(h,this.options)).join(" ").split(/\s+/).map(h=>vg(h,this.options));o&&(a=a.filter(h=>(N("loose invalid filter",h,this.options),!!h.match(G[W.COMPARATORLOOSE])))),N("range list",a);let l=new Map,g=a.map(h=>new ks(h,this.options));for(let h of g){if(Ti(h))return[h];l.set(h.value,h)}l.size>1&&l.has("")&&l.delete("");let p=[...l.values()];return Ei.set(r,p),p}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>yi(r,t)&&e.set.some(s=>yi(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 sg(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Eg(this.set[t],e,this.options))return!0;return!1}};Mi.exports=Ds;var tg=Si(),Ei=new tg,rg=br(),ks=Rt(),N=Mt(),sg=V(),{safeRe:G,t:W,comparatorTrimReplace:og,tildeTrimReplace:ng,caretTrimReplace:ig}=ct(),{FLAG_INCLUDE_PRERELEASE:ag,FLAG_LOOSE:cg}=yt(),Ti=c(n=>n.value==="<0.0.0-0","isNullSet"),lg=c(n=>n.value==="","isAny"),yi=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"),gg=c((n,e)=>(n=n.replace(G[W.BUILD],""),N("comp",n,e),n=hg(n,e),N("caret",n),n=ug(n,e),N("tildes",n),n=dg(n,e),N("xrange",n),n=Cg(n,e),N("stars",n),n),"parseComparator"),X=c(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),ug=c((n,e)=>n.trim().split(/\s+/).map(t=>pg(t,e)).join(" "),"replaceTildes"),pg=c((n,e)=>{let t=e.loose?G[W.TILDELOOSE]:G[W.TILDE];return n.replace(t,(r,s,o,i,a)=>{N("tilde",n,r,s,o,i,a);let l;return X(s)?l="":X(o)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:X(i)?l=`>=${s}.${o}.0 <${s}.${+o+1}.0-0`:a?(N("replaceTilde pr",a),l=`>=${s}.${o}.${i}-${a} <${s}.${+o+1}.0-0`):l=`>=${s}.${o}.${i} <${s}.${+o+1}.0-0`,N("tilde return",l),l})},"replaceTilde"),hg=c((n,e)=>n.trim().split(/\s+/).map(t=>mg(t,e)).join(" "),"replaceCarets"),mg=c((n,e)=>{N("caret",n,e);let t=e.loose?G[W.CARETLOOSE]:G[W.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(s,o,i,a,l)=>{N("caret",n,s,o,i,a,l);let g;return X(o)?g="":X(i)?g=`>=${o}.0.0${r} <${+o+1}.0.0-0`:X(a)?o==="0"?g=`>=${o}.${i}.0${r} <${o}.${+i+1}.0-0`:g=`>=${o}.${i}.0${r} <${+o+1}.0.0-0`:l?(N("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`):(N("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`),N("caret return",g),g})},"replaceCaret"),dg=c((n,e)=>(N("replaceXRanges",n,e),n.split(/\s+/).map(t=>fg(t,e)).join(" ")),"replaceXRanges"),fg=c((n,e)=>{n=n.trim();let t=e.loose?G[W.XRANGELOOSE]:G[W.XRANGE];return n.replace(t,(r,s,o,i,a,l)=>{N("xRange",n,r,s,o,i,a,l);let g=X(o),p=g||X(i),h=p||X(a),S=h;return s==="="&&S&&(s=""),l=e.includePrerelease?"-0":"",g?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&S?(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`),N("xRange return",r),r})},"replaceXRange"),Cg=c((n,e)=>(N("replaceStars",n,e),n.trim().replace(G[W.STAR],"")),"replaceStars"),vg=c((n,e)=>(N("replaceGTE0",n,e),n.trim().replace(G[e.includePrerelease?W.GTE0PRE:W.GTE0],"")),"replaceGTE0"),Sg=c(n=>(e,t,r,s,o,i,a,l,g,p,h,S)=>(X(r)?t="":X(s)?t=`>=${r}.0.0${n?"-0":""}`:X(o)?t=`>=${r}.${s}.0${n?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,X(g)?l="":X(p)?l=`<${+g+1}.0.0-0`:X(h)?l=`<${g}.${+p+1}.0-0`:S?l=`<=${g}.${p}.${h}-${S}`:n?l=`<${g}.${p}.${+h+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),Eg=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(N(n[r].semver),n[r].semver!==ks.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 Rt=T((NS,Ai)=>{"use strict";var wt=Symbol("SemVer ANY"),Hs=class n{static{c(this,"Comparator")}static get ANY(){return wt}constructor(e,t){if(t=Pi(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),js("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===wt?this.value="":this.value=this.operator+this.semver.version,js("comp",this)}parse(e){let t=this.options.loose?Ri[wi.COMPARATORLOOSE]:Ri[wi.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 bi(r[2],this.options.loose):this.semver=wt}toString(){return this.value}test(e){if(js("Comparator.test",e,this.options.loose),this.semver===wt||e===wt)return!0;if(typeof e=="string")try{e=new bi(e,this.options)}catch{return!1}return _s(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 Ii(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new Ii(this.value,t).test(e.semver):(t=Pi(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("=")||_s(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||_s(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Ai.exports=Hs;var Pi=br(),{safeRe:Ri,t:wi}=ct(),_s=xs(),js=Mt(),bi=V(),Ii=ne()});var bt=T((OS,Ni)=>{"use strict";var Tg=ne(),yg=c((n,e,t)=>{try{e=new Tg(e,t)}catch{return!1}return e.test(n)},"satisfies");Ni.exports=yg});var Oi=T((LS,$i)=>{"use strict";var Mg=ne(),Pg=c((n,e)=>new Mg(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");$i.exports=Pg});var Li=T((kS,xi)=>{"use strict";var Rg=V(),wg=ne(),bg=c((n,e,t)=>{let r=null,s=null,o=null;try{o=new wg(e,t)}catch{return null}return n.forEach(i=>{o.test(i)&&(!r||s.compare(i)===-1)&&(r=i,s=new Rg(r,t))}),r},"maxSatisfying");xi.exports=bg});var ki=T((jS,Di)=>{"use strict";var Ig=V(),Ag=ne(),Ng=c((n,e,t)=>{let r=null,s=null,o=null;try{o=new Ag(e,t)}catch{return null}return n.forEach(i=>{o.test(i)&&(!r||s.compare(i)===1)&&(r=i,s=new Ig(r,t))}),r},"minSatisfying");Di.exports=Ng});var Hi=T((zS,ji)=>{"use strict";var zs=V(),$g=ne(),_i=Pt(),Og=c((n,e)=>{n=new $g(n,e);let t=new zs("0.0.0");if(n.test(t)||(t=new zs("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 zs(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!o||_i(a,o))&&(o=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),o&&(!t||_i(t,o))&&(t=o)}return t&&n.test(t)?t:null},"minVersion");ji.exports=Og});var Fi=T((US,zi)=>{"use strict";var xg=ne(),Lg=c((n,e)=>{try{return new xg(n,e).range||"*"}catch{return null}},"validRange");zi.exports=Lg});var jr=T((WS,Bi)=>{"use strict";var Dg=V(),Wi=Rt(),{ANY:kg}=Wi,_g=ne(),jg=bt(),Ui=Pt(),Vi=xr(),Hg=Dr(),zg=Lr(),Fg=c((n,e,t,r)=>{n=new Dg(n,r),e=new _g(e,r);let s,o,i,a,l;switch(t){case">":s=Ui,o=Hg,i=Vi,a=">",l=">=";break;case"<":s=Vi,o=zg,i=Ui,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(jg(n,e,r))return!1;for(let g=0;g<e.set.length;++g){let p=e.set[g],h=null,S=null;if(p.forEach(f=>{f.semver===kg&&(f=new Wi(">=0.0.0")),h=h||f,S=S||f,s(f.semver,h.semver,r)?h=f:i(f.semver,S.semver,r)&&(S=f)}),h.operator===a||h.operator===l||(!S.operator||S.operator===a)&&o(n,S.semver))return!1;if(S.operator===l&&i(n,S.semver))return!1}return!0},"outside");Bi.exports=Fg});var Gi=T((qS,qi)=>{"use strict";var Ug=jr(),Vg=c((n,e,t)=>Ug(n,e,">",t),"gtr");qi.exports=Vg});var Ji=T((XS,Xi)=>{"use strict";var Wg=jr(),Bg=c((n,e,t)=>Wg(n,e,"<",t),"ltr");Xi.exports=Bg});var Zi=T((YS,Ki)=>{"use strict";var Yi=ne(),qg=c((n,e,t)=>(n=new Yi(n,t),e=new Yi(e,t),n.intersects(e,t)),"intersects");Ki.exports=qg});var ea=T((ZS,Qi)=>{"use strict";var Gg=bt(),Xg=oe();Qi.exports=(n,e,t)=>{let r=[],s=null,o=null,i=n.sort((p,h)=>Xg(p,h,t));for(let p of i)Gg(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 ia=T((QS,na)=>{"use strict";var ta=ne(),Us=Rt(),{ANY:Fs}=Us,It=bt(),Vs=oe(),Jg=c((n,e,t={})=>{if(n===e)return!0;n=new ta(n,t),e=new ta(e,t);let r=!1;e:for(let s of n.set){for(let o of e.set){let i=Kg(s,o,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Yg=[new Us(">=0.0.0-0")],ra=[new Us(">=0.0.0")],Kg=c((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Fs){if(e.length===1&&e[0].semver===Fs)return!0;t.includePrerelease?n=Yg:n=ra}if(e.length===1&&e[0].semver===Fs){if(t.includePrerelease)return!0;e=ra}let r=new Set,s,o;for(let f of n)f.operator===">"||f.operator===">="?s=sa(s,f,t):f.operator==="<"||f.operator==="<="?o=oa(o,f,t):r.add(f.semver);if(r.size>1)return null;let i;if(s&&o){if(i=Vs(s.semver,o.semver,t),i>0)return null;if(i===0&&(s.operator!==">="||o.operator!=="<="))return null}for(let f of r){if(s&&!It(f,String(s),t)||o&&!It(f,String(o),t))return null;for(let $ of e)if(!It(f,String($),t))return!1;return!0}let a,l,g,p,h=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1,S=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 f of e){if(p=p||f.operator===">"||f.operator===">=",g=g||f.operator==="<"||f.operator==="<=",s){if(S&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===S.major&&f.semver.minor===S.minor&&f.semver.patch===S.patch&&(S=!1),f.operator===">"||f.operator===">="){if(a=sa(s,f,t),a===f&&a!==s)return!1}else if(s.operator===">="&&!It(s.semver,String(f),t))return!1}if(o){if(h&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===h.major&&f.semver.minor===h.minor&&f.semver.patch===h.patch&&(h=!1),f.operator==="<"||f.operator==="<="){if(l=oa(o,f,t),l===f&&l!==o)return!1}else if(o.operator==="<="&&!It(o.semver,String(f),t))return!1}if(!f.operator&&(o||s)&&i!==0)return!1}return!(s&&g&&!o&&i!==0||o&&p&&!s&&i!==0||S||h)},"simpleSubset"),sa=c((n,e,t)=>{if(!n)return e;let r=Vs(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),oa=c((n,e,t)=>{if(!n)return e;let r=Vs(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");na.exports=Jg});var ga=T((tE,la)=>{"use strict";var Ws=ct(),aa=yt(),Zg=V(),ca=Is(),Qg=qe(),eu=Ln(),tu=kn(),ru=Hn(),su=Un(),ou=Wn(),nu=qn(),iu=Xn(),au=Yn(),cu=oe(),lu=ei(),gu=ri(),uu=Or(),pu=ii(),hu=ci(),mu=Pt(),du=xr(),fu=$s(),Cu=Os(),vu=Lr(),Su=Dr(),Eu=xs(),Tu=Ci(),yu=Rt(),Mu=ne(),Pu=bt(),Ru=Oi(),wu=Li(),bu=ki(),Iu=Hi(),Au=Fi(),Nu=jr(),$u=Gi(),Ou=Ji(),xu=Zi(),Lu=ea(),Du=ia();la.exports={parse:Qg,valid:eu,clean:tu,inc:ru,diff:su,major:ou,minor:nu,patch:iu,prerelease:au,compare:cu,rcompare:lu,compareLoose:gu,compareBuild:uu,sort:pu,rsort:hu,gt:mu,lt:du,eq:fu,neq:Cu,gte:vu,lte:Su,cmp:Eu,coerce:Tu,Comparator:yu,Range:Mu,satisfies:Pu,toComparators:Ru,maxSatisfying:wu,minSatisfying:bu,minVersion:Iu,validRange:Au,outside:Nu,gtr:$u,ltr:Ou,intersects:xu,simplifyRange:Lu,subset:Du,SemVer:Zg,re:Ws.re,src:Ws.src,tokens:Ws.t,SEMVER_SPEC_VERSION:aa.SEMVER_SPEC_VERSION,RELEASE_TYPES:aa.RELEASE_TYPES,compareIdentifiers:ca.compareIdentifiers,rcompareIdentifiers:ca.rcompareIdentifiers}});import{exec as ku,spawn as _u}from"child_process";import{promisify as ju}from"util";var At,ua,Ge,Bs=d(()=>{"use strict";y();z();At=Oa(ga(),1),ua=ju(ku),Ge=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=_u("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}`;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 ua("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 ua("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(o=>o&&typeof o=="string"&&At.default.valid(o));return e!=="all"&&(s=s.filter(o=>{let i=At.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)=>At.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=At.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 pa}from"zod";var Hu,Hr,ha=d(()=>{"use strict";y();z();Bs();Hu=pa.object({version:pa.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Hr=class{static{c(this,"UpdateApiHandler")}npmManager;logger=u.withTag("UpdateApiHandler");eventBus=P();activeInstalls=new Map;constructor(){this.npmManager=new Ge(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Hu.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 zr,ma=d(()=>{"use strict";vs();y();Bs();zr=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=xe.getVersionInfo();return this.logger.debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25");return e.json(r,500)}}async getVersionSimple(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=xe.getVersion();return this.logger.debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.json(this.createSuccessResponse({version:t}))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25");return e.json(r,500)}}async clearVersionCache(e){try{return this.logger.debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),xe.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let o=await new Ge().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 Ge().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 da=d(()=>{"use strict";Wo();Bo();qo();Go();Xo();Yo();Ko();dn();fn();Cn();Sn();Tn();ha();ma()});var Fr,fa=d(()=>{"use strict";y();z();Fr=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 Ur,Ca=d(()=>{"use strict";y();ee();z();Ur=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 zu}from"events";import{z as Ae}from"zod";var Fu,Uu,Nt,qs=d(()=>{"use strict";pe();y();mr();z();Ht();Fu={reconnectInterval:5e3,maxReconnectAttempts:3,connectionTimeout:1e4,errorRecoveryEnabled:!0,errorNotificationEnabled:!0,serviceAddedDelayMs:2e3,serviceRemovedDelayMs:2e3,batchAddedDelayMs:3e3},Uu=Ae.object({reconnectInterval:Ae.number().min(100,"reconnectInterval \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 100 \u7684\u6570\u5B57").optional(),maxReconnectAttempts:Ae.number().min(0,"maxReconnectAttempts \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),connectionTimeout:Ae.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),errorRecoveryEnabled:Ae.boolean().optional(),errorNotificationEnabled:Ae.boolean().optional(),serviceAddedDelayMs:Ae.number().min(0,"serviceAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),serviceRemovedDelayMs:Ae.number().min(0,"serviceRemovedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional(),batchAddedDelayMs:Ae.number().min(0,"batchAddedDelayMs \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 0 \u7684\u6570\u5B57").optional()}).strict(),Nt=class extends zu{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 ${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);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 ${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);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${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,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 ${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,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=Uu.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 ${E(s)} \u9884\u70ED\u5B8C\u6210`)}catch(o){this.logger.warn(`\u5C0F\u667A\u63A5\u5165\u70B9 ${E(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: ${E(e)}`);try{let r=new Ie(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().map(t=>({name:t.name,description:t.description,inputSchema:ye(t.inputSchema)}))}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(o){this.logger.error(`\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25: ${E(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: ${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 Ie(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 Vu(n){return n&&["loadBalanceStrategy","reconnectStrategy","maxReconnectDelay","reconnectBackoffMultiplier","jitterEnabled"].filter(s=>s in n).length>0,new Nt(m,n)}async function va(n){if(Ee&&Y==="initialized")return Ee;if(ie&&Y==="initializing")return ie;Y==="failed"&&Gs(),Y="initializing",ie=Vu(n);try{return Ee=await ie,Y="initialized",Ot=`xiaozhi-connection-manager-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,$t=null,Ee}catch(e){throw Y="failed",$t=e,ie=null,e}}async function Sa(){if(Y!=="cleanup"){Y="cleanup";try{if(ie){try{await(await ie).cleanup()}catch{}ie=null}Ee&&(await Ee.cleanup(),Ee=null),Y="not_initialized",$t=null,Ot=null}catch(n){throw Gs(),n}}}function Gs(){ie&&(ie=null),Ee=null,Y="not_initialized",$t=null,Ot=null}function Wu(){return Y==="initialized"&&Ee!==null}function Bu(){return{state:Y,initializationTime:Ot?new Date:void 0,lastError:$t||void 0,instanceId:Ot||void 0}}async function qu(n){return await Sa(),va(n)}function Gu(){return Ee}async function Xu(){if(Y==="initialized")return!0;if(Y==="initializing"&&ie)try{return await ie,!0}catch{return!1}return!1}var Ee,ie,Y,$t,Ot,lt,Ea=d(()=>{"use strict";ee();qs();Ee=null,ie=null,Y="not_initialized",$t=null,Ot=null;c(Vu,"createInstance");c(va,"getInstance");c(Sa,"cleanup");c(Gs,"reset");c(Wu,"isInitialized");c(Bu,"getStatus");c(qu,"forceReinitialize");c(Gu,"getCurrentInstance");c(Xu,"waitForInitialization");lt={getInstance:va,cleanup:Sa,reset:Gs,isInitialized:Wu,getStatus:Bu,forceReinitialize:qu,getCurrentInstance:Gu,waitForInitialization:Xu};process.on("exit",()=>{lt.isInitialized()&&lt.reset()});process.on("uncaughtException",async n=>{try{await lt.cleanup()}catch{}});process.on("unhandledRejection",async n=>{try{await lt.cleanup()}catch{}})});function Yu(){return u}function Xs(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 Ku(e,g),g}function Ku(n,e){Vr.has(n)||Vr.set(n,[]);let t=Vr.get(n);t.push(e),t.length>Ju&&t.shift(),Yu().debug(`[ErrorHandler] \u8BB0\u5F55\u9519\u8BEF\u5386\u53F2: ${n} - ${e.code}`)}function Zu(n){let e=Vr.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 Js(n){return Zu(n.serviceName).errorRate>10||!n.recoverable||n.category==="authentication"||n.category==="configuration"}var Vr,Ju,Ys=d(()=>{"use strict";y();Vr=new Map,Ju=100;c(Yu,"getLogger");c(Xs,"categorizeError");c(Ku,"recordError");c(Zu,"getErrorStatistics");c(Js,"shouldAlert")});import{existsSync as Qu,readFileSync as Ta}from"fs";import{watch as ep}from"chokidar";var Zs,Ks,lT,ya=d(()=>{"use strict";y();Ys();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()),!Qu(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=ep(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=Xs(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=Ta(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=Ta(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=Xs(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])),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)}},Ks=null,lT=(Ks||(Ks=new Zs),Ks)});var eo,Qs,Ma,to=d(()=>{"use strict";y();eo=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}},Qs=null,Ma=(Qs||(Qs=new eo),Qs)});var so,ro,CT,Pa=d(()=>{"use strict";y();to();so=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=Ma.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)}}},ro=null,CT=(ro||(ro=new so),ro)});var Ra=d(()=>{"use strict";Ve();y();u.warn("MCPService \u5DF2\u8FC1\u79FB\u5230 @/lib/mcp/connection.js\uFF0C\u8BF7\u66F4\u65B0\u5BFC\u5165\u8DEF\u5F84")});var wa=d(()=>{"use strict";Et();fa();Ca();cs();z();qs();Ea();ya();Ys();Pa();to();Ra();Zt();Kt();Qr();hs()});var dr={};Te(dr,{WebServer:()=>oo});import{createServer as tp}from"http";import{serve as rp}from"@hono/node-server";import{WebSocketServer as sp}from"ws";var oo,fr=d(()=>{"use strict";pe();Ho();da();us();gs();y();mr();ee();Zr();wa();oo=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;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 de,this.statusService=new Fr,this.notificationService=new Ur,this.configApiHandler=new er,this.statusApiHandler=new Tr(this.statusService),this.serviceApiHandler=new vr(this.statusService),this.toolApiHandler=new Mr,this.toolCallLogApiHandler=new wr,this.versionApiHandler=new zr,this.staticFileHandler=new Er,this.mcpRouteHandler=new nr,this.realtimeNotificationHandler=new cr(this.notificationService,this.statusService),this.heartbeatHandler=new or(this.statusService,this.notificationService),this.app=Mo(),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 nt.getInstance(),this.mcpServerApiHandler=new ar(this.mcpServiceManager,m),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`);let r=t.map(s=>({name:s.name,description:s.description||"",inputSchema:ye(s.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint,r),this.logger.debug("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e)}}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=uo(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 lt.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 Ie(i),this.mcpServiceManager&&this.proxyMCPServer.setServiceManager(this.mcpServiceManager);let a=this.proxyMCPServer;await this.connectWithRetry(()=>a.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=L("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new be(this.xiaozhiConnectionManager,m).getEndpointStatus(e)}async handleEndpointConnect(e){if(!this.xiaozhiConnectionManager){let r=L("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new be(this.xiaozhiConnectionManager,m).connectEndpoint(e)}async handleEndpointDisconnect(e){if(!this.xiaozhiConnectionManager){let r=L("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new be(this.xiaozhiConnectionManager,m).disconnectEndpoint(e)}async handleEndpointReconnect(e){if(!this.xiaozhiConnectionManager){let r=L("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new be(this.xiaozhiConnectionManager,m).reconnectEndpoint(e)}async handleEndpointAdd(e){if(!this.xiaozhiConnectionManager){let r=L("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return await new be(this.xiaozhiConnectionManager,m).addEndpoint(e)}async handleEndpointRemove(e){if(!this.xiaozhiConnectionManager){let r=L("CONNECTION_MANAGER_NOT_AVAILABLE","\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");return e.json(r,503)}return new be(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("*",ns),this.app?.use("*",ls),this.app?.use("*",is),this.app?.onError(as)}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 Hr;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=>We.getWorkspaces(t)),this.app?.get("/api/coze/workflows",t=>We.getWorkflows(t)),this.app?.post("/api/coze/cache/clear",t=>We.clearCache(t)),this.app?.get("/api/coze/cache/stats",t=>We.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=L("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=rp({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:tp});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new sp({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(),po(),this.proxyMCPServer?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function op(){let n=await Promise.resolve().then(()=>(fr(),dr)),e=await Promise.resolve().then(()=>(ee(),Co)),t=await Promise.resolve().then(()=>(y(),co));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}c(op,"importModules");async function np(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await op();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{process.exit(1)}}c(np,"main");import.meta.url===`file://${process.argv[1]}`&&np();
98
99
  //# sourceMappingURL=WebServerStandalone.js.map