xiaozhi-client 1.9.4-beta.3 → 1.9.4-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/WebServer.js +12 -12
- package/dist/backend/WebServer.js.map +1 -1
- package/dist/backend/WebServerLauncher.js +11 -11
- package/dist/backend/WebServerLauncher.js.map +1 -1
- package/dist/backend/managers/MCPServiceManagerSingleton.js +5 -5
- package/dist/backend/managers/MCPServiceManagerSingleton.js.map +1 -1
- package/dist/backend/package.json +11 -22
- package/dist/backend/templates/default/xiaozhi.cache.json +0 -0
- package/dist/backend/templates/default/xiaozhi.log +0 -0
- package/dist/backend/templates/hello-world/xiaozhi.cache.json +0 -0
- package/dist/backend/templates/hello-world/xiaozhi.log +0 -0
- package/dist/backend/templates/json5/xiaozhi.cache.json +0 -0
- package/dist/backend/templates/json5/xiaozhi.log +0 -0
- package/dist/backend/templates/jsonc/xiaozhi.cache.json +0 -0
- package/dist/backend/templates/jsonc/xiaozhi.log +0 -0
- package/dist/backend/templates/modelscope/xiaozhi.cache.json +0 -0
- package/dist/backend/templates/modelscope/xiaozhi.log +0 -0
- package/dist/cli/index.js +18 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +580 -0
- package/dist/config/index.js +1784 -0
- package/dist/config/index.js.map +1 -0
- package/dist/frontend/assets/index-88NfCOo9.js.map +1 -1
- package/package.json +11 -22
- package/templates/default/xiaozhi.cache.json +0 -0
- package/templates/default/xiaozhi.log +0 -0
- package/templates/hello-world/xiaozhi.cache.json +0 -0
- package/templates/hello-world/xiaozhi.log +0 -0
- package/templates/json5/xiaozhi.cache.json +0 -0
- package/templates/json5/xiaozhi.log +0 -0
- package/templates/jsonc/xiaozhi.cache.json +0 -0
- package/templates/jsonc/xiaozhi.log +0 -0
- package/templates/modelscope/xiaozhi.cache.json +0 -0
- package/templates/modelscope/xiaozhi.log +0 -0
- package/dist/backend/lib/config/manager.js +0 -3
- package/dist/backend/lib/config/manager.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var _i=Object.create;var Je=Object.defineProperty;var ki=Object.getOwnPropertyDescriptor;var ji=Object.getOwnPropertyNames;var Hi=Object.getPrototypeOf,zi=Object.prototype.hasOwnProperty;var a=(n,e)=>Je(n,"name",{value:e,configurable:!0});var d=(n,e)=>()=>(n&&(e=n(n=0)),e);var S=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Ye=(n,e)=>{for(var t in e)Je(n,t,{get:e[t],enumerable:!0})},Kt=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ji(e))!zi.call(n,o)&&o!==t&&Je(n,o,{get:()=>e[o],enumerable:!(r=ki(e,o))||r.enumerable});return n},le=(n,e,t)=>(Kt(n,e,"default"),t&&Kt(t,e,"default")),Ui=(n,e,t)=>(t=n!=null?_i(Hi(n)):{},Kt(e||!n||!n.__esModule?Je(t,"default",{value:n,enumerable:!0}):t,n));function Fi(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function K(n){return Fi(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var oe,w,V=d(()=>{"use strict";oe=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(oe||{});a(Fi,"isValidToolJSONSchema");a(K,"ensureToolJSONSchema");w=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{a(this,"ToolCallError")}}});var W,Te=d(()=>{"use strict";(t=>{function n(r){if(!r||typeof r!="object")return r;let o=JSON.parse(JSON.stringify(r));if(!("type"in o))return o;let s=o.type;if(s==="sse"||s==="streamable-http")return o;let i;return s==="streamableHttp"||s==="streamable_http"?i="streamable-http":s==="s_se"||s==="s-se"?i="sse":i=e(s),(i==="sse"||i==="streamable-http")&&(o.type=i),o}t.normalizeTypeField=n,a(n,"normalizeTypeField");function e(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}a(e,"convertToKebabCase")})(W||={})});function Xe(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 fo(n){if(n.type)return W.normalizeTypeField(n);if(n.command)return{...n,type:"stdio"};if(n.url!==void 0&&n.url!==null){let e=Xe(n.url,{serviceName:n.name});return{...n,type:e}}throw new Error(`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${n.name} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`)}function Ke(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new w(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new w(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(t.validateArguments&&r.arguments!==void 0&&r.arguments!==null&&(typeof r.arguments!="object"||Array.isArray(r.arguments)))throw new w(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!t.allowEmptyArguments&&r.arguments!==void 0&&r.arguments!==null){let o=r.arguments;if(Object.keys(o).length===0)throw new w(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new w(-32602,o)}return{name:r.name,arguments:r.arguments}}var Me=d(()=>{"use strict";Te();V();a(Xe,"inferTransportTypeFromUrl");a(fo,"inferTransportTypeFromConfig");a(Ke,"validateToolCallParams")});import{isAbsolute as Vi,resolve as Wi}from"path";function Eo(n,e){try{if(!n||typeof n!="string")throw new N("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!e||typeof e!="object")throw new N("\u914D\u7F6E\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A",n);let t=W.normalizeTypeField(e),r=qi(n,t);return Yi(r),r}catch(t){throw t instanceof N?t:new N(`\u914D\u7F6E\u8F6C\u6362\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`,n)}}function qi(n,e){if(Ji(e))return Bi(n,e);if("type"in e)switch(e.type){case"sse":return Co(n,e);case"streamable-http":return vo(n,e);default:throw new N(`\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 N("\u7F51\u7EDC\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 url \u5B57\u6BB5",n);if(Xe(e.url||"")==="sse"){let o={...e,type:"sse"};return Co(n,o)}let r={...e,type:"streamable-http"};return vo(n,r)}throw new N("\u65E0\u6CD5\u8BC6\u522B\u7684\u914D\u7F6E\u7C7B\u578B",n)}function Bi(n,e){if(!e.command)throw new N("\u672C\u5730\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5",n);let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=(e.args||[]).map(o=>Gi(o)?Wi(t,o):o);return{name:n,type:"stdio",command:e.command,args:r,env:e.env,timeout:3e4}}function Co(n,e){if(e.url===void 0||e.url===null)throw new N("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5",n);let t=e.type==="sse"?"sse":Xe(e.url||""),r=e.url?Zt(e.url):!1,o={name:n,type:t,url:e.url,timeout:3e4,headers:e.headers};return r&&(o.modelScopeAuth=!0),o}function vo(n,e){if(e.url===void 0||e.url===null)throw new N("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 Gi(n){return Vi(n)?!1:!!(n.startsWith("./")||n.startsWith("../")||/\.(js|py|ts|mjs|cjs)$/i.test(n))}function Ji(n){return"command"in n&&typeof n.command=="string"}function Zt(n){return n.includes("modelscope.net")||n.includes("modelscope.cn")}function Yi(n){if(!n.name||typeof n.name!="string")throw new N("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(n.type&&!Object.values(oe).includes(n.type))throw new N(`\u65E0\u6548\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`);if(!n.type)throw new N("\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 N("STDIO \u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u5B57\u6BB5");break;case"sse":if(n.url===void 0||n.url===null)throw new N("SSE \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;case"streamable-http":if(n.url===void 0||n.url===null)throw new N("STREAMABLE_HTTP \u914D\u7F6E\u5FC5\u987B\u5305\u542B url \u5B57\u6BB5");break;default:throw new N(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}var N,er=d(()=>{"use strict";V();Me();Te();N=class extends Error{constructor(t,r){super(t);this.configName=r;this.name="ConfigValidationError"}static{a(this,"ConfigValidationError")}};a(Eo,"convertLegacyToNew");a(qi,"convertByConfigType");a(Bi,"convertLocalConfig");a(Co,"convertSSEConfig");a(vo,"convertStreamableHTTPConfig");a(Gi,"isRelativePath");a(Ji,"isLocalConfig");a(Zt,"isModelScopeURL");a(Yi,"validateNewConfig")});var To={};Ye(To,{Logger:()=>ye,createLogger:()=>Zi,getGlobalLogLevel:()=>ra,getLogger:()=>So,logger:()=>f,setGlobalLogLevel:()=>ta,setGlobalLogger:()=>ea});import*as D from"fs";import*as z from"path";import Re from"chalk";import pe from"pino";import{z as Xi}from"zod";function Qi(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),o=String(n.getHours()).padStart(2,"0"),s=String(n.getMinutes()).padStart(2,"0"),i=String(n.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${o}:${s}:${i}`}function Zi(n){return new ye(n||Qe)}function So(){return ue||(ue=new ye(Qe)),ue}function ea(n){ue=n}function ta(n){Qe=n,ue&&ue.setLevel(n)}function ra(){return Qe}var Ki,ye,ue,Qe,f,R=d(()=>{"use strict";Ki=Xi.enum(["fatal","error","warn","info","debug","trace"]);a(Qi,"formatDateTime");ye=class{static{a(this,"Logger")}logFilePath=null;pinoInstance;isDaemonMode;logLevel;maxLogFileSize=10*1024*1024;maxLogFiles=5;constructor(e="info"){this.isDaemonMode=process.env.XIAOZHI_DAEMON==="true",this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}validateLogLevel(e){let t=e.toLowerCase(),r=Ki.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:pe.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:pe.destination({dest:"/dev/null"})}),pe({level:this.logLevel,timestamp:pe.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((t,r)=>({level:r}),"level")},base:null,serializers:{err:pe.stdSerializers?.err||(t=>t)}},pe.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Re.gray}],[30,{name:"INFO",color:Re.blue}],[40,{name:"WARN",color:Re.yellow}],[50,{name:"ERROR",color:Re.red}],[60,{name:"FATAL",color:Re.red}]]);return{write:a(t=>{try{let r=JSON.parse(t),o=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${o}
|
|
3
|
-
`)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"&&process.stderr.write(e)}catch{}}formatConsoleMessageOptimized(e,t){let r=Qi(new Date),o=t.get(e.level)||{name:"UNKNOWN",color:a(c=>c,"color")},s=o.color(`[${o.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let c=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${c}`}return`[${r}] ${s} ${i}`}initLogFile(e){this.logFilePath=z.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),D.existsSync(this.logFilePath)||D.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(o=>o instanceof Error?this.pinoInstance.level==="debug"?o.message:{message:o.message,stack:o.stack,name:o.name,cause:o.cause}:o);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}enhanceErrorObject(e){let t={...e};for(let[r,o]of Object.entries(t))o instanceof Error&&(t[r]={message:o.message,stack:o.stack,name:o.name,cause:o.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!D.existsSync(this.logFilePath)))try{D.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=z.dirname(this.logFilePath),t=z.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let s=z.join(e,`${t}.${o}.log`),i=z.join(e,`${t}.${o+1}.log`);D.existsSync(s)&&(o===this.maxLogFiles-1?D.unlinkSync(s):D.renameSync(s,i))}let r=z.join(e,`${t}.1.log`);D.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=z.dirname(this.logFilePath),t=z.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=z.join(e,`${t}.${r}.log`);D.existsSync(o)&&D.unlinkSync(o)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},ue=null,Qe="info";a(Zi,"createLogger");a(So,"getLogger");a(ea,"setGlobalLogger");a(ta,"setGlobalLogLevel");a(ra,"getGlobalLogLevel");f=So()});import{EventEmitter as oa}from"events";function M(){return ge||(ge=new tr),ge}function Mo(){ge&&(ge.destroy(),ge=null)}var tr,ge,_=d(()=>{"use strict";R();tr=class extends oa{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=f,this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=a(o=>{try{t(o)}catch(s){throw this.emit("error",s),s}finally{this.offEvent(e,r)}},"onceListener");return this.on(e,r)}offEvent(e,t){return this.logger.debug(`\u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.off(e,t)}updateEventStats(e){let t=this.eventStats.get(e)||{count:0,lastEmitted:new Date};t.count++,t.lastEmitted=new Date,this.eventStats.set(e,t)}getEventStats(){let e={};for(let[t,r]of this.eventStats)e[t]={...r};return e}getListenerStats(){let e={};for(let t of this.eventNames())e[t]=this.listenerCount(t);return e}clearEventStats(){this.eventStats.clear(),this.logger.info("\u4E8B\u4EF6\u7EDF\u8BA1\u5DF2\u6E05\u7406")}getStatus(){return{totalEvents:this.eventStats.size,totalListeners:Object.values(this.getListenerStats()).reduce((e,t)=>e+t,0),eventStats:this.getEventStats(),listenerStats:this.getListenerStats()}}destroy(){this.removeAllListeners(),this.eventStats.clear(),this.logger.info("EventBus \u5DF2\u9500\u6BC1")}},ge=null;a(M,"getEventBus");a(Mo,"destroyEventBus")});function na(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 rr(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=na(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 de(n){return`${n.slice(0,30)}...${n.slice(-10)}`}var Ze=d(()=>{"use strict";a(na,"getMcpServerCommunicationType");a(rr,"validateMcpServerConfig");a(de,"sliceEndpoint")});import*as Pe from"comment-json";function Ro(n){let e=Pe.parse(n);return{write(t){e&&typeof e=="object"&&t&&Object.assign(e,t)},toSource(){return Pe.stringify(e,null,2)}}}function yo(n){return Pe.parse(n)}var Po=d(()=>{"use strict";a(Ro,"createJson5Writer");a(yo,"parseJson5")});var No={};Ye(No,{ConfigManager:()=>tt,configManager:()=>m});import{copyFileSync as sa,existsSync as et,readFileSync as ia,writeFileSync as aa}from"fs";import{dirname as ca,resolve as ne}from"path";import{fileURLToPath as la}from"url";import*as me from"comment-json";import wo from"dayjs";var bo,or,tt,m,H=d(()=>{"use strict";_();Te();Ze();Po();bo=ca(la(import.meta.url)),or={heartbeatInterval:3e4,heartbeatTimeout:1e4,reconnectInterval:5e3},tt=class n{static{a(this,"ConfigManager")}static instance;defaultConfigPath;config=null;currentConfigPath=null;json5Writer=null;eventBus=M();statsUpdateLocks=new Map;statsUpdateLockTimeouts=new Map;STATS_UPDATE_TIMEOUT=5e3;constructor(){let e=[ne(bo,"templates","default","xiaozhi.config.json"),ne(bo,"..","templates","default","xiaozhi.config.json"),ne(process.cwd(),"templates","default","xiaozhi.config.json")];this.defaultConfigPath=e.find(t=>et(t))||e[0]}getConfigFilePath(){let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),t=["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"];for(let r of t){let o=ne(e,r);if(et(o))return o}return ne(e,"xiaozhi.config.json")}getConfigFileFormat(e){return e.endsWith(".json5")?"json5":e.endsWith(".jsonc")?"jsonc":"json"}static getInstance(){return n.instance||(n.instance=new n),n.instance}configExists(){let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),t=["xiaozhi.config.json5","xiaozhi.config.jsonc","xiaozhi.config.json"];for(let r of t){let o=ne(e,r);if(et(o))return!0}return!1}initConfig(e="json"){if(!et(this.defaultConfigPath))throw new Error(`\u9ED8\u8BA4\u914D\u7F6E\u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728: ${this.defaultConfigPath}`);if(this.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u521D\u59CB\u5316");let t=process.env.XIAOZHI_CONFIG_DIR||process.cwd(),r=`xiaozhi.config.${e}`,o=ne(t,r);sa(this.defaultConfigPath,o),this.config=null,this.json5Writer=null}loadConfig(){if(!this.configExists()){let e=new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C xiaozhi init \u521D\u59CB\u5316\u914D\u7F6E");throw this.eventBus.emitEvent("config:error",{error:e,operation:"loadConfig"}),e}try{let e=this.getConfigFilePath();this.currentConfigPath=e;let t=this.getConfigFileFormat(e),o=ia(e,"utf8").replace(/^\uFEFF/,""),s;switch(t){case"json5":s=yo(o),this.json5Writer=Ro(o);break;case"jsonc":s=me.parse(o);break;default:s=JSON.parse(o);break}return this.validateConfig(s),s}catch(e){throw this.eventBus.emitEvent("config:error",{error:e instanceof Error?e:new Error(String(e)),operation:"loadConfig"}),e instanceof SyntaxError?new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF: ${e.message}`):e}}validateConfig(e){if(!e||typeof e!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A\u6839\u5BF9\u8C61\u65E0\u6548");let t=e;if(t.mcpEndpoint===void 0||t.mcpEndpoint===null)throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5B57\u6BB5\u65E0\u6548");if(typeof t.mcpEndpoint!="string")if(Array.isArray(t.mcpEndpoint)){for(let r of t.mcpEndpoint)if(typeof r!="string"||r.trim()==="")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}else throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpEndpoint \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6216\u5B57\u7B26\u4E32\u6570\u7EC4");if(!t.mcpServers||typeof t.mcpServers!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers \u5B57\u6BB5\u65E0\u6548");for(let[r,o]of Object.entries(t.mcpServers)){if(!o||typeof o!="object")throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1AmcpServers.${r} \u65E0\u6548`);let s=W.normalizeTypeField(o),i=rr(r,s);if(!i.valid)throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\uFF1A${i.error}`)}}getConfig(){return this.config=this.loadConfig(),JSON.parse(JSON.stringify(this.config))}getMutableConfig(){return this.config||(this.config=this.loadConfig()),this.config}getMcpEndpoint(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?e.mcpEndpoint[0]||"":e.mcpEndpoint}getMcpEndpoints(){let e=this.getConfig();return Array.isArray(e.mcpEndpoint)?[...e.mcpEndpoint]:e.mcpEndpoint?[e.mcpEndpoint]:[]}getMcpServers(){return this.getConfig().mcpServers}getMcpServerConfig(){return this.getConfig().mcpServerConfig||{}}getServerToolsConfig(e){return this.getMcpServerConfig()[e]?.tools||{}}isToolEnabled(e,t){return this.getServerToolsConfig(e)[t]?.enable!==!1}updateMcpEndpoint(e){if(Array.isArray(e)){for(let r of e)if(!r||typeof r!="string")throw new Error("MCP \u7AEF\u70B9\u6570\u7EC4\u4E2D\u7684\u6BCF\u4E2A\u5143\u7D20\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}let t=this.getMutableConfig();t.mcpEndpoint=e,this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"endpoint",timestamp:new Date})}addMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.includes(e))throw new Error(`MCP \u7AEF\u70B9 ${e} \u5DF2\u5B58\u5728`);let o=[...r,e];t.mcpEndpoint=o,this.saveConfig(t)}removeMcpEndpoint(e){if(!e||typeof e!="string")throw new Error("MCP \u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig(),r=this.getMcpEndpoints();if(r.indexOf(e)===-1)throw new Error(`MCP \u7AEF\u70B9 ${e} \u4E0D\u5B58\u5728`);let s=r.filter(i=>i!==e);t.mcpEndpoint=s,this.saveConfig(t)}updateMcpServer(e,t){if(!e||typeof e!="string")throw new Error("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let r=rr(e,t);if(!r.valid)throw new Error(r.error||"\u670D\u52A1\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let o=this.getMutableConfig();o.mcpServers[e]=t,this.saveConfig(o)}removeMcpServer(e){if(!e||typeof e!="string")throw new Error("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");let t=this.getMutableConfig();if(!t.mcpServers[e])throw new Error(`\u670D\u52A1 ${e} \u4E0D\u5B58\u5728`);if(delete t.mcpServers[e],t.mcpServerConfig?.[e]&&delete t.mcpServerConfig[e],t.customMCP?.tools){let r=t.customMCP.tools.filter(o=>o.handler?.type==="mcp"&&o.handler.config?.serviceName===e);for(let o of r){let s=t.customMCP.tools.findIndex(i=>i.name===o.name);s!==-1&&t.customMCP.tools.splice(s,1)}t.customMCP.tools.length===0&&(t.customMCP=void 0)}this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date})}updateConfig(e){let t=this.getMutableConfig();if(e.mcpEndpoint!==void 0&&(t.mcpEndpoint=e.mcpEndpoint),e.mcpServers){let r={...t.mcpServers};for(let[o,s]of Object.entries(e.mcpServers))t.mcpServers[o]=s;for(let o of Object.keys(r))o in e.mcpServers||(delete t.mcpServers[o],t.mcpServerConfig?.[o]&&delete t.mcpServerConfig[o])}if(e.connection&&(t.connection||(t.connection={}),Object.assign(t.connection,e.connection)),e.modelscope&&(t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e.modelscope)),e.webUI&&(t.webUI||(t.webUI={}),Object.assign(t.webUI,e.webUI)),e.mcpServerConfig)for(let[r,o]of Object.entries(e.mcpServerConfig))t.mcpServerConfig?.[r]&&(t.mcpServerConfig[r]=o);if(e.platforms)for(let[r,o]of Object.entries(e.platforms))t.platforms||(t.platforms={}),t.platforms[r]=o;this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"config",timestamp:new Date})}updateServerToolsConfig(e,t){let r=this.getMutableConfig();r.mcpServerConfig||(r.mcpServerConfig={}),Object.keys(t).length===0?delete r.mcpServerConfig[e]:r.mcpServerConfig[e]={tools:t},this.saveConfig(r),this.eventBus.emitEvent("config:updated",{type:"serverTools",serviceName:e,timestamp:new Date})}removeServerToolsConfig(e){let r={...this.getConfig()};r.mcpServerConfig&&(delete r.mcpServerConfig[e],this.saveConfig(r))}cleanupInvalidServerToolsConfig(){let e=this.getMutableConfig();if(!e.mcpServerConfig)return;let t=Object.keys(e.mcpServers),o=Object.keys(e.mcpServerConfig).filter(s=>!t.includes(s));if(o.length>0){for(let s of o)delete e.mcpServerConfig[s];this.saveConfig(e)}}setToolEnabled(e,t,r,o){let s=this.getMutableConfig();s.mcpServerConfig||(s.mcpServerConfig={}),s.mcpServerConfig[e]||(s.mcpServerConfig[e]={tools:{}}),s.mcpServerConfig[e].tools[t]={...s.mcpServerConfig[e].tools[t],enable:r,...o&&{description:o}},this.saveConfig(s)}saveConfig(e){try{this.validateConfig(e);let t;this.currentConfigPath?t=this.currentConfigPath:(t=this.getConfigFilePath(),this.currentConfigPath=t);let r=this.getConfigFileFormat(t),o;switch(r){case"json5":try{this.json5Writer?(this.json5Writer.write(e),o=this.json5Writer.toSource()):o=me.stringify(e,null,2)}catch{o=me.stringify(e,null,2)}break;case"jsonc":try{o=me.stringify(e,null,2)}catch{o=JSON.stringify(e,null,2)}break;default:o=JSON.stringify(e,null,2);break}aa(t,o,"utf8"),this.config=e,this.notifyConfigUpdate(e)}catch(t){throw this.eventBus.emitEvent("config:error",{error:t instanceof Error?t:new Error(String(t)),operation:"saveConfig"}),new Error(`\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`)}}reloadConfig(){this.config=null,this.currentConfigPath=null,this.json5Writer=null}getConfigPath(){return this.getConfigFilePath()}getDefaultConfigPath(){return this.defaultConfigPath}getConnectionConfig(){let t=this.getConfig().connection||{};return{heartbeatInterval:t.heartbeatInterval??or.heartbeatInterval,heartbeatTimeout:t.heartbeatTimeout??or.heartbeatTimeout,reconnectInterval:t.reconnectInterval??or.reconnectInterval}}getHeartbeatInterval(){return this.getConnectionConfig().heartbeatInterval}getHeartbeatTimeout(){return this.getConnectionConfig().heartbeatTimeout}getReconnectInterval(){return this.getConnectionConfig().reconnectInterval}updateConnectionConfig(e){let t=this.getMutableConfig();t.connection||(t.connection={}),Object.assign(t.connection,e),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"connection",timestamp:new Date})}async updateToolUsageStats(e,t,r){try{if(typeof t=="string"&&r){let o=e,s=t,i=r;await Promise.all([this._updateMCPServerToolStats(o,s,i),this.updateCustomMCPToolStats(o,s,i)])}else{let o=e,s=t,i=new Date().toISOString();await this.updateCustomMCPToolStats(o,i,s)}}catch{if(typeof t=="string"&&r){let s=e,i=t}else{let s=e}}}async updateMCPServerToolStats(e,t,r,o=!0){await this._updateMCPServerToolStats(e,t,r,o)}setHeartbeatInterval(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u68C0\u6D4B\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatInterval:e})}setHeartbeatTimeout(e){if(e<=0)throw new Error("\u5FC3\u8DF3\u8D85\u65F6\u65F6\u95F4\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({heartbeatTimeout:e})}setReconnectInterval(e){if(e<=0)throw new Error("\u91CD\u8FDE\u95F4\u9694\u5FC5\u987B\u5927\u4E8E0");this.updateConnectionConfig({reconnectInterval:e})}getModelScopeConfig(){return this.getConfig().modelscope||{}}getModelScopeApiKey(){return this.getModelScopeConfig().apiKey||process.env.MODELSCOPE_API_TOKEN}updateModelScopeConfig(e){let t=this.getMutableConfig();t.modelscope||(t.modelscope={}),Object.assign(t.modelscope,e),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"modelscope",timestamp:new Date})}setModelScopeApiKey(e){if(!e||typeof e!="string")throw new Error("API Key \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");this.updateModelScopeConfig({apiKey:e})}getCustomMCPConfig(){return this.getConfig().customMCP||null}getCustomMCPTools(){let e=this.getCustomMCPConfig();return!e||!e.tools?[]:e.tools}validateCustomMCPTools(e){if(!Array.isArray(e))return!1;for(let t of e)if(!t.name||typeof t.name!="string"||!t.description||typeof t.description!="string"||!t.inputSchema||typeof t.inputSchema!="object"||!t.handler||typeof t.handler!="object"||!["proxy","function","http","script","chain","mcp"].includes(t.handler.type)||!this.validateHandlerConfig(t.name,t.handler))return!1;return!0}validateHandlerConfig(e,t){switch(t.type){case"proxy":return this.validateProxyHandler(e,t);case"http":return this.validateHttpHandler(e,t);case"function":return this.validateFunctionHandler(e,t);case"script":return this.validateScriptHandler(e,t);case"chain":return this.validateChainHandler(e,t);case"mcp":return this.validateMCPHandler(e,t);default:return!1}}validateProxyHandler(e,t){return!(!t.platform||!["coze","openai","anthropic","custom"].includes(t.platform)||!t.config||typeof t.config!="object"||t.platform==="coze"&&!t.config.workflow_id&&!t.config.bot_id)}validateHttpHandler(e,t){if(!t.url||typeof t.url!="string")return!1;try{new URL(t.url)}catch{return!1}return!(t.method&&!["GET","POST","PUT","DELETE","PATCH"].includes(t.method))}validateFunctionHandler(e,t){return!(!t.module||typeof t.module!="string"||!t.function||typeof t.function!="string")}validateScriptHandler(e,t){return!(!t.script||typeof t.script!="string"||t.interpreter&&!["node","python","bash"].includes(t.interpreter))}validateChainHandler(e,t){return!(!t.tools||!Array.isArray(t.tools)||t.tools.length===0||!["sequential","parallel"].includes(t.mode)||!["stop","continue","retry"].includes(t.error_handling))}validateMCPHandler(e,t){return!(!t.config||typeof t.config!="object"||!t.config.serviceName||typeof t.config.serviceName!="string"||!t.config.toolName||typeof t.config.toolName!="string")}hasValidCustomMCPTools(){try{let e=this.getCustomMCPTools();return e.length===0?!1:this.validateCustomMCPTools(e)}catch{return!1}}addCustomMCPTool(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools.find(o=>o.name===e.name))throw new Error(`\u5DE5\u5177 "${e.name}" \u5DF2\u5B58\u5728`);if(!this.validateCustomMCPTools([e]))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.unshift(e),this.saveConfig(t)}async addCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(e.length===0)return;let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]});let r=new Set(t.customMCP.tools.map(s=>s.name)),o=e.filter(s=>!r.has(s.name));if(o.length>0){if(!this.validateCustomMCPTools(o))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");t.customMCP.tools.push(...o),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date})}}removeCustomMCPTool(e){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let t=this.getMutableConfig();if(!t.customMCP||!t.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let r=t.customMCP.tools.findIndex(o=>o.name===e);if(r===-1)throw new Error(`\u5DE5\u5177 "${e}" \u4E0D\u5B58\u5728`);t.customMCP.tools.splice(r,1),this.saveConfig(t)}updateCustomMCPTool(e,t){if(!e||typeof e!="string")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="object")throw new Error("\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");let r=this.getMutableConfig();if(!r.customMCP||!r.customMCP.tools)throw new Error("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177");let o=r.customMCP.tools.findIndex(s=>s.name===e);if(o===-1)throw new Error(`\u5DE5\u5177 "${e}" \u4E0D\u5B58\u5728`);if(!this.validateCustomMCPTools([t]))throw new Error("\u66F4\u65B0\u540E\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");r.customMCP.tools[o]=t,this.saveConfig(r)}updateCustomMCPTools(e){if(!Array.isArray(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6570\u7EC4");if(!this.validateCustomMCPTools(e))throw new Error("\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let t=this.getMutableConfig();t.customMCP||(t.customMCP={tools:[]}),t.customMCP.tools=e,this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"customMCP",timestamp:new Date})}getWebUIConfig(){return this.getConfig().webUI||{}}getWebUIPort(){return this.getWebUIConfig().port??9999}notifyConfigUpdate(e){try{let t=global.__webServer;t&&typeof t.broadcastConfigUpdate=="function"&&t.broadcastConfigUpdate(e)}catch{}}updateWebUIConfig(e){let t=this.getMutableConfig();t.webUI||(t.webUI={}),Object.assign(t.webUI,e),this.saveConfig(t),this.eventBus.emitEvent("config:updated",{type:"webui",timestamp:new Date})}setWebUIPort(e){if(!Number.isInteger(e)||e<=0||e>65535)throw new Error("\u7AEF\u53E3\u53F7\u5FC5\u987B\u662F 1-65535 \u4E4B\u95F4\u7684\u6574\u6570");this.updateWebUIConfig({port:e})}updatePlatformConfig(e,t){let r=this.getMutableConfig();r.platforms||(r.platforms={}),r.platforms[e]=t,this.saveConfig(r),this.eventBus.emitEvent("config:updated",{type:"platform",platformName:e,timestamp:new Date})}getCozePlatformConfig(){let t=this.getConfig().platforms?.coze;return!t||!t.token?null:{token:t.token}}getCozeToken(){return this.getCozePlatformConfig()?.token||null}setCozePlatformConfig(e){if(!e.token||typeof e.token!="string"||e.token.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");this.updatePlatformConfig("coze",{token:e.token.trim()})}isCozeConfigValid(){let e=this.getCozePlatformConfig();return e!==null&&typeof e.token=="string"&&e.token.trim()!==""}async _updateMCPServerToolStats(e,t,r,o=!0){let s=this.getMutableConfig();s.mcpServerConfig||(s.mcpServerConfig={}),s.mcpServerConfig[e]||(s.mcpServerConfig[e]={tools:{}}),s.mcpServerConfig[e].tools[t]||(s.mcpServerConfig[e].tools[t]={enable:!0});let i=s.mcpServerConfig[e].tools[t],c=i.usageCount||0,l=i.lastUsedTime;o&&(i.usageCount=c+1),(!l||new Date(r)>new Date(l))&&(i.lastUsedTime=wo(r).format("YYYY-MM-DD HH:mm:ss")),this.saveConfig(s)}async updateCustomMCPToolStats(e,t,r){try{let o,s,i=!0,c;if(typeof r=="string"){let b=e;o=`${b}__${t}`,s=r,c=`${b}/${t}`}else o=e,s=t,i=r||!0,c=o;let l=this.getCustomMCPTools(),p=l.findIndex(b=>b.name===o);if(p===-1)return;let g=[...l],u=g[p];u.stats||(u.stats={});let E=u.stats.usageCount||0,h=u.stats.lastUsedTime;i&&(u.stats.usageCount=E+1),(!h||new Date(s)>new Date(h))&&(u.stats.lastUsedTime=wo(s).format("YYYY-MM-DD HH:mm:ss")),await this.updateCustomMCPTools(g)}catch{if(typeof r=="string"){let s=e,i=t}else{let s=e}}}async acquireStatsUpdateLock(e){if(this.statsUpdateLocks.has(e))return!1;let t=new Promise(o=>{});this.statsUpdateLocks.set(e,t);let r=setTimeout(()=>{this.releaseStatsUpdateLock(e)},this.STATS_UPDATE_TIMEOUT);return this.statsUpdateLockTimeouts.set(e,r),!0}releaseStatsUpdateLock(e){this.statsUpdateLocks.delete(e);let t=this.statsUpdateLockTimeouts.get(e);t&&(clearTimeout(t),this.statsUpdateLockTimeouts.delete(e))}async updateToolUsageStatsWithLock(e,t=!0){let r=`custommcp_${e}`;if(await this.acquireStatsUpdateLock(r))try{await this.updateToolUsageStats(e,t)}catch(o){throw o}finally{this.releaseStatsUpdateLock(r)}}async updateMCPServerToolStatsWithLock(e,t,r,o=!0){let s=`mcpserver_${e}_${t}`;if(await this.acquireStatsUpdateLock(s))try{await this.updateMCPServerToolStats(e,t,r,o)}catch(i){throw i}finally{this.releaseStatsUpdateLock(s)}}clearAllStatsUpdateLocks(){let e=this.statsUpdateLocks.size;this.statsUpdateLocks.clear();for(let t of this.statsUpdateLockTimeouts.values())clearTimeout(t);this.statsUpdateLockTimeouts.clear(),e>0}getStatsUpdateLocks(){return Array.from(this.statsUpdateLocks.keys())}getToolCallLogConfig(){return this.getConfig().toolCallLog||{}}updateToolCallLogConfig(e){let t=this.getMutableConfig();t.toolCallLog||(t.toolCallLog={}),Object.assign(t.toolCallLog,e),this.saveConfig(t)}getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}},m=tt.getInstance()});import we from"ws";var be,rt=d(()=>{"use strict";V();Me();Ze();V();be=class{static{a(this,"EndpointConnection")}endpointUrl;ws=null;connectionStatus=!1;serverInitialized=!1;serviceManager=null;connectionState="disconnected";lastError=null;connectionTimeout=null;toolCallTimeout=3e4;reconnectDelay=2e3;constructor(e,t){this.endpointUrl=e,t!==void 0&&(this.reconnectDelay=t)}setServiceManager(e){this.serviceManager=e}getTools(){if(!this.serviceManager)return[];try{return this.serviceManager.getAllTools().map(t=>({name:t.name,description:t.description,inputSchema:K(t.inputSchema)}))}catch{return[]}}async connect(){if(!this.serviceManager)throw new Error("MCPServiceManager \u672A\u8BBE\u7F6E\u3002\u8BF7\u5728\u8FDE\u63A5\u524D\u5148\u8BBE\u7F6E\u670D\u52A1\u7BA1\u7406\u5668\u3002");if(this.connectionState==="connecting")throw new Error("\u8FDE\u63A5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5B8C\u6210");return this.cleanupConnection(),this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error("\u8FDE\u63A5\u8D85\u65F6 (10000ms)");this.handleConnectionError(r),t(r)},1e4),this.ws=new we(this.endpointUrl),this.ws.on("open",()=>{this.handleConnectionSuccess(),e()}),this.ws.on("message",r=>{try{let o=JSON.parse(r.toString());this.handleMessage(o)}catch{}}),this.ws.on("close",(r,o)=>{this.handleConnectionClose(r,o.toString())}),this.ws.on("error",r=>{this.handleConnectionError(r),t(r)})})}handleConnectionSuccess(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!0,this.connectionState="connected"}handleConnectionError(e){this.lastError=e.message,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection()}handleConnectionClose(e,t){this.connectionStatus=!1,this.serverInitialized=!1,this.connectionState="disconnected"}cleanupConnection(){if(this.ws){this.ws.removeAllListeners();try{this.ws.readyState===we.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===we.CONNECTING&&this.ws.terminate()}catch{}this.ws=null}this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!1,this.serverInitialized=!1,this.connectionState="disconnected"}handleMessage(e){if(e.method)switch(e.method){case"initialize":case"notifications/initialized":this.sendResponse(e.id,{protocolVersion:"2024-11-05",capabilities:{tools:{listChanged:!0},logging:{}},serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"}}),this.serverInitialized=!0;break;case"tools/list":{let t=this.getTools();this.sendResponse(e.id,{tools:t});break}case"tools/call":{this.handleToolCall(e).catch(t=>{});break}case"ping":this.sendResponse(e.id,{});break;default:}}sendResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===we.OPEN){let r={jsonrpc:"2.0",id:e,result:t};try{this.ws.send(JSON.stringify(r))}catch{}}}getStatus(){let e=this.serviceManager?this.serviceManager.getAllTools().length:0;return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:e,connectionState:this.connectionState,lastError:this.lastError}}isConnected(){return this.connectionStatus}disconnect(){this.cleanupConnection()}async reconnect(){if(!this.serviceManager)throw new Error("MCPServiceManager \u672A\u8BBE\u7F6E\u3002\u8BF7\u5728\u91CD\u8FDE\u524D\u5148\u8BBE\u7F6E\u670D\u52A1\u7BA1\u7406\u5668\u3002");this.disconnect(),await new Promise(e=>setTimeout(e,this.reconnectDelay)),await this.connect()}async handleToolCall(e){if(e.id===void 0||e.id===null)throw new w(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=Date.now();try{let o=Ke(e.params);if(!this.serviceManager)throw new w(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E");let s=await this.executeToolWithTimeout(o.name,o.arguments||{},this.toolCallTimeout);this.sendResponse(t,{content:s.content||[{type:"text",text:JSON.stringify(s)}],isError:s.isError||!1})}catch(o){this.handleToolCallError(o,t,Date.now()-r)}}async executeToolWithTimeout(e,t,r=3e4){return new Promise((o,s)=>{let i=setTimeout(()=>{s(new w(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),s(new w(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E"));return}this.serviceManager.callTool(e,t).then(c=>{clearTimeout(i),o(c)}).catch(c=>{clearTimeout(i);let l=c instanceof Error?c.message:String(c);l.includes("\u672A\u627E\u5230\u5DE5\u5177")?s(new w(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?s(new w(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?s(new w(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?s(new w(-32001,l)):s(new w(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let o;if(e instanceof w)o={code:e.code,message:e.message,data:e.data};else{let s=e instanceof Error?e.message:"\u672A\u77E5\u9519\u8BEF";o={code:-32e3,message:s,data:{originalError:String(e)||"null"}}}this.sendErrorResponse(t,o)}sendErrorResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===we.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r))}}}});import{EventEmitter as pa}from"events";import{z as nr}from"zod";var ua,ga,Ne,sr=d(()=>{"use strict";V();_();Ze();rt();ua={connectionTimeout:1e4,reconnectDelay:2e3},ga=nr.object({connectionTimeout:nr.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),reconnectDelay:nr.number().min(500,"reconnectDelay \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 500 \u7684\u6570\u5B57").optional()}).strict(),Ne=class extends pa{static{a(this,"EndpointManager")}connections=new Map;connectionStates=new Map;mcpServiceManager=null;configManager;eventBus;isInitialized=!1;isConnecting=!1;options;constructor(e,t){super(),this.configManager=e,this.eventBus=M(),this.options={...ua,...t}}async initialize(e,t){if(!this.isInitialized)try{this.validateInitializeParams(e,t),await this.cleanup();for(let r of e)await this.createConnection(r,t);this.isInitialized=!0}catch(r){throw await this.cleanup(),r}}async connect(){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");if(!this.isConnecting){this.isConnecting=!0;try{let e=[];for(let[o,s]of this.connections)e.push(this.connectSingleEndpoint(o,s));if((await Promise.allSettled(e)).filter(o=>o.status==="fulfilled").length===0)throw new Error("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25")}finally{this.isConnecting=!1}}}async disconnect(){let e=[];for(let[t,r]of this.connections)e.push(this.disconnectSingleEndpoint(t,r));await Promise.allSettled(e)}async addEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");if(!this.connections.has(e)){if(this.checkConfigDuplicate(e))throw new Error(`\u63A5\u5165\u70B9 ${de(e)} \u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D`);try{this.configManager.addMcpEndpoint(e);try{let t=this.getCurrentTools();await this.createConnection(e,t);let r=this.connections.get(e);if(!r)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);await this.connectSingleEndpoint(e,r)}catch(t){try{this.configManager.removeMcpEndpoint(e)}catch{}throw this.connections.delete(e),this.connectionStates.delete(e),t}}catch(t){throw t}}}async removeEndpoint(e){if(this.connections.has(e))try{let t=this.connections.get(e);if(!t)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);this.configManager.removeMcpEndpoint(e);try{await this.disconnectSingleEndpoint(e,t),this.connections.delete(e),this.connectionStates.delete(e)}catch(r){try{this.configManager.addMcpEndpoint(e)}catch{}throw r}}catch(t){throw t}}getEndpoints(){let e=Array.from(this.connections.keys()),t=Array.from(this.connectionStates.keys());return Array.from(new Set([...e,...t]))}async disconnectEndpoint(e){let t=this.connections.get(e);if(t)try{await this.disconnectSingleEndpoint(e,t)}catch(r){throw r}}async clearEndpoints(){let e=Array.from(this.connections.keys()).map(t=>this.removeEndpoint(t));await Promise.allSettled(e)}getConnectionStatus(){return Array.from(this.connectionStates.values())}isAnyConnected(){for(let e of this.connectionStates.values())if(e.connected)return!0;return!1}isEndpointConnected(e){return this.connectionStates.get(e)?.connected??!1}getEndpointStatus(e){return this.connectionStates.get(e)}setServiceManager(e){this.mcpServiceManager=e}emitEndpointStatusChanged(e,t,r,o,s,i="connection-manager"){this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:t,operation:r,success:o,message:s,timestamp:Date.now(),source:i})}async connectExistingEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${de(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);this.connectionStates.get(e)?.connected||await this.connectSingleEndpoint(e,t)}async reconnectAll(){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");let e=[],t=[];for(let[s,i]of this.connections){let c=this.reconnectSingleEndpoint(s,i).then(()=>{t.push({endpoint:s,success:!0})}).catch(l=>{t.push({endpoint:s,success:!1,error:l instanceof Error?l.message:String(l)})});e.push(c)}await Promise.allSettled(e);let r=t.filter(s=>s.success).length,o=t.filter(s=>!s.success).length;if(o>0){let s=t.filter(i=>!i.success);for(let i of s);}return{successCount:r,failureCount:o,results:t}}async reconnectEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${de(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);await this.reconnectSingleEndpoint(e,t)}async sleep(e){return new Promise(t=>setTimeout(t,e))}validateEndpoints(e){let t=[],r=[];for(let o of e){if(!o||typeof o!="string"){r.push(o);continue}if(!o.startsWith("ws://")&&!o.startsWith("wss://")){r.push(o);continue}try{new URL(o),t.push(o)}catch{r.push(o)}}return{valid:t,invalid:r}}validateOptions(e){let t=ga.safeParse(e);return t.success?{valid:!0,errors:[]}:{valid:!1,errors:t.error.errors.map(o=>o.message)}}async updateEndpoints(e,t=[]){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let{valid:r,invalid:o}=this.validateEndpoints(e);if(o.length>0,r.length===0)throw new Error("\u6CA1\u6709\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9");let s=Array.from(this.connections.keys()),i=r.filter(p=>!s.includes(p)),c=s.filter(p=>!r.includes(p)),l=s.filter(p=>r.includes(p));try{for(let g of c)await this.removeEndpoint(g);for(let g of i)await this.addEndpoint(g);let p={type:i.length>0&&c.length>0?"endpoints_updated":i.length>0?"endpoints_added":"endpoints_removed",data:{added:i.length>0?i:void 0,removed:c.length>0?c:void 0,updated:i.length>0&&c.length>0?r:void 0},timestamp:new Date};this.emit("configChange",p)}catch(p){throw p}}updateOptions(e){let{valid:t,errors:r}=this.validateOptions(e);if(!t)throw new Error(`\u65E0\u6548\u7684\u8FDE\u63A5\u9009\u9879: ${r.join(", ")}`);let o={...this.options};this.options={...this.options,...e};let s={type:"options_updated",data:{oldOptions:o,newOptions:e},timestamp:new Date};this.emit("configChange",s)}getCurrentConfig(){return{endpoints:Array.from(this.connections.keys()),options:{...this.options}}}async reloadConfig(e){try{e.options&&this.updateOptions(e.options),e.endpoints&&await this.updateEndpoints(e.endpoints,e.tools||[])}catch(t){throw t}}async prewarmConnections(e=[]){let r=(e.length>0?e:Array.from(this.connections.keys())).map(async o=>{try{let s=this.connections.get(o)}catch{}});await Promise.all(r)}async cleanup(){try{await this.disconnect(),this.connections.clear(),this.connectionStates.clear(),this.isInitialized=!1,this.isConnecting=!1}catch(e){throw e}}checkConfigDuplicate(e){try{return this.configManager.getMcpEndpoints().includes(e)}catch{return!0}}validateInitializeParams(e,t){if(!Array.isArray(e))throw new Error("\u5C0F\u667A\u63A5\u5165\u70B9\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4");if(!Array.isArray(t))throw new Error("\u5DE5\u5177\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4");for(let r of e){if(!r||typeof r!="string")throw new Error(`\u65E0\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\u5730\u5740: ${r}`);if(!r.startsWith("ws://")&&!r.startsWith("wss://"))throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u5730\u5740\u5FC5\u987B\u662F WebSocket URL: ${r}`)}}async createConnection(e,t){try{let r=new be(e,this.options.reconnectDelay);this.mcpServiceManager&&r.setServiceManager(this.mcpServiceManager),this.connections.set(e,r),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1})}catch(r){throw r}}async connectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(!r)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u72B6\u6001\u4E0D\u5B58\u5728: ${de(e)}`);try{r.connected=!1,r.initialized=!1,await t.connect(),r.connected=!0,r.initialized=!0,r.lastConnected=new Date,r.lastError=void 0,this.emitEndpointStatusChanged(e,!0,"connect",!0,"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F","connection-manager")}catch(o){throw r.connected=!1,r.initialized=!1,r.lastError=o instanceof Error?o.message:String(o),this.emitEndpointStatusChanged(e,!1,"connect",!1,o instanceof Error?o.message:"\u8FDE\u63A5\u5931\u8D25","connection-manager"),o}}async disconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(r)try{t.disconnect(),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!0,"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F","connection-manager")}catch(o){r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!1,o instanceof Error?o.message:"\u65AD\u5F00\u5931\u8D25","connection-manager")}}async reconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(!r)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u72B6\u6001\u4E0D\u5B58\u5728: ${de(e)}`);try{await t.reconnect(),r.connected=!0,r.initialized=!0,r.lastConnected=new Date,r.lastError=void 0,this.emitEndpointStatusChanged(e,!0,"reconnect",!0,"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F","connection-manager")}catch(o){throw r.connected=!1,r.initialized=!1,r.lastError=o instanceof Error?o.message:String(o),this.emitEndpointStatusChanged(e,!1,"reconnect",!1,o instanceof Error?o.message:"\u91CD\u8FDE\u5931\u8D25","connection-manager"),o}}getCurrentTools(){if(!this.mcpServiceManager)return[];try{return this.mcpServiceManager.getAllTools().map(t=>({name:t.name,description:t.description,inputSchema:K(t.inputSchema)}))}catch{return[]}}}});var Io=d(()=>{"use strict";rt();sr();sr();rt()});var Ie,ir=d(()=>{"use strict";Ie={zh:{COZE_BASE_URL:"https://api.coze.cn",COZE_BASE_WS_URL:"wss://ws.coze.cn"},en:{COZE_BASE_URL:"https://api.coze.com",COZE_BASE_WS_URL:"wss://ws.coze.com"}}});function ot(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Ie[e]||Ie.zh;return new Y.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var ar=d(()=>{"use strict";nt();ir();a(ot,"createCozeClient")});import da from"node-cache";var Q,Ao=d(()=>{"use strict";ar();Q=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=ot(this.token),this.cache=new da({stdTTL:300})}async getWorkspaces(){let e="workspaces",t=this.cache.get(e);if(t)return t;let{workspaces:r=[]}=await this.client.workspaces.list();return this.cache.set(e,r,1800),r}async getWorkflows(e){let{workspace_id:t,page_num:r=1,page_size:o=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let s=`workflows:${t}:${r}:${o}`,i=this.cache.get(s);if(i)return i;let l=(await this.client.get("/v1/workflows",{workspace_id:t,page_num:r,page_size:o,workflow_mode:"workflow"})).data;return this.cache.set(s,l),l}callWorkflow(e,t){return this.client.workflows.runs.create({workflow_id:e,parameters:t})}clearCache(e){if(!e){this.cache.flushAll();return}let r=this.cache.keys().filter(o=>o.startsWith(e));this.cache.del(r)}getCacheStats(){let e=this.cache.getStats(),t=this.cache.keys(),r=e.hits+e.misses,o=r>0?e.hits/r:0;return{size:e.keys,keys:t,hits:e.hits,misses:e.misses,hitRate:o,ksize:e.ksize,vsize:e.vsize}}}});var Y={};Ye(Y,{CozeApiService:()=>Q,config:()=>Ie,createCozeClient:()=>ot});import*as pg from"@coze/api";var nt=d(()=>{"use strict";ir();le(Y,pg);ar();Ao()});import{createHash as ma}from"crypto";function G(n,e){let t=ma("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function cr(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Ae(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 st,lr=d(()=>{"use strict";a(G,"generateCacheKey");a(cr,"isCacheExpired");a(Ae,"shouldCleanupCache");st={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function Oo(n,e){return{content:[{type:"text",text:e?ha(e,n):xo(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 ha(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 Ri=Object.create;var Be=Object.defineProperty;var Ti=Object.getOwnPropertyDescriptor;var Mi=Object.getOwnPropertyNames;var yi=Object.getPrototypeOf,Pi=Object.prototype.hasOwnProperty;var a=(s,e)=>Be(s,"name",{value:e,configurable:!0});var d=(s,e)=>()=>(s&&(e=s(s=0)),e);var v=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),Bt=(s,e)=>{for(var t in e)Be(s,t,{get:e[t],enumerable:!0})},qt=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Mi(e))!Pi.call(s,o)&&o!==t&&Be(s,o,{get:()=>e[o],enumerable:!(r=Ti(e,o))||r.enumerable});return s},ae=(s,e,t)=>(qt(s,e,"default"),t&&qt(t,e,"default")),wi=(s,e,t)=>(t=s!=null?Ri(yi(s)):{},qt(e||!s||!s.__esModule?Be(t,"default",{value:s,enumerable:!0}):t,s));function bi(s){return typeof s=="object"&&s!==null&&"type"in s&&s.type==="object"}function Y(s){return bi(s)?s:{type:"object",properties:{},required:[],additionalProperties:!0}}var Se,w,q=d(()=>{"use strict";Se=(r=>(r.STDIO="stdio",r.SSE="sse",r.STREAMABLE_HTTP="streamable-http",r))(Se||{});a(bi,"isValidToolJSONSchema");a(Y,"ensureToolJSONSchema");w=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{a(this,"ToolCallError")}}});var re,Gt=d(()=>{"use strict";(t=>{function s(r){if(!r||typeof r!="object")return r;let o=JSON.parse(JSON.stringify(r));if(!("type"in o))return o;let n=o.type;if(n==="sse"||n==="streamable-http")return o;let i;return n==="streamableHttp"||n==="streamable_http"?i="streamable-http":n==="s_se"||n==="s-se"?i="sse":i=e(n),(i==="sse"||i==="streamable-http")&&(o.type=i),o}t.normalizeTypeField=s,a(s,"normalizeTypeField");function e(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}a(e,"convertToKebabCase")})(re||={})});function Ni(s,e){try{let r=new URL(s).pathname;return r.endsWith("/sse")?"sse":r.endsWith("/mcp")?"streamable-http":(e?.serviceName,"streamable-http")}catch{return e?.serviceName,"streamable-http"}}function co(s){if(s.type)return re.normalizeTypeField(s);if(s.command)return{...s,type:"stdio"};if(s.url!==void 0&&s.url!==null){let e=Ni(s.url,{serviceName:s.name});return{...s,type:e}}throw new Error(`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${s.name} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`)}function Ge(s,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!s||typeof s!="object")throw new w(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=s;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new w(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(t.validateArguments&&r.arguments!==void 0&&r.arguments!==null&&(typeof r.arguments!="object"||Array.isArray(r.arguments)))throw new w(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!t.allowEmptyArguments&&r.arguments!==void 0&&r.arguments!==null){let o=r.arguments;if(Object.keys(o).length===0)throw new w(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new w(-32602,o)}return{name:r.name,arguments:r.arguments}}var Je=d(()=>{"use strict";Gt();q();a(Ni,"inferTransportTypeFromUrl");a(co,"inferTransportTypeFromConfig");a(Ge,"validateToolCallParams")});function ce(s){return`${s.slice(0,30)}...${s.slice(-10)}`}var Xt=d(()=>{"use strict";a(ce,"sliceEndpoint")});import Re from"ws";var Te,Xe=d(()=>{"use strict";q();Je();Xt();q();Te=class{static{a(this,"EndpointConnection")}endpointUrl;ws=null;connectionStatus=!1;serverInitialized=!1;serviceManager=null;connectionState="disconnected";lastError=null;connectionTimeout=null;toolCallTimeout=3e4;reconnectDelay=2e3;constructor(e,t){this.endpointUrl=e,t!==void 0&&(this.reconnectDelay=t)}setServiceManager(e){this.serviceManager=e}getTools(){if(!this.serviceManager)return[];try{return this.serviceManager.getAllTools().map(t=>({name:t.name,description:t.description,inputSchema:Y(t.inputSchema)}))}catch{return[]}}async connect(){if(!this.serviceManager)throw new Error("MCPServiceManager \u672A\u8BBE\u7F6E\u3002\u8BF7\u5728\u8FDE\u63A5\u524D\u5148\u8BBE\u7F6E\u670D\u52A1\u7BA1\u7406\u5668\u3002");if(this.connectionState==="connecting")throw new Error("\u8FDE\u63A5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5B8C\u6210");return this.cleanupConnection(),this.attemptConnection()}async attemptConnection(){return this.connectionState="connecting",new Promise((e,t)=>{this.connectionTimeout=setTimeout(()=>{let r=new Error("\u8FDE\u63A5\u8D85\u65F6 (10000ms)");this.handleConnectionError(r),t(r)},1e4),this.ws=new Re(this.endpointUrl),this.ws.on("open",()=>{this.handleConnectionSuccess(),e()}),this.ws.on("message",r=>{try{let o=JSON.parse(r.toString());this.handleMessage(o)}catch{}}),this.ws.on("close",(r,o)=>{this.handleConnectionClose(r,o.toString())}),this.ws.on("error",r=>{this.handleConnectionError(r),t(r)})})}handleConnectionSuccess(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!0,this.connectionState="connected"}handleConnectionError(e){this.lastError=e.message,this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.cleanupConnection()}handleConnectionClose(e,t){this.connectionStatus=!1,this.serverInitialized=!1,this.connectionState="disconnected"}cleanupConnection(){if(this.ws){this.ws.removeAllListeners();try{this.ws.readyState===Re.OPEN?this.ws.close(1e3,"Cleaning up connection"):this.ws.readyState===Re.CONNECTING&&this.ws.terminate()}catch{}this.ws=null}this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=null),this.connectionStatus=!1,this.serverInitialized=!1,this.connectionState="disconnected"}handleMessage(e){if(e.method)switch(e.method){case"initialize":case"notifications/initialized":this.sendResponse(e.id,{protocolVersion:"2024-11-05",capabilities:{tools:{listChanged:!0},logging:{}},serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"}}),this.serverInitialized=!0;break;case"tools/list":{let t=this.getTools();this.sendResponse(e.id,{tools:t});break}case"tools/call":{this.handleToolCall(e).catch(t=>{});break}case"ping":this.sendResponse(e.id,{});break;default:}}sendResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===Re.OPEN){let r={jsonrpc:"2.0",id:e,result:t};try{this.ws.send(JSON.stringify(r))}catch{}}}getStatus(){let e=this.serviceManager?this.serviceManager.getAllTools().length:0;return{connected:this.connectionStatus,initialized:this.serverInitialized,url:this.endpointUrl,availableTools:e,connectionState:this.connectionState,lastError:this.lastError}}isConnected(){return this.connectionStatus}disconnect(){this.cleanupConnection()}async reconnect(){if(!this.serviceManager)throw new Error("MCPServiceManager \u672A\u8BBE\u7F6E\u3002\u8BF7\u5728\u91CD\u8FDE\u524D\u5148\u8BBE\u7F6E\u670D\u52A1\u7BA1\u7406\u5668\u3002");this.disconnect(),await new Promise(e=>setTimeout(e,this.reconnectDelay)),await this.connect()}async handleToolCall(e){if(e.id===void 0||e.id===null)throw new w(-32602,"\u8BF7\u6C42 ID \u4E0D\u80FD\u4E3A\u7A7A");let t=e.id,r=Date.now();try{let o=Ge(e.params);if(!this.serviceManager)throw new w(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E");let n=await this.executeToolWithTimeout(o.name,o.arguments||{},this.toolCallTimeout);this.sendResponse(t,{content:n.content||[{type:"text",text:JSON.stringify(n)}],isError:n.isError||!1})}catch(o){this.handleToolCallError(o,t,Date.now()-r)}}async executeToolWithTimeout(e,t,r=3e4){return new Promise((o,n)=>{let i=setTimeout(()=>{n(new w(-32002,`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6 (${r}ms): ${e}`))},r);if(!this.serviceManager){clearTimeout(i),n(new w(-32001,"MCPServiceManager \u672A\u8BBE\u7F6E"));return}this.serviceManager.callTool(e,t).then(c=>{clearTimeout(i),o(c)}).catch(c=>{clearTimeout(i);let l=c instanceof Error?c.message:String(c);l.includes("\u672A\u627E\u5230\u5DE5\u5177")?n(new w(-32601,`\u5DE5\u5177\u4E0D\u5B58\u5728: ${e}`)):l.includes("\u670D\u52A1")&&l.includes("\u4E0D\u53EF\u7528")?n(new w(-32001,l)):l.includes("\u6682\u65F6\u4E0D\u53EF\u7528")?n(new w(-32001,l)):l.includes("\u6301\u7EED\u4E0D\u53EF\u7528")?n(new w(-32001,l)):n(new w(-32e3,`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${l}`))})})}handleToolCallError(e,t,r){let o;if(e instanceof w)o={code:e.code,message:e.message,data:e.data};else{let n=e instanceof Error?e.message:"\u672A\u77E5\u9519\u8BEF";o={code:-32e3,message:n,data:{originalError:String(e)||"null"}}}this.sendErrorResponse(t,o)}sendErrorResponse(e,t){if(this.connectionStatus&&this.ws?.readyState===Re.OPEN){let r={jsonrpc:"2.0",id:e,error:t};this.ws.send(JSON.stringify(r))}}}});var po={};Bt(po,{Logger:()=>ye,createLogger:()=>xi,getGlobalLogLevel:()=>Di,getLogger:()=>lo,logger:()=>m,setGlobalLogLevel:()=>Li,setGlobalLogger:()=>$i});import*as L from"fs";import*as j from"path";import Me from"chalk";import le from"pino";import{z as Ii}from"zod";function Oi(s){let e=s.getFullYear(),t=String(s.getMonth()+1).padStart(2,"0"),r=String(s.getDate()).padStart(2,"0"),o=String(s.getHours()).padStart(2,"0"),n=String(s.getMinutes()).padStart(2,"0"),i=String(s.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${o}:${n}:${i}`}function xi(s){return new ye(s||Ye)}function lo(){return pe||(pe=new ye(Ye)),pe}function $i(s){pe=s}function Li(s){Ye=s,pe&&pe.setLevel(s)}function Di(){return Ye}var Ai,ye,pe,Ye,m,T=d(()=>{"use strict";Ai=Ii.enum(["fatal","error","warn","info","debug","trace"]);a(Oi,"formatDateTime");ye=class{static{a(this,"Logger")}logFilePath=null;pinoInstance;isDaemonMode;logLevel;maxLogFileSize=10*1024*1024;maxLogFiles=5;constructor(e="info"){this.isDaemonMode=process.env.XIAOZHI_DAEMON==="true",this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}validateLogLevel(e){let t=e.toLowerCase(),r=Ai.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:le.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:le.destination({dest:"/dev/null"})}),le({level:this.logLevel,timestamp:le.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((t,r)=>({level:r}),"level")},base:null,serializers:{err:le.stdSerializers?.err||(t=>t)}},le.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Me.gray}],[30,{name:"INFO",color:Me.blue}],[40,{name:"WARN",color:Me.yellow}],[50,{name:"ERROR",color:Me.red}],[60,{name:"FATAL",color:Me.red}]]);return{write:a(t=>{try{let r=JSON.parse(t),o=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${o}
|
|
3
|
+
`)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"&&process.stderr.write(e)}catch{}}formatConsoleMessageOptimized(e,t){let r=Oi(new Date),o=t.get(e.level)||{name:"UNKNOWN",color:a(c=>c,"color")},n=o.color(`[${o.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let c=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${c}`}return`[${r}] ${n} ${i}`}initLogFile(e){this.logFilePath=j.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),L.existsSync(this.logFilePath)||L.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(o=>o instanceof Error?this.pinoInstance.level==="debug"?o.message:{message:o.message,stack:o.stack,name:o.name,cause:o.cause}:o);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}enhanceErrorObject(e){let t={...e};for(let[r,o]of Object.entries(t))o instanceof Error&&(t[r]={message:o.message,stack:o.stack,name:o.name,cause:o.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!L.existsSync(this.logFilePath)))try{L.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=j.dirname(this.logFilePath),t=j.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let n=j.join(e,`${t}.${o}.log`),i=j.join(e,`${t}.${o+1}.log`);L.existsSync(n)&&(o===this.maxLogFiles-1?L.unlinkSync(n):L.renameSync(n,i))}let r=j.join(e,`${t}.1.log`);L.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=j.dirname(this.logFilePath),t=j.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=j.join(e,`${t}.${r}.log`);L.existsSync(o)&&L.unlinkSync(o)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},pe=null,Ye="info";a(xi,"createLogger");a(lo,"getLogger");a($i,"setGlobalLogger");a(Li,"setGlobalLogLevel");a(Di,"getGlobalLogLevel");m=lo()});import{EventEmitter as _i}from"events";function R(){return ue||(ue=new Yt),ue}function uo(){ue&&(ue.destroy(),ue=null)}var Yt,ue,k=d(()=>{"use strict";T();Yt=class extends _i{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=m,this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=a(o=>{try{t(o)}catch(n){throw this.emit("error",n),n}finally{this.offEvent(e,r)}},"onceListener");return this.on(e,r)}offEvent(e,t){return this.logger.debug(`\u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.off(e,t)}updateEventStats(e){let t=this.eventStats.get(e)||{count:0,lastEmitted:new Date};t.count++,t.lastEmitted=new Date,this.eventStats.set(e,t)}getEventStats(){let e={};for(let[t,r]of this.eventStats)e[t]={...r};return e}getListenerStats(){let e={};for(let t of this.eventNames())e[t]=this.listenerCount(t);return e}clearEventStats(){this.eventStats.clear(),this.logger.info("\u4E8B\u4EF6\u7EDF\u8BA1\u5DF2\u6E05\u7406")}getStatus(){return{totalEvents:this.eventStats.size,totalListeners:Object.values(this.getListenerStats()).reduce((e,t)=>e+t,0),eventStats:this.getEventStats(),listenerStats:this.getListenerStats()}}destroy(){this.removeAllListeners(),this.eventStats.clear(),this.logger.info("EventBus \u5DF2\u9500\u6BC1")}},ue=null;a(R,"getEventBus");a(uo,"destroyEventBus")});import{EventEmitter as ki}from"events";import{z as Kt}from"zod";var ji,Hi,Pe,Qt=d(()=>{"use strict";q();k();Xt();Xe();ji={connectionTimeout:1e4,reconnectDelay:2e3},Hi=Kt.object({connectionTimeout:Kt.number().min(1e3,"connectionTimeout \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 1000 \u7684\u6570\u5B57").optional(),reconnectDelay:Kt.number().min(500,"reconnectDelay \u5FC5\u987B\u662F\u5927\u4E8E\u7B49\u4E8E 500 \u7684\u6570\u5B57").optional()}).strict(),Pe=class extends ki{static{a(this,"EndpointManager")}connections=new Map;connectionStates=new Map;mcpServiceManager=null;configManager;eventBus;isInitialized=!1;isConnecting=!1;options;constructor(e,t){super(),this.configManager=e,this.eventBus=R(),this.options={...ji,...t}}async initialize(e,t){if(!this.isInitialized)try{this.validateInitializeParams(e,t),await this.cleanup();for(let r of e)await this.createConnection(r,t);this.isInitialized=!0}catch(r){throw await this.cleanup(),r}}async connect(){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");if(!this.isConnecting){this.isConnecting=!0;try{let e=[];for(let[o,n]of this.connections)e.push(this.connectSingleEndpoint(o,n));if((await Promise.allSettled(e)).filter(o=>o.status==="fulfilled").length===0)throw new Error("\u6240\u6709\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25")}finally{this.isConnecting=!1}}}async disconnect(){let e=[];for(let[t,r]of this.connections)e.push(this.disconnectSingleEndpoint(t,r));await Promise.allSettled(e)}async addEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");if(!this.connections.has(e)){if(this.checkConfigDuplicate(e))throw new Error(`\u63A5\u5165\u70B9 ${ce(e)} \u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D`);try{this.configManager.addMcpEndpoint(e);try{let t=this.getCurrentTools();await this.createConnection(e,t);let r=this.connections.get(e);if(!r)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);await this.connectSingleEndpoint(e,r)}catch(t){try{this.configManager.removeMcpEndpoint(e)}catch{}throw this.connections.delete(e),this.connectionStates.delete(e),t}}catch(t){throw t}}}async removeEndpoint(e){if(this.connections.has(e))try{let t=this.connections.get(e);if(!t)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u63A5\u5165\u70B9\u8FDE\u63A5: ${e}`);this.configManager.removeMcpEndpoint(e);try{await this.disconnectSingleEndpoint(e,t),this.connections.delete(e),this.connectionStates.delete(e)}catch(r){try{this.configManager.addMcpEndpoint(e)}catch{}throw r}}catch(t){throw t}}getEndpoints(){let e=Array.from(this.connections.keys()),t=Array.from(this.connectionStates.keys());return Array.from(new Set([...e,...t]))}async disconnectEndpoint(e){let t=this.connections.get(e);if(t)try{await this.disconnectSingleEndpoint(e,t)}catch(r){throw r}}async clearEndpoints(){let e=Array.from(this.connections.keys()).map(t=>this.removeEndpoint(t));await Promise.allSettled(e)}getConnectionStatus(){return Array.from(this.connectionStates.values())}isAnyConnected(){for(let e of this.connectionStates.values())if(e.connected)return!0;return!1}isEndpointConnected(e){return this.connectionStates.get(e)?.connected??!1}getEndpointStatus(e){return this.connectionStates.get(e)}setServiceManager(e){this.mcpServiceManager=e}emitEndpointStatusChanged(e,t,r,o,n,i="connection-manager"){this.eventBus.emitEvent("endpoint:status:changed",{endpoint:e,connected:t,operation:r,success:o,message:n,timestamp:Date.now(),source:i})}async connectExistingEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${ce(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);this.connectionStates.get(e)?.connected||await this.connectSingleEndpoint(e,t)}async reconnectAll(){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()");let e=[],t=[];for(let[n,i]of this.connections){let c=this.reconnectSingleEndpoint(n,i).then(()=>{t.push({endpoint:n,success:!0})}).catch(l=>{t.push({endpoint:n,success:!1,error:l instanceof Error?l.message:String(l)})});e.push(c)}await Promise.allSettled(e);let r=t.filter(n=>n.success).length,o=t.filter(n=>!n.success).length;if(o>0){let n=t.filter(i=>!i.success);for(let i of n);}return{successCount:r,failureCount:o,results:t}}async reconnectEndpoint(e){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let t=this.connections.get(e);if(!t)throw new Error(`\u63A5\u5165\u70B9 ${ce(e)} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9`);await this.reconnectSingleEndpoint(e,t)}async sleep(e){return new Promise(t=>setTimeout(t,e))}validateEndpoints(e){let t=[],r=[];for(let o of e){if(!o||typeof o!="string"){r.push(o);continue}if(!o.startsWith("ws://")&&!o.startsWith("wss://")){r.push(o);continue}try{new URL(o),t.push(o)}catch{r.push(o)}}return{valid:t,invalid:r}}validateOptions(e){let t=Hi.safeParse(e);return t.success?{valid:!0,errors:[]}:{valid:!1,errors:t.error.errors.map(o=>o.message)}}async updateEndpoints(e,t=[]){if(!this.isInitialized)throw new Error("EndpointManager \u672A\u521D\u59CB\u5316");let{valid:r,invalid:o}=this.validateEndpoints(e);if(o.length>0,r.length===0)throw new Error("\u6CA1\u6709\u6709\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9");let n=Array.from(this.connections.keys()),i=r.filter(p=>!n.includes(p)),c=n.filter(p=>!r.includes(p)),l=n.filter(p=>r.includes(p));try{for(let u of c)await this.removeEndpoint(u);for(let u of i)await this.addEndpoint(u);let p={type:i.length>0&&c.length>0?"endpoints_updated":i.length>0?"endpoints_added":"endpoints_removed",data:{added:i.length>0?i:void 0,removed:c.length>0?c:void 0,updated:i.length>0&&c.length>0?r:void 0},timestamp:new Date};this.emit("configChange",p)}catch(p){throw p}}updateOptions(e){let{valid:t,errors:r}=this.validateOptions(e);if(!t)throw new Error(`\u65E0\u6548\u7684\u8FDE\u63A5\u9009\u9879: ${r.join(", ")}`);let o={...this.options};this.options={...this.options,...e};let n={type:"options_updated",data:{oldOptions:o,newOptions:e},timestamp:new Date};this.emit("configChange",n)}getCurrentConfig(){return{endpoints:Array.from(this.connections.keys()),options:{...this.options}}}async reloadConfig(e){try{e.options&&this.updateOptions(e.options),e.endpoints&&await this.updateEndpoints(e.endpoints,e.tools||[])}catch(t){throw t}}async prewarmConnections(e=[]){let r=(e.length>0?e:Array.from(this.connections.keys())).map(async o=>{try{let n=this.connections.get(o)}catch{}});await Promise.all(r)}async cleanup(){try{await this.disconnect(),this.connections.clear(),this.connectionStates.clear(),this.isInitialized=!1,this.isConnecting=!1}catch(e){throw e}}checkConfigDuplicate(e){try{return this.configManager.getMcpEndpoints().includes(e)}catch{return!0}}validateInitializeParams(e,t){if(!Array.isArray(e))throw new Error("\u5C0F\u667A\u63A5\u5165\u70B9\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4");if(!Array.isArray(t))throw new Error("\u5DE5\u5177\u5217\u8868\u5FC5\u987B\u662F\u6570\u7EC4");for(let r of e){if(!r||typeof r!="string")throw new Error(`\u65E0\u6548\u7684\u5C0F\u667A\u63A5\u5165\u70B9\u5730\u5740: ${r}`);if(!r.startsWith("ws://")&&!r.startsWith("wss://"))throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u5730\u5740\u5FC5\u987B\u662F WebSocket URL: ${r}`)}}async createConnection(e,t){try{let r=new Te(e,this.options.reconnectDelay);this.mcpServiceManager&&r.setServiceManager(this.mcpServiceManager),this.connections.set(e,r),this.connectionStates.set(e,{endpoint:e,connected:!1,initialized:!1})}catch(r){throw r}}async connectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(!r)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u72B6\u6001\u4E0D\u5B58\u5728: ${ce(e)}`);try{r.connected=!1,r.initialized=!1,await t.connect(),r.connected=!0,r.initialized=!0,r.lastConnected=new Date,r.lastError=void 0,this.emitEndpointStatusChanged(e,!0,"connect",!0,"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F","connection-manager")}catch(o){throw r.connected=!1,r.initialized=!1,r.lastError=o instanceof Error?o.message:String(o),this.emitEndpointStatusChanged(e,!1,"connect",!1,o instanceof Error?o.message:"\u8FDE\u63A5\u5931\u8D25","connection-manager"),o}}async disconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(r)try{t.disconnect(),r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!0,"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F","connection-manager")}catch(o){r.connected=!1,r.initialized=!1,this.emitEndpointStatusChanged(e,!1,"disconnect",!1,o instanceof Error?o.message:"\u65AD\u5F00\u5931\u8D25","connection-manager")}}async reconnectSingleEndpoint(e,t){let r=this.connectionStates.get(e);if(!r)throw new Error(`\u5C0F\u667A\u63A5\u5165\u70B9\u72B6\u6001\u4E0D\u5B58\u5728: ${ce(e)}`);try{await t.reconnect(),r.connected=!0,r.initialized=!0,r.lastConnected=new Date,r.lastError=void 0,this.emitEndpointStatusChanged(e,!0,"reconnect",!0,"\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F","connection-manager")}catch(o){throw r.connected=!1,r.initialized=!1,r.lastError=o instanceof Error?o.message:String(o),this.emitEndpointStatusChanged(e,!1,"reconnect",!1,o instanceof Error?o.message:"\u91CD\u8FDE\u5931\u8D25","connection-manager"),o}}getCurrentTools(){if(!this.mcpServiceManager)return[];try{return this.mcpServiceManager.getAllTools().map(t=>({name:t.name,description:t.description,inputSchema:Y(t.inputSchema)}))}catch{return[]}}}});var go=d(()=>{"use strict";Xe();Qt();Qt();Xe()});var we,Zt=d(()=>{"use strict";we={zh:{COZE_BASE_URL:"https://api.coze.cn",COZE_BASE_WS_URL:"wss://ws.coze.cn"},en:{COZE_BASE_URL:"https://api.coze.com",COZE_BASE_WS_URL:"wss://ws.coze.com"}}});function Ke(s,e="zh"){if(!s||typeof s!="string"||s.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=we[e]||we.zh;return new J.CozeAPI({baseURL:t.COZE_BASE_URL,token:s.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var er=d(()=>{"use strict";Qe();Zt();a(Ke,"createCozeClient")});import zi from"node-cache";var K,ho=d(()=>{"use strict";er();K=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Ke(this.token),this.cache=new zi({stdTTL:300})}async getWorkspaces(){let e="workspaces",t=this.cache.get(e);if(t)return t;let{workspaces:r=[]}=await this.client.workspaces.list();return this.cache.set(e,r,1800),r}async getWorkflows(e){let{workspace_id:t,page_num:r=1,page_size:o=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let n=`workflows:${t}:${r}:${o}`,i=this.cache.get(n);if(i)return i;let l=(await this.client.get("/v1/workflows",{workspace_id:t,page_num:r,page_size:o,workflow_mode:"workflow"})).data;return this.cache.set(n,l),l}callWorkflow(e,t){return this.client.workflows.runs.create({workflow_id:e,parameters:t})}clearCache(e){if(!e){this.cache.flushAll();return}let r=this.cache.keys().filter(o=>o.startsWith(e));this.cache.del(r)}getCacheStats(){let e=this.cache.getStats(),t=this.cache.keys(),r=e.hits+e.misses,o=r>0?e.hits/r:0;return{size:e.keys,keys:t,hits:e.hits,misses:e.misses,hitRate:o,ksize:e.ksize,vsize:e.vsize}}}});var J={};Bt(J,{CozeApiService:()=>K,config:()=>we,createCozeClient:()=>Ke});import*as wu from"@coze/api";var Qe=d(()=>{"use strict";Zt();ae(J,wu);er();ho()});import{createHash as Fi}from"crypto";function B(s,e){let t=Fi("md5").update(JSON.stringify(e||{})).digest("hex");return`${s}_${t}`}function tr(s,e){let t=new Date(s).getTime();return Date.now()-t>e}function be(s){let e=Date.now(),t=new Date(s.timestamp).getTime();return!!(s.consumed&&e-t>6e4||e-t>s.ttl||s.status==="failed")}var Ze,rr=d(()=>{"use strict";a(B,"generateCacheKey");a(tr,"isCacheExpired");a(be,"shouldCleanupCache");Ze={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function mo(s,e){return{content:[{type:"text",text:e?Ui(e,s):fo(s)}],isError:!1,taskId:s,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 Ui(s,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,24 +11,24 @@ var _i=Object.create;var Je=Object.defineProperty;var ki=Object.getOwnPropertyDe
|
|
|
11
11
|
\u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
|
|
12
12
|
1. \u4F7F\u7528\u76F8\u540C\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
|
|
13
13
|
2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
|
|
14
|
-
3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:
|
|
14
|
+
3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:fo(e)};return t[s]||t.default}function fo(s){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
|
|
15
15
|
|
|
16
16
|
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
17
|
-
- \u4EFB\u52A1ID: ${
|
|
17
|
+
- \u4EFB\u52A1ID: ${s}
|
|
18
18
|
- \u72B6\u6001: \u5904\u7406\u4E2D
|
|
19
19
|
- \u5EFA\u8BAE: \u8BF7\u7B49\u5F8530\u79D2\u540E\u91CD\u8BD5\u67E5\u8BE2
|
|
20
20
|
|
|
21
21
|
\u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
|
|
22
22
|
1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
|
|
23
23
|
2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
|
|
24
|
-
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var
|
|
25
|
-
`).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,o=t.slice(r),
|
|
24
|
+
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var Ne,or=d(()=>{"use strict";Ne=class s extends Error{static{a(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,s)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};a(mo,"createTimeoutResponse");a(Ui,"getToolSpecificTimeoutMessage");a(fo,"getDefaultTimeoutMessage")});import{configManager as Co}from "../config/index.js";function Eo(s){return s.type==="proxy"}var Ie,et=d(()=>{"use strict";Qe();Q();q();T();k();rr();or();a(Eo,"isProxyHandler");Ie=class{static{a(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=Ze.TIMEOUT;CACHE_TTL=Ze.CACHE_TTL;constructor(e,t){this.logger=m,this.cacheManager=e||new X,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=Co.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new K(e)}setupEventListeners(){R().onEvent("config:updated",async t=>{if(t.type==="customMCP"){this.logger.info("[CustomMCP] \u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316...");try{this.reinitialize()}catch(r){this.logger.error("[CustomMCP] \u914D\u7F6E\u66F4\u65B0\u5904\u7406\u5931\u8D25:",r)}}})}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||Co.getCustomMCPTools();this.tools.clear();for(let r of t)if(Eo(r.handler)&&r.handler.platform==="coze")this.tools.set(r.name,r),this.logger.debug(`[CustomMCP] \u5DF2\u52A0\u8F7D Coze \u5DE5\u5177: ${r.name} (workflow_id: ${r.handler.config.workflow_id})`);else{let o=Eo(r.handler)?`/${r.handler.platform}`:"";this.logger.warn(`[CustomMCP] \u8DF3\u8FC7\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r.name} (${r.handler.type}${o})`)}this.logger.debug(`[CustomMCP] \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A Coze \u5DE5\u5177`)}catch(t){throw this.logger.error("[CustomMCP] \u521D\u59CB\u5316\u5931\u8D25:",t),t}}getTools(){return Array.from(this.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:Y(e.inputSchema)}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}getToolInfo(e){return this.tools.get(e)}reinitialize(){this.logger.debug("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668..."),this.initialize()}async callTool(e,t,r){let o=this.tools.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let n=await this.getCompletedResult(e,t);if(n)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),n;try{let i=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,c),c}catch(i){if(i instanceof Ne){let c=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${c}`),mo(c,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new Ne(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(!o.customMCPResults||!o.customMCPResults[r])return null;let n=o.customMCPResults[r];return n.status==="completed"&&!n.consumed&&!tr(n.timestamp,n.ttl)?n.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}processWorkflowResponse(e,t){try{let r=t.data||t;return typeof r=="string"?{content:[{type:"text",text:r}],isError:!1}:{content:[{type:"text",text:JSON.stringify(r,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406\u5DE5\u4F5C\u6D41\u54CD\u5E94\u5931\u8D25: ${e}`,r),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async callCozeWorkflow(e,t){let o=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:o.workflow_id});try{let n=this.getCozeApiService();if(!o.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let i=await n.callWorkflow(o.workflow_id,t);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`),this.processWorkflowResponse(e.name,i)}catch(n){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,n),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`}],isError:!0}}}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(o.customMCPResults?.[r]){o.customMCPResults[r].consumed=!0;let n=o.customMCPResults[r];be(n)&&delete o.customMCPResults[r],await this.saveCache(o),this.logger.debug(`[CustomMCP] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}`)}}catch(r){this.logger.warn(`[CustomMCP] \u6E05\u7406\u7F13\u5B58\u5931\u8D25: ${r}`)}}async generateTaskId(e,t){return B(e,t)}generateCacheKey(e,t){return B(e,t)}async loadExtendedCache(){try{return await this.cacheManager.loadExistingCache()}catch{return{version:"1.0.0",mcpServers:{},metadata:{lastGlobalUpdate:new Date().toISOString(),totalWrites:0,createdAt:new Date().toISOString()},customMCPResults:{}}}}async updateCacheWithResult(e,t){try{let r=await this.loadExtendedCache();r.customMCPResults||(r.customMCPResults={}),r.customMCPResults[e]=t,await this.saveCache(r)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u7F13\u5B58\u5931\u8D25: ${r}`)}}async cacheResult(e,t,r){try{let o=this.generateCacheKey(e,t),n={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(o,n),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(o){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${o}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.tools.clear(),this.cacheManager.cleanup()}}});import{tmpdir as Vi}from"os";var Ae,vo=d(()=>{"use strict";Ae=class{static{a(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||Vi()}static getHomeDir(){return process.env.HOME||process.env.USERPROFILE||""}}});import*as Z from"fs";import*as oe from"path";import tt from"pino";var Oe,rt,ot=d(()=>{"use strict";vo();Oe=class{static{a(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=oe.resolve(oe.normalize(e.logFilePath));else{let r=t||Ae.getTempDir();this.logFilePath=oe.join(oe.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:a(r=>{try{let o=JSON.parse(r),n=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:tt.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch{}return tt({level:"info",timestamp:tt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((r,o)=>({level:o}),"level")},base:null},tt.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,o=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${o}`}async cleanupOldRecords(){try{if(!Z.existsSync(this.logFilePath))return;let t=Z.readFileSync(this.logFilePath,"utf8").trim().split(`
|
|
25
|
+
`).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,o=t.slice(r),n=o.join(`
|
|
26
26
|
`)+(o.length>0?`
|
|
27
|
-
`:"");
|
|
28
|
-
`).filter(s=>s.trim()!==""),o=[];for(let s of r)try{let i=JSON.parse(s);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp,o.push(i)}catch{}return o.sort((s,i)=>(i.timestamp||0)-(s.timestamp||0)),o}catch{throw new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(o=>o.toolName.toLowerCase().includes(t.toolName?.toLowerCase()??""))),t.serverName&&(r=r.filter(o=>o.serverName?.toLowerCase().includes(t.serverName?.toLowerCase()??""))),t.success!==void 0&&(r=r.filter(o=>o.success===t.success)),t.startDate||t.endDate){let o=t.startDate?new Date(t.startDate).getTime():0,s=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let c=i.timestamp||0;return c>=o&&c<=s})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),o=r.length,s=Math.min(e.limit||50,1e3),i=e.offset||0,c=r.slice(i,i+s),l=i+s<o;return{records:c,total:o,hasMore:l}}}});var he,pt=d(()=>{"use strict";Z();R();he=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=f}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case"initialize":return await this.handleInitialize(e.params,e.id);case"notifications/initialized":return await this.handleInitializedNotification(e.params);case"tools/list":return await this.handleToolsList(e.id);case"tools/call":return await this.handleToolCall(e.params,e.id);case"resources/list":return await this.handleResourcesList(e.id);case"prompts/list":return await this.handlePromptsList(e.id);case"ping":return await this.handlePing(e.id);default:if(t)return this.logger.warn(`\u6536\u5230\u672A\u77E5\u7684\u901A\u77E5\u6D88\u606F: ${e.method}`,e),null;throw new Error(`\u672A\u77E5\u7684\u65B9\u6CD5: ${e.method}`)}}catch(t){return this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t),e.id===void 0?null:this.createErrorResponse(t,e.id)}}async handleInitialize(e,t){this.logger.debug("\u5904\u7406 initialize \u8BF7\u6C42",e);let r=["2024-11-05","2025-06-18"],o=e.protocolVersion,s=r.includes(o)?o:"2024-11-05";return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${o}, \u670D\u52A1\u5668\u54CD\u5E94=${s}`),{jsonrpc:"2.0",result:{serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"},capabilities:{tools:{},logging:{}},protocolVersion:s},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.debug("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.debug("\u5904\u7406 tools/list \u8BF7\u6C42");try{return{jsonrpc:"2.0",result:{tools:this.serviceManager.getAllTools().map(o=>({name:o.name,description:o.description,inputSchema:o.inputSchema}))},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=Ke(e),o=await this.serviceManager.callTool(r.name,r.arguments||{});return{jsonrpc:"2.0",result:{content:o.content,isError:o.isError||!1},id:t!==void 0?t:1}}catch(r){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,r),r}}async handlePing(e){return this.logger.debug("\u5904\u7406 ping \u8BF7\u6C42"),{jsonrpc:"2.0",result:{status:"ok",timestamp:new Date().toISOString()},id:e!==void 0?e:1}}async handleResourcesList(e){this.logger.debug("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.debug("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u63D0\u793A\u6A21\u677F`),{jsonrpc:"2.0",result:{prompts:t},id:e!==void 0?e:1}}createErrorResponse(e,t){let r=-32603;return e.message.includes("\u672A\u627E\u5230\u5DE5\u5177")||e.message.includes("\u672A\u77E5\u7684\u65B9\u6CD5")?r=-32601:(e.message.includes("\u53C2\u6570")||e.message.includes("\u4E0D\u80FD\u4E3A\u7A7A"))&&(r=-32602),{jsonrpc:"2.0",error:{code:r,message:e.message,data:{stack:e.stack}},id:t!==void 0?t:1}}getServiceManager(){return this.serviceManager}}});var ut=d(()=>{"use strict"});var Do=d(()=>{"use strict";ut()});import qg,{WebSocketServer as Bg}from"ws";var _o=d(()=>{"use strict";ut()});var dr=d(()=>{"use strict";ut();Do();_o()});import{EventEmitter as Ea}from"events";var ie,ko=d(()=>{"use strict";er();H();Z();Z();_();it();lt();pt();dr();ie=class extends Ea{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=M();toolCallLogger;retryTimers=new Map;failedServices=new Set;transportAdapters=new Map;messageHandler;isRunning=!1;config;constructor(e){super(),e&&this.isUnifiedServerConfig(e)?(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info",...e},this.configs=e.configs||{}):(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info"},this.configs=e||{});let r=process.env.NODE_ENV==="test"||process.env.VITEST==="true"?`/tmp/xiaozhi-test-${Date.now()}-${Math.random().toString(36).substring(2,11)}/xiaozhi.cache.json`:void 0;this.cacheManager=new X(r),this.customMCPHandler=new xe(this.cacheManager,this);let o=m.getToolCallLogConfig(),s=m.getConfigDir();this.toolCallLogger=new Le(o,s),this.setupEventListeners(),this.messageHandler=new he(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",async e=>{await this.handleServiceConnected(e)}),this.eventBus.onEvent("mcp:service:disconnected",async e=>{await this.handleServiceDisconnected(e)}),this.eventBus.onEvent("mcp:service:connection:failed",async e=>{await this.handleServiceConnectionFailed(e)})}async handleServiceConnected(e){try{this.services.get(e.serviceName)&&await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceDisconnected(e){try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch{}}async startAllServices(){try{this.customMCPHandler.initialize()}catch{}let e=Object.entries(this.configs);if(e.length===0)return;let t=e.map(async([c])=>{try{return await this.startService(c),{serviceName:c,success:!0,error:null}}catch(l){return{serviceName:c,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),o=0,s=0,i=[];for(let c of r)c.status==="fulfilled"?c.value.success?o++:(s++,i.push(c.value.serviceName)):s++;i.length>0&&e.length,i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r=new gt(t);await r.connect(),this.services.set(e,r),await this.refreshToolsCache();let o=r.getTools()}catch(r){throw this.services.delete(e),r}}async stopService(e){let t=this.services.get(e);if(t)try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache()}catch(r){throw r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),o=this.configs[e];o&&this.cacheManager.writeCacheEntry(e,r,o).then(()=>{}).catch(s=>{});for(let s of r){let i=`${e}__${s.name}`;this.tools.set(i,{serviceName:e,originalName:s.name,tool:s})}}await this.syncToolsConfigToFile()}getAllTools(){let e=[];for(let[r,o]of this.services)try{if(o.isConnected()){let s=o.getTools();for(let i of s)try{if(!m.isToolEnabled(r,i.name))continue;let l=`${r}__${i.name}`;e.push({name:l,description:i.description||"",inputSchema:i.inputSchema,serviceName:r,originalName:i.name})}catch{}}}catch{}let t=[];try{t=this.customMCPHandler.getTools()}catch{t=[]}for(let r of t)try{e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name})}catch{}return e}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t,r){let o=Date.now(),s="unknown",i=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(s=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(c=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(c=await this.customMCPHandler.callTool(e,t,r),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);s=l.serviceName,i=l.originalName;let p=this.services.get(l.serviceName);if(!p)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!p.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await p.callTool(l.originalName,t||{}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-o}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:null,success:!1,duration:Date.now()-o,error:c instanceof Error?c.message:String(c)}),this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l?.handler?.type==="mcp"?this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!1):this.updateToolStatsSafe(e,"customMCP",e,!1)}else{let l=this.tools.get(e);l&&this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1)}throw c}}async updateToolStats(e,t,r,o){try{let s=new Date().toISOString();o?(await this.updateCustomMCPToolStats(e,s),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,s)):(await this.updateCustomMCPToolLastUsedTime(e,s),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,s))}catch(s){throw s}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch{let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F"}}async updateCustomMCPToolStats(e,t){try{await m.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await m.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await m.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await m.updateMCPServerToolStatsWithLock(e,t,r,!1)}catch(o){throw o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:s}=t,i=this.services.get(o);if(!i)throw new Error(`\u670D\u52A1 ${o} \u4E0D\u53EF\u7528`);if(!i.isConnected())throw new Error(`\u670D\u52A1 ${o} \u672A\u8FDE\u63A5`);try{return await i.callTool(s,r||{})}catch(c){throw c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect()}catch{}try{this.customMCPHandler.cleanup()}catch{}try{m.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=m.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch{return{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{this.customMCPHandler.initialize()}catch(e){throw e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch{return!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch{return[]}}isModelScopeService(e){return e.url?Zt(e.url):!1}handleModelScopeAuth(e,t){if(e.headers?.Authorization)return;let o=m.getModelScopeApiKey();if(o){t.apiKey=o;return}let s=e.url||"\u672A\u77E5",i=e.name||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${i}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${s}\u8BF7\u9009\u62E9\u4EE5\u4E0B\u4EFB\u4E00\u65B9\u5F0F\u914D\u7F6E\u8BA4\u8BC1\uFF1A1. \u5728\u670D\u52A1\u914D\u7F6E\u4E2D\u6DFB\u52A0 headers.Authorization2. \u6216\u8005\u5728\u5168\u5C40\u914D\u7F6E\u4E2D\u8BBE\u7F6E modelscope.apiKey3. \u6216\u8005\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF MODELSCOPE_API_TOKEN\u83B7\u53D6 ModelScope API Key: https://modelscope.cn/my?myInfo=true`)}enhanceServiceConfig(e){let t={...e};try{return this.isModelScopeService(e)&&this.handleModelScopeAuth(e,t),t}catch(r){throw r}}addServiceConfig(e,t){let r,o;if(typeof e=="string"&&t)o=e,r=t;else if(typeof e=="object")o=e.name,r=e;else throw new Error("Invalid arguments for addServiceConfig");let s=this.enhanceServiceConfig(r);this.configs[o]=s}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(t);this.configs[e]=r}removeServiceConfig(e){delete this.configs[e]}async syncToolsConfigToFile(){try{let e=m.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let o=r.getTools();if(o.length===0)continue;let s=e[t]?.tools||{},i={};for(let u of o){let E=s[u.name];E?i[u.name]={...E,description:u.description||E.description||""}:i[u.name]={description:u.description||"",enable:!0}}let c=o.map(u=>u.name),p=Object.keys(s).filter(u=>!c.includes(u));if(p.length>0,this.hasToolsConfigChanged(s,i)){m.updateServerToolsConfig(t,i);let u=Object.keys(i).filter(h=>!s[h]),E=Object.keys(i).filter(h=>{let b=s[h],Ge=i[h];return b&&b.description!==Ge.description});u.length>0,E.length>0,p.length>0}}}catch{}}hasToolsConfigChanged(e,t){let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!0;let s=o.filter(c=>!r.includes(c)),i=r.filter(c=>!o.includes(c));if(s.length>0||i.length>0)return!0;for(let c of r){let l=e[c],p=t[c];if(l.description!==p.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e));let o=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,o)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e);try{await this.refreshCustomMCPHandlerPublic()}catch{}}catch{let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);this.scheduleServiceRetry(e,o)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,o)=>r+o.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e)),this.failedServices.delete(e)}stopAllServiceRetries(){for(let[e,t]of this.retryTimers)clearTimeout(t);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);try{await t.initialize(),this.transportAdapters.set(e,t),this.emit("transportRegistered",{name:e,adapter:t})}catch(r){throw r}}async startTransports(){let e=[],t=[];for(let[r,o]of this.transportAdapters)try{await o.start(),e.push(r)}catch{t.push(r)}if(e.length===0&&t.length>0){let r=`\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5931\u8D25\uFF0C\u5931\u8D25\u7684\u9002\u914D\u5668: ${t.join(", ")}`;throw new Error(r)}t.length>0}async stopTransports(){try{for(let[e,t]of this.transportAdapters)try{await t.stop()}catch{}}catch(e){throw e}}getTransportAdapters(){return new Map(this.transportAdapters)}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");try{await this.startAllServices(),await this.startTransports(),this.isRunning=!0,this.emit("started")}catch(e){throw e}}async stop(){if(this.isRunning)try{await this.stopTransports(),await this.stopAllServices(),this.isRunning=!1,this.emit("stopped")}catch(e){throw e}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});for(let[t,r]of this.transportAdapters)e.push({id:r.getConnectionId(),name:t,state:r.getState()});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,transportCount:this.getTransportAdapters().size,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames()}catch{e=0,t=[]}let r=this.tools.size+e,s=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:s};for(let[c,l]of this.services){let p=l.getStatus();i.services[c]={connected:p.connected,clientName:`xiaozhi-${c}-client`}}return e>0&&(i.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),i}isServerRunning(){return this.isRunning}isUnifiedServerConfig(e){return e!==null&&typeof e=="object"&&"configs"in e}async routeMessage(e){let t=await this.messageHandler.handleMessage(e);return t===null?null:{jsonrpc:"2.0",method:"response",params:t,id:t.id}}async initialize(){await this.start()}getToolRegistry(){return this}getConnectionManager(){return this}}});import{SSEClientTransport as Sa}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Ta}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Ma}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as Ra}from"eventsource";function ya(n){switch(n.type){case"stdio":return Pa(n);case"sse":return wa(n);case"streamable-http":return ba(n);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${n.type}`)}}function Pa(n){if(!n.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new Ta({command:n.command,args:n.args||[],env:n.env})}function wa(n){if(!n.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Na(n);return new Sa(e,t)}function ba(n){if(!n.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(n.url),t=Ia(n);return new Ma(e,t)}function Na(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Ia(n){let e={};return n.apiKey?e.requestInit={headers:{Authorization:`Bearer ${n.apiKey}`,...n.headers}}:n.headers&&(e.requestInit={headers:n.headers}),e}function Aa(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(oe).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 Oa(){return["stdio","sse","streamable-http"]}var mr,hr=d(()=>{"use strict";V();typeof global<"u"&&!global.EventSource&&(global.EventSource=Ra);a(ya,"createTransport");a(Pa,"createStdioTransport");a(wa,"createSSETransport");a(ba,"createStreamableHTTPTransport");a(Na,"createSSEOptions");a(Ia,"createStreamableHTTPOptions");a(Aa,"validateConfig");a(Oa,"getSupportedTypes");mr={create:ya,validateConfig:Aa,getSupportedTypes:Oa}});import{Client as xa}from"@modelcontextprotocol/sdk/client/index.js";var gt,jo=d(()=>{"use strict";_();hr();V();Me();gt=class{static{a(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";connectionTimeout=null;initialized=!1;eventBus=M();constructor(e){this.config=fo(e),this.validateConfig()}validateConfig(){mr.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 xa({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{}}),this.transport=mr.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 Ho=d(()=>{"use strict"});import{Hono as $a}from"hono";var zo,fr=d(()=>{"use strict";zo=a(()=>new $a,"createApp")});var Cr=d(()=>{"use strict";lr();Ho();pr();fr()});import{createHash as La}from"crypto";import{existsSync as De,mkdirSync as Da,readFileSync as Uo,renameSync as _a,writeFileSync as Fo}from"fs";import{dirname as ka,resolve as Vo}from"path";import ja from"dayjs";var X,Wo=d(()=>{"use strict";R();Cr();X=class{static{a(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION="1.0.0";CACHE_ENTRY_VERSION="1.0.0";cleanupInterval;CLEANUP_INTERVAL=6e4;constructor(e){this.logger=f,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return ja().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return Vo(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return Vo(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!De(this.cachePath)){let e=ka(this.cachePath);De(e)||(Da(e,{recursive:!0}),this.logger.debug(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55: ${e}`)),this.logger.debug("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u521D\u59CB\u7F13\u5B58\u6587\u4EF6");let t=await this.createInitialCache();await this.saveCache(t),this.logger.info(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u6587\u4EF6: ${this.cachePath}`)}}catch(e){this.logger.warn(`[CacheManager] \u521B\u5EFA\u7F13\u5B58\u6587\u4EF6\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async createInitialCache(){let e=this.formatTimestamp();return{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:e,totalWrites:0,createdAt:e}}}async writeCacheEntry(e,t,r){try{this.logger.debug(`[CacheManager] \u5F00\u59CB\u5199\u5165\u7F13\u5B58: ${e}`),await this.ensureCacheFile();let o=await this.loadExistingCache(),s=this.generateConfigHash(r),i={tools:t.map(c=>({name:c.name,description:c.description||"",inputSchema:c.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:s,version:this.CACHE_ENTRY_VERSION};o.mcpServers[e]=i,o.metadata.lastGlobalUpdate=this.formatTimestamp(),o.metadata.totalWrites+=1,await this.saveCache(o),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(o){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)}}async loadExistingCache(){try{if(!De(this.cachePath))return await this.createInitialCache();let e=Uo(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{Fo(r,t,"utf8"),_a(r,e)}catch(o){try{De(r)&&Fo(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return La("sha256").update(JSON.stringify(e)).digest("hex")}catch(t){return this.logger.warn(`[CacheManager] \u751F\u6210\u914D\u7F6E\u54C8\u5E0C\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),""}}validateCacheStructure(e){try{if(!e||typeof e!="object")return!1;let t=e,r=t.metadata;return typeof t.version=="string"&&typeof t.mcpServers=="object"&&t.mcpServers!==null&&t.metadata!==null&&t.metadata!==void 0&&typeof r=="object"&&r!==null&&typeof r.lastGlobalUpdate=="string"&&typeof r.totalWrites=="number"&&typeof r.createdAt=="string"}catch{return!1}}async getStats(){try{let e=await this.loadExistingCache();return{totalWrites:e.metadata.totalWrites,lastUpdate:e.metadata.lastGlobalUpdate,serverCount:Object.keys(e.mcpServers).length,cacheFileSize:De(this.cachePath)?Uo(this.cachePath,"utf8").length:0}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),null}}getFilePath(){return this.cachePath}async getAllCachedTools(){try{let e=await this.loadExistingCache(),t=[];for(let[r,o]of Object.entries(e.mcpServers))for(let s of o.tools)t.push({...s,name:`${r}__${s.name}`});return this.logger.debug(`[CacheManager] \u83B7\u53D6\u5230\u6240\u6709\u7F13\u5B58\u5DE5\u5177\uFF0C\u5171 ${t.length} \u4E2A`),t}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),[]}}async writeCustomMCPResult(e,t,r,o="completed",s,i=3e5){try{let c=await this.loadExtendedCache(),l=G(e,t),p={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:s,retryCount:0};c.customMCPResults||(c.customMCPResults={}),c.customMCPResults[l]=p,await this.saveExtendedCache(c),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${o}`)}catch(c){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=G(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return null;let s=r.customMCPResults[o],i=Date.now(),c=new Date(s.timestamp).getTime();return i-c>s.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):s}catch(r){return this.logger.warn(`[CacheManager] \u8BFB\u53D6CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),null}}async updateCustomMCPStatus(e,t,r,o,s){try{let i=await this.loadExtendedCache(),c=G(e,t);if(!i.customMCPResults||!i.customMCPResults[c])return!1;let l=i.customMCPResults[c],p=l.status;return l.status=r,l.timestamp=new Date().toISOString(),o&&(l.result=o),s&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${s}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(i),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${p} -> ${r}`),!0}catch(i){return this.logger.warn(`[CacheManager] \u66F4\u65B0CustomMCP\u7F13\u5B58\u72B6\u6001\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`),!1}}async markCustomMCPAsConsumed(e,t){try{let r=await this.loadExtendedCache(),o=G(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return!1;let s=r.customMCPResults[o];return s.consumed||(s.consumed=!0,s.timestamp=new Date().toISOString(),await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${e}`)),!0}catch(r){return this.logger.warn(`[CacheManager] \u6807\u8BB0CustomMCP\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async deleteCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=G(e,t);return!r.customMCPResults||!r.customMCPResults[o]?!1:(delete r.customMCPResults[o],await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u5220\u9664\u7F13\u5B58\u6761\u76EE: ${e}`),!0)}catch(r){return this.logger.warn(`[CacheManager] \u5220\u9664CustomMCP\u7F13\u5B58\u6761\u76EE\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async cleanupCustomMCPResults(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[o,s]of t)Ae(s)&&(delete e.customMCPResults[o],r++);return r>0&&(await this.saveExtendedCache(e),this.logger.info(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58: ${r}/${t.length}`)),{cleaned:r,total:t.length}}catch(e){return this.logger.warn(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{cleaned:0,total:0}}}async getCustomMCPStatistics(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0};let t=Object.values(e.customMCPResults),r=t.length,o=t.filter(g=>g.status==="pending").length,s=t.filter(g=>g.status==="completed").length,i=t.filter(g=>g.status==="failed").length,c=t.filter(g=>g.consumed).length,l=s>0?c/s*100:0,p=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:s,failedTasks:i,consumedEntries:c,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:p}}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 Z=d(()=>{"use strict";ko();jo();V();Me();hr();pt();Wo();it();lt();dr()});var vr,qo=d(()=>{"use strict";R();vr=a(async(n,e)=>{n.set("logger",f),await e()},"loggerMiddleware")});import{cors as Ha}from"hono/cors";var Er,Bo=d(()=>{"use strict";Er=Ha({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var O,q,Sr,Tr,Mr=d(()=>{"use strict";R();O=a((n,e,t)=>({error:{code:n,message:e,details:t}}),"createErrorResponse"),q=a((n,e)=>({success:!0,data:n,message:e}),"createSuccessResponse"),Sr=a((n,e)=>{let t;try{let o=e.get("logger");o?t=o:t=f}catch{t=f}process.env.NODE_ENV,t.error("HTTP request error:",n);let r=O("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"),Tr=a(n=>{if(n.req.path.startsWith("/api/")){let t=O("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method});return n.json(t,404)}let e=O("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method});return n.json(e,404)},"notFoundHandlerMiddleware")});var fe,_e,Rr=d(()=>{"use strict";fe=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},_e=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var yr,Go=d(()=>{"use strict";R();Rr();yr=a(async(n,e)=>{if(!n.get("mcpServiceManager"))try{let t=n.get("logger")||f;t.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let r=n.get("webServer");if(!r)throw new _e("WebServer \u672A\u6CE8\u5165\u5230 Context");let o=r.getMCPServiceManager();n.set("mcpServiceManager",o),t.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){let r=n.get("logger")||f;if(t instanceof fe)r.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof _e?(r.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(r.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware")});var Pr,Jo=d(()=>{"use strict";Pr=a(()=>async(n,e)=>{let t=n.get("webServer");if(!t)throw new Error("WebServer \u5B9E\u4F8B\u672A\u6CE8\u5165\u5230\u4E0A\u4E0B\u6587\u4E2D\uFF0C\u8BF7\u786E\u4FDD webServerMiddleware \u5DF2\u6B63\u786E\u914D\u7F6E");if(!t.getEndpointManager)throw new Error("WebServer \u5B9E\u4F8B\u7F3A\u5C11 getEndpointManager \u65B9\u6CD5");try{let r=t.getEndpointManager();n.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))n.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware")});var dt,wr=d(()=>{"use strict";R();_();dt=class{static{a(this,"MCPEndpointApiHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=f,this.endpointManager=e,this.configManager=t,this.eventBus=M()}createErrorResponse(e,t,r,o){return{error:{code:e,message:t,details:r?{endpoint:r,...o}:o}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(s){this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",s);let i=this.createErrorResponse(t,s instanceof Error?s.message:"JSON\u89E3\u6790\u5931\u8D25");return{ok:!1,response:e.json(i,500)}}let o=r.endpoint;if(!o||typeof o!="string"){let s=this.createErrorResponse("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",o);return{ok:!1,response:e.json(s,400)}}return{ok:!0,endpoint:o}}async getEndpointStatus(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_STATUS_READ_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.debug(`\u5904\u7406\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(i=>i.endpoint===r);if(!s){let i=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(i,404)}return this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.json(this.createSuccessResponse(s))}catch(o){this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",o);let s=this.createErrorResponse("ENDPOINT_STATUS_READ_ERROR",o instanceof Error?o.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",r);return e.json(s,500)}}async connectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_CONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u8FDE\u63A5\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);if(!s){let p=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",r);return e.json(p,404)}if(s.connected){let p=this.createErrorResponse("ENDPOINT_ALREADY_CONNECTED","\u7AEF\u70B9\u5DF2\u8FDE\u63A5",r);return e.json(p,409)}await this.endpointManager.connectExistingEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);if(!c){let p=this.createErrorResponse("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",r);return e.json(p,500)}this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!0,operation:"connect",success:!0,message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${r}`);let l=this.createSuccessResponse(c);return e.json(l)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",o);let s=this.createErrorResponse("ENDPOINT_CONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",r);return e.json(s,500)}}async disconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_DISCONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u65AD\u5F00\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(g=>g.endpoint===r);if(!s){let g=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(g,404)}if(!s.connected){let g=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(g,409)}await this.endpointManager.disconnectEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(g=>g.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},p=this.createSuccessResponse(c||l);return e.json(p)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",o);let s=this.createErrorResponse("ENDPOINT_DISCONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",r);return e.json(s,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;try{if(this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r)){let p=this.createErrorResponse("ENDPOINT_ALREADY_EXISTS","\u63A5\u5165\u70B9\u5DF2\u5B58\u5728",r);return e.json(p,409)}await this.endpointManager.addEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);if(!c){let p=this.createErrorResponse("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u72B6\u6001",r);return e.json(p,500)}this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"add",success:!0,message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F: ${r}`);let l=this.createSuccessResponse(c);return e.json(l)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25:",o);let s="ENDPOINT_ADD_ERROR",i=500;o instanceof Error&&(o.message.includes("\u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D")?(s="ENDPOINT_ALREADY_IN_CONFIG",i=409):o.message.includes("\u5DF2\u5B58\u5728")?(s="ENDPOINT_ALREADY_EXISTS",i=409):o.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(s="INVALID_ENDPOINT",i=400));let c=this.createErrorResponse(s,o instanceof Error?o.message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25",void 0);return e.json(c,i)}}async removeEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_REMOVE_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u79FB\u9664\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);if(!s){let c=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(c,404)}s.connected&&await this.endpointManager.disconnectEndpoint(r),await this.endpointManager.removeEndpoint(r),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F: ${r}`);let i=this.createSuccessResponse({endpoint:r,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F"});return e.json(i)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25:",o);let s="ENDPOINT_REMOVE_ERROR",i=500;o instanceof Error&&(o.message.includes("\u4E0D\u5B58\u5728")?(s="ENDPOINT_NOT_FOUND",i=404):o.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(s="INVALID_ENDPOINT",i=400));let c=this.createErrorResponse(s,o instanceof Error?o.message:"\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25",r);return e.json(c,i)}}}});var br,Yo=d(()=>{"use strict";H();wr();br=a(()=>{let n=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?n=new dt(o,m):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var Nr=d(()=>{"use strict";qo();Bo();Mr();Go();Jo();Yo();fr()});var mt,Xo=d(()=>{"use strict";mt=class{static{a(this,"AbstractApiHandler")}getLogger(e){let t=e.get("logger");if(!t)throw new Error("Logger not found in context. Ensure loggerMiddleware is registered.");return t}}});var ht,Ko=d(()=>{"use strict";H();Nr();Xo();ht=class extends mt{static{a(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=m.getConfig();return t.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(q(r))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r);let o=O("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async updateConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let r=await e.req.json();if(m.validateConfig(r),m.updateConfig(r),r.mcpServerConfig)for(let[o,s]of Object.entries(r.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))m.setToolEnabled(o,i,c.enable);return t.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(q(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(r){t.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r);let o=O("CONFIG_UPDATE_ERROR",r instanceof Error?r.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25");return e.json(o,400)}}async getMcpEndpoint(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let r=m.getMcpEndpoint();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(q({endpoint:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",r);let o=O("MCP_ENDPOINT_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25");return e.json(o,500)}}async getMcpEndpoints(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let r=m.getMcpEndpoints();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(q({endpoints:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",r);let o=O("MCP_ENDPOINTS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25");return e.json(o,500)}}async getMcpServers(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let r=m.getMcpServers();return t.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(q({servers:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",r);let o=O("MCP_SERVERS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async getConnectionConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let r=m.getConnectionConfig();return t.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(q({connection:r}))}catch(r){t.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",r);let o=O("CONNECTION_CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async reloadConfig(e){let t=this.getLogger(e);try{t.info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42"),m.reloadConfig();let r=m.getConfig();return t.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(q(r,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(r){t.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",r);let o=O("CONFIG_RELOAD_ERROR",r instanceof Error?r.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async getConfigPath(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let r=m.getConfigPath();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(q({path:r}))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",r);let o=O("CONFIG_PATH_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25");return e.json(o,500)}}async checkConfigExists(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let r=m.configExists();return t.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${r}`),e.json(q({exists:r}))}catch(r){t.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",r);let o=O("CONFIG_EXISTS_CHECK_ERROR",r instanceof Error?r.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25");return e.json(o,500)}}}});function Ce(n){if(!(n instanceof Error&&"code"in n))return!1;let e=n.code;return typeof e=="string"&&["AUTH_FAILED","RATE_LIMITED","TIMEOUT","API_ERROR","NETWORK_ERROR"].includes(e)}function ft(n,e){return{success:!0,data:n,message:e}}function I(n,e,t){return{success:!1,message:n,error:e?{code:e,details:t}:void 0}}function Ct(){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 Q(n)}var vt,Qo=d(()=>{"use strict";H();nt();R();a(Ce,"isErrorWithCode");a(ft,"createSuccessResponse");a(I,"createErrorResponse");a(Ct,"getCozeApiService");vt=class{static{a(this,"CozeApiHandler")}async getWorkspaces(e){try{if(f.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(I("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=Ct();f.info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return f.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(ft({workspaces:r}))}catch(t){return f.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),Ce(t)&&t.code==="AUTH_FAILED"?e.json(I("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):Ce(t)&&t.code==="RATE_LIMITED"?e.json(I("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):Ce(t)&&t.code==="TIMEOUT"?e.json(I("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(I(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async getWorkflows(e){try{if(f.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(I("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),o=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return f.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(I("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(I("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(o<1||o>100)return e.json(I("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let s={workspace_id:t,page_num:r,page_size:o},i=Ct();f.info(`\u5F00\u59CB\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868\uFF0C\u9875\u7801: ${r}\uFF0C\u6BCF\u9875: ${o}`);let c=await i.getWorkflows(s);f.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=m.getCustomMCPTools(),p=c.items.map(g=>{let u=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===g.workflow_id);return{...g,isAddedAsTool:!!u,toolName:u?.name||null}});return f.info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${p.filter(g=>g.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.json(ft({items:p,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length}))}catch(t){return f.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),Ce(t)&&t.code==="AUTH_FAILED"?e.json(I("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):Ce(t)&&t.code==="RATE_LIMITED"?e.json(I("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):Ce(t)&&t.code==="TIMEOUT"?e.json(I("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(I(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async clearCache(e){try{if(f.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(I("\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=Ct(),o=r.getCacheStats();f.info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let s=r.getCacheStats();return f.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${s.size} \u9879`),e.json(ft({cleared:o.size-s.size,remaining:s.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return f.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(I(t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async getCacheStats(e){try{if(f.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!m.isCozeConfigValid())return f.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(I("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=Ct().getCacheStats();return e.json(ft(r))}catch(t){return f.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(I(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 Et,Zo=d(()=>{"use strict";H();R();Et=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=f,this.statusService=e,this.notificationService=t}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let o={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(o,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(o){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,o),this.sendError(e,"CLIENT_STATUS_ERROR",o instanceof Error?o.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25")}}async sendLatestConfig(e,t){try{let o={type:"configUpdate",data:m.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(o)),this.logger.debug(`\u6700\u65B0\u914D\u7F6E\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u6700\u65B0\u914D\u7F6E\u5931\u8D25: ${t}`,r)}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>35e3&&(this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.statusService.updateClientInfo({status:"disconnected"},"heartbeat-timeout"))}startHeartbeatMonitoring(){return this.logger.debug("\u542F\u52A8\u5FC3\u8DF3\u76D1\u63A7"),setInterval(()=>{this.checkHeartbeatTimeout(),this.cleanupDisconnectedClients()},1e4)}cleanupDisconnectedClients(){try{this.notificationService.cleanupDisconnectedClients()}catch(e){this.logger.error("\u6E05\u7406\u65AD\u5F00\u8FDE\u63A5\u7684\u5BA2\u6237\u7AEF\u5931\u8D25:",e)}}stopHeartbeatMonitoring(e){this.logger.info("\u505C\u6B62\u5FC3\u8DF3\u76D1\u63A7"),clearInterval(e)}getHeartbeatStats(){return{lastHeartbeat:this.statusService.getLastHeartbeat(),isConnected:this.statusService.isClientConnected(),clientStats:this.notificationService.getClientStats()}}handleClientConnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u65AD\u5F00: ${e}`),this.statusService.updateClientInfo({status:"disconnected"},`websocket-disconnect-${e}`)}sendHeartbeatResponse(e,t){try{let r={type:"heartbeatResponse",data:{timestamp:Date.now(),status:"ok"}};e.send(JSON.stringify(r)),this.logger.debug(`\u5FC3\u8DF3\u54CD\u5E94\u5DF2\u53D1\u9001: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u5FC3\u8DF3\u54CD\u5E94\u5931\u8D25: ${t}`,r)}}validateHeartbeatMessage(e){return e&&typeof e=="object"&&e.type==="clientStatus"&&e.data&&typeof e.data=="object"}}});import{randomUUID as za}from"crypto";var St,en=d(()=>{"use strict";pt();R();St=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=f,this.config={maxClients:e.maxClients??100,connectionTimeout:e.connectionTimeout??3e5,heartbeatInterval:e.heartbeatInterval??3e4,maxMessageSize:e.maxMessageSize??1024*1024,enableMetrics:e.enableMetrics??!0},this.metrics={totalConnections:0,activeConnections:0,totalMessages:0,errorCount:0,averageResponseTime:0,uptime:0},this.startTime=new Date,this.startCleanupTask(),this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval})}startCleanupTask(){this.cleanupInterval=setInterval(()=>{this.cleanupStaleConnections(),this.updateMetrics()},6e4)}stopCleanupTask(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null)}cleanupStaleConnections(){let e=new Date,t=[];for(let[r,o]of this.clients.entries())(e.getTime()-o.lastActivity.getTime()>this.config.connectionTimeout||!o.isAlive)&&t.push(r);for(let r of t)this.logger.info(`\u6E05\u7406\u8FC7\u671F\u8FDE\u63A5: ${r}`),this.handleClientDisconnect(r,"cleanup");t.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${t.length} \u4E2A\u8FC7\u671F\u8FDE\u63A5`)}updateMetrics(){this.config.enableMetrics&&(this.metrics.activeConnections=this.clients.size,this.metrics.uptime=Date.now()-this.startTime.getTime(),this.logger.debug("\u8FDE\u63A5\u7EDF\u8BA1",{activeConnections:this.metrics.activeConnections,totalConnections:this.metrics.totalConnections,totalMessages:this.metrics.totalMessages,errorCount:this.metrics.errorCount}))}getMCPServiceManager(e){let t=e.get("mcpServiceManager");if(t)return t;let r=e.get("webServer");if(!r)throw new Error("WebServer \u672A\u5728 Context \u4E2D\u627E\u5230\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u95F4\u4EF6\u914D\u7F6E");let o=r.getMCPServiceManager();return this.logger.debug("MCPServiceManager \u4ECE WebServer \u83B7\u53D6\uFF08Context \u4E2D\u672A\u627E\u5230\uFF09"),o}async initializeMessageHandler(e){if(!this.mcpMessageHandler)try{let t=this.getMCPServiceManager(e);this.mcpMessageHandler=new he(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let o=e.req.query("sessionId");if(o)return await this.handleSSEMessage(e,o);let s=e.req.header("content-length");if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Request too large: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header("content-type")?.includes("application/json"))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Content-Type must be application/json");let c=e.req.header("mcp-protocol-version")||e.req.header("MCP-Protocol-Version")||e.req.header("Mcp-Protocol-Version"),l=["2024-11-05","2025-06-18"];c&&!l.includes(c)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${c}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${l.join(", ")}`);let p;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);p=JSON.parse(E),r=p.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(p))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 g=await this.mcpMessageHandler.handleMessage(p);this.metrics.totalMessages++;let u=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+u)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:p.method,messageId:r,responseTime:u,isNotification:g===null}),g===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":u.toString()}}):e.json(g,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":u.toString()})}catch(o){this.metrics.errorCount++;let s=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:o instanceof Error?o.message:String(o),messageId:r,responseTime:s,stack:o instanceof Error?o.stack:void 0});let i=o instanceof Error?o.message:String(o);return this.createErrorResponse(-32603,`Internal error: ${i}`,r)}}async handleSSEMessage(e,t){let r=Date.now(),o=null;try{this.logger.debug(`\u5904\u7406 SSE \u6D88\u606F (\u4F1A\u8BDD: ${t})`);let s=this.clients.get(t);if(!s)return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Invalid or missing sessionId",null);s.lastActivity=new Date;let i=e.req.header("content-length");if(i&&Number.parseInt(i)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`);let c;try{let g=await e.req.text();if(g.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);c=JSON.parse(g),o=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",o);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let l=await this.mcpMessageHandler.handleMessage(c);if(s.messageCount++,this.metrics.totalMessages++,l!==null&&s.writer&&s.isAlive)try{await this.sendSSEEvent(s.writer,"message",JSON.stringify(l))}catch(g){this.logger.warn(`SSE \u5199\u5165\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${t}`,g),s.isAlive=!1}let p=Date.now()-r;return this.logger.debug(`SSE \u6D88\u606F\u5904\u7406\u5B8C\u6210 (\u4F1A\u8BDD: ${t})`,{method:c.method,messageId:o,responseTime:p,messageCount:s.messageCount,isNotification:l===null}),new Response(null,{status:202,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.toString()}})}catch(s){this.metrics.errorCount++;let i=Date.now()-r;this.logger.error(`\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519 (\u4F1A\u8BDD: ${t}):`,{error:s instanceof Error?s.message:String(s),messageId:o,responseTime:i,stack:s instanceof Error?s.stack:void 0});let c=s instanceof Error?s.message:String(s);return this.createErrorResponse(-32603,`Internal error: ${c}`,o)}}async handleGet(e){try{if(this.logger.debug("\u5904\u7406 MCP GET \u8BF7\u6C42\uFF08SSE \u8FDE\u63A5\uFF09"),this.clients.size>=this.config.maxClients)return this.metrics.errorCount++,e.json({jsonrpc:"2.0",error:{code:-32e3,message:"Server busy: Maximum client connections reached",data:{maxClients:this.config.maxClients}},id:null},503);let t=Date.now().toString(),r=za(),o=new Date,s=e.req.header("user-agent"),i=e.req.header("x-forwarded-for")||e.req.header("x-real-ip")||"unknown";this.logger.info(`SSE \u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t} (\u4F1A\u8BDD: ${r})`,{userAgent:s,remoteAddress:i});let{readable:c,writable:l}=new TransformStream,p=l.getWriter(),g=new AbortController,u={id:t,sessionId:r,response:new Response(c),connectedAt:o,lastActivity:o,writer:p,abortController:g,isAlive:!0,messageCount:0,userAgent:s,remoteAddress:i};this.clients.set(r,u),this.metrics.totalConnections++,this.metrics.activeConnections=this.clients.size;try{await this.sendSSEEvent(p,"connected",JSON.stringify({sessionId:r,endpoint:`/mcp?sessionId=${r}`,timestamp:o.toISOString(),protocolVersion:"2024-11-05"}))}catch(b){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,b),u.isAlive=!1}this.startHeartbeat(u);let E=new Response(c,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no","MCP-Protocol-Version":"2024-11-05","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type, MCP-Protocol-Version"}}),h=a(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",h),g.signal.addEventListener("abort",h),E}catch(t){return this.metrics.errorCount++,this.logger.error("\u5904\u7406 MCP GET \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),e.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:null},500)}}startHeartbeat(e){e.heartbeatInterval&&clearInterval(e.heartbeatInterval),e.heartbeatInterval=setInterval(async()=>{if(!e.isAlive||!e.writer){this.stopHeartbeat(e);return}try{await this.sendSSEEvent(e.writer,"heartbeat",JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId})),this.logger.debug(`\u5FC3\u8DF3\u53D1\u9001\u6210\u529F: ${e.sessionId}`)}catch(t){this.logger.warn(`\u5FC3\u8DF3\u53D1\u9001\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${e.sessionId}`,t),e.isAlive=!1,this.stopHeartbeat(e)}},this.config.heartbeatInterval)}stopHeartbeat(e){e.heartbeatInterval&&(clearInterval(e.heartbeatInterval),e.heartbeatInterval=void 0)}async sendSSEEvent(e,t,r){try{let o=`event: ${t}
|
|
27
|
+
`:"");Z.writeFileSync(this.logFilePath,n,"utf8")}catch{}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch{}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},rt=class{static{a(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||Ae.getConfigDir()}getLogFilePath(){return new Oe({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!Z.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=Z.readFileSync(e,"utf8").trim().split(`
|
|
28
|
+
`).filter(n=>n.trim()!==""),o=[];for(let n of r)try{let i=JSON.parse(n);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp,o.push(i)}catch{}return o.sort((n,i)=>(i.timestamp||0)-(n.timestamp||0)),o}catch{throw new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(o=>o.toolName.toLowerCase().includes(t.toolName?.toLowerCase()??""))),t.serverName&&(r=r.filter(o=>o.serverName?.toLowerCase().includes(t.serverName?.toLowerCase()??""))),t.success!==void 0&&(r=r.filter(o=>o.success===t.success)),t.startDate||t.endDate){let o=t.startDate?new Date(t.startDate).getTime():0,n=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let c=i.timestamp||0;return c>=o&&c<=n})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),o=r.length,n=Math.min(e.limit||50,1e3),i=e.offset||0,c=r.slice(i,i+n),l=i+n<o;return{records:c,total:o,hasMore:l}}}});var ge,st=d(()=>{"use strict";Q();T();ge=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=m}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case"initialize":return await this.handleInitialize(e.params,e.id);case"notifications/initialized":return await this.handleInitializedNotification(e.params);case"tools/list":return await this.handleToolsList(e.id);case"tools/call":return await this.handleToolCall(e.params,e.id);case"resources/list":return await this.handleResourcesList(e.id);case"prompts/list":return await this.handlePromptsList(e.id);case"ping":return await this.handlePing(e.id);default:if(t)return this.logger.warn(`\u6536\u5230\u672A\u77E5\u7684\u901A\u77E5\u6D88\u606F: ${e.method}`,e),null;throw new Error(`\u672A\u77E5\u7684\u65B9\u6CD5: ${e.method}`)}}catch(t){return this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t),e.id===void 0?null:this.createErrorResponse(t,e.id)}}async handleInitialize(e,t){this.logger.debug("\u5904\u7406 initialize \u8BF7\u6C42",e);let r=["2024-11-05","2025-06-18"],o=e.protocolVersion,n=r.includes(o)?o:"2024-11-05";return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${o}, \u670D\u52A1\u5668\u54CD\u5E94=${n}`),{jsonrpc:"2.0",result:{serverInfo:{name:"xiaozhi-mcp-server",version:"1.0.0"},capabilities:{tools:{},logging:{}},protocolVersion:n},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.debug("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.debug("\u5904\u7406 tools/list \u8BF7\u6C42");try{return{jsonrpc:"2.0",result:{tools:this.serviceManager.getAllTools().map(o=>({name:o.name,description:o.description,inputSchema:o.inputSchema}))},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=Ge(e),o=await this.serviceManager.callTool(r.name,r.arguments||{});return{jsonrpc:"2.0",result:{content:o.content,isError:o.isError||!1},id:t!==void 0?t:1}}catch(r){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,r),r}}async handlePing(e){return this.logger.debug("\u5904\u7406 ping \u8BF7\u6C42"),{jsonrpc:"2.0",result:{status:"ok",timestamp:new Date().toISOString()},id:e!==void 0?e:1}}async handleResourcesList(e){this.logger.debug("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.debug("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u63D0\u793A\u6A21\u677F`),{jsonrpc:"2.0",result:{prompts:t},id:e!==void 0?e:1}}createErrorResponse(e,t){let r=-32603;return e.message.includes("\u672A\u627E\u5230\u5DE5\u5177")||e.message.includes("\u672A\u77E5\u7684\u65B9\u6CD5")?r=-32601:(e.message.includes("\u53C2\u6570")||e.message.includes("\u4E0D\u80FD\u4E3A\u7A7A"))&&(r=-32602),{jsonrpc:"2.0",error:{code:r,message:e.message,data:{stack:e.stack}},id:t!==void 0?t:1}}getServiceManager(){return this.serviceManager}}});var nt=d(()=>{"use strict"});var So=d(()=>{"use strict";nt()});import ag,{WebSocketServer as cg}from"ws";var Ro=d(()=>{"use strict";nt()});var ir=d(()=>{"use strict";nt();So();Ro()});import{EventEmitter as Bi}from"events";import{isModelScopeURL as Gi}from "../config/index.js";import{configManager as H}from "../config/index.js";var se,To=d(()=>{"use strict";Q();Q();k();et();ot();st();ir();se=class extends Bi{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=R();toolCallLogger;retryTimers=new Map;failedServices=new Set;transportAdapters=new Map;messageHandler;isRunning=!1;config;constructor(e){super(),e&&this.isUnifiedServerConfig(e)?(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info",...e},this.configs=e.configs||{}):(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info"},this.configs=e||{});let r=process.env.NODE_ENV==="test"||process.env.VITEST==="true"?`/tmp/xiaozhi-test-${Date.now()}-${Math.random().toString(36).substring(2,11)}/xiaozhi.cache.json`:void 0;this.cacheManager=new X(r),this.customMCPHandler=new Ie(this.cacheManager,this);let o=H.getToolCallLogConfig(),n=H.getConfigDir();this.toolCallLogger=new Oe(o,n),this.setupEventListeners(),this.messageHandler=new ge(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",async e=>{await this.handleServiceConnected(e)}),this.eventBus.onEvent("mcp:service:disconnected",async e=>{await this.handleServiceDisconnected(e)}),this.eventBus.onEvent("mcp:service:connection:failed",async e=>{await this.handleServiceConnectionFailed(e)})}async handleServiceConnected(e){try{this.services.get(e.serviceName)&&await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceDisconnected(e){try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch{}}async startAllServices(){try{this.customMCPHandler.initialize()}catch{}let e=Object.entries(this.configs);if(e.length===0)return;let t=e.map(async([c])=>{try{return await this.startService(c),{serviceName:c,success:!0,error:null}}catch(l){return{serviceName:c,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),o=0,n=0,i=[];for(let c of r)c.status==="fulfilled"?c.value.success?o++:(n++,i.push(c.value.serviceName)):n++;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 it(t);await r.connect(),this.services.set(e,r),await this.refreshToolsCache();let o=r.getTools()}catch(r){throw this.services.delete(e),r}}async stopService(e){let t=this.services.get(e);if(t)try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache()}catch(r){throw r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),o=this.configs[e];o&&this.cacheManager.writeCacheEntry(e,r,o).then(()=>{}).catch(n=>{});for(let n of r){let i=`${e}__${n.name}`;this.tools.set(i,{serviceName:e,originalName:n.name,tool:n})}}await this.syncToolsConfigToFile()}getAllTools(){let e=[];for(let[r,o]of this.services)try{if(o.isConnected()){let n=o.getTools();for(let i of n)try{if(!H.isToolEnabled(r,i.name))continue;let l=`${r}__${i.name}`;e.push({name:l,description:i.description||"",inputSchema:i.inputSchema,serviceName:r,originalName:i.name})}catch{}}}catch{}let t=[];try{t=this.customMCPHandler.getTools()}catch{t=[]}for(let r of t)try{e.push({name:r.name,description:r.description||"",inputSchema:r.inputSchema,serviceName:this.getServiceNameForTool(r),originalName:r.name})}catch{}return e}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t,r){let o=Date.now(),n="unknown",i=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(n=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(c=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(c=await this.customMCPHandler.callTool(e,t,r),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);n=l.serviceName,i=l.originalName;let p=this.services.get(l.serviceName);if(!p)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!p.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await p.callTool(l.originalName,t||{}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:n,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-o}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:n,arguments:t,result:null,success:!1,duration:Date.now()-o,error:c instanceof Error?c.message:String(c)}),this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l?.handler?.type==="mcp"?this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!1):this.updateToolStatsSafe(e,"customMCP",e,!1)}else{let l=this.tools.get(e);l&&this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1)}throw c}}async updateToolStats(e,t,r,o){try{let n=new Date().toISOString();o?(await this.updateCustomMCPToolStats(e,n),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,n)):(await this.updateCustomMCPToolLastUsedTime(e,n),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,n))}catch(n){throw n}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch{let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F"}}async updateCustomMCPToolStats(e,t){try{await H.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await H.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await H.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await H.updateMCPServerToolStatsWithLock(e,t,r,!1)}catch(o){throw o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:n}=t,i=this.services.get(o);if(!i)throw new Error(`\u670D\u52A1 ${o} \u4E0D\u53EF\u7528`);if(!i.isConnected())throw new Error(`\u670D\u52A1 ${o} \u672A\u8FDE\u63A5`);try{return await i.callTool(n,r||{})}catch(c){throw c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect()}catch{}try{this.customMCPHandler.cleanup()}catch{}try{H.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=H.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch{return{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{this.customMCPHandler.initialize()}catch(e){throw e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch{return!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch{return[]}}isModelScopeService(e){return e.url?Gi(e.url):!1}handleModelScopeAuth(e,t){if(e.headers?.Authorization)return;let o=H.getModelScopeApiKey();if(o){t.apiKey=o;return}let n=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: ${n}\u8BF7\u9009\u62E9\u4EE5\u4E0B\u4EFB\u4E00\u65B9\u5F0F\u914D\u7F6E\u8BA4\u8BC1\uFF1A1. \u5728\u670D\u52A1\u914D\u7F6E\u4E2D\u6DFB\u52A0 headers.Authorization2. \u6216\u8005\u5728\u5168\u5C40\u914D\u7F6E\u4E2D\u8BBE\u7F6E modelscope.apiKey3. \u6216\u8005\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF MODELSCOPE_API_TOKEN\u83B7\u53D6 ModelScope API Key: https://modelscope.cn/my?myInfo=true`)}enhanceServiceConfig(e){let t={...e};try{return this.isModelScopeService(e)&&this.handleModelScopeAuth(e,t),t}catch(r){throw r}}addServiceConfig(e,t){let r,o;if(typeof e=="string"&&t)o=e,r=t;else if(typeof e=="object")o=e.name,r=e;else throw new Error("Invalid arguments for addServiceConfig");let n=this.enhanceServiceConfig(r);this.configs[o]=n}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(t);this.configs[e]=r}removeServiceConfig(e){delete this.configs[e]}async syncToolsConfigToFile(){try{let e=H.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let o=r.getTools();if(o.length===0)continue;let n=e[t]?.tools||{},i={};for(let g of o){let E=n[g.name];E?i[g.name]={...E,description:g.description||E.description||""}:i[g.name]={description:g.description||"",enable:!0}}let c=o.map(g=>g.name),p=Object.keys(n).filter(g=>!c.includes(g));if(p.length>0,this.hasToolsConfigChanged(n,i)){H.updateServerToolsConfig(t,i);let g=Object.keys(i).filter(h=>!n[h]),E=Object.keys(i).filter(h=>{let x=n[h],qe=i[h];return x&&x.description!==qe.description});g.length>0,E.length>0,p.length>0}}}catch{}}hasToolsConfigChanged(e,t){let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!0;let n=o.filter(c=>!r.includes(c)),i=r.filter(c=>!o.includes(c));if(n.length>0||i.length>0)return!0;for(let c of r){let l=e[c],p=t[c];if(l.description!==p.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e));let o=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,o)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e);try{await this.refreshCustomMCPHandlerPublic()}catch{}}catch{let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);this.scheduleServiceRetry(e,o)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,o)=>r+o.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e)),this.failedServices.delete(e)}stopAllServiceRetries(){for(let[e,t]of this.retryTimers)clearTimeout(t);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}async registerTransport(e,t){if(this.transportAdapters.has(e))throw new Error(`\u4F20\u8F93\u9002\u914D\u5668 ${e} \u5DF2\u5B58\u5728`);try{await t.initialize(),this.transportAdapters.set(e,t),this.emit("transportRegistered",{name:e,adapter:t})}catch(r){throw r}}async startTransports(){let e=[],t=[];for(let[r,o]of this.transportAdapters)try{await o.start(),e.push(r)}catch{t.push(r)}if(e.length===0&&t.length>0){let r=`\u6240\u6709\u4F20\u8F93\u9002\u914D\u5668\u542F\u52A8\u5931\u8D25\uFF0C\u5931\u8D25\u7684\u9002\u914D\u5668: ${t.join(", ")}`;throw new Error(r)}t.length>0}async stopTransports(){try{for(let[e,t]of this.transportAdapters)try{await t.stop()}catch{}}catch(e){throw e}}getTransportAdapters(){return new Map(this.transportAdapters)}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");try{await this.startAllServices(),await this.startTransports(),this.isRunning=!0,this.emit("started")}catch(e){throw e}}async stop(){if(this.isRunning)try{await this.stopTransports(),await this.stopAllServices(),this.isRunning=!1,this.emit("stopped")}catch(e){throw e}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});for(let[t,r]of this.transportAdapters)e.push({id:r.getConnectionId(),name:t,state:r.getState()});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,transportCount:this.getTransportAdapters().size,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames()}catch{e=0,t=[]}let r=this.tools.size+e,n=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:n};for(let[c,l]of this.services){let p=l.getStatus();i.services[c]={connected:p.connected,clientName:`xiaozhi-${c}-client`}}return e>0&&(i.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),i}isServerRunning(){return this.isRunning}isUnifiedServerConfig(e){return e!==null&&typeof e=="object"&&"configs"in e}async routeMessage(e){let t=await this.messageHandler.handleMessage(e);return t===null?null:{jsonrpc:"2.0",method:"response",params:t,id:t.id}}async initialize(){await this.start()}getToolRegistry(){return this}getConnectionManager(){return this}}});import{SSEClientTransport as Ji}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Xi}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Yi}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{EventSource as Ki}from"eventsource";function Qi(s){switch(s.type){case"stdio":return Zi(s);case"sse":return ea(s);case"streamable-http":return ta(s);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${s.type}`)}}function Zi(s){if(!s.command)throw new Error("stdio transport \u9700\u8981 command \u914D\u7F6E");return new Xi({command:s.command,args:s.args||[],env:s.env})}function ea(s){if(!s.url)throw new Error("SSE transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(s.url),t=ra(s);return new Ji(e,t)}function ta(s){if(!s.url)throw new Error("StreamableHTTP transport \u9700\u8981 URL \u914D\u7F6E");let e=new URL(s.url),t=oa(s);return new Yi(e,t)}function ra(s){let e={};return s.apiKey?e.requestInit={headers:{Authorization:`Bearer ${s.apiKey}`,...s.headers}}:s.headers&&(e.requestInit={headers:s.headers}),e}function oa(s){let e={};return s.apiKey?e.requestInit={headers:{Authorization:`Bearer ${s.apiKey}`,...s.headers}}:s.headers&&(e.requestInit={headers:s.headers}),e}function sa(s){if(!s.name||typeof s.name!="string")throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");if(s.type&&!Object.values(Se).includes(s.type))throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${s.type}`);if(!s.type)throw new Error("\u4F20\u8F93\u7C7B\u578B\u672A\u8BBE\u7F6E\uFF0C\u8FD9\u5E94\u8BE5\u5728 inferTransportType \u4E2D\u5904\u7406");switch(s.type){case"stdio":if(!s.command)throw new Error("stdio \u7C7B\u578B\u9700\u8981 command \u5B57\u6BB5");break;case"sse":if(s.url===void 0||s.url===null)throw new Error(`${s.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;case"streamable-http":if(s.url===void 0||s.url===null)throw new Error(`${s.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${s.type}`)}}function na(){return["stdio","sse","streamable-http"]}var ar,cr=d(()=>{"use strict";q();typeof global<"u"&&!global.EventSource&&(global.EventSource=Ki);a(Qi,"createTransport");a(Zi,"createStdioTransport");a(ea,"createSSETransport");a(ta,"createStreamableHTTPTransport");a(ra,"createSSEOptions");a(oa,"createStreamableHTTPOptions");a(sa,"validateConfig");a(na,"getSupportedTypes");ar={create:Qi,validateConfig:sa,getSupportedTypes:na}});import{Client as ia}from"@modelcontextprotocol/sdk/client/index.js";var it,Mo=d(()=>{"use strict";k();cr();q();Je();it=class{static{a(this,"MCPService")}config;client=null;transport=null;tools=new Map;connectionState="disconnected";connectionTimeout=null;initialized=!1;eventBus=R();constructor(e){this.config=co(e),this.validateConfig()}validateConfig(){ar.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 ia({name:`xiaozhi-${this.config.name}-client`,version:"1.0.0"},{capabilities:{}}),this.transport=ar.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 yo=d(()=>{"use strict"});import{Hono as aa}from"hono";var Po,lr=d(()=>{"use strict";Po=a(()=>new aa,"createApp")});var pr=d(()=>{"use strict";rr();yo();or();lr()});import{createHash as ca}from"crypto";import{existsSync as xe,mkdirSync as la,readFileSync as wo,renameSync as pa,writeFileSync as bo}from"fs";import{dirname as ua,resolve as No}from"path";import ga from"dayjs";var X,Io=d(()=>{"use strict";T();pr();X=class{static{a(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION="1.0.0";CACHE_ENTRY_VERSION="1.0.0";cleanupInterval;CLEANUP_INTERVAL=6e4;constructor(e){this.logger=m,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return ga().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return No(e,"xiaozhi.cache.json")}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return No(t,"xiaozhi.cache.json")}}async ensureCacheFile(){try{if(!xe(this.cachePath)){let e=ua(this.cachePath);xe(e)||(la(e,{recursive:!0}),this.logger.debug(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55: ${e}`)),this.logger.debug("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u521D\u59CB\u7F13\u5B58\u6587\u4EF6");let t=await this.createInitialCache();await this.saveCache(t),this.logger.info(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u6587\u4EF6: ${this.cachePath}`)}}catch(e){this.logger.warn(`[CacheManager] \u521B\u5EFA\u7F13\u5B58\u6587\u4EF6\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async createInitialCache(){let e=this.formatTimestamp();return{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:e,totalWrites:0,createdAt:e}}}async writeCacheEntry(e,t,r){try{this.logger.debug(`[CacheManager] \u5F00\u59CB\u5199\u5165\u7F13\u5B58: ${e}`),await this.ensureCacheFile();let o=await this.loadExistingCache(),n=this.generateConfigHash(r),i={tools:t.map(c=>({name:c.name,description:c.description||"",inputSchema:c.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:n,version:this.CACHE_ENTRY_VERSION};o.mcpServers[e]=i,o.metadata.lastGlobalUpdate=this.formatTimestamp(),o.metadata.totalWrites+=1,await this.saveCache(o),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(o){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)}}async loadExistingCache(){try{if(!xe(this.cachePath))return await this.createInitialCache();let e=wo(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{bo(r,t,"utf8"),pa(r,e)}catch(o){try{xe(r)&&bo(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return ca("sha256").update(JSON.stringify(e)).digest("hex")}catch(t){return this.logger.warn(`[CacheManager] \u751F\u6210\u914D\u7F6E\u54C8\u5E0C\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),""}}validateCacheStructure(e){try{if(!e||typeof e!="object")return!1;let t=e,r=t.metadata;return typeof t.version=="string"&&typeof t.mcpServers=="object"&&t.mcpServers!==null&&t.metadata!==null&&t.metadata!==void 0&&typeof r=="object"&&r!==null&&typeof r.lastGlobalUpdate=="string"&&typeof r.totalWrites=="number"&&typeof r.createdAt=="string"}catch{return!1}}async getStats(){try{let e=await this.loadExistingCache();return{totalWrites:e.metadata.totalWrites,lastUpdate:e.metadata.lastGlobalUpdate,serverCount:Object.keys(e.mcpServers).length,cacheFileSize:xe(this.cachePath)?wo(this.cachePath,"utf8").length:0}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),null}}getFilePath(){return this.cachePath}async getAllCachedTools(){try{let e=await this.loadExistingCache(),t=[];for(let[r,o]of Object.entries(e.mcpServers))for(let n of o.tools)t.push({...n,name:`${r}__${n.name}`});return this.logger.debug(`[CacheManager] \u83B7\u53D6\u5230\u6240\u6709\u7F13\u5B58\u5DE5\u5177\uFF0C\u5171 ${t.length} \u4E2A`),t}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),[]}}async writeCustomMCPResult(e,t,r,o="completed",n,i=3e5){try{let c=await this.loadExtendedCache(),l=B(e,t),p={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:n,retryCount:0};c.customMCPResults||(c.customMCPResults={}),c.customMCPResults[l]=p,await this.saveExtendedCache(c),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${o}`)}catch(c){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=B(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return null;let n=r.customMCPResults[o],i=Date.now(),c=new Date(n.timestamp).getTime();return i-c>n.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):n}catch(r){return this.logger.warn(`[CacheManager] \u8BFB\u53D6CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),null}}async updateCustomMCPStatus(e,t,r,o,n){try{let i=await this.loadExtendedCache(),c=B(e,t);if(!i.customMCPResults||!i.customMCPResults[c])return!1;let l=i.customMCPResults[c],p=l.status;return l.status=r,l.timestamp=new Date().toISOString(),o&&(l.result=o),n&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(i),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${p} -> ${r}`),!0}catch(i){return this.logger.warn(`[CacheManager] \u66F4\u65B0CustomMCP\u7F13\u5B58\u72B6\u6001\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`),!1}}async markCustomMCPAsConsumed(e,t){try{let r=await this.loadExtendedCache(),o=B(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return!1;let n=r.customMCPResults[o];return n.consumed||(n.consumed=!0,n.timestamp=new Date().toISOString(),await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${e}`)),!0}catch(r){return this.logger.warn(`[CacheManager] \u6807\u8BB0CustomMCP\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async deleteCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=B(e,t);return!r.customMCPResults||!r.customMCPResults[o]?!1:(delete r.customMCPResults[o],await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u5220\u9664\u7F13\u5B58\u6761\u76EE: ${e}`),!0)}catch(r){return this.logger.warn(`[CacheManager] \u5220\u9664CustomMCP\u7F13\u5B58\u6761\u76EE\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async cleanupCustomMCPResults(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[o,n]of t)be(n)&&(delete e.customMCPResults[o],r++);return r>0&&(await this.saveExtendedCache(e),this.logger.info(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58: ${r}/${t.length}`)),{cleaned:r,total:t.length}}catch(e){return this.logger.warn(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{cleaned:0,total:0}}}async getCustomMCPStatistics(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0};let t=Object.values(e.customMCPResults),r=t.length,o=t.filter(u=>u.status==="pending").length,n=t.filter(u=>u.status==="completed").length,i=t.filter(u=>u.status==="failed").length,c=t.filter(u=>u.consumed).length,l=n>0?c/n*100:0,p=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:n,failedTasks:i,consumedEntries:c,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:p}}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 Q=d(()=>{"use strict";To();Mo();q();Je();cr();st();Io();et();ot();ir()});var ur,Ao=d(()=>{"use strict";T();ur=a(async(s,e)=>{s.set("logger",m),await e()},"loggerMiddleware")});import{cors as da}from"hono/cors";var gr,Oo=d(()=>{"use strict";gr=da({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(s=>s.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var I,V,dr,hr,mr=d(()=>{"use strict";T();I=a((s,e,t)=>({error:{code:s,message:e,details:t}}),"createErrorResponse"),V=a((s,e)=>({success:!0,data:s,message:e}),"createSuccessResponse"),dr=a((s,e)=>{let t;try{let o=e.get("logger");o?t=o:t=m}catch{t=m}process.env.NODE_ENV,t.error("HTTP request error:",s);let r=I("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?s.stack:void 0);return e.json(r,500)},"errorHandlerMiddleware"),hr=a(s=>{if(s.req.path.startsWith("/api/")){let t=I("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:s.req.path,method:s.req.method});return s.json(t,404)}let e=I("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:s.req.path,method:s.req.method});return s.json(e,404)},"notFoundHandlerMiddleware")});var de,$e,fr=d(()=>{"use strict";de=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},$e=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var Cr,xo=d(()=>{"use strict";T();fr();Cr=a(async(s,e)=>{if(!s.get("mcpServiceManager"))try{let t=s.get("logger")||m;t.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let r=s.get("webServer");if(!r)throw new $e("WebServer \u672A\u6CE8\u5165\u5230 Context");let o=r.getMCPServiceManager();s.set("mcpServiceManager",o),t.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){let r=s.get("logger")||m;if(t instanceof de)r.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof $e?(r.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(r.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware")});var Er,$o=d(()=>{"use strict";Er=a(()=>async(s,e)=>{let t=s.get("webServer");if(!t)throw new Error("WebServer \u5B9E\u4F8B\u672A\u6CE8\u5165\u5230\u4E0A\u4E0B\u6587\u4E2D\uFF0C\u8BF7\u786E\u4FDD webServerMiddleware \u5DF2\u6B63\u786E\u914D\u7F6E");if(!t.getEndpointManager)throw new Error("WebServer \u5B9E\u4F8B\u7F3A\u5C11 getEndpointManager \u65B9\u6CD5");try{let r=t.getEndpointManager();s.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))s.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware")});var at,vr=d(()=>{"use strict";T();k();at=class{static{a(this,"MCPEndpointApiHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=m,this.endpointManager=e,this.configManager=t,this.eventBus=R()}createErrorResponse(e,t,r,o){return{error:{code:e,message:t,details:r?{endpoint:r,...o}:o}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(n){this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",n);let i=this.createErrorResponse(t,n instanceof Error?n.message:"JSON\u89E3\u6790\u5931\u8D25");return{ok:!1,response:e.json(i,500)}}let o=r.endpoint;if(!o||typeof o!="string"){let n=this.createErrorResponse("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",o);return{ok:!1,response:e.json(n,400)}}return{ok:!0,endpoint:o}}async getEndpointStatus(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_STATUS_READ_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.debug(`\u5904\u7406\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u8BF7\u6C42: ${r}`);try{let n=this.endpointManager.getConnectionStatus().find(i=>i.endpoint===r);if(!n){let i=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(i,404)}return this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.json(this.createSuccessResponse(n))}catch(o){this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",o);let n=this.createErrorResponse("ENDPOINT_STATUS_READ_ERROR",o instanceof Error?o.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",r);return e.json(n,500)}}async connectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_CONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u8FDE\u63A5\u8BF7\u6C42: ${r}`);try{let n=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);if(!n){let p=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",r);return e.json(p,404)}if(n.connected){let p=this.createErrorResponse("ENDPOINT_ALREADY_CONNECTED","\u7AEF\u70B9\u5DF2\u8FDE\u63A5",r);return e.json(p,409)}await this.endpointManager.connectExistingEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);if(!c){let p=this.createErrorResponse("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",r);return e.json(p,500)}this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!0,operation:"connect",success:!0,message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${r}`);let l=this.createSuccessResponse(c);return e.json(l)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",o);let n=this.createErrorResponse("ENDPOINT_CONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",r);return e.json(n,500)}}async disconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_DISCONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u65AD\u5F00\u8BF7\u6C42: ${r}`);try{let n=this.endpointManager.getConnectionStatus().find(u=>u.endpoint===r);if(!n){let u=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(u,404)}if(!n.connected){let u=this.createErrorResponse("ENDPOINT_NOT_CONNECTED","\u7AEF\u70B9\u672A\u8FDE\u63A5",r);return e.json(u,409)}await this.endpointManager.disconnectEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(u=>u.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"disconnect",success:!0,message:"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F: ${r}`);let l={endpoint:r,connected:!1,initialized:!0},p=this.createSuccessResponse(c||l);return e.json(p)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",o);let n=this.createErrorResponse("ENDPOINT_DISCONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",r);return e.json(n,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;try{if(this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r)){let p=this.createErrorResponse("ENDPOINT_ALREADY_EXISTS","\u63A5\u5165\u70B9\u5DF2\u5B58\u5728",r);return e.json(p,409)}await this.endpointManager.addEndpoint(r);let c=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);if(!c){let p=this.createErrorResponse("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u72B6\u6001",r);return e.json(p,500)}this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"add",success:!0,message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F: ${r}`);let l=this.createSuccessResponse(c);return e.json(l)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25:",o);let n="ENDPOINT_ADD_ERROR",i=500;o instanceof Error&&(o.message.includes("\u5DF2\u5B58\u5728\u4E8E\u914D\u7F6E\u6587\u4EF6\u4E2D")?(n="ENDPOINT_ALREADY_IN_CONFIG",i=409):o.message.includes("\u5DF2\u5B58\u5728")?(n="ENDPOINT_ALREADY_EXISTS",i=409):o.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(n="INVALID_ENDPOINT",i=400));let c=this.createErrorResponse(n,o instanceof Error?o.message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u5931\u8D25",void 0);return e.json(c,i)}}async removeEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_REMOVE_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u79FB\u9664\u8BF7\u6C42: ${r}`);try{let n=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);if(!n){let c=this.createErrorResponse("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",r);return e.json(c,404)}n.connected&&await this.endpointManager.disconnectEndpoint(r),await this.endpointManager.removeEndpoint(r),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F: ${r}`);let i=this.createSuccessResponse({endpoint:r,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F"});return e.json(i)}catch(o){this.logger.error("\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25:",o);let n="ENDPOINT_REMOVE_ERROR",i=500;o instanceof Error&&(o.message.includes("\u4E0D\u5B58\u5728")?(n="ENDPOINT_NOT_FOUND",i=404):o.message.includes("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")&&(n="INVALID_ENDPOINT",i=400));let c=this.createErrorResponse(n,o instanceof Error?o.message:"\u63A5\u5165\u70B9\u79FB\u9664\u5931\u8D25",r);return e.json(c,i)}}}});import{configManager as ha}from "../config/index.js";var Sr,Lo=d(()=>{"use strict";vr();Sr=a(()=>{let s=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?s=new at(o,ha):s=null),t.set("endpointHandler",s),await r()}},"endpointsMiddleware")});var Rr=d(()=>{"use strict";Ao();Oo();mr();xo();$o();Lo();lr()});var ct,Do=d(()=>{"use strict";ct=class{static{a(this,"AbstractApiHandler")}getLogger(e){let t=e.get("logger");if(!t)throw new Error("Logger not found in context. Ensure loggerMiddleware is registered.");return t}}});import{configManager as z}from "../config/index.js";var lt,_o=d(()=>{"use strict";Rr();Do();lt=class extends ct{static{a(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=z.getConfig();return t.info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.json(V(r))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r);let o=I("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async updateConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let r=await e.req.json();if(z.validateConfig(r),z.updateConfig(r),r.mcpServerConfig)for(let[o,n]of Object.entries(r.mcpServerConfig))for(let[i,c]of Object.entries(n.tools))z.setToolEnabled(o,i,c.enable);return t.info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.json(V(null,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F"))}catch(r){t.error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",r);let o=I("CONFIG_UPDATE_ERROR",r instanceof Error?r.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25");return e.json(o,400)}}async getMcpEndpoint(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let r=z.getMcpEndpoint();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.json(V({endpoint:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",r);let o=I("MCP_ENDPOINT_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25");return e.json(o,500)}}async getMcpEndpoints(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let r=z.getMcpEndpoints();return t.debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.json(V({endpoints:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",r);let o=I("MCP_ENDPOINTS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25");return e.json(o,500)}}async getMcpServers(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let r=z.getMcpServers();return t.debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.json(V({servers:r}))}catch(r){t.error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",r);let o=I("MCP_SERVERS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async getConnectionConfig(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let r=z.getConnectionConfig();return t.debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.json(V({connection:r}))}catch(r){t.error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",r);let o=I("CONNECTION_CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async reloadConfig(e){let t=this.getLogger(e);try{t.info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42"),z.reloadConfig();let r=z.getConfig();return t.info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.json(V(r,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F"))}catch(r){t.error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",r);let o=I("CONFIG_RELOAD_ERROR",r instanceof Error?r.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25");return e.json(o,500)}}async getConfigPath(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let r=z.getConfigPath();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.json(V({path:r}))}catch(r){t.error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",r);let o=I("CONFIG_PATH_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25");return e.json(o,500)}}async checkConfigExists(e){let t=this.getLogger(e);try{t.debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let r=z.configExists();return t.debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${r}`),e.json(V({exists:r}))}catch(r){t.error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",r);let o=I("CONFIG_EXISTS_CHECK_ERROR",r instanceof Error?r.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25");return e.json(o,500)}}}});import{configManager as me}from "../config/index.js";function he(s){if(!(s instanceof Error&&"code"in s))return!1;let e=s.code;return typeof e=="string"&&["AUTH_FAILED","RATE_LIMITED","TIMEOUT","API_ERROR","NETWORK_ERROR"].includes(e)}function pt(s,e){return{success:!0,data:s,message:e}}function b(s,e,t){return{success:!1,message:s,error:e?{code:e,details:t}:void 0}}function ut(){let s=me.getCozeToken();if(!s)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 K(s)}var gt,ko=d(()=>{"use strict";Qe();T();a(he,"isErrorWithCode");a(pt,"createSuccessResponse");a(b,"createErrorResponse");a(ut,"getCozeApiService");gt=class{static{a(this,"CozeApiHandler")}async getWorkspaces(e){try{if(m.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!me.isCozeConfigValid())return m.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(b("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=ut();m.info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return m.info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.json(pt({workspaces:r}))}catch(t){return m.error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),he(t)&&t.code==="AUTH_FAILED"?e.json(b("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):he(t)&&t.code==="RATE_LIMITED"?e.json(b("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):he(t)&&t.code==="TIMEOUT"?e.json(b("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(b(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async getWorkflows(e){try{if(m.info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!me.isCozeConfigValid())return m.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(b("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),o=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return m.warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.json(b("\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id","MISSING_PARAMETER"),400);if(r<1||r>1e3)return e.json(b("page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4","INVALID_PARAMETER"),400);if(o<1||o>100)return e.json(b("page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4","INVALID_PARAMETER"),400);let n={workspace_id:t,page_num:r,page_size:o},i=ut();m.info(`\u5F00\u59CB\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868\uFF0C\u9875\u7801: ${r}\uFF0C\u6BCF\u9875: ${o}`);let c=await i.getWorkflows(n);m.info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=me.getCustomMCPTools(),p=c.items.map(u=>{let g=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!g,toolName:g?.name||null}});return m.info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${p.filter(u=>u.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.json(pt({items:p,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length}))}catch(t){return m.error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),he(t)&&t.code==="AUTH_FAILED"?e.json(b("\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E","AUTH_FAILED"),401):he(t)&&t.code==="RATE_LIMITED"?e.json(b("\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","RATE_LIMITED"),429):he(t)&&t.code==="TIMEOUT"?e.json(b("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5","TIMEOUT"),408):e.json(b(t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async clearCache(e){try{if(m.info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!me.isCozeConfigValid())return m.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(b("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let t=e.req.query("pattern"),r=ut(),o=r.getCacheStats();m.info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let n=r.getCacheStats();return m.info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${n.size} \u9879`),e.json(pt({cleared:o.size-n.size,remaining:n.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F"))}catch(t){return m.error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t),e.json(b(t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25","INTERNAL_ERROR",process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0),500)}}async getCacheStats(e){try{if(m.info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!me.isCozeConfigValid())return m.debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.json(b("\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E","CONFIG_INVALID"),400);let r=ut().getCacheStats();return e.json(pt(r))}catch(t){return m.error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t),e.json(b(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)}}}});import{configManager as ma}from "../config/index.js";var dt,jo=d(()=>{"use strict";T();dt=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=m,this.statusService=e,this.notificationService=t}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let o={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(o,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(o){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,o),this.sendError(e,"CLIENT_STATUS_ERROR",o instanceof Error?o.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25")}}async sendLatestConfig(e,t){try{let o={type:"configUpdate",data:ma.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(o)),this.logger.debug(`\u6700\u65B0\u914D\u7F6E\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u6700\u65B0\u914D\u7F6E\u5931\u8D25: ${t}`,r)}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>35e3&&(this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.statusService.updateClientInfo({status:"disconnected"},"heartbeat-timeout"))}startHeartbeatMonitoring(){return this.logger.debug("\u542F\u52A8\u5FC3\u8DF3\u76D1\u63A7"),setInterval(()=>{this.checkHeartbeatTimeout(),this.cleanupDisconnectedClients()},1e4)}cleanupDisconnectedClients(){try{this.notificationService.cleanupDisconnectedClients()}catch(e){this.logger.error("\u6E05\u7406\u65AD\u5F00\u8FDE\u63A5\u7684\u5BA2\u6237\u7AEF\u5931\u8D25:",e)}}stopHeartbeatMonitoring(e){this.logger.info("\u505C\u6B62\u5FC3\u8DF3\u76D1\u63A7"),clearInterval(e)}getHeartbeatStats(){return{lastHeartbeat:this.statusService.getLastHeartbeat(),isConnected:this.statusService.isClientConnected(),clientStats:this.notificationService.getClientStats()}}handleClientConnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u65AD\u5F00: ${e}`),this.statusService.updateClientInfo({status:"disconnected"},`websocket-disconnect-${e}`)}sendHeartbeatResponse(e,t){try{let r={type:"heartbeatResponse",data:{timestamp:Date.now(),status:"ok"}};e.send(JSON.stringify(r)),this.logger.debug(`\u5FC3\u8DF3\u54CD\u5E94\u5DF2\u53D1\u9001: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u5FC3\u8DF3\u54CD\u5E94\u5931\u8D25: ${t}`,r)}}validateHeartbeatMessage(e){return e&&typeof e=="object"&&e.type==="clientStatus"&&e.data&&typeof e.data=="object"}}});import{randomUUID as fa}from"crypto";var ht,Ho=d(()=>{"use strict";st();T();ht=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;clients=new Map;config;metrics;cleanupInterval=null;startTime;constructor(e={}){this.logger=m,this.config={maxClients:e.maxClients??100,connectionTimeout:e.connectionTimeout??3e5,heartbeatInterval:e.heartbeatInterval??3e4,maxMessageSize:e.maxMessageSize??1024*1024,enableMetrics:e.enableMetrics??!0},this.metrics={totalConnections:0,activeConnections:0,totalMessages:0,errorCount:0,averageResponseTime:0,uptime:0},this.startTime=new Date,this.startCleanupTask(),this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval})}startCleanupTask(){this.cleanupInterval=setInterval(()=>{this.cleanupStaleConnections(),this.updateMetrics()},6e4)}stopCleanupTask(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null)}cleanupStaleConnections(){let e=new Date,t=[];for(let[r,o]of this.clients.entries())(e.getTime()-o.lastActivity.getTime()>this.config.connectionTimeout||!o.isAlive)&&t.push(r);for(let r of t)this.logger.info(`\u6E05\u7406\u8FC7\u671F\u8FDE\u63A5: ${r}`),this.handleClientDisconnect(r,"cleanup");t.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${t.length} \u4E2A\u8FC7\u671F\u8FDE\u63A5`)}updateMetrics(){this.config.enableMetrics&&(this.metrics.activeConnections=this.clients.size,this.metrics.uptime=Date.now()-this.startTime.getTime(),this.logger.debug("\u8FDE\u63A5\u7EDF\u8BA1",{activeConnections:this.metrics.activeConnections,totalConnections:this.metrics.totalConnections,totalMessages:this.metrics.totalMessages,errorCount:this.metrics.errorCount}))}getMCPServiceManager(e){let t=e.get("mcpServiceManager");if(t)return t;let r=e.get("webServer");if(!r)throw new Error("WebServer \u672A\u5728 Context \u4E2D\u627E\u5230\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u95F4\u4EF6\u914D\u7F6E");let o=r.getMCPServiceManager();return this.logger.debug("MCPServiceManager \u4ECE WebServer \u83B7\u53D6\uFF08Context \u4E2D\u672A\u627E\u5230\uFF09"),o}async initializeMessageHandler(e){if(!this.mcpMessageHandler)try{let t=this.getMCPServiceManager(e);this.mcpMessageHandler=new ge(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let o=e.req.query("sessionId");if(o)return await this.handleSSEMessage(e,o);let n=e.req.header("content-length");if(n&&Number.parseInt(n)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Request too large: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header("content-type")?.includes("application/json"))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Content-Type must be application/json");let c=e.req.header("mcp-protocol-version")||e.req.header("MCP-Protocol-Version")||e.req.header("Mcp-Protocol-Version"),l=["2024-11-05","2025-06-18"];c&&!l.includes(c)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${c}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${l.join(", ")}`);let p;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);p=JSON.parse(E),r=p.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(p))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",r);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let u=await this.mcpMessageHandler.handleMessage(p);this.metrics.totalMessages++;let g=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+g)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:p.method,messageId:r,responseTime:g,isNotification:u===null}),u===null?new Response(null,{status:204,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":g.toString()}}):e.json(u,200,{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05","X-Response-Time":g.toString()})}catch(o){this.metrics.errorCount++;let n=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:o instanceof Error?o.message:String(o),messageId:r,responseTime:n,stack:o instanceof Error?o.stack:void 0});let i=o instanceof Error?o.message:String(o);return this.createErrorResponse(-32603,`Internal error: ${i}`,r)}}async handleSSEMessage(e,t){let r=Date.now(),o=null;try{this.logger.debug(`\u5904\u7406 SSE \u6D88\u606F (\u4F1A\u8BDD: ${t})`);let n=this.clients.get(t);if(!n)return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Invalid or missing sessionId",null);n.lastActivity=new Date;let i=e.req.header("content-length");if(i&&Number.parseInt(i)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`);let c;try{let u=await e.req.text();if(u.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);c=JSON.parse(u),o=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,"Parse error: Invalid JSON")}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,"Invalid Request: Message does not conform to JSON-RPC 2.0",o);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let l=await this.mcpMessageHandler.handleMessage(c);if(n.messageCount++,this.metrics.totalMessages++,l!==null&&n.writer&&n.isAlive)try{await this.sendSSEEvent(n.writer,"message",JSON.stringify(l))}catch(u){this.logger.warn(`SSE \u5199\u5165\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${t}`,u),n.isAlive=!1}let p=Date.now()-r;return this.logger.debug(`SSE \u6D88\u606F\u5904\u7406\u5B8C\u6210 (\u4F1A\u8BDD: ${t})`,{method:c.method,messageId:o,responseTime:p,messageCount:n.messageCount,isNotification:l===null}),new Response(null,{status:202,headers:{"MCP-Protocol-Version":"2024-11-05","X-Response-Time":p.toString()}})}catch(n){this.metrics.errorCount++;let i=Date.now()-r;this.logger.error(`\u5904\u7406 SSE \u6D88\u606F\u65F6\u51FA\u9519 (\u4F1A\u8BDD: ${t}):`,{error:n instanceof Error?n.message:String(n),messageId:o,responseTime:i,stack:n instanceof Error?n.stack:void 0});let c=n instanceof Error?n.message:String(n);return this.createErrorResponse(-32603,`Internal error: ${c}`,o)}}async handleGet(e){try{if(this.logger.debug("\u5904\u7406 MCP GET \u8BF7\u6C42\uFF08SSE \u8FDE\u63A5\uFF09"),this.clients.size>=this.config.maxClients)return this.metrics.errorCount++,e.json({jsonrpc:"2.0",error:{code:-32e3,message:"Server busy: Maximum client connections reached",data:{maxClients:this.config.maxClients}},id:null},503);let t=Date.now().toString(),r=fa(),o=new Date,n=e.req.header("user-agent"),i=e.req.header("x-forwarded-for")||e.req.header("x-real-ip")||"unknown";this.logger.info(`SSE \u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t} (\u4F1A\u8BDD: ${r})`,{userAgent:n,remoteAddress:i});let{readable:c,writable:l}=new TransformStream,p=l.getWriter(),u=new AbortController,g={id:t,sessionId:r,response:new Response(c),connectedAt:o,lastActivity:o,writer:p,abortController:u,isAlive:!0,messageCount:0,userAgent:n,remoteAddress:i};this.clients.set(r,g),this.metrics.totalConnections++,this.metrics.activeConnections=this.clients.size;try{await this.sendSSEEvent(p,"connected",JSON.stringify({sessionId:r,endpoint:`/mcp?sessionId=${r}`,timestamp:o.toISOString(),protocolVersion:"2024-11-05"}))}catch(x){this.logger.error(`\u521D\u59CB SSE \u4E8B\u4EF6\u53D1\u9001\u5931\u8D25: ${r}`,x),g.isAlive=!1}this.startHeartbeat(g);let E=new Response(c,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no","MCP-Protocol-Version":"2024-11-05","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type, MCP-Protocol-Version"}}),h=a(()=>{this.handleClientDisconnect(r,t)},"handleDisconnect");return e.req.raw.signal?.addEventListener("abort",h),u.signal.addEventListener("abort",h),E}catch(t){return this.metrics.errorCount++,this.logger.error("\u5904\u7406 MCP GET \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),e.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:null},500)}}startHeartbeat(e){e.heartbeatInterval&&clearInterval(e.heartbeatInterval),e.heartbeatInterval=setInterval(async()=>{if(!e.isAlive||!e.writer){this.stopHeartbeat(e);return}try{await this.sendSSEEvent(e.writer,"heartbeat",JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId})),this.logger.debug(`\u5FC3\u8DF3\u53D1\u9001\u6210\u529F: ${e.sessionId}`)}catch(t){this.logger.warn(`\u5FC3\u8DF3\u53D1\u9001\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${e.sessionId}`,t),e.isAlive=!1,this.stopHeartbeat(e)}},this.config.heartbeatInterval)}stopHeartbeat(e){e.heartbeatInterval&&(clearInterval(e.heartbeatInterval),e.heartbeatInterval=void 0)}async sendSSEEvent(e,t,r){try{let o=`event: ${t}
|
|
29
29
|
data: ${r}
|
|
30
30
|
|
|
31
|
-
`;await e.write(new TextEncoder().encode(o))}catch(o){throw this.logger.error("\u53D1\u9001 SSE \u4E8B\u4EF6\u5931\u8D25:",o),o}}handleClientDisconnect(e,t){let r=this.clients.get(e);if(!r)return;let o=Date.now()-r.connectedAt.getTime();this.logger.debug(`SSE \u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${r.id} (\u4F1A\u8BDD: ${e})`,{reason:t,duration:o,messageCount:r.messageCount,userAgent:r.userAgent,remoteAddress:r.remoteAddress}),this.stopHeartbeat(r),r.abortController&&r.abortController.abort();try{r.writer&&r.writer.close()}catch(s){this.logger.debug("\u5173\u95ED SSE writer \u65F6\u51FA\u9519:",s)}this.clients.delete(e),this.metrics.activeConnections=this.clients.size}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let o=r??`error-${Date.now()}`,s={jsonrpc:"2.0",error:{code:e,message:t},id:o};return new Response(JSON.stringify(s),{status:400,headers:{"Content-Type":"application/json","MCP-Protocol-Version":"2024-11-05"}})}getStatus(){return{connectedClients:this.clients.size,maxClients:this.config.maxClients,isInitialized:this.mcpMessageHandler!==null,metrics:this.config.enableMetrics?this.metrics:void 0,config:{maxClients:this.config.maxClients,connectionTimeout:this.config.connectionTimeout,heartbeatInterval:this.config.heartbeatInterval,maxMessageSize:this.config.maxMessageSize}}}getDetailedStatus(){let e=Array.from(this.clients.values()).map(t=>({id:t.id,sessionId:t.sessionId,connectedAt:t.connectedAt.toISOString(),lastActivity:t.lastActivity.toISOString(),messageCount:t.messageCount,isAlive:t.isAlive,userAgent:t.userAgent,remoteAddress:t.remoteAddress}));return{...this.getStatus(),clients:e,startTime:this.startTime.toISOString()}}async broadcastMessage(e,t){let r;try{r=JSON.stringify(t)}catch(s){throw this.logger.error("\u5E7F\u64AD\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25:",{error:s instanceof Error?s.message:String(s),data:t}),new Error(`\u5E7F\u64AD\u6D88\u606F\u65E0\u6CD5\u5E8F\u5217\u5316: ${s instanceof Error?s.message:String(s)}`)}let o=[];for(let[s,i]of this.clients.entries()){if(!i.isAlive||!i.writer){o.push(s);continue}try{await this.sendSSEEvent(i.writer,e,r)}catch(c){this.logger.warn(`\u5E7F\u64AD\u6D88\u606F\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${s}`,c),i.isAlive=!1,o.push(s)}}for(let s of o)this.handleClientDisconnect(s,"broadcast-failed")}destroy(){this.logger.info("\u6B63\u5728\u9500\u6BC1 MCPRouteHandler"),this.stopCleanupTask();for(let[e]of this.clients.entries())this.handleClientDisconnect(e,"server-shutdown");this.mcpMessageHandler=null,this.logger.info("MCPRouteHandler \u9500\u6BC1\u5B8C\u6210")}}});var P,Tt,Ir,Ar,Or,ih,tn=d(()=>{"use strict";P=class n extends Error{static{a(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",o="system",s={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=o,this.timestamp=new Date().toISOString(),this.details={...s,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,code:this.code,message:this.message,severity:this.severity,category:this.category,details:this.details,timestamp:this.timestamp}}static configError(e,t,r={}){return new n(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new n(e,t,"high","connection",r)}static operationError(e,t,r={}){return new n(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new n(e,t,"high","system",r)}static validationError(e,t,r={}){return new n(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new n(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},Tt=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof P)}handle(e,t){return P.fromError(e,"INTERNAL_ERROR","system")}},Ir=class{static{a(this,"ConfigErrorHandler")}canHandle(e){return e.message.includes("\u914D\u7F6E")||e.message.includes("config")||e.message.includes("JSON")||e.message.includes("\u89E3\u6790")}handle(e,t){return P.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Ar=class{static{a(this,"ConnectionErrorHandler")}canHandle(e){return e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")||e.message.includes("timeout")||e.message.includes("ECONNREFUSED")||e.message.includes("ENOTFOUND")}handle(e,t){return P.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},Or=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Ir),this.registerHandler(new Ar),this.registerHandler(new Tt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof P)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new Tt().handle(e,t)}},ih=new Or});var Mt,B,rn=d(()=>{"use strict";R();tn();_();Te();Mt=class{static{a(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=f,this.mcpServiceManager=e,this.configManager=t}createErrorResponse(e,t,r,o){return{error:{code:e,message:t,details:r?{serverName:r,...o}:o}}}handleError(e,t,r){if(e instanceof P)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let s;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?s=P.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?s=P.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?s=P.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?s=P.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):s=P.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:s,operation:t,context:r}),s}let o=P.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:o,operation:t,context:r}),o}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createMCPServiceConfig(e,t){if("command"in t)return{name:e,type:"stdio",command:t.command,args:t.args||[],env:t.env||{}};if("type"in t&&t.type==="sse")return{name:e,type:"sse",url:t.url};if("url"in t)return{name:e,type:"streamable-http",url:t.url};throw new Error(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u683C\u5F0F: ${JSON.stringify(t)}`)}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let g=r,u=await this.addMCPServersBatch(g),E=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:u.addedCount,failedCount:u.failedCount,duration:E}),e.json(this.createSuccessResponse(u,u.message),201)}let o=r,{name:s,config:i}=o,c=await this.addMCPServerSingle(s,i),l=Date.now()-t;this.logger.info("addMCPServer",{serverName:s,toolsCount:c.tools?.length||0,duration:l,status:c.status});let p=this.createSuccessResponse(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F");return e.json(p,201)}catch(o){let s=this.handleError(o,"addMCPServer",{requestData:r}),i=this.createErrorResponse(s.code,s.message,void 0,{error:s.details}),c=500;return s.category==="validation"?c=400:s.category==="configuration"?s.code==="SERVER_ALREADY_EXISTS"?c=409:c=400:s.category==="connection"&&(c=500),e.json(i,c)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=W.normalizeTypeField(t);try{let o=B.validateServiceName(e);if(!o.isValid){let p=P.validationError("INVALID_SERVICE_NAME",o.errors.join(", "),{serverName:e,errors:o.errors});throw this.logger.error("addMCPServerSingle",{validationError:p,serverName:e,phase:"name_validation"}),p}if(B.checkServiceExists(e,this.configManager)){let p=P.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:p,serverName:e,phase:"existence_check"}),p}let s=B.validateConfig(r);if(!s.isValid){let p=P.configError("INVALID_CONFIG",s.errors.join(", "),{serverName:e,config:r,errors:s.errors});throw this.logger.error("addMCPServerSingle",{configError:p,serverName:e,phase:"config_validation"}),p}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let i=this.createMCPServiceConfig(e,r);this.mcpServiceManager.addServiceConfig(i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),l=this.getServiceTools(e);return M().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(p=>p.name),timestamp:new Date}),{...c,tools:l.map(p=>p.name)}}catch(o){let s=this.handleError(o,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:s,serverName:e}),s}}getServiceStatus(e){let r=this.configManager.getConfig().mcpServers[e];if(!r)return{name:e,status:"disconnected",connected:!1,tools:[],config:{}};try{let i=this.mcpServiceManager.services.get(e);if(i?.isConnected?.()){let c=i.getTools().map(p=>p.name),l={name:e,status:"connected",connected:!0,tools:c,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(s){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,s)}let o={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,o),o}checkAndEmitStatusChange(e,t){let r=this.getPreviousStatus(e);if(r&&r.status!==t.status&&(this.logger.info(`\u670D\u52A1 ${e} \u72B6\u6001\u53D8\u5316: ${r.status} -> ${t.status}`),M().emitEvent("mcp:server:status_changed",{serverName:e,oldStatus:r.status,newStatus:t.status,timestamp:new Date,reason:t.status==="connected"?"connection_established":"connection_lost"}),r.tools!==t.tools)){let o=t.tools.filter(i=>!r.tools.includes(i)),s=r.tools.filter(i=>!t.tools.includes(i));(o.length>0||s.length>0)&&M().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:o,removedTools:s,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){let t=this;return t.statusCache||(t.statusCache=new Map),t.statusCache.get(e)||null}updateStatusCache(e,t){let r=this;r.statusCache||(r.statusCache=new Map),r.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName"),r=B.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!B.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let o=this.getServiceTools(t).map(i=>i.name);try{await this.mcpServiceManager.stopService(t)}catch(i){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,i)}this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),M().emitEvent("mcp:server:removed",{serverName:t,affectedTools:o,timestamp:new Date});let s=this.createSuccessResponse({name:t,operation:"removed",affectedTools:o},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F");return e.json(s,200)}catch(t){if(this.logger.error("\u79FB\u9664 MCP \u670D\u52A1\u5931\u8D25:",t),t instanceof Error){if(t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")){let o=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(o,404)}if(t.message.includes("\u914D\u7F6E\u66F4\u65B0")){let o=this.createErrorResponse("CONFIG_UPDATE_FAILED",t.message);return e.json(o,500)}}let r=this.createErrorResponse("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName"),r=B.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!B.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let o=this.getServiceStatus(t),s=this.createSuccessResponse(o,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F");return e.json(s,200)}catch(t){if(this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")){let o=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(o,404)}let r=this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},o=[];for(let[c,l]of Object.entries(r)){let p=this.getServiceStatus(c);o.push(p)}let s={servers:o,total:o.length},i=this.createSuccessResponse(s,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F");return e.json(i,200)}catch(t){this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t);let r=this.createErrorResponse("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async addMCPServersBatch(e){let{mcpServers:t}=e,r=Object.keys(t);if(this.logger.info("addMCPServersBatch",{serverCount:r.length,serverNames:r}),r.length===0)throw P.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let o=[],s=[],i=this.validateBatchServers(t);if(!i.isValid)throw P.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[g,u]of Object.entries(t)){let E=W.normalizeTypeField(u);try{let h=await this.addMCPServerSingle(g,E);o.push({name:g,success:!0,config:E,tools:h.tools,status:h.status}),s.push(g),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:g,toolsCount:h.tools?.length||0})}catch(h){let b=this.handleError(h,"addMCPServersBatch",{serverName:g,serverConfig:E});o.push({name:g,success:!1,error:b.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:g,error:b.message})}}let c=s.length,l=r.length-c;if(c===0)throw P.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");M().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:c,failedCount:l,successfullyAddedServers:s,results:o,timestamp:new Date});let p={success:c>0,message:c===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:o,addedCount:c,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:c,failedCount:l}),p}catch(c){throw s.length>0&&await this.rollbackBatchAdd(s),c instanceof P?c:P.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`)}}validateBatchServers(e){let t=[];if(!e||typeof e!="object")return t.push("mcpServers \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};let r=Object.keys(e);if(r.length===0)return t.push("mcpServers \u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A"),{isValid:!1,errors:t};if(r.length>50)return t.push("\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7 50 \u4E2A"),{isValid:!1,errors:t};for(let[o,s]of Object.entries(e)){let i=B.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(B.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=W.normalizeTypeField(s),l=B.validateConfig(c);l.isValid||t.push(`\u670D\u52A1 "${o}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let o of e)try{try{await this.mcpServiceManager.stopService(o)}catch(s){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${o} \u5931\u8D25:`,s)}this.mcpServiceManager.removeServiceConfig(o),this.configManager.removeMcpServer(o),t.push(o),M().emitEvent("mcp:server:rollback",{serverName:o,timestamp:new Date})}catch(s){let i=this.handleError(s,"rollbackBatchAdd",{serverName:o});r.push(o),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${o} \u5931\u8D25:`,i.message)}r.length>0?this.logger.warn("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u90E8\u5206\u5931\u8D25",{totalServers:e.length,rollbackedCount:t.length,failedCount:r.length,failedServers:r}):this.logger.info("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u6210\u529F",{totalServers:e.length,rollbackedCount:t.length})}};(r=>{function n(o){let s=[];if(!o||typeof o!="object")return s.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:s};if("command"in o)(!o.command||typeof o.command!="string")&&s.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),o.args&&!Array.isArray(o.args)&&s.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),o.env&&typeof o.env!="object"&&s.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in o){(!o.url||typeof o.url!="string")&&s.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(o.url)}catch{s.push("URL \u683C\u5F0F\u65E0\u6548")}}else s.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:s.length===0,errors:s}}r.validateConfig=n,a(n,"validateConfig");function e(o){let s=[];return!o||typeof o!="string"?(s.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:s}):((o.length<1||o.length>50)&&s.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(o)||s.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:s.length===0,errors:s})}r.validateServiceName=e,a(e,"validateServiceName");function t(o,s){let i=s.getConfig();return i.mcpServers&&o in i.mcpServers}r.checkServiceExists=t,a(t,"checkServiceExists")})(B||={})});var Rt,on=d(()=>{"use strict";H();R();_();Rt=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=f,this.notificationService=e,this.statusService=t,this.eventBus=M()}async handleMessage(e,t,r){try{switch(this.logger.debug(`\u5904\u7406 WebSocket \u6D88\u606F: ${t.type}`,{clientId:r}),this.eventBus.emitEvent("websocket:message:received",{type:t.type,data:t.data,clientId:r}),t.type){case"getConfig":await this.handleGetConfig(e,r);break;case"updateConfig":await this.handleUpdateConfig(e,t.data,r);break;case"getStatus":await this.handleGetStatus(e,r);break;case"restartService":await this.handleRestartService(e,r);break;default:this.logger.warn(`\u672A\u77E5\u7684 WebSocket \u6D88\u606F\u7C7B\u578B: ${t.type}`,{clientId:r}),this.sendError(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`)}}catch(o){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,o),this.sendError(e,"MESSAGE_PROCESSING_ERROR",o instanceof Error?o.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25")}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=m.getConfig();this.logger.debug("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t}),e.send(JSON.stringify({type:"config",data:r}))}catch(r){this.logger.error("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25")}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{if(m.validateConfig(t),m.updateConfig(t),t.mcpServerConfig)for(let[o,s]of Object.entries(t.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))m.setToolEnabled(o,i,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(o){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",o),this.sendError(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o))}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25")}}async handleRestartService(e,t){this.logDeprecationWarning("WebSocket restartService","POST /api/services/restart");try{this.logger.info("WebSocket: \u6536\u5230\u670D\u52A1\u91CD\u542F\u8BF7\u6C42",{clientId:t}),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:`websocket-${t}`,delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting")}catch(r){this.logger.error("WebSocket: \u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",r),this.sendError(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25")}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}async sendInitialData(e,t){try{this.logger.debug("\u53D1\u9001\u521D\u59CB\u6570\u636E\u7ED9\u5BA2\u6237\u7AEF",{clientId:t});let r=m.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let o=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:o.client})),o.restart&&e.send(JSON.stringify({type:"restartStatus",data:o.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),this.sendError(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25")}}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});var xr,$r,nn=d(()=>{"use strict";H();Z();xr=class n{static{a(this,"MCPServiceManagerSingleton")}static instance=null;static getInstance(){if(!n.instance){let e=m.getMcpServers();n.instance=new ie(e)}return n.instance}static reset(){n.instance=null}},$r=xr.getInstance()});import{spawn as yt}from"child_process";var Pt,sn=d(()=>{"use strict";nn();R();_();Pt=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=f,this.statusService=e,this.eventBus=M()}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async restartService(e){try{return this.logger.info("\u5904\u7406\u670D\u52A1\u91CD\u542F\u8BF7\u6C42"),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:"http-api",delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting"),setTimeout(async()=>{try{await this.executeRestart(),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},5e3)}catch(t){this.logger.error("\u670D\u52A1\u91CD\u542F\u5931\u8D25:",t),this.statusService.updateRestartStatus("failed",t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF")}},500),e.json(this.createSuccessResponse(null,"\u91CD\u542F\u8BF7\u6C42\u5DF2\u63A5\u6536"))}catch(t){this.logger.error("\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25");return e.json(r,500)}}async executeRestart(){this.logger.info("\u6B63\u5728\u91CD\u542F MCP \u670D\u52A1...");try{if(!(await $r.getStatus()).isRunning){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),yt("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}yt("xiaozhi",["restart","--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\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"),yt("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"),yt("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 t=await $r.getStatus();return this.logger.debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}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 wt}from"fs";import{readFile as Ua}from"fs/promises";import{dirname as Fa,join as A}from"path";import{fileURLToPath as Va}from"url";var bt,an=d(()=>{"use strict";R();bt=class{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=f,this.initializeWebPath()}initializeWebPath(){try{let e=Fa(Va(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[A(e,"..","..","..","frontend"),A(e,"..","..","frontend"),A(e,"..","frontend"),A(e,"..","..","apps","frontend","dist"),A(e,"..","apps","frontend","dist"),A(e,"..","..","apps","frontend"),A(e,"..","apps","frontend"),A(e,"..","..","web","dist"),A(e,"..","web","dist"),A(e,"..","..","web"),A(e,"..","web"),A(e,"..","..","..","apps","frontend","dist"),A(e,"..","..","..","apps","frontend"),A(e,"..","..","..","web","dist"),A(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=wt(r);return this.logger.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?this.logger.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(this.logger.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),this.logger.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){this.logger.error("\u521D\u59CB\u5316\u9759\u6001\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",e)}}async handleStaticFile(e){let t=new URL(e.req.url).pathname;try{if(this.logger.debug(`\u5904\u7406\u9759\u6001\u6587\u4EF6\u8BF7\u6C42: ${t}`),!this.webPath)return this.createErrorPage(e,"\u627E\u4E0D\u5230\u524D\u7AEF\u8D44\u6E90\u6587\u4EF6");let r=t;if(r==="/"&&(r="/index.html"),r.includes(".."))return this.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",403);let o=A(this.webPath,r);if(!wt(o)){let i=A(this.webPath,"index.html");return wt(i)?(this.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,"text/html")):(this.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",404))}let s=this.getContentType(o);return this.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${s}`),this.serveFile(e,o,s)}catch(r){return this.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",500)}}async serveFile(e,t,r){try{let o=await Ua(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(o.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(o),200,{"Content-Type":r})}catch(o){throw this.logger.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,o),o}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:"text/html",htm:"text/html",js:"application/javascript",mjs:"application/javascript",css:"text/css",json:"application/json",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",ico:"image/x-icon",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf",eot:"application/vnd.ms-fontobject",pdf:"application/pdf",txt:"text/plain",xml:"application/xml",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip"}[t||""]||"application/octet-stream"}createErrorPage(e,t){let r=`
|
|
31
|
+
`;await e.write(new TextEncoder().encode(o))}catch(o){throw this.logger.error("\u53D1\u9001 SSE \u4E8B\u4EF6\u5931\u8D25:",o),o}}handleClientDisconnect(e,t){let r=this.clients.get(e);if(!r)return;let o=Date.now()-r.connectedAt.getTime();this.logger.debug(`SSE \u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${r.id} (\u4F1A\u8BDD: ${e})`,{reason:t,duration:o,messageCount:r.messageCount,userAgent:r.userAgent,remoteAddress:r.remoteAddress}),this.stopHeartbeat(r),r.abortController&&r.abortController.abort();try{r.writer&&r.writer.close()}catch(n){this.logger.debug("\u5173\u95ED SSE writer \u65F6\u51FA\u9519:",n)}this.clients.delete(e),this.metrics.activeConnections=this.clients.size}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let o=r??`error-${Date.now()}`,n={jsonrpc:"2.0",error:{code:e,message:t},id:o};return new Response(JSON.stringify(n),{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(n){throw this.logger.error("\u5E7F\u64AD\u6D88\u606F\u5E8F\u5217\u5316\u5931\u8D25:",{error:n instanceof Error?n.message:String(n),data:t}),new Error(`\u5E7F\u64AD\u6D88\u606F\u65E0\u6CD5\u5E8F\u5217\u5316: ${n instanceof Error?n.message:String(n)}`)}let o=[];for(let[n,i]of this.clients.entries()){if(!i.isAlive||!i.writer){o.push(n);continue}try{await this.sendSSEEvent(i.writer,e,r)}catch(c){this.logger.warn(`\u5E7F\u64AD\u6D88\u606F\u5931\u8D25\uFF0C\u6807\u8BB0\u5BA2\u6237\u7AEF\u4E3A\u4E0D\u6D3B\u8DC3: ${n}`,c),i.isAlive=!1,o.push(n)}}for(let n of o)this.handleClientDisconnect(n,"broadcast-failed")}destroy(){this.logger.info("\u6B63\u5728\u9500\u6BC1 MCPRouteHandler"),this.stopCleanupTask();for(let[e]of this.clients.entries())this.handleClientDisconnect(e,"server-shutdown");this.mcpMessageHandler=null,this.logger.info("MCPRouteHandler \u9500\u6BC1\u5B8C\u6210")}}});var P,mt,Tr,Mr,yr,Th,zo=d(()=>{"use strict";P=class s extends Error{static{a(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",o="system",n={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=o,this.timestamp=new Date().toISOString(),this.details={...n,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,s)}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 s(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new s(e,t,"high","connection",r)}static operationError(e,t,r={}){return new s(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new s(e,t,"high","system",r)}static validationError(e,t,r={}){return new s(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new s(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},mt=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof P)}handle(e,t){return P.fromError(e,"INTERNAL_ERROR","system")}},Tr=class{static{a(this,"ConfigErrorHandler")}canHandle(e){return e.message.includes("\u914D\u7F6E")||e.message.includes("config")||e.message.includes("JSON")||e.message.includes("\u89E3\u6790")}handle(e,t){return P.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Mr=class{static{a(this,"ConnectionErrorHandler")}canHandle(e){return e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")||e.message.includes("timeout")||e.message.includes("ECONNREFUSED")||e.message.includes("ENOTFOUND")}handle(e,t){return P.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},yr=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Tr),this.registerHandler(new Mr),this.registerHandler(new mt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof P)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new mt().handle(e,t)}},Th=new yr});var ft,W,Fo=d(()=>{"use strict";T();zo();k();Gt();ft=class{static{a(this,"MCPServerApiHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=m,this.mcpServiceManager=e,this.configManager=t}createErrorResponse(e,t,r,o){return{error:{code:e,message:t,details:r?{serverName:r,...o}:o}}}handleError(e,t,r){if(e instanceof P)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let n;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?n=P.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?n=P.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?n=P.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?n=P.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):n=P.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:n,operation:t,context:r}),n}let o=P.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:o,operation:t,context:r}),o}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createMCPServiceConfig(e,t){if("command"in t)return{name:e,type:"stdio",command:t.command,args:t.args||[],env:t.env||{}};if("type"in t&&t.type==="sse")return{name:e,type:"sse",url:t.url};if("url"in t)return{name:e,type:"streamable-http",url:t.url};throw new Error(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u683C\u5F0F: ${JSON.stringify(t)}`)}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let u=r,g=await this.addMCPServersBatch(u),E=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:g.addedCount,failedCount:g.failedCount,duration:E}),e.json(this.createSuccessResponse(g,g.message),201)}let o=r,{name:n,config:i}=o,c=await this.addMCPServerSingle(n,i),l=Date.now()-t;this.logger.info("addMCPServer",{serverName:n,toolsCount:c.tools?.length||0,duration:l,status:c.status});let p=this.createSuccessResponse(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F");return e.json(p,201)}catch(o){let n=this.handleError(o,"addMCPServer",{requestData:r}),i=this.createErrorResponse(n.code,n.message,void 0,{error:n.details}),c=500;return n.category==="validation"?c=400:n.category==="configuration"?n.code==="SERVER_ALREADY_EXISTS"?c=409:c=400:n.category==="connection"&&(c=500),e.json(i,c)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=re.normalizeTypeField(t);try{let o=W.validateServiceName(e);if(!o.isValid){let p=P.validationError("INVALID_SERVICE_NAME",o.errors.join(", "),{serverName:e,errors:o.errors});throw this.logger.error("addMCPServerSingle",{validationError:p,serverName:e,phase:"name_validation"}),p}if(W.checkServiceExists(e,this.configManager)){let p=P.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:p,serverName:e,phase:"existence_check"}),p}let n=W.validateConfig(r);if(!n.isValid){let p=P.configError("INVALID_CONFIG",n.errors.join(", "),{serverName:e,config:r,errors:n.errors});throw this.logger.error("addMCPServerSingle",{configError:p,serverName:e,phase:"config_validation"}),p}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let i=this.createMCPServiceConfig(e,r);this.mcpServiceManager.addServiceConfig(i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),l=this.getServiceTools(e);return R().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(p=>p.name),timestamp:new Date}),{...c,tools:l.map(p=>p.name)}}catch(o){let n=this.handleError(o,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:n,serverName:e}),n}}getServiceStatus(e){let r=this.configManager.getConfig().mcpServers[e];if(!r)return{name:e,status:"disconnected",connected:!1,tools:[],config:{}};try{let i=this.mcpServiceManager.services.get(e);if(i?.isConnected?.()){let c=i.getTools().map(p=>p.name),l={name:e,status:"connected",connected:!0,tools:c,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(n){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,n)}let o={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,o),o}checkAndEmitStatusChange(e,t){let r=this.getPreviousStatus(e);if(r&&r.status!==t.status&&(this.logger.info(`\u670D\u52A1 ${e} \u72B6\u6001\u53D8\u5316: ${r.status} -> ${t.status}`),R().emitEvent("mcp:server:status_changed",{serverName:e,oldStatus:r.status,newStatus:t.status,timestamp:new Date,reason:t.status==="connected"?"connection_established":"connection_lost"}),r.tools!==t.tools)){let o=t.tools.filter(i=>!r.tools.includes(i)),n=r.tools.filter(i=>!t.tools.includes(i));(o.length>0||n.length>0)&&R().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:o,removedTools:n,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=W.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!W.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let o=this.getServiceTools(t).map(i=>i.name);try{await this.mcpServiceManager.stopService(t)}catch(i){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,i)}this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),R().emitEvent("mcp:server:removed",{serverName:t,affectedTools:o,timestamp:new Date});let n=this.createSuccessResponse({name:t,operation:"removed",affectedTools:o},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F");return e.json(n,200)}catch(t){if(this.logger.error("\u79FB\u9664 MCP \u670D\u52A1\u5931\u8D25:",t),t instanceof Error){if(t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")){let o=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(o,404)}if(t.message.includes("\u914D\u7F6E\u66F4\u65B0")){let o=this.createErrorResponse("CONFIG_UPDATE_FAILED",t.message);return e.json(o,500)}}let r=this.createErrorResponse("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName"),r=W.validateServiceName(t);if(!r.isValid){let i=this.createErrorResponse("INVALID_SERVICE_NAME",r.errors.join(", "),t);return e.json(i,400)}if(!W.checkServiceExists(t,this.configManager)){let i=this.createErrorResponse("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",t);return e.json(i,404)}let o=this.getServiceStatus(t),n=this.createSuccessResponse(o,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F");return e.json(n,200)}catch(t){if(this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")){let o=this.createErrorResponse("SERVER_NOT_FOUND",t.message);return e.json(o,404)}let r=this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},o=[];for(let[c,l]of Object.entries(r)){let p=this.getServiceStatus(c);o.push(p)}let n={servers:o,total:o.length},i=this.createSuccessResponse(n,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F");return e.json(i,200)}catch(t){this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t);let r=this.createErrorResponse("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",void 0,{error:t instanceof Error?t.message:String(t)});return e.json(r,500)}}async addMCPServersBatch(e){let{mcpServers:t}=e,r=Object.keys(t);if(this.logger.info("addMCPServersBatch",{serverCount:r.length,serverNames:r}),r.length===0)throw P.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let o=[],n=[],i=this.validateBatchServers(t);if(!i.isValid)throw P.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,g]of Object.entries(t)){let E=re.normalizeTypeField(g);try{let h=await this.addMCPServerSingle(u,E);o.push({name:u,success:!0,config:E,tools:h.tools,status:h.status}),n.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:h.tools?.length||0})}catch(h){let x=this.handleError(h,"addMCPServersBatch",{serverName:u,serverConfig:E});o.push({name:u,success:!1,error:x.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:x.message})}}let c=n.length,l=r.length-c;if(c===0)throw P.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");R().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:c,failedCount:l,successfullyAddedServers:n,results:o,timestamp:new Date});let p={success:c>0,message:c===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:o,addedCount:c,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:c,failedCount:l}),p}catch(c){throw n.length>0&&await this.rollbackBatchAdd(n),c instanceof P?c:P.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`)}}validateBatchServers(e){let t=[];if(!e||typeof e!="object")return t.push("mcpServers \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};let r=Object.keys(e);if(r.length===0)return t.push("mcpServers \u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A"),{isValid:!1,errors:t};if(r.length>50)return t.push("\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7 50 \u4E2A"),{isValid:!1,errors:t};for(let[o,n]of Object.entries(e)){let i=W.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(W.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=re.normalizeTypeField(n),l=W.validateConfig(c);l.isValid||t.push(`\u670D\u52A1 "${o}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let o of e)try{try{await this.mcpServiceManager.stopService(o)}catch(n){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${o} \u5931\u8D25:`,n)}this.mcpServiceManager.removeServiceConfig(o),this.configManager.removeMcpServer(o),t.push(o),R().emitEvent("mcp:server:rollback",{serverName:o,timestamp:new Date})}catch(n){let i=this.handleError(n,"rollbackBatchAdd",{serverName:o});r.push(o),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${o} \u5931\u8D25:`,i.message)}r.length>0?this.logger.warn("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u90E8\u5206\u5931\u8D25",{totalServers:e.length,rollbackedCount:t.length,failedCount:r.length,failedServers:r}):this.logger.info("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u6210\u529F",{totalServers:e.length,rollbackedCount:t.length})}};(r=>{function s(o){let n=[];if(!o||typeof o!="object")return n.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:n};if("command"in o)(!o.command||typeof o.command!="string")&&n.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),o.args&&!Array.isArray(o.args)&&n.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),o.env&&typeof o.env!="object"&&n.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in o){(!o.url||typeof o.url!="string")&&n.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(o.url)}catch{n.push("URL \u683C\u5F0F\u65E0\u6548")}}else n.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:n.length===0,errors:n}}r.validateConfig=s,a(s,"validateConfig");function e(o){let n=[];return!o||typeof o!="string"?(n.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:n}):((o.length<1||o.length>50)&&n.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(o)||n.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:n.length===0,errors:n})}r.validateServiceName=e,a(e,"validateServiceName");function t(o,n){let i=n.getConfig();return i.mcpServers&&o in i.mcpServers}r.checkServiceExists=t,a(t,"checkServiceExists")})(W||={})});import{configManager as Le}from "../config/index.js";var Ct,Uo=d(()=>{"use strict";T();k();Ct=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=m,this.notificationService=e,this.statusService=t,this.eventBus=R()}async handleMessage(e,t,r){try{switch(this.logger.debug(`\u5904\u7406 WebSocket \u6D88\u606F: ${t.type}`,{clientId:r}),this.eventBus.emitEvent("websocket:message:received",{type:t.type,data:t.data,clientId:r}),t.type){case"getConfig":await this.handleGetConfig(e,r);break;case"updateConfig":await this.handleUpdateConfig(e,t.data,r);break;case"getStatus":await this.handleGetStatus(e,r);break;case"restartService":await this.handleRestartService(e,r);break;default:this.logger.warn(`\u672A\u77E5\u7684 WebSocket \u6D88\u606F\u7C7B\u578B: ${t.type}`,{clientId:r}),this.sendError(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`)}}catch(o){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,o),this.sendError(e,"MESSAGE_PROCESSING_ERROR",o instanceof Error?o.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25")}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=Le.getConfig();this.logger.debug("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t}),e.send(JSON.stringify({type:"config",data:r}))}catch(r){this.logger.error("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25")}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{if(Le.validateConfig(t),Le.updateConfig(t),t.mcpServerConfig)for(let[o,n]of Object.entries(t.mcpServerConfig))for(let[i,c]of Object.entries(n.tools))Le.setToolEnabled(o,i,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(o){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",o),this.sendError(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o))}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),this.sendError(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25")}}async handleRestartService(e,t){this.logDeprecationWarning("WebSocket restartService","POST /api/services/restart");try{this.logger.info("WebSocket: \u6536\u5230\u670D\u52A1\u91CD\u542F\u8BF7\u6C42",{clientId:t}),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:`websocket-${t}`,delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting")}catch(r){this.logger.error("WebSocket: \u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",r),this.sendError(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25")}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}async sendInitialData(e,t){try{this.logger.debug("\u53D1\u9001\u521D\u59CB\u6570\u636E\u7ED9\u5BA2\u6237\u7AEF",{clientId:t});let r=Le.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let o=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:o.client})),o.restart&&e.send(JSON.stringify({type:"restartStatus",data:o.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),this.sendError(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25")}}handleClientDisconnect(e){this.logger.info(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{configManager as Ca}from "../config/index.js";var Pr,wr,Vo=d(()=>{"use strict";Q();Pr=class s{static{a(this,"MCPServiceManagerSingleton")}static instance=null;static getInstance(){if(!s.instance){let e=Ca.getMcpServers();s.instance=new se(e)}return s.instance}static reset(){s.instance=null}},wr=Pr.getInstance()});import{spawn as Et}from"child_process";var vt,Wo=d(()=>{"use strict";Vo();T();k();vt=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=m,this.statusService=e,this.eventBus=R()}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async restartService(e){try{return this.logger.info("\u5904\u7406\u670D\u52A1\u91CD\u542F\u8BF7\u6C42"),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:"http-api",delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting"),setTimeout(async()=>{try{await this.executeRestart(),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},5e3)}catch(t){this.logger.error("\u670D\u52A1\u91CD\u542F\u5931\u8D25:",t),this.statusService.updateRestartStatus("failed",t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF")}},500),e.json(this.createSuccessResponse(null,"\u91CD\u542F\u8BF7\u6C42\u5DF2\u63A5\u6536"))}catch(t){this.logger.error("\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25");return e.json(r,500)}}async executeRestart(){this.logger.info("\u6B63\u5728\u91CD\u542F MCP \u670D\u52A1...");try{if(!(await wr.getStatus()).isRunning){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),Et("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}Et("xiaozhi",["restart","--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\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"),Et("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"),Et("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 t=await wr.getStatus();return this.logger.debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}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 St}from"fs";import{readFile as Ea}from"fs/promises";import{dirname as va,join as N}from"path";import{fileURLToPath as Sa}from"url";var Rt,qo=d(()=>{"use strict";T();Rt=class{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){this.logger=m,this.initializeWebPath()}initializeWebPath(){try{let e=va(Sa(import.meta.url));this.logger.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[N(e,"..","..","..","frontend"),N(e,"..","..","frontend"),N(e,"..","frontend"),N(e,"..","..","apps","frontend","dist"),N(e,"..","apps","frontend","dist"),N(e,"..","..","apps","frontend"),N(e,"..","apps","frontend"),N(e,"..","..","web","dist"),N(e,"..","web","dist"),N(e,"..","..","web"),N(e,"..","web"),N(e,"..","..","..","apps","frontend","dist"),N(e,"..","..","..","apps","frontend"),N(e,"..","..","..","web","dist"),N(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=St(r);return this.logger.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?this.logger.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(this.logger.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),this.logger.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){this.logger.error("\u521D\u59CB\u5316\u9759\u6001\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",e)}}async handleStaticFile(e){let t=new URL(e.req.url).pathname;try{if(this.logger.debug(`\u5904\u7406\u9759\u6001\u6587\u4EF6\u8BF7\u6C42: ${t}`),!this.webPath)return this.createErrorPage(e,"\u627E\u4E0D\u5230\u524D\u7AEF\u8D44\u6E90\u6587\u4EF6");let r=t;if(r==="/"&&(r="/index.html"),r.includes(".."))return this.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",403);let o=N(this.webPath,r);if(!St(o)){let i=N(this.webPath,"index.html");return St(i)?(this.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,"text/html")):(this.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",404))}let n=this.getContentType(o);return this.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${n}`),this.serveFile(e,o,n)}catch(r){return this.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",500)}}async serveFile(e,t,r){try{let o=await Ea(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(o.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(o),200,{"Content-Type":r})}catch(o){throw this.logger.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,o),o}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:"text/html",htm:"text/html",js:"application/javascript",mjs:"application/javascript",css:"text/css",json:"application/json",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",ico:"image/x-icon",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf",eot:"application/vnd.ms-fontobject",pdf:"application/pdf",txt:"text/plain",xml:"application/xml",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip"}[t||""]||"application/octet-stream"}createErrorPage(e,t){let r=`
|
|
32
32
|
<!DOCTYPE html>
|
|
33
33
|
<html>
|
|
34
34
|
<head>
|
|
@@ -85,10 +85,10 @@ data: ${r}
|
|
|
85
85
|
</div>
|
|
86
86
|
</body>
|
|
87
87
|
</html>
|
|
88
|
-
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&wt(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var Nt,cn=d(()=>{"use strict";R();Nt=class{static{a(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=f,this.statusService=e}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return this.logger.debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getClientStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return this.logger.debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async getRestartStatus(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return this.logger.debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("RESTART_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}async checkClientConnected(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.json(this.createSuccessResponse({connected:t}))}catch(t){this.logger.error("\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_CONNECTION_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5931\u8D25");return e.json(r,500)}}async getLastHeartbeat(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return this.logger.debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.json(this.createSuccessResponse({lastHeartbeat:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25:",t);let r=this.createErrorResponse("HEARTBEAT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u5931\u8D25");return e.json(r,500)}}async getActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return this.logger.debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.json(this.createSuccessResponse({servers:t}))}catch(t){this.logger.error("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,500)}}async updateClientStatus(e){try{this.logger.debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object"){let r=this.createErrorResponse("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return e.json(r,400)}return this.statusService.updateClientInfo(t,"http-api"),this.logger.info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("CLIENT_STATUS_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25");return e.json(r,400)}}async setActiveMCPServers(e){try{this.logger.debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await e.req.json();if(!Array.isArray(t)){let r=this.createErrorResponse("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");return e.json(r,400)}return this.statusService.setActiveMCPServers(t),this.logger.info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25:",t);let r=this.createErrorResponse("ACTIVE_MCP_SERVERS_UPDATE_ERROR",t instanceof Error?t.message:"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25");return e.json(r,400)}}async resetStatus(e){try{return this.logger.info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),this.logger.info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.json(this.createSuccessResponse(null,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F"))}catch(t){this.logger.error("\u91CD\u7F6E\u72B6\u6001\u5931\u8D25:",t);let r=this.createErrorResponse("STATUS_RESET_ERROR",t instanceof Error?t.message:"\u91CD\u7F6E\u72B6\u6001\u5931\u8D25");return e.json(r,500)}}}});var ve,ln=d(()=>{"use strict";ve=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(ve||{})});import Wa from"ajv";import It from"dayjs";var At,pn=d(()=>{"use strict";H();Z();R();ln();At=class{static{a(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=f,this.ajv=new Wa({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}ensureValidStatusCode(e){return e>=100&&e<600?e:500}createHonoResponse(e,t,r){return e.json(t,r)}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:o,args:s}=t;if(!r||!o){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${o}\uFF0C\u53C2\u6570:`,JSON.stringify(s));let i=e.get("mcpServiceManager");if(!i){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}await this.validateServiceAndTool(i,r,o),r==="customMCP"&&await this.validateCustomMCPArguments(i,o,s||{});let c;if(r==="customMCP")c=await i.callTool(o,s||{},{timeout:6e4});else{let l=`${r}__${o}`;c=await i.callTool(l,s||{})}return e.json(this.createSuccessResponse(c,"\u5DE5\u5177\u8C03\u7528\u6210\u529F"))}catch(t){this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),o="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?o="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?o="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?o="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?o="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?o="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(o="TIMEOUT_ERROR");let s=this.createErrorResponse(o,r);return e.json(s,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!m.configExists()){let s=this.createErrorResponse("CONFIG_NOT_FOUND","\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");return e.json(s,404)}let t=[],r="";try{t=m.getCustomMCPTools(),r=m.getConfigPath()}catch(s){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",s);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!m.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let s=this.createErrorResponse("INVALID_TOOL_CONFIG","\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49");return e.json(s,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=m.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=m.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let o={list:r,total:r.length};return e.json(this.createSuccessResponse(o,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`))}catch(t){this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getDisabledTools(){try{let e=m.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),o=await new X().getAllCachedTools(),s=m.getConfig(),i=new Set(Object.keys(s.mcpServers||{})),c=[];for(let l of o){if(t.has(l.name))continue;let p=l.name.split("__")[0];if(!i.has(p)){this.logger.debug(`\u5DE5\u5177 ${l.name} \u5BF9\u5E94\u7684 MCP \u670D\u52A1 ${p} \u5DF2\u5220\u9664\uFF0C\u8DF3\u8FC7\u663E\u793A`);continue}let g={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:p,toolName:l.name.split("__").slice(1).join("__")}}};c.push(g)}return this.logger.debug(`\u4ECE ${o.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${c.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),c}catch(e){return this.logger.error("\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\u5931\u8D25:",e),[]}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let o=e.getCustomMCPTools().map(s=>s.name);throw o.length===0?new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 customMCP \u5DE5\u5177\u3002\u8BF7\u68C0\u67E5 xiaozhi.config.json \u4E2D\u7684 customMCP \u914D\u7F6E\u3002`):new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u53EF\u7528\u7684 customMCP \u5DE5\u5177: ${o.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let s=e.getCustomMCPTools().find(i=>i.name===r);s&&!s.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),s&&!s.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(o){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,o),new Error(`customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49\u3002`)}return}}async validateCustomMCPArguments(e,t,r){try{let s=e.getCustomMCPTools().find(l=>l.name===t);if(!s)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!s.inputSchema){this.logger.warn(`customMCP \u5DE5\u5177 '${t}' \u6CA1\u6709\u5B9A\u4E49 inputSchema\uFF0C\u8DF3\u8FC7\u53C2\u6570\u9A8C\u8BC1`);return}let i=this.ajv.compile(s.inputSchema);if(!i(r)){let g=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(u=>{let E=u.instancePath||u.schemaPath||"",h=u.message||"\u672A\u77E5\u9519\u8BEF";if(u.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${u.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(u.keyword==="type"){let b=u.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${b}`}if(u.keyword==="enum"){let b=u.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${b.join(", ")}`}return`\u53C2\u6570 ${E} ${h}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,g),new Error(g)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(o){throw o instanceof Error&&o.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,o),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{this.logger.info("\u5904\u7406\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42");let t=await e.req.json();return this.isNewFormatRequest(t)?await this.handleNewFormatAddTool(e,t):await this.handleLegacyFormatAddTool(e,t)}catch(t){this.logger.error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleAddToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}isNewFormatRequest(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:o}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(ve).includes(r)){let s=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(ve).join(", ")}`);return e.json(s,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,o);case"coze":return await this.handleAddCozeTool(e,o);case"http":case"function":{let s=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`);return e.json(s,501)}default:{let s=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(s,400)}}}async handleLegacyFormatAddTool(e,t){this.logger.info("\u5904\u7406\u65E7\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF08\u5411\u540E\u517C\u5BB9\uFF09");let{workflow:r,customName:o,customDescription:s,parameterConfig:i}=t,c=this.performPreChecks(r,o,s);if(c)return this.createHonoResponse(e,c.errorResponse,this.ensureValidStatusCode(c.statusCode));let l=this.convertWorkflowToTool(r,o,s,i);return m.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:o,customName:s,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${o}`),!r||!o){let L=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json(L,400)}let c=e.get("mcpServiceManager");if(!c){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)}try{await this.validateServiceAndTool(c,r,o)}catch(L){let Li=L instanceof Error?L.message:String(L),Di=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",Li);return e.json(Di,404)}let p=await new X().getAllCachedTools(),g=`${r}__${o}`,u=p.find(L=>L.name===g);if(!u){let L=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`);return e.json(L,404)}let E=s||g,h=m.getCustomMCPTools();if(new Set(h.map(L=>L.name)).has(E)){let L=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(L,409)}let Ge={name:E,description:i||u.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:u.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:It().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}/${o}`);let Xt=m.getServerToolsConfig(r);Xt?.toolName&&(Xt[o].enable=!0,m.updateServerToolsConfig(r,Xt),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${E}`);let $i={tool:Ge,toolName:E,toolType:"mcp",addedAt:It().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse($i,`MCP \u5DE5\u5177 "${E}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:s,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let c=this.performPreChecks(r,o,s);if(c)return this.createHonoResponse(e,c.errorResponse,this.ensureValidStatusCode(c.statusCode));let l=this.convertWorkflowToTool(r,o,s,i);m.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let p={tool:l,toolName:l.name,toolType:"coze",addedAt:It().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(p,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t){let s=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(s,400)}this.logger.info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();if(!r||typeof r!="object"){let s=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(s,400)}if(this.isNewFormatRequest(r))return await this.handleNewFormatUpdateTool(e,t,r);let o=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(o,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleUpdateToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:s}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!Object.values(ve).includes(o)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(ve).join(", ")}`);return e.json(i,400)}switch(o){case"coze":return await this.handleUpdateCozeTool(e,t,s);case"mcp":case"http":case"function":{let i=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${o} \u6682\u4E0D\u652F\u6301\u66F4\u65B0\u64CD\u4F5C\uFF0C\u76EE\u524D\u4EC5\u652F\u6301 Coze \u7C7B\u578B`);return e.json(i,501)}default:{let i=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${o}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:o,customName:s,customDescription:i,parameterConfig:c}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let p=m.getCustomMCPTools().find(h=>h.name===t);if(!p){let h=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(h,404)}if(p.handler.type!=="proxy"||p.handler.platform!=="coze"){let h=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(h,400)}!o.workflow_id&&p.handler?.config?.workflow_id&&(o.workflow_id=p.handler.config.workflow_id),!o.workflow_id&&o.app_id&&this.logger.warn(`\u5DE5\u4F5C\u6D41 ${t} \u7F3A\u5C11 workflow_id\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u67D0\u4E9B\u529F\u80FD`),this.validateWorkflowUpdateData(o);let g=this.generateInputSchema(o,c),u={...p,description:i||p.description,inputSchema:g};m.updateCustomMCPTool(t,u),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:u,toolName:t,toolType:"coze",updatedAt:It().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(E,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`))}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`)}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("UPDATE_CUSTOM_TOOL_ERROR",`\u66F4\u65B0\u5DE5\u5177\u914D\u7F6E\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t){let s=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(s,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let o=m.getCustomMCPTools().find(s=>s.name===t);if(o&&o.handler.type==="mcp"){let s=o.handler.config;if(s.serviceName&&s.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`);let i=m.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,m.updateServerToolsConfig(s.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return m.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleRemoveToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}convertWorkflowToTool(e,t,r,o){this.validateWorkflowData(e);let s=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(s),c=this.generateToolDescription(e,r),l=this.generateInputSchema(e,o),p=this.createHttpHandler(e),g={name:i,description:c,inputSchema:l,handler:p};return this.validateGeneratedTool(g),g}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[o,s]of Object.entries(t))r=r.replace(new RegExp(o,"g"),s);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");this.validateRequiredFields(e),this.validateFieldFormats(e),this.validateFieldLengths(e),this.validateBusinessLogic(e)}validateWorkflowUpdateData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32")}if(e.workflow_name){if(typeof e.workflow_name!="string"||e.workflow_name.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26")}if(e.app_id){if(typeof e.app_id!="string"||e.app_id.trim()==="")throw new Error("\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.app_id.length>50)throw new Error("\u5E94\u7528ID\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}validateRequiredFields(e){let t=[{field:"workflow_id",name:"\u5DE5\u4F5C\u6D41ID"},{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0"},{field:"app_id",name:"\u5E94\u7528ID"}];for(let{field:r,name:o}of t){let s=e[r];if(!s||typeof s!="string"||s.trim()==="")throw new Error(`${o}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.icon_url?.trim())try{new URL(e.icon_url)}catch{throw new Error("\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw new Error("\u521B\u5EFA\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233");if(e.updated_at&&(!Number.isInteger(e.updated_at)||e.updated_at<=0))throw new Error("\u66F4\u65B0\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233")}validateFieldLengths(e){let t=[{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0",max:100},{field:"description",name:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0",max:500},{field:"app_id",name:"\u5E94\u7528ID",max:50}];for(let{field:r,name:o,max:s}of t){let i=e[r];if(i&&i.length>s)throw new Error(`${o}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${s}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw new Error("\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw new Error("\u521B\u5EFA\u8005\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32")}if(e.created_at&&e.updated_at&&e.updated_at<e.created_at)throw new Error("\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4");let t=["admin","root","system","config","password","token"],r=e.workflow_name.toLowerCase();for(let o of t)if(r.includes(o))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${o}`)}resolveToolNameConflict(e){let t=m.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),o=e,s=1;for(;r.has(o);)if(o=`${e}_${s}`,s++,s>999)throw new Error(`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return o}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=m.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!m.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),e.handler&&this.validateProxyHandler(e.handler)}validateToolStructure(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");let t=["name","description","inputSchema","handler"];for(let r of t)if(!(r in e)||e[r]==null)throw new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\u8BA4\u8BC1\u7C7B\u578B\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E4B\u4E00: ${t.join(", ")}`);if(e.type==="bearer"){if(!e.token||typeof e.token!="string")throw new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let o=r.slice(2,-2).trim();if(!o||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(o))throw new Error(`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684required\u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4")}generateInputSchema(e,t){return t&&t.parameters.length>0?this.generateInputSchemaFromConfig(t):{type:"object",properties:{input:{type:"string",description:"\u8F93\u5165\u5185\u5BB9"}},required:["input"],additionalProperties:!1}}generateInputSchemaFromConfig(e){let t={},r=[];for(let o of e.parameters)t[o.fieldName]={type:o.type,description:o.description},o.required&&r.push(o.fieldName);return{type:"object",properties:t,required:r.length>0?r:void 0,additionalProperties:!1}}handleAddToolError(e){let t=e instanceof Error?e.message:"\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{statusCode:400,errorResponse:this.createErrorResponse("MISSING_REQUIRED_FIELD",t)}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",t)}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{statusCode:503,errorResponse:this.createErrorResponse("SERVICE_NOT_INITIALIZED",t)}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{statusCode:409,errorResponse:this.createErrorResponse("TOOL_NAME_CONFLICT",`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`)}:this.isValidationError(t)?{statusCode:400,errorResponse:this.createErrorResponse("VALIDATION_ERROR",this.formatValidationError(t))}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\uFF1A1) \u76F8\u5173\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1B2) \u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38\uFF1B3) \u914D\u7F6E\u6587\u4EF6\u6743\u9650\u662F\u5426\u6B63\u786E`)}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",t)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("ADD_CUSTOM_TOOL_ERROR",`\u6DFB\u52A0\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}handleRemoveToolError(e){let t=e instanceof Error?e.message:"\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E\uFF0C\u6216\u5237\u65B0\u9875\u9762\u67E5\u770B\u6700\u65B0\u7684\u5DE5\u5177\u5217\u8868`)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:{statusCode:500,errorResponse:this.createErrorResponse("REMOVE_CUSTOM_TOOL_ERROR",`\u5220\u9664\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}isValidationError(e){return["\u4E0D\u80FD\u4E3A\u7A7A","\u5FC5\u987B\u662F","\u683C\u5F0F\u65E0\u6548","\u8FC7\u957F","\u8FC7\u77ED","\u9A8C\u8BC1\u5931\u8D25","\u65E0\u6548","\u4E0D\u7B26\u5408","\u8D85\u8FC7","\u5C11\u4E8E","\u654F\u611F\u8BCD","\u65F6\u95F4","URL"].some(r=>e.includes(r))}formatValidationError(e){let t={\u5DE5\u4F5C\u6D41ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41ID",\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41\u540D\u79F0",\u5E94\u7528ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5E94\u7528ID",\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548:"\u5DE5\u4F5C\u6D41ID\u5E94\u4E3A\u6570\u5B57\u683C\u5F0F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u914D\u7F6E",\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548:"\u5E94\u7528ID\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26",\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u540D\u79F0",\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7500\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u63CF\u8FF0",\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u56FE\u6807URL\u5730\u5740",\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4:"\u5DE5\u4F5C\u6D41\u7684\u65F6\u95F4\u4FE1\u606F\u6709\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u6570\u636E",\u654F\u611F\u8BCD:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u5305\u542B\u654F\u611F\u8BCD\u6C47\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5"};for(let[r,o]of Object.entries(t))if(e.includes(r))return o;return e}performPreChecks(e,t,r){let o=this.checkBasicParameters(e,t,r);if(o)return o;let s=this.checkSystemStatus();if(s)return s;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570")};if(typeof e!="object")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B")};if(!Array.isArray(e)){let o=e;if(!o.workflow_id||typeof o.workflow_id!="string"||!o.workflow_id.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(!o.workflow_name||typeof o.workflow_name!="string"||!o.workflow_name.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}}if(t!==void 0){if(typeof t!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(t.trim()==="")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32")};if(t.length>50)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}if(r!==void 0){if(typeof r!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(r.length>200)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26")}}return null}checkSystemStatus(){try{let e=m.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=m.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,o=1024*1024;if(r>o)return{statusCode:413,errorResponse:this.createErrorResponse("PAYLOAD_TOO_LARGE","\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4")}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}}});var Lr,un=d(()=>{"use strict";Lr={DEFAULT_LIMIT:50,MAX_LIMIT:200}});import{z as te}from"zod";var qa,Ot,gn=d(()=>{"use strict";lt();un();R();qa=te.object({limit:te.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=Lr.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Lr.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:te.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:te.string().optional(),serverName:te.string().optional(),success:te.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:te.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:te.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"]}),Ot=class{static{a(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new ct}createSuccessResponse(e){let t={success:!0,data:e};return Response.json(t)}createErrorResponse(e,t,r){let o={success:!1,error:{code:e,message:t,details:r}};return Response.json(o,{status:this.getHttpStatusCode(e)})}getHttpStatusCode(e){switch(e){case"INVALID_QUERY_PARAMETERS":return 400;case"LOG_FILE_NOT_FOUND":return 404;case"LOG_FILE_READ_ERROR":return 500;default:return 500}}parseAndValidateQueryParams(e){let t=e.req.query(),r=qa.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.map(o=>({field:o.path.join("."),message:o.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return this.createErrorResponse("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error);let r=await this.toolCallLogService.getToolCallLogs(t.data);return f.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){f.error("\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF";return r.includes("\u4E0D\u5B58\u5728")?this.createErrorResponse("LOG_FILE_NOT_FOUND",r):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?this.createErrorResponse("LOG_FILE_READ_ERROR",r):this.createErrorResponse("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r})}}}});var ke=S((nf,dn)=>{"use strict";var Ba="2.0.0",Ga=Number.MAX_SAFE_INTEGER||9007199254740991,Ja=16,Ya=250,Xa=["major","premajor","minor","preminor","patch","prepatch","prerelease"];dn.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Ja,MAX_SAFE_BUILD_LENGTH:Ya,MAX_SAFE_INTEGER:Ga,RELEASE_TYPES:Xa,SEMVER_SPEC_VERSION:Ba,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var je=S((sf,mn)=>{"use strict";var Ka=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};mn.exports=Ka});var Ee=S((J,hn)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Dr,MAX_SAFE_BUILD_LENGTH:Qa,MAX_LENGTH:Za}=ke(),ec=je();J=hn.exports={};var tc=J.re=[],rc=J.safeRe=[],C=J.src=[],oc=J.safeSrc=[],v=J.t={},nc=0,_r="[a-zA-Z0-9-]",sc=[["\\s",1],["\\d",Za],[_r,Qa]],ic=a(n=>{for(let[e,t]of sc)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),T=a((n,e,t)=>{let r=ic(e),o=nc++;ec(n,o,e),v[n]=o,C[o]=e,oc[o]=r,tc[o]=new RegExp(e,t?"g":void 0),rc[o]=new RegExp(r,t?"g":void 0)},"createToken");T("NUMERICIDENTIFIER","0|[1-9]\\d*");T("NUMERICIDENTIFIERLOOSE","\\d+");T("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${_r}*`);T("MAINVERSION",`(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})\\.(${C[v.NUMERICIDENTIFIER]})`);T("MAINVERSIONLOOSE",`(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})\\.(${C[v.NUMERICIDENTIFIERLOOSE]})`);T("PRERELEASEIDENTIFIER",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIER]})`);T("PRERELEASEIDENTIFIERLOOSE",`(?:${C[v.NONNUMERICIDENTIFIER]}|${C[v.NUMERICIDENTIFIERLOOSE]})`);T("PRERELEASE",`(?:-(${C[v.PRERELEASEIDENTIFIER]}(?:\\.${C[v.PRERELEASEIDENTIFIER]})*))`);T("PRERELEASELOOSE",`(?:-?(${C[v.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${C[v.PRERELEASEIDENTIFIERLOOSE]})*))`);T("BUILDIDENTIFIER",`${_r}+`);T("BUILD",`(?:\\+(${C[v.BUILDIDENTIFIER]}(?:\\.${C[v.BUILDIDENTIFIER]})*))`);T("FULLPLAIN",`v?${C[v.MAINVERSION]}${C[v.PRERELEASE]}?${C[v.BUILD]}?`);T("FULL",`^${C[v.FULLPLAIN]}$`);T("LOOSEPLAIN",`[v=\\s]*${C[v.MAINVERSIONLOOSE]}${C[v.PRERELEASELOOSE]}?${C[v.BUILD]}?`);T("LOOSE",`^${C[v.LOOSEPLAIN]}$`);T("GTLT","((?:<|>)?=?)");T("XRANGEIDENTIFIERLOOSE",`${C[v.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);T("XRANGEIDENTIFIER",`${C[v.NUMERICIDENTIFIER]}|x|X|\\*`);T("XRANGEPLAIN",`[v=\\s]*(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:\\.(${C[v.XRANGEIDENTIFIER]})(?:${C[v.PRERELEASE]})?${C[v.BUILD]}?)?)?`);T("XRANGEPLAINLOOSE",`[v=\\s]*(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:\\.(${C[v.XRANGEIDENTIFIERLOOSE]})(?:${C[v.PRERELEASELOOSE]})?${C[v.BUILD]}?)?)?`);T("XRANGE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAIN]}$`);T("XRANGELOOSE",`^${C[v.GTLT]}\\s*${C[v.XRANGEPLAINLOOSE]}$`);T("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Dr}})(?:\\.(\\d{1,${Dr}}))?(?:\\.(\\d{1,${Dr}}))?`);T("COERCE",`${C[v.COERCEPLAIN]}(?:$|[^\\d])`);T("COERCEFULL",C[v.COERCEPLAIN]+`(?:${C[v.PRERELEASE]})?(?:${C[v.BUILD]})?(?:$|[^\\d])`);T("COERCERTL",C[v.COERCE],!0);T("COERCERTLFULL",C[v.COERCEFULL],!0);T("LONETILDE","(?:~>?)");T("TILDETRIM",`(\\s*)${C[v.LONETILDE]}\\s+`,!0);J.tildeTrimReplace="$1~";T("TILDE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAIN]}$`);T("TILDELOOSE",`^${C[v.LONETILDE]}${C[v.XRANGEPLAINLOOSE]}$`);T("LONECARET","(?:\\^)");T("CARETTRIM",`(\\s*)${C[v.LONECARET]}\\s+`,!0);J.caretTrimReplace="$1^";T("CARET",`^${C[v.LONECARET]}${C[v.XRANGEPLAIN]}$`);T("CARETLOOSE",`^${C[v.LONECARET]}${C[v.XRANGEPLAINLOOSE]}$`);T("COMPARATORLOOSE",`^${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]})$|^$`);T("COMPARATOR",`^${C[v.GTLT]}\\s*(${C[v.FULLPLAIN]})$|^$`);T("COMPARATORTRIM",`(\\s*)${C[v.GTLT]}\\s*(${C[v.LOOSEPLAIN]}|${C[v.XRANGEPLAIN]})`,!0);J.comparatorTrimReplace="$1$2$3";T("HYPHENRANGE",`^\\s*(${C[v.XRANGEPLAIN]})\\s+-\\s+(${C[v.XRANGEPLAIN]})\\s*$`);T("HYPHENRANGELOOSE",`^\\s*(${C[v.XRANGEPLAINLOOSE]})\\s+-\\s+(${C[v.XRANGEPLAINLOOSE]})\\s*$`);T("STAR","(<|>)?=?\\s*\\*");T("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");T("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var xt=S((cf,fn)=>{"use strict";var ac=Object.freeze({loose:!0}),cc=Object.freeze({}),lc=a(n=>n?typeof n!="object"?ac:n:cc,"parseOptions");fn.exports=lc});var kr=S((pf,En)=>{"use strict";var Cn=/^[0-9]+$/,vn=a((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=Cn.test(n),r=Cn.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),pc=a((n,e)=>vn(e,n),"rcompareIdentifiers");En.exports={compareIdentifiers:vn,rcompareIdentifiers:pc}});var x=S((gf,Tn)=>{"use strict";var $t=je(),{MAX_LENGTH:Sn,MAX_SAFE_INTEGER:Lt}=ke(),{safeRe:Dt,t:_t}=Ee(),uc=xt(),{compareIdentifiers:jr}=kr(),Hr=class n{static{a(this,"SemVer")}constructor(e,t){if(t=uc(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>Sn)throw new TypeError(`version is longer than ${Sn} characters`);$t("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Dt[_t.LOOSE]:Dt[_t.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>Lt||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Lt||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Lt||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(o=>{if(/^[0-9]+$/.test(o)){let s=+o;if(s>=0&&s<Lt)return s}return o}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if($t("SemVer.compare",this.version,this.options,e),!(e instanceof n)){if(typeof e=="string"&&e===this.version)return 0;e=new n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof n||(e=new n(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof n||(e=new n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],o=e.prerelease[t];if($t("prerelease compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return jr(r,o)}while(++t)}compareBuild(e){e instanceof n||(e=new n(e,this.options));let t=0;do{let r=this.build[t],o=e.build[t];if($t("build compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return jr(r,o)}while(++t)}inc(e,t,r){if(e.startsWith("pre")){if(!t&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(t){let o=`-${t}`.match(this.options.loose?Dt[_t.PRERELEASELOOSE]:Dt[_t.PRERELEASE]);if(!o||o[1]!==t)throw new Error(`invalid identifier: ${t}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t,r),this.inc("pre",t,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",t,r),this.inc("pre",t,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let o=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[o];else{let s=this.prerelease.length;for(;--s>=0;)typeof this.prerelease[s]=="number"&&(this.prerelease[s]++,s=-2);if(s===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(o)}}if(t){let s=[t,o];r===!1&&(s=[t]),jr(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=s):this.prerelease=s}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};Tn.exports=Hr});var ae=S((mf,Rn)=>{"use strict";var Mn=x(),gc=a((n,e,t=!1)=>{if(n instanceof Mn)return n;try{return new Mn(n,e)}catch(r){if(!t)return null;throw r}},"parse");Rn.exports=gc});var Pn=S((ff,yn)=>{"use strict";var dc=ae(),mc=a((n,e)=>{let t=dc(n,e);return t?t.version:null},"valid");yn.exports=mc});var bn=S((vf,wn)=>{"use strict";var hc=ae(),fc=a((n,e)=>{let t=hc(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");wn.exports=fc});var An=S((Sf,In)=>{"use strict";var Nn=x(),Cc=a((n,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new Nn(n instanceof Nn?n.version:n,t).inc(e,r,o).version}catch{return null}},"inc");In.exports=Cc});var $n=S((Mf,xn)=>{"use strict";var On=ae(),vc=a((n,e)=>{let t=On(n,null,!0),r=On(e,null,!0),o=t.compare(r);if(o===0)return null;let s=o>0,i=s?t:r,c=s?r:t,l=!!i.prerelease.length;if(!!c.prerelease.length&&!l){if(!c.patch&&!c.minor)return"major";if(c.compareMain(i)===0)return c.minor&&!c.patch?"minor":"patch"}let g=l?"pre":"";return t.major!==r.major?g+"major":t.minor!==r.minor?g+"minor":t.patch!==r.patch?g+"patch":"prerelease"},"diff");xn.exports=vc});var Dn=S((yf,Ln)=>{"use strict";var Ec=x(),Sc=a((n,e)=>new Ec(n,e).major,"major");Ln.exports=Sc});var kn=S((wf,_n)=>{"use strict";var Tc=x(),Mc=a((n,e)=>new Tc(n,e).minor,"minor");_n.exports=Mc});var Hn=S((Nf,jn)=>{"use strict";var Rc=x(),yc=a((n,e)=>new Rc(n,e).patch,"patch");jn.exports=yc});var Un=S((Af,zn)=>{"use strict";var Pc=ae(),wc=a((n,e)=>{let t=Pc(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");zn.exports=wc});var U=S((xf,Vn)=>{"use strict";var Fn=x(),bc=a((n,e,t)=>new Fn(n,t).compare(new Fn(e,t)),"compare");Vn.exports=bc});var qn=S((Lf,Wn)=>{"use strict";var Nc=U(),Ic=a((n,e,t)=>Nc(e,n,t),"rcompare");Wn.exports=Ic});var Gn=S((_f,Bn)=>{"use strict";var Ac=U(),Oc=a((n,e)=>Ac(n,e,!0),"compareLoose");Bn.exports=Oc});var kt=S((jf,Yn)=>{"use strict";var Jn=x(),xc=a((n,e,t)=>{let r=new Jn(n,t),o=new Jn(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");Yn.exports=xc});var Kn=S((zf,Xn)=>{"use strict";var $c=kt(),Lc=a((n,e)=>n.sort((t,r)=>$c(t,r,e)),"sort");Xn.exports=Lc});var Zn=S((Ff,Qn)=>{"use strict";var Dc=kt(),_c=a((n,e)=>n.sort((t,r)=>Dc(r,t,e)),"rsort");Qn.exports=_c});var He=S((Wf,es)=>{"use strict";var kc=U(),jc=a((n,e,t)=>kc(n,e,t)>0,"gt");es.exports=jc});var jt=S((Bf,ts)=>{"use strict";var Hc=U(),zc=a((n,e,t)=>Hc(n,e,t)<0,"lt");ts.exports=zc});var zr=S((Jf,rs)=>{"use strict";var Uc=U(),Fc=a((n,e,t)=>Uc(n,e,t)===0,"eq");rs.exports=Fc});var Ur=S((Xf,os)=>{"use strict";var Vc=U(),Wc=a((n,e,t)=>Vc(n,e,t)!==0,"neq");os.exports=Wc});var Ht=S((Qf,ns)=>{"use strict";var qc=U(),Bc=a((n,e,t)=>qc(n,e,t)>=0,"gte");ns.exports=Bc});var zt=S((eC,ss)=>{"use strict";var Gc=U(),Jc=a((n,e,t)=>Gc(n,e,t)<=0,"lte");ss.exports=Jc});var Fr=S((rC,is)=>{"use strict";var Yc=zr(),Xc=Ur(),Kc=He(),Qc=Ht(),Zc=jt(),el=zt(),tl=a((n,e,t,r)=>{switch(e){case"===":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n===t;case"!==":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n!==t;case"":case"=":case"==":return Yc(n,t,r);case"!=":return Xc(n,t,r);case">":return Kc(n,t,r);case">=":return Qc(n,t,r);case"<":return Zc(n,t,r);case"<=":return el(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");is.exports=tl});var cs=S((nC,as)=>{"use strict";var rl=x(),ol=ae(),{safeRe:Ut,t:Ft}=Ee(),nl=a((n,e)=>{if(n instanceof rl)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?Ut[Ft.COERCEFULL]:Ut[Ft.COERCE]);else{let l=e.includePrerelease?Ut[Ft.COERCERTLFULL]:Ut[Ft.COERCERTL],p;for(;(p=l.exec(n))&&(!t||t.index+t[0].length!==n.length);)(!t||p.index+p[0].length!==t.index+t[0].length)&&(t=p),l.lastIndex=p.index+p[1].length+p[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],o=t[3]||"0",s=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",c=e.includePrerelease&&t[6]?`+${t[6]}`:"";return ol(`${r}.${o}.${s}${i}${c}`,e)},"coerce");as.exports=nl});var ps=S((iC,ls)=>{"use strict";var Vr=class{static{a(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let o=this.map.keys().next().value;this.delete(o)}this.map.set(e,t)}return this}};ls.exports=Vr});var F=S((cC,ms)=>{"use strict";var sl=/\s+/g,Wr=class n{static{a(this,"Range")}constructor(e,t){if(t=al(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof qr)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(sl," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(o=>!gs(o[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let o of this.set)if(o.length===1&&ml(o[0])){this.set=[o];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let t=this.set[e];for(let r=0;r<t.length;r++)r>0&&(this.formatted+=" "),this.formatted+=t[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let r=((this.options.includePrerelease&&gl)|(this.options.loose&&dl))+":"+e,o=us.get(r);if(o)return o;let s=this.options.loose,i=s?k[$.HYPHENRANGELOOSE]:k[$.HYPHENRANGE];e=e.replace(i,yl(this.options.includePrerelease)),y("hyphen replace",e),e=e.replace(k[$.COMPARATORTRIM],ll),y("comparator trim",e),e=e.replace(k[$.TILDETRIM],pl),y("tilde trim",e),e=e.replace(k[$.CARETTRIM],ul),y("caret trim",e);let c=e.split(" ").map(u=>hl(u,this.options)).join(" ").split(/\s+/).map(u=>Rl(u,this.options));s&&(c=c.filter(u=>(y("loose invalid filter",u,this.options),!!u.match(k[$.COMPARATORLOOSE])))),y("range list",c);let l=new Map,p=c.map(u=>new qr(u,this.options));for(let u of p){if(gs(u))return[u];l.set(u.value,u)}l.size>1&&l.has("")&&l.delete("");let g=[...l.values()];return us.set(r,g),g}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>ds(r,t)&&e.set.some(o=>ds(o,t)&&r.every(s=>o.every(i=>s.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new cl(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Pl(this.set[t],e,this.options))return!0;return!1}};ms.exports=Wr;var il=ps(),us=new il,al=xt(),qr=ze(),y=je(),cl=x(),{safeRe:k,t:$,comparatorTrimReplace:ll,tildeTrimReplace:pl,caretTrimReplace:ul}=Ee(),{FLAG_INCLUDE_PRERELEASE:gl,FLAG_LOOSE:dl}=ke(),gs=a(n=>n.value==="<0.0.0-0","isNullSet"),ml=a(n=>n.value==="","isAny"),ds=a((n,e)=>{let t=!0,r=n.slice(),o=r.pop();for(;t&&r.length;)t=r.every(s=>o.intersects(s,e)),o=r.pop();return t},"isSatisfiable"),hl=a((n,e)=>(n=n.replace(k[$.BUILD],""),y("comp",n,e),n=vl(n,e),y("caret",n),n=fl(n,e),y("tildes",n),n=Sl(n,e),y("xrange",n),n=Ml(n,e),y("stars",n),n),"parseComparator"),j=a(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),fl=a((n,e)=>n.trim().split(/\s+/).map(t=>Cl(t,e)).join(" "),"replaceTildes"),Cl=a((n,e)=>{let t=e.loose?k[$.TILDELOOSE]:k[$.TILDE];return n.replace(t,(r,o,s,i,c)=>{y("tilde",n,r,o,s,i,c);let l;return j(o)?l="":j(s)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:j(i)?l=`>=${o}.${s}.0 <${o}.${+s+1}.0-0`:c?(y("replaceTilde pr",c),l=`>=${o}.${s}.${i}-${c} <${o}.${+s+1}.0-0`):l=`>=${o}.${s}.${i} <${o}.${+s+1}.0-0`,y("tilde return",l),l})},"replaceTilde"),vl=a((n,e)=>n.trim().split(/\s+/).map(t=>El(t,e)).join(" "),"replaceCarets"),El=a((n,e)=>{y("caret",n,e);let t=e.loose?k[$.CARETLOOSE]:k[$.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(o,s,i,c,l)=>{y("caret",n,o,s,i,c,l);let p;return j(s)?p="":j(i)?p=`>=${s}.0.0${r} <${+s+1}.0.0-0`:j(c)?s==="0"?p=`>=${s}.${i}.0${r} <${s}.${+i+1}.0-0`:p=`>=${s}.${i}.0${r} <${+s+1}.0.0-0`:l?(y("replaceCaret pr",l),s==="0"?i==="0"?p=`>=${s}.${i}.${c}-${l} <${s}.${i}.${+c+1}-0`:p=`>=${s}.${i}.${c}-${l} <${s}.${+i+1}.0-0`:p=`>=${s}.${i}.${c}-${l} <${+s+1}.0.0-0`):(y("no pr"),s==="0"?i==="0"?p=`>=${s}.${i}.${c}${r} <${s}.${i}.${+c+1}-0`:p=`>=${s}.${i}.${c}${r} <${s}.${+i+1}.0-0`:p=`>=${s}.${i}.${c} <${+s+1}.0.0-0`),y("caret return",p),p})},"replaceCaret"),Sl=a((n,e)=>(y("replaceXRanges",n,e),n.split(/\s+/).map(t=>Tl(t,e)).join(" ")),"replaceXRanges"),Tl=a((n,e)=>{n=n.trim();let t=e.loose?k[$.XRANGELOOSE]:k[$.XRANGE];return n.replace(t,(r,o,s,i,c,l)=>{y("xRange",n,r,o,s,i,c,l);let p=j(s),g=p||j(i),u=g||j(c),E=u;return o==="="&&E&&(o=""),l=e.includePrerelease?"-0":"",p?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&E?(g&&(i=0),c=0,o===">"?(o=">=",g?(s=+s+1,i=0,c=0):(i=+i+1,c=0)):o==="<="&&(o="<",g?s=+s+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+s}.${i}.${c}${l}`):g?r=`>=${s}.0.0${l} <${+s+1}.0.0-0`:u&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),y("xRange return",r),r})},"replaceXRange"),Ml=a((n,e)=>(y("replaceStars",n,e),n.trim().replace(k[$.STAR],"")),"replaceStars"),Rl=a((n,e)=>(y("replaceGTE0",n,e),n.trim().replace(k[e.includePrerelease?$.GTE0PRE:$.GTE0],"")),"replaceGTE0"),yl=a(n=>(e,t,r,o,s,i,c,l,p,g,u,E)=>(j(r)?t="":j(o)?t=`>=${r}.0.0${n?"-0":""}`:j(s)?t=`>=${r}.${o}.0${n?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,j(p)?l="":j(g)?l=`<${+p+1}.0.0-0`:j(u)?l=`<${p}.${+g+1}.0-0`:E?l=`<=${p}.${g}.${u}-${E}`:n?l=`<${p}.${g}.${+u+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),Pl=a((n,e,t)=>{for(let r=0;r<n.length;r++)if(!n[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<n.length;r++)if(y(n[r].semver),n[r].semver!==qr.ANY&&n[r].semver.prerelease.length>0){let o=n[r].semver;if(o.major===e.major&&o.minor===e.minor&&o.patch===e.patch)return!0}return!1}return!0},"testSet")});var ze=S((pC,Ss)=>{"use strict";var Ue=Symbol("SemVer ANY"),Jr=class n{static{a(this,"Comparator")}static get ANY(){return Ue}constructor(e,t){if(t=hs(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Gr("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Ue?this.value="":this.value=this.operator+this.semver.version,Gr("comp",this)}parse(e){let t=this.options.loose?fs[Cs.COMPARATORLOOSE]:fs[Cs.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 vs(r[2],this.options.loose):this.semver=Ue}toString(){return this.value}test(e){if(Gr("Comparator.test",e,this.options.loose),this.semver===Ue||e===Ue)return!0;if(typeof e=="string")try{e=new vs(e,this.options)}catch{return!1}return Br(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 Es(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new Es(this.value,t).test(e.semver):(t=hs(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("=")||Br(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Br(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Ss.exports=Jr;var hs=xt(),{safeRe:fs,t:Cs}=Ee(),Br=Fr(),Gr=je(),vs=x(),Es=F()});var Fe=S((gC,Ts)=>{"use strict";var wl=F(),bl=a((n,e,t)=>{try{e=new wl(e,t)}catch{return!1}return e.test(n)},"satisfies");Ts.exports=bl});var Rs=S((mC,Ms)=>{"use strict";var Nl=F(),Il=a((n,e)=>new Nl(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");Ms.exports=Il});var Ps=S((fC,ys)=>{"use strict";var Al=x(),Ol=F(),xl=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new Ol(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new Al(r,t))}),r},"maxSatisfying");ys.exports=xl});var bs=S((vC,ws)=>{"use strict";var $l=x(),Ll=F(),Dl=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new Ll(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new $l(r,t))}),r},"minSatisfying");ws.exports=Dl});var As=S((SC,Is)=>{"use strict";var Yr=x(),_l=F(),Ns=He(),kl=a((n,e)=>{n=new _l(n,e);let t=new Yr("0.0.0");if(n.test(t)||(t=new Yr("0.0.0-0"),n.test(t)))return t;t=null;for(let r=0;r<n.set.length;++r){let o=n.set[r],s=null;o.forEach(i=>{let c=new Yr(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!s||Ns(c,s))&&(s=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Ns(t,s))&&(t=s)}return t&&n.test(t)?t:null},"minVersion");Is.exports=kl});var xs=S((MC,Os)=>{"use strict";var jl=F(),Hl=a((n,e)=>{try{return new jl(n,e).range||"*"}catch{return null}},"validRange");Os.exports=Hl});var Vt=S((yC,_s)=>{"use strict";var zl=x(),Ds=ze(),{ANY:Ul}=Ds,Fl=F(),Vl=Fe(),$s=He(),Ls=jt(),Wl=zt(),ql=Ht(),Bl=a((n,e,t,r)=>{n=new zl(n,r),e=new Fl(e,r);let o,s,i,c,l;switch(t){case">":o=$s,s=Wl,i=Ls,c=">",l=">=";break;case"<":o=Ls,s=ql,i=$s,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Vl(n,e,r))return!1;for(let p=0;p<e.set.length;++p){let g=e.set[p],u=null,E=null;if(g.forEach(h=>{h.semver===Ul&&(h=new Ds(">=0.0.0")),u=u||h,E=E||h,o(h.semver,u.semver,r)?u=h:i(h.semver,E.semver,r)&&(E=h)}),u.operator===c||u.operator===l||(!E.operator||E.operator===c)&&s(n,E.semver))return!1;if(E.operator===l&&i(n,E.semver))return!1}return!0},"outside");_s.exports=Bl});var js=S((wC,ks)=>{"use strict";var Gl=Vt(),Jl=a((n,e,t)=>Gl(n,e,">",t),"gtr");ks.exports=Jl});var zs=S((NC,Hs)=>{"use strict";var Yl=Vt(),Xl=a((n,e,t)=>Yl(n,e,"<",t),"ltr");Hs.exports=Xl});var Vs=S((AC,Fs)=>{"use strict";var Us=F(),Kl=a((n,e,t)=>(n=new Us(n,t),e=new Us(e,t),n.intersects(e,t)),"intersects");Fs.exports=Kl});var qs=S((xC,Ws)=>{"use strict";var Ql=Fe(),Zl=U();Ws.exports=(n,e,t)=>{let r=[],o=null,s=null,i=n.sort((g,u)=>Zl(g,u,t));for(let g of i)Ql(g,e,t)?(s=g,o||(o=g)):(s&&r.push([o,s]),s=null,o=null);o&&r.push([o,null]);let c=[];for(let[g,u]of r)g===u?c.push(g):!u&&g===i[0]?c.push("*"):u?g===i[0]?c.push(`<=${u}`):c.push(`${g} - ${u}`):c.push(`>=${g}`);let l=c.join(" || "),p=typeof e.raw=="string"?e.raw:String(e);return l.length<p.length?l:e}});var Ks=S(($C,Xs)=>{"use strict";var Bs=F(),Kr=ze(),{ANY:Xr}=Kr,Ve=Fe(),Qr=U(),ep=a((n,e,t={})=>{if(n===e)return!0;n=new Bs(n,t),e=new Bs(e,t);let r=!1;e:for(let o of n.set){for(let s of e.set){let i=rp(o,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),tp=[new Kr(">=0.0.0-0")],Gs=[new Kr(">=0.0.0")],rp=a((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Xr){if(e.length===1&&e[0].semver===Xr)return!0;t.includePrerelease?n=tp:n=Gs}if(e.length===1&&e[0].semver===Xr){if(t.includePrerelease)return!0;e=Gs}let r=new Set,o,s;for(let h of n)h.operator===">"||h.operator===">="?o=Js(o,h,t):h.operator==="<"||h.operator==="<="?s=Ys(s,h,t):r.add(h.semver);if(r.size>1)return null;let i;if(o&&s){if(i=Qr(o.semver,s.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||s.operator!=="<="))return null}for(let h of r){if(o&&!Ve(h,String(o),t)||s&&!Ve(h,String(s),t))return null;for(let b of e)if(!Ve(h,String(b),t))return!1;return!0}let c,l,p,g,u=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,E=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;u&&u.prerelease.length===1&&s.operator==="<"&&u.prerelease[0]===0&&(u=!1);for(let h of e){if(g=g||h.operator===">"||h.operator===">=",p=p||h.operator==="<"||h.operator==="<=",o){if(E&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===E.major&&h.semver.minor===E.minor&&h.semver.patch===E.patch&&(E=!1),h.operator===">"||h.operator===">="){if(c=Js(o,h,t),c===h&&c!==o)return!1}else if(o.operator===">="&&!Ve(o.semver,String(h),t))return!1}if(s){if(u&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===u.major&&h.semver.minor===u.minor&&h.semver.patch===u.patch&&(u=!1),h.operator==="<"||h.operator==="<="){if(l=Ys(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Ve(s.semver,String(h),t))return!1}if(!h.operator&&(s||o)&&i!==0)return!1}return!(o&&p&&!s&&i!==0||s&&g&&!o&&i!==0||E||u)},"simpleSubset"),Js=a((n,e,t)=>{if(!n)return e;let r=Qr(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),Ys=a((n,e,t)=>{if(!n)return e;let r=Qr(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");Xs.exports=ep});var ti=S((DC,ei)=>{"use strict";var Zr=Ee(),Qs=ke(),op=x(),Zs=kr(),np=ae(),sp=Pn(),ip=bn(),ap=An(),cp=$n(),lp=Dn(),pp=kn(),up=Hn(),gp=Un(),dp=U(),mp=qn(),hp=Gn(),fp=kt(),Cp=Kn(),vp=Zn(),Ep=He(),Sp=jt(),Tp=zr(),Mp=Ur(),Rp=Ht(),yp=zt(),Pp=Fr(),wp=cs(),bp=ze(),Np=F(),Ip=Fe(),Ap=Rs(),Op=Ps(),xp=bs(),$p=As(),Lp=xs(),Dp=Vt(),_p=js(),kp=zs(),jp=Vs(),Hp=qs(),zp=Ks();ei.exports={parse:np,valid:sp,clean:ip,inc:ap,diff:cp,major:lp,minor:pp,patch:up,prerelease:gp,compare:dp,rcompare:mp,compareLoose:hp,compareBuild:fp,sort:Cp,rsort:vp,gt:Ep,lt:Sp,eq:Tp,neq:Mp,gte:Rp,lte:yp,cmp:Pp,coerce:wp,Comparator:bp,Range:Np,satisfies:Ip,toComparators:Ap,maxSatisfying:Op,minSatisfying:xp,minVersion:$p,validRange:Lp,outside:Dp,gtr:_p,ltr:kp,intersects:jp,simplifyRange:Hp,subset:zp,SemVer:op,re:Zr.re,src:Zr.src,tokens:Zr.t,SEMVER_SPEC_VERSION:Qs.SEMVER_SPEC_VERSION,RELEASE_TYPES:Qs.RELEASE_TYPES,compareIdentifiers:Zs.compareIdentifiers,rcompareIdentifiers:Zs.rcompareIdentifiers}});import{exec as Up,spawn as Fp}from"child_process";import{promisify as Vp}from"util";var We,ri,ce,oi=d(()=>{"use strict";_();We=Ui(ti(),1),ri=Vp(Up),ce=class{static{a(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||M()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=Fp("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((s,i)=>{o.stdout.on("data",c=>{let l=c.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),o.stderr.on("data",c=>{let l=c.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),o.on("close",c=>{let l=Date.now()-r;if(c===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),s();else{let p=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${c}`;this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:p,duration:l,timestamp:Date.now()}),i(new Error(p))}})})}async getCurrentVersion(){let{stdout:e}=await ri("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 ri("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(s=>s&&typeof s=="string"&&We.default.valid(s));return e!=="all"&&(o=o.filter(s=>{let i=We.default.prerelease(s);return e==="stable"?i===null:e==="rc"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("rc")===!0:e==="beta"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("beta")===!0:!0})),o.sort((s,i)=>We.default.rcompare(s,i))}catch{return[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],o=!1;try{o=We.default.gt(r,e)}catch{o=r!==e}return{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});var eo=d(()=>{"use strict";oi()});import{z as ni}from"zod";var Wp,Wt,si=d(()=>{"use strict";eo();R();_();Wp=ni.object({version:ni.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Wt=class{static{a(this,"UpdateApiHandler")}npmManager;logger=f;eventBus=M();activeInstalls=new Map;constructor(){this.npmManager=new ce(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Wp.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version:o}=r.data;return Array.from(this.activeInstalls.values()).some(i=>i)?e.json({success:!1,error:{code:"INSTALL_IN_PROGRESS",message:"\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5"}},409):(this.npmManager.installVersion(o).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:o,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},message:"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7"}))}catch(t){return this.logger.error("\u5904\u7406\u5B89\u88C5\u8BF7\u6C42\u5931\u8D25:",t),e.json({success:!1,error:{code:"REQUEST_FAILED",message:t instanceof Error?t.message:"\u8BF7\u6C42\u5904\u7406\u5931\u8D25"}},500)}}}});import qt from"fs";import re from"path";import{fileURLToPath as ii}from"url";var Se,ai=d(()=>{"use strict";Se=class n{static{a(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(n.cachedVersion)return n.cachedVersion;try{let e=ii(import.meta.url),t=re.dirname(e),r=[re.join(t,"..","..","package.json"),re.join(t,"..","..","..","package.json"),re.join(t,"..","..","..","..","package.json")];for(let o of r)if(qt.existsSync(o)){let s=JSON.parse(qt.readFileSync(o,"utf8"));if(s.version)return n.cachedVersion=s.version,s.version}return n.cachedVersion="unknown","unknown"}catch{return n.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=ii(import.meta.url),t=re.dirname(e),r=[re.join(t,"..","..","package.json"),re.join(t,"..","..","..","package.json"),re.join(t,"..","..","..","..","package.json")];for(let o of r)if(qt.existsSync(o)){let s=JSON.parse(qt.readFileSync(o,"utf8"));return{version:s.version||"unknown",name:s.name,description:s.description,author:s.author}}return{version:"unknown"}}catch{return{version:"unknown"}}}static compareVersions(e,t){let r=e.split(".").map(Number),o=t.split(".").map(Number),s=Math.max(r.length,o.length);for(let i=0;i<s;i++){let c=r[i]||0,l=o[i]||0;if(c>l)return 1;if(c<l)return-1}return 0}static isValidVersion(e){return/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(e)}static clearCache(){n.cachedVersion=null}}});var Bt,ci=d(()=>{"use strict";eo();R();ai();Bt=class{static{a(this,"VersionApiHandler")}logger;constructor(){this.logger=f}createErrorResponse(e,t,r){return{error:{code:e,message:t,details:r}}}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}async getVersion(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=Se.getVersionInfo();return this.logger.debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.json(this.createSuccessResponse(t))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u5931\u8D25");return e.json(r,500)}}async getVersionSimple(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=Se.getVersion();return this.logger.debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.json(this.createSuccessResponse({version:t}))}catch(t){this.logger.error("\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25:",t);let r=this.createErrorResponse("VERSION_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7248\u672C\u53F7\u5931\u8D25");return e.json(r,500)}}async clearVersionCache(e){try{return this.logger.debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),Se.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let s=await new ce().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${s.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:s,type:t,total:s.length}))}catch(t){this.logger.error("\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("VERSIONS_FETCH_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async checkLatestVersion(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new ce().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 li=d(()=>{"use strict";Ko();Qo();Zo();wr();en();rn();on();sn();an();cn();pn();gn();si();ci()});var Gt,pi=d(()=>{"use strict";R();_();Gt=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=f,this.eventBus=M()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.updateClientInfo({status:"disconnected"},"heartbeat-timeout")},this.HEARTBEAT_TIMEOUT)}clearHeartbeatTimeout(){this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=void 0)}isClientConnected(){return this.clientInfo.status==="connected"}getLastHeartbeat(){return this.clientInfo.lastHeartbeat}getActiveMCPServers(){return[...this.clientInfo.activeMCPServers]}setActiveMCPServers(e){this.updateClientInfo({activeMCPServers:[...e]},"mcp-servers-update")}setMcpEndpoint(e){this.updateClientInfo({mcpEndpoint:e},"mcp-endpoint-update")}reset(){this.logger.info("\u91CD\u7F6E\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]},this.restartStatus=void 0}destroy(){this.logger.info("\u9500\u6BC1\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.reset()}}});var Jt,ui=d(()=>{"use strict";H();R();_();Jt=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=f,this.eventBus=M(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=m.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:a(o=>{t.readyState===1&&t.send(o)},"send")};this.clients.set(e,r),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u518C: ${e}`),this.logger.debug(`\u5F53\u524D\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.sendQueuedMessages(e),this.eventBus.emitEvent("websocket:client:connected",{clientId:e,timestamp:Date.now()})}catch(r){this.logger.error(`\u6CE8\u518C\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,r),this.eventBus.emitEvent("notification:error",{error:r instanceof Error?r:new Error(String(r)),type:"client:register"})}}unregisterClient(e){try{this.clients.has(e)&&(this.clients.delete(e),this.messageQueue.delete(e),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u9500: ${e}`),this.logger.debug(`\u5269\u4F59\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.eventBus.emitEvent("websocket:client:disconnected",{clientId:e,timestamp:Date.now()}))}catch(t){this.logger.error(`\u6CE8\u9500\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,t)}}broadcast(e,t){let r={type:e,data:t,timestamp:Date.now()};this.logger.debug(`\u5E7F\u64AD\u6D88\u606F: ${e}`,{clientCount:this.clients.size});for(let[o,s]of this.clients)this.sendMessageToClient(s,r,o)}sendToClient(e,t,r){let o={type:t,data:r,timestamp:Date.now()},s=this.clients.get(e);s?this.sendMessageToClient(s,o,e):this.queueMessage(e,o)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let o=JSON.stringify(t);e.send(o),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF ${r}: ${t.type}`)}else this.queueMessage(r,t),this.logger.warn(`\u5BA2\u6237\u7AEF ${r} \u8FDE\u63A5\u4E0D\u53EF\u7528\uFF0C\u6D88\u606F\u5DF2\u52A0\u5165\u961F\u5217`)}catch(o){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,o),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:o instanceof Error?o:new Error(String(o)),type:"message:send"})}}queueMessage(e,t){this.messageQueue.has(e)||this.messageQueue.set(e,[]);let r=this.messageQueue.get(e);r.push(t),r.length>this.maxQueueSize&&(r.shift(),this.logger.warn(`\u5BA2\u6237\u7AEF ${e} \u6D88\u606F\u961F\u5217\u5DF2\u6EE1\uFF0C\u79FB\u9664\u6700\u65E7\u6D88\u606F`))}sendQueuedMessages(e){let t=this.messageQueue.get(e);if(!t||t.length===0)return;let r=this.clients.get(e);if(r){this.logger.info(`\u53D1\u9001 ${t.length} \u6761\u6392\u961F\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${e}`);for(let o of t)this.sendMessageToClient(r,o,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let o={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",o)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,o)=>r+o.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var gi=d(()=>{"use strict";R()});var di=d(()=>{"use strict";pi();ui();_();gi();it()});var qe,mi=d(()=>{"use strict";Mr();qe=class{static{a(this,"RouteManager")}routes=new Map;registerRoute(e,t){this.routes.has(e),this.routes.set(e,t)}registerRoutes(e){for(let[t,r]of Object.entries(e))this.registerRoute(t,r)}getAllRoutes(){return new Map(this.routes)}getRoute(e){return this.routes.get(e)}applyToApp(e){let t=Array.from(this.routes.entries());t.sort(([r],[o])=>r==="static"?1:o==="static"?-1:0);for(let[r,o]of t)try{this.applyRouteConfig(e,o)}catch{}}applyRouteConfig(e,t){for(let r of t.routes){let o=t.path+r.path,s=[...t.middleware||[],...r.middleware||[]],i=a(async(p,g)=>{try{return await r.handler(p)}catch(u){let E=O("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",u instanceof Error?u.message:String(u));return p.json(E,500)}},"wrappedHandler"),l={GET:e.get.bind(e),POST:e.post.bind(e),PUT:e.put.bind(e),DELETE:e.delete.bind(e),PATCH:e.patch.bind(e)}[r.method];if(!l)throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${r.method}`);s.length>0?l(o,...s,i):l(o,i)}}clear(){this.routes.clear()}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}}});var to,hi=d(()=>{"use strict";to={name:"config",path:"/api/config",description:"\u914D\u7F6E\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getConfig(n)},"handler")},{method:"PUT",path:"",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.updateConfig(n)},"handler")},{method:"GET",path:"/mcp-endpoint",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getMcpEndpoint(n)},"handler")},{method:"GET",path:"/mcp-endpoints",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getMcpEndpoints(n)},"handler")},{method:"GET",path:"/mcp-servers",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getMcpServers(n)},"handler")},{method:"GET",path:"/connection",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getConnectionConfig(n)},"handler")},{method:"POST",path:"/reload",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.reloadConfig(n)},"handler")},{method:"GET",path:"/path",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.getConfigPath(n)},"handler")},{method:"GET",path:"/exists",handler:a(n=>{let e=n.get("dependencies"),{configApiHandler:t}=e;return t.checkConfigExists(n)},"handler")}]}});var ro,fi=d(()=>{"use strict";ro={name:"status",path:"/api/status",description:"\u72B6\u6001\u67E5\u8BE2\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.getStatus(n)},"handler")},{method:"GET",path:"/client",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.getClientStatus(n)},"handler")},{method:"PUT",path:"/client",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.updateClientStatus(n)},"handler")},{method:"POST",path:"/reset",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.resetStatus(n)},"handler")},{method:"GET",path:"/mcp-servers",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.getActiveMCPServers(n)},"handler")},{method:"PUT",path:"/mcp-servers",handler:a(n=>{let{statusApiHandler:e}=n.get("dependencies");return e.setActiveMCPServers(n)},"handler")}]}});var oo,Ci=d(()=>{"use strict";oo={name:"tools",path:"/api/tools",description:"\u5DE5\u5177\u8C03\u7528\u76F8\u5173 API",routes:[{method:"POST",path:"/call",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.callTool(n)},"handler")},{method:"GET",path:"/list",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.listTools(n)},"handler")},{method:"GET",path:"/custom",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.getCustomTools(n)},"handler")},{method:"POST",path:"/custom",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.addCustomTool(n)},"handler")},{method:"PUT",path:"/custom/:toolName",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.updateCustomTool(n)},"handler")},{method:"DELETE",path:"/custom/:toolName",handler:a(n=>{let{toolApiHandler:e}=n.get("dependencies");return e.removeCustomTool(n)},"handler")}]}});var no,vi=d(()=>{"use strict";no={name:"mcp",path:"/mcp",description:"MCP \u534F\u8BAE\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(n=>{let{mcpRouteHandler:e}=n.get("dependencies");return e.handlePost(n)},"handler")},{method:"GET",path:"",handler:a(n=>{let{mcpRouteHandler:e}=n.get("dependencies");return e.handleGet(n)},"handler")}]}});var so,Ei=d(()=>{"use strict";so={name:"version",path:"/api/version",description:"\u7248\u672C\u4FE1\u606F\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.getVersion(n)},"handler")},{method:"GET",path:"/simple",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.getVersionSimple(n)},"handler")},{method:"DELETE",path:"/cache",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.clearVersionCache(n)},"handler")},{method:"GET",path:"/latest",handler:a(n=>{let{versionApiHandler:e}=n.get("dependencies");return e.checkLatestVersion(n)},"handler")}]}});var io,Si=d(()=>{"use strict";io={name:"services",path:"/api/services",description:"\u670D\u52A1\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/restart",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.restartService(n)},"handler")},{method:"POST",path:"/stop",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.stopService(n)},"handler")},{method:"POST",path:"/start",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.startService(n)},"handler")},{method:"GET",path:"/status",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.getServiceStatus(n)},"handler")},{method:"GET",path:"/health",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.getServiceHealth(n)},"handler")}]}});var ao,Ti=d(()=>{"use strict";ao={name:"update",path:"/api",description:"\u66F4\u65B0\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/update",handler:a(n=>{let{updateApiHandler:e}=n.get("dependencies");return e.performUpdate(n)},"handler")}]}});var co,Mi=d(()=>{"use strict";co={name:"static",path:"/",description:"\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u7531",routes:[{method:"GET",path:"*",handler:a(async n=>n.req.path.startsWith("/api/")?n.notFound():await n.get("dependencies").staticFileHandler.handleStaticFile(n),"handler")}]}});var lo,Ri=d(()=>{"use strict";lo={name:"coze",path:"/api/coze",description:"\u6263\u5B50 API \u76F8\u5173\u8DEF\u7531",routes:[{method:"GET",path:"/workspaces",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.getWorkspaces(n)},"handler")},{method:"GET",path:"/workflows",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.getWorkflows(n)},"handler")},{method:"POST",path:"/cache/clear",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.clearCache(n)},"handler")},{method:"GET",path:"/cache/stats",handler:a(n=>{let{cozeApiHandler:e}=n.get("dependencies");return e.getCacheStats(n)},"handler")}]}});var po,yi=d(()=>{"use strict";po={name:"tool-logs",path:"/api/tool-calls",description:"\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u76F8\u5173 API",routes:[{method:"GET",path:"/logs",handler:a(n=>{let{toolCallLogApiHandler:e}=n.get("dependencies");return e.getToolCallLogs(n)},"handler")}]}});var Yt,uo,Pi=d(()=>{"use strict";Yt=a(async(n,e)=>{let r=n.get("dependencies").mcpServerApiHandler;return r?await e(r):n.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),uo={name:"mcpserver",path:"/api/mcp-servers",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(n=>Yt(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/:serverName",handler:a(n=>Yt(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/:serverName/status",handler:a(n=>Yt(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"",handler:a(n=>Yt(n,e=>e.listMCPServers(n)),"handler")}]}});var wi,Be,go,bi=d(()=>{"use strict";wi=a((n,e)=>({error:{code:n,message:e}}),"createErrorResponse"),Be=a(async(n,e)=>{let t=n.get("endpointHandler");if(!t){let r=wi("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");return n.json(r,503)}try{return await t[e](n)}catch(r){let o=wi("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return n.json(o,500)}},"withEndpointHandler"),go={name:"endpoint",path:"/api/endpoint",description:"\u7AEF\u70B9\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/status",handler:a(n=>Be(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/connect",handler:a(n=>Be(n,"connectEndpoint"),"handler")},{method:"POST",path:"/disconnect",handler:a(n=>Be(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/add",handler:a(n=>Be(n,"addEndpoint"),"handler")},{method:"POST",path:"/remove",handler:a(n=>Be(n,"removeEndpoint"),"handler")}]}});var mo,Ni=d(()=>{"use strict";mo={name:"misc",path:"/api",description:"\u901A\u7528 API \u8DEF\u7531",routes:[{method:"POST",path:"/restart",handler:a(n=>{let{serviceApiHandler:e}=n.get("dependencies");return e.restartService(n)},"handler")}]}});var Ii=d(()=>{"use strict";hi();fi();Ci();vi();Ei();Si();Ti();Mi();Ri();yi();Pi();bi();Ni()});var Ai=d(()=>{"use strict";mi();Ii()});var Oi={};Ye(Oi,{WebServer:()=>ho});import{createServer as qp}from"http";import{serve as Bp}from"@hono/node-server";import{WebSocketServer as Gp}from"ws";var ho,xi=d(()=>{"use strict";er();H();Io();Z();V();li();Nr();R();Cr();di();Rr();Ai();ho=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;toolCallLogApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;updateApiHandler;cozeApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointConnection;endpointManager=null;mcpServiceManager=null;constructor(e){try{this.port=e??m.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=f,this.eventBus=M(),this.statusService=new Gt,this.notificationService=new Jt,this.configApiHandler=new ht,this.statusApiHandler=new Nt(this.statusService),this.serviceApiHandler=new Pt(this.statusService),this.toolApiHandler=new At,this.toolCallLogApiHandler=new Ot,this.versionApiHandler=new Bt,this.staticFileHandler=new bt,this.mcpRouteHandler=new St,this.updateApiHandler=new Wt,this.cozeApiHandler=new vt,this.realtimeNotificationHandler=new Rt(this.notificationService,this.statusService),this.heartbeatHandler=new Et(this.statusService,this.notificationService),this.app=zo(),this.setupMiddleware(),this.app.notFound(Tr),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5..."),this.mcpServiceManager?this.logger.debug("\u4F7F\u7528\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u8DF3\u8FC7\u521B\u5EFA"):(this.logger.debug("\u521B\u5EFA\u65B0\u7684 MCPServiceManager \u5B9E\u4F8B"),this.mcpServiceManager=new ie,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpServerApiHandler=new Mt(this.mcpServiceManager,m),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`);let r=t.map(o=>({name:o.name,description:o.description||"",inputSchema:K(o.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint,r),this.logger.debug("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),this.mcpServiceManager||(this.logger.warn(`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u8FDB\u5165\u964D\u7EA7\u6A21\u5F0F\u3002\u5728\u964D\u7EA7\u6A21\u5F0F\u4E0B\uFF1A
|
|
88
|
+
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&St(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var Tt,Bo=d(()=>{"use strict";T();Tt=class{static{a(this,"StatusApiHandler")}logger;statusService;constructor(e){this.logger=m,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 fe,Go=d(()=>{"use strict";fe=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(fe||{})});import{configManager as M}from "../config/index.js";import Ra from"ajv";import Mt from"dayjs";var yt,Jo=d(()=>{"use strict";Q();T();Go();yt=class{static{a(this,"ToolApiHandler")}logger;ajv;constructor(){this.logger=m,this.ajv=new Ra({allErrors:!0,verbose:!0})}createSuccessResponse(e,t){return{success:!0,data:e,message:t}}createErrorResponse(e,t){return{success:!1,error:{code:e,message:t}}}ensureValidStatusCode(e){return e>=100&&e<600?e:500}createHonoResponse(e,t,r){return e.json(t,r)}async callTool(e){try{this.logger.info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:o,args:n}=t;if(!r||!o){let l=this.createErrorResponse("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570");return e.json(l,400)}this.logger.info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${o}\uFF0C\u53C2\u6570:`,JSON.stringify(n));let i=e.get("mcpServiceManager");if(!i){let l=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json(l,503)}await this.validateServiceAndTool(i,r,o),r==="customMCP"&&await this.validateCustomMCPArguments(i,o,n||{});let c;if(r==="customMCP")c=await i.callTool(o,n||{},{timeout:6e4});else{let l=`${r}__${o}`;c=await i.callTool(l,n||{})}return e.json(this.createSuccessResponse(c,"\u5DE5\u5177\u8C03\u7528\u6210\u529F"))}catch(t){this.logger.error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),o="TOOL_CALL_ERROR";r.includes("\u4E0D\u5B58\u5728")?o="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?o="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?o="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?o="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?o="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(o="TIMEOUT_ERROR");let n=this.createErrorResponse(o,r);return e.json(n,500)}}async getCustomTools(e){try{if(this.logger.info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!M.configExists()){let n=this.createErrorResponse("CONFIG_NOT_FOUND","\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");return e.json(n,404)}let t=[],r="";try{t=M.getCustomMCPTools(),r=M.getConfigPath()}catch(n){this.logger.error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",n);let i=this.createErrorResponse("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:"\u672A\u77E5\u9519\u8BEF"}`);return e.json(i,500)}if(!t||t.length===0)return this.logger.info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.json(this.createSuccessResponse({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"));if(!M.validateCustomMCPTools(t)){this.logger.warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25");let n=this.createErrorResponse("INVALID_TOOL_CONFIG","\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49");return e.json(n,400)}return this.logger.info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.json(this.createSuccessResponse({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F"))}catch(t){this.logger.error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async listTools(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=[];switch(t){case"enabled":r=M.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u5DF2\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;case"disabled":r=await this.getDisabledTools(),this.logger.debug(`\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break;default:r=M.getCustomMCPTools(),this.logger.debug(`\u83B7\u53D6\u6240\u6709\u5DE5\u5177\uFF0C\u5171 ${r.length} \u4E2A`);break}let o={list:r,total:r.length};return e.json(this.createSuccessResponse(o,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`))}catch(t){this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async getDisabledTools(){try{let e=M.getCustomMCPTools(),t=new Set(e.map(l=>l.name)),o=await new X().getAllCachedTools(),n=M.getConfig(),i=new Set(Object.keys(n.mcpServers||{})),c=[];for(let l of o){if(t.has(l.name))continue;let p=l.name.split("__")[0];if(!i.has(p)){this.logger.debug(`\u5DE5\u5177 ${l.name} \u5BF9\u5E94\u7684 MCP \u670D\u52A1 ${p} \u5DF2\u5220\u9664\uFF0C\u8DF3\u8FC7\u663E\u793A`);continue}let u={name:l.name,description:l.description||"",inputSchema:l.inputSchema||{},handler:{type:"mcp",config:{serviceName:p,toolName:l.name.split("__").slice(1).join("__")}}};c.push(u)}return this.logger.debug(`\u4ECE ${o.length} \u4E2A\u7F13\u5B58\u5DE5\u5177\u4E2D\u7B5B\u9009\u51FA ${c.length} \u4E2A\u672A\u542F\u7528\u5DE5\u5177`),c}catch(e){return this.logger.error("\u83B7\u53D6\u672A\u542F\u7528\u5DE5\u5177\u5931\u8D25:",e),[]}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let o=e.getCustomMCPTools().map(n=>n.name);throw o.length===0?new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 customMCP \u5DE5\u5177\u3002\u8BF7\u68C0\u67E5 xiaozhi.config.json \u4E2D\u7684 customMCP \u914D\u7F6E\u3002`):new Error(`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u53EF\u7528\u7684 customMCP \u5DE5\u5177: ${o.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let n=e.getCustomMCPTools().find(i=>i.name===r);n&&!n.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),n&&!n.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(o){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,o),new Error(`customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49\u3002`)}return}}async validateCustomMCPArguments(e,t,r){try{let n=e.getCustomMCPTools().find(l=>l.name===t);if(!n)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!n.inputSchema){this.logger.warn(`customMCP \u5DE5\u5177 '${t}' \u6CA1\u6709\u5B9A\u4E49 inputSchema\uFF0C\u8DF3\u8FC7\u53C2\u6570\u9A8C\u8BC1`);return}let i=this.ajv.compile(n.inputSchema);if(!i(r)){let u=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(g=>{let E=g.instancePath||g.schemaPath||"",h=g.message||"\u672A\u77E5\u9519\u8BEF";if(g.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${g.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(g.keyword==="type"){let x=g.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${x}`}if(g.keyword==="enum"){let x=g.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${x.join(", ")}`}return`\u53C2\u6570 ${E} ${h}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,u),new Error(u)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(o){throw o instanceof Error&&o.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,o),new Error(`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{this.logger.info("\u5904\u7406\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42");let t=await e.req.json();return this.isNewFormatRequest(t)?await this.handleNewFormatAddTool(e,t):await this.handleLegacyFormatAddTool(e,t)}catch(t){this.logger.error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleAddToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}isNewFormatRequest(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:o}=t;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!Object.values(fe).includes(r)){let n=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(fe).join(", ")}`);return e.json(n,400)}switch(r){case"mcp":return await this.handleAddMCPTool(e,o);case"coze":return await this.handleAddCozeTool(e,o);case"http":case"function":{let n=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`);return e.json(n,501)}default:{let n=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`);return e.json(n,400)}}}async handleLegacyFormatAddTool(e,t){this.logger.info("\u5904\u7406\u65E7\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF08\u5411\u540E\u517C\u5BB9\uFF09");let{workflow:r,customName:o,customDescription:n,parameterConfig:i}=t,c=this.performPreChecks(r,o,n);if(c)return this.createHonoResponse(e,c.errorResponse,this.ensureValidStatusCode(c.statusCode));let l=this.convertWorkflowToTool(r,o,n,i);return M.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.json(this.createSuccessResponse({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async handleAddMCPTool(e,t){let{serviceName:r,toolName:o,customName:n,customDescription:i}=t;if(this.logger.info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${o}`),!r||!o){let $=this.createErrorResponse("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5");return e.json($,400)}let c=e.get("mcpServiceManager");if(!c){let $=this.createErrorResponse("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002");return e.json($,503)}try{await this.validateServiceAndTool(c,r,o)}catch($){let vi=$ instanceof Error?$.message:String($),Si=this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",vi);return e.json(Si,404)}let p=await new X().getAllCachedTools(),u=`${r}__${o}`,g=p.find($=>$.name===u);if(!g){let $=this.createErrorResponse("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`);return e.json($,404)}let E=n||u,h=M.getCustomMCPTools();if(new Set(h.map($=>$.name)).has(E)){let $=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($,409)}let qe={name:E,description:i||g.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:g.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:Mt().format("YYYY-MM-DD HH:mm:ss")}};M.addCustomMCPTool(qe),this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`);let Wt=M.getServerToolsConfig(r);Wt?.toolName&&(Wt[o].enable=!0,M.updateServerToolsConfig(r,Wt),this.logger.info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`)),this.logger.info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${E}`);let Ei={tool:qe,toolName:E,toolType:"mcp",addedAt:Mt().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(Ei,`MCP \u5DE5\u5177 "${E}" \u6DFB\u52A0\u6210\u529F`))}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:n,parameterConfig:i}=t;this.logger.info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let c=this.performPreChecks(r,o,n);if(c)return this.createHonoResponse(e,c.errorResponse,this.ensureValidStatusCode(c.statusCode));let l=this.convertWorkflowToTool(r,o,n,i);M.addCustomMCPTool(l),this.logger.info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let p={tool:l,toolName:l.name,toolType:"coze",addedAt:Mt().format("YYYY-MM-DD HH:mm:ss")};return e.json(this.createSuccessResponse(p,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`))}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t){let n=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(n,400)}this.logger.info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();if(!r||typeof r!="object"){let n=this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");return e.json(n,400)}if(this.isNewFormatRequest(r))return await this.handleNewFormatUpdateTool(e,t,r);let o=this.createErrorResponse("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42");return e.json(o,400)}catch(t){this.logger.error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleUpdateToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:n}=r;if(this.logger.info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!Object.values(fe).includes(o)){let i=this.createErrorResponse("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(fe).join(", ")}`);return e.json(i,400)}switch(o){case"coze":return await this.handleUpdateCozeTool(e,t,n);case"mcp":case"http":case"function":{let i=this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${o} \u6682\u4E0D\u652F\u6301\u66F4\u65B0\u64CD\u4F5C\uFF0C\u76EE\u524D\u4EC5\u652F\u6301 Coze \u7C7B\u578B`);return e.json(i,501)}default:{let i=this.createErrorResponse("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${o}`);return e.json(i,400)}}}async handleUpdateCozeTool(e,t,r){let{workflow:o,customName:n,customDescription:i,parameterConfig:c}=r;this.logger.info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let p=M.getCustomMCPTools().find(h=>h.name===t);if(!p){let h=this.createErrorResponse("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`);return e.json(h,404)}if(p.handler.type!=="proxy"||p.handler.platform!=="coze"){let h=this.createErrorResponse("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`);return e.json(h,400)}!o.workflow_id&&p.handler?.config?.workflow_id&&(o.workflow_id=p.handler.config.workflow_id),!o.workflow_id&&o.app_id&&this.logger.warn(`\u5DE5\u4F5C\u6D41 ${t} \u7F3A\u5C11 workflow_id\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u67D0\u4E9B\u529F\u80FD`),this.validateWorkflowUpdateData(o);let u=this.generateInputSchema(o,c),g={...p,description:i||p.description,inputSchema:u};M.updateCustomMCPTool(t,g),this.logger.info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:g,toolName:t,toolType:"coze",updatedAt:Mt().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 n=this.createErrorResponse("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return e.json(n,400)}this.logger.info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let o=M.getCustomMCPTools().find(n=>n.name===t);if(o&&o.handler.type==="mcp"){let n=o.handler.config;if(n.serviceName&&n.toolName){this.logger.info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`);let i=M.getServerToolsConfig(n.serviceName);i?.[n.toolName]&&(i[n.toolName].enable=!1,M.updateServerToolsConfig(n.serviceName,i),this.logger.info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`))}}return M.removeCustomMCPTool(t),this.logger.info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.json(this.createSuccessResponse(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`))}catch(t){this.logger.error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{statusCode:r,errorResponse:o}=this.handleRemoveToolError(t);return this.createHonoResponse(e,o,this.ensureValidStatusCode(r))}}convertWorkflowToTool(e,t,r,o){this.validateWorkflowData(e);let n=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(n),c=this.generateToolDescription(e,r),l=this.generateInputSchema(e,o),p=this.createHttpHandler(e),u={name:i,description:c,inputSchema:l,handler:p};return this.validateGeneratedTool(u),u}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[o,n]of Object.entries(t))r=r.replace(new RegExp(o,"g"),n);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");this.validateRequiredFields(e),this.validateFieldFormats(e),this.validateFieldLengths(e),this.validateBusinessLogic(e)}validateWorkflowUpdateData(e){if(!e)throw new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32")}if(e.workflow_name){if(typeof e.workflow_name!="string"||e.workflow_name.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26")}if(e.app_id){if(typeof e.app_id!="string"||e.app_id.trim()==="")throw new Error("\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.app_id.length>50)throw new Error("\u5E94\u7528ID\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}validateRequiredFields(e){let t=[{field:"workflow_id",name:"\u5DE5\u4F5C\u6D41ID"},{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0"},{field:"app_id",name:"\u5E94\u7528ID"}];for(let{field:r,name:o}of t){let n=e[r];if(!n||typeof n!="string"||n.trim()==="")throw new Error(`${o}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(e.icon_url?.trim())try{new URL(e.icon_url)}catch{throw new Error("\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw new Error("\u521B\u5EFA\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233");if(e.updated_at&&(!Number.isInteger(e.updated_at)||e.updated_at<=0))throw new Error("\u66F4\u65B0\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233")}validateFieldLengths(e){let t=[{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0",max:100},{field:"description",name:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0",max:500},{field:"app_id",name:"\u5E94\u7528ID",max:50}];for(let{field:r,name:o,max:n}of t){let i=e[r];if(i&&i.length>n)throw new Error(`${o}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${n}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw new Error("\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw new Error("\u521B\u5EFA\u8005\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32")}if(e.created_at&&e.updated_at&&e.updated_at<e.created_at)throw new Error("\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4");let t=["admin","root","system","config","password","token"],r=e.workflow_name.toLowerCase();for(let o of t)if(r.includes(o))throw new Error(`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${o}`)}resolveToolNameConflict(e){let t=M.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),o=e,n=1;for(;r.has(o);)if(o=`${e}_${n}`,n++,n>999)throw new Error(`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return o}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=M.getCozePlatformConfig();if(!e||!e.token)throw new Error("\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!M.validateCustomMCPTools([e]))throw new Error("\u751F\u6210\u7684\u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u5B9A\u4E49");this.validateJsonSchema(e.inputSchema),e.handler&&this.validateProxyHandler(e.handler)}validateToolStructure(e){if(!e||typeof e!="object")throw new Error("\u5DE5\u5177\u914D\u7F6E\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61");let t=["name","description","inputSchema","handler"];for(let r of t)if(!(r in e)||e[r]==null)throw new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\u8BA4\u8BC1\u7C7B\u578B\u5FC5\u987B\u662F\u4EE5\u4E0B\u4E4B\u4E00: ${t.join(", ")}`);if(e.type==="bearer"){if(!e.token||typeof e.token!="string")throw new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let o=r.slice(2,-2).trim();if(!o||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(o))throw new Error(`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684required\u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4")}generateInputSchema(e,t){return t&&t.parameters.length>0?this.generateInputSchemaFromConfig(t):{type:"object",properties:{input:{type:"string",description:"\u8F93\u5165\u5185\u5BB9"}},required:["input"],additionalProperties:!1}}generateInputSchemaFromConfig(e){let t={},r=[];for(let o of e.parameters)t[o.fieldName]={type:o.type,description:o.description},o.required&&r.push(o.fieldName);return{type:"object",properties:t,required:r.length>0?r:void 0,additionalProperties:!1}}handleAddToolError(e){let t=e instanceof Error?e.message:"\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("TOOL_TYPE")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_TOOL_TYPE",t)}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{statusCode:400,errorResponse:this.createErrorResponse("MISSING_REQUIRED_FIELD",t)}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("SERVICE_OR_TOOL_NOT_FOUND",t)}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{statusCode:503,errorResponse:this.createErrorResponse("SERVICE_NOT_INITIALIZED",t)}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{statusCode:409,errorResponse:this.createErrorResponse("TOOL_NAME_CONFLICT",`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`)}:this.isValidationError(t)?{statusCode:400,errorResponse:this.createErrorResponse("VALIDATION_ERROR",this.formatValidationError(t))}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\uFF1A1) \u76F8\u5173\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1B2) \u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38\uFF1B3) \u914D\u7F6E\u6587\u4EF6\u6743\u9650\u662F\u5426\u6B63\u786E`)}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",t)}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{statusCode:501,errorResponse:this.createErrorResponse("TOOL_TYPE_NOT_IMPLEMENTED",t)}:{statusCode:500,errorResponse:this.createErrorResponse("ADD_CUSTOM_TOOL_ERROR",`\u6DFB\u52A0\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}handleRemoveToolError(e){let t=e instanceof Error?e.message:"\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{statusCode:404,errorResponse:this.createErrorResponse("TOOL_NOT_FOUND",`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E\uFF0C\u6216\u5237\u65B0\u9875\u9762\u67E5\u770B\u6700\u65B0\u7684\u5DE5\u5177\u5217\u8868`)}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST",`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`)}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR",`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`)}:{statusCode:500,errorResponse:this.createErrorResponse("REMOVE_CUSTOM_TOOL_ERROR",`\u5220\u9664\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`)}}isValidationError(e){return["\u4E0D\u80FD\u4E3A\u7A7A","\u5FC5\u987B\u662F","\u683C\u5F0F\u65E0\u6548","\u8FC7\u957F","\u8FC7\u77ED","\u9A8C\u8BC1\u5931\u8D25","\u65E0\u6548","\u4E0D\u7B26\u5408","\u8D85\u8FC7","\u5C11\u4E8E","\u654F\u611F\u8BCD","\u65F6\u95F4","URL"].some(r=>e.includes(r))}formatValidationError(e){let t={\u5DE5\u4F5C\u6D41ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41ID",\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41\u540D\u79F0",\u5E94\u7528ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5E94\u7528ID",\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548:"\u5DE5\u4F5C\u6D41ID\u5E94\u4E3A\u6570\u5B57\u683C\u5F0F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u914D\u7F6E",\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548:"\u5E94\u7528ID\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26",\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u540D\u79F0",\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7500\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u63CF\u8FF0",\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u56FE\u6807URL\u5730\u5740",\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4:"\u5DE5\u4F5C\u6D41\u7684\u65F6\u95F4\u4FE1\u606F\u6709\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u6570\u636E",\u654F\u611F\u8BCD:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u5305\u542B\u654F\u611F\u8BCD\u6C47\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5"};for(let[r,o]of Object.entries(t))if(e.includes(r))return o;return e}performPreChecks(e,t,r){let o=this.checkBasicParameters(e,t,r);if(o)return o;let n=this.checkSystemStatus();if(n)return n;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570")};if(typeof e!="object")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B")};if(!Array.isArray(e)){let o=e;if(!o.workflow_id||typeof o.workflow_id!="string"||!o.workflow_id.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")};if(!o.workflow_name||typeof o.workflow_name!="string"||!o.workflow_name.trim())return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32")}}if(t!==void 0){if(typeof t!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(t.trim()==="")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32")};if(t.length>50)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}if(r!==void 0){if(typeof r!="string")return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B")};if(r.length>200)return{statusCode:400,errorResponse:this.createErrorResponse("INVALID_REQUEST","customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26")}}return null}checkSystemStatus(){try{let e=M.getCozePlatformConfig();if(!e||!e.token)return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token")};if(typeof e.token!="string"||e.token.trim()==="")return{statusCode:422,errorResponse:this.createErrorResponse("CONFIGURATION_ERROR","\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token")}}catch{return{statusCode:500,errorResponse:this.createErrorResponse("SYSTEM_ERROR","\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}}return null}checkResourceLimits(){try{let e=M.getCustomMCPTools(),t=100;if(e.length>=t)return{statusCode:429,errorResponse:this.createErrorResponse("RESOURCE_LIMIT_EXCEEDED",`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`)};let r=JSON.stringify(e).length,o=1024*1024;if(r>o)return{statusCode:413,errorResponse:this.createErrorResponse("PAYLOAD_TOO_LARGE","\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4")}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}}});var br,Xo=d(()=>{"use strict";br={DEFAULT_LIMIT:50,MAX_LIMIT:200}});import{z as ee}from"zod";var Ta,Pt,Yo=d(()=>{"use strict";ot();Xo();T();Ta=ee.object({limit:ee.string().optional().transform(s=>s?Number.parseInt(s,10):void 0).refine(s=>s===void 0||s>=1&&s<=br.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${br.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:ee.string().optional().transform(s=>s?Number.parseInt(s,10):void 0).refine(s=>s===void 0||s>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:ee.string().optional(),serverName:ee.string().optional(),success:ee.string().optional().transform(s=>s?s.toLowerCase()==="true":void 0),startDate:ee.string().optional().refine(s=>{if(!s)return!0;let e=Date.parse(s);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:ee.string().optional().refine(s=>{if(!s)return!0;let e=Date.parse(s);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(s=>!s.startDate||!s.endDate?!0:new Date(s.startDate)<=new Date(s.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),Pt=class{static{a(this,"ToolCallLogApiHandler")}toolCallLogService;constructor(){this.toolCallLogService=new rt}createSuccessResponse(e){let t={success:!0,data:e};return Response.json(t)}createErrorResponse(e,t,r){let o={success:!1,error:{code:e,message:t,details:r}};return Response.json(o,{status:this.getHttpStatusCode(e)})}getHttpStatusCode(e){switch(e){case"INVALID_QUERY_PARAMETERS":return 400;case"LOG_FILE_NOT_FOUND":return 404;case"LOG_FILE_READ_ERROR":return 500;default:return 500}}parseAndValidateQueryParams(e){let t=e.req.query(),r=Ta.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.map(o=>({field:o.path.join("."),message:o.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return this.createErrorResponse("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error);let r=await this.toolCallLogService.getToolCallLogs(t.data);return m.debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),this.createSuccessResponse(r)}catch(t){m.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 De=v((Sm,Ko)=>{"use strict";var Ma="2.0.0",ya=Number.MAX_SAFE_INTEGER||9007199254740991,Pa=16,wa=250,ba=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Ko.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Pa,MAX_SAFE_BUILD_LENGTH:wa,MAX_SAFE_INTEGER:ya,RELEASE_TYPES:ba,SEMVER_SPEC_VERSION:Ma,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var _e=v((Rm,Qo)=>{"use strict";var Na=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...s)=>{}:()=>{};Qo.exports=Na});var Ce=v((G,Zo)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Nr,MAX_SAFE_BUILD_LENGTH:Ia,MAX_LENGTH:Aa}=De(),Oa=_e();G=Zo.exports={};var xa=G.re=[],$a=G.safeRe=[],f=G.src=[],La=G.safeSrc=[],C=G.t={},Da=0,Ir="[a-zA-Z0-9-]",_a=[["\\s",1],["\\d",Aa],[Ir,Ia]],ka=a(s=>{for(let[e,t]of _a)s=s.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return s},"makeSafeRegex"),S=a((s,e,t)=>{let r=ka(e),o=Da++;Oa(s,o,e),C[s]=o,f[o]=e,La[o]=r,xa[o]=new RegExp(e,t?"g":void 0),$a[o]=new RegExp(r,t?"g":void 0)},"createToken");S("NUMERICIDENTIFIER","0|[1-9]\\d*");S("NUMERICIDENTIFIERLOOSE","\\d+");S("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Ir}*`);S("MAINVERSION",`(${f[C.NUMERICIDENTIFIER]})\\.(${f[C.NUMERICIDENTIFIER]})\\.(${f[C.NUMERICIDENTIFIER]})`);S("MAINVERSIONLOOSE",`(${f[C.NUMERICIDENTIFIERLOOSE]})\\.(${f[C.NUMERICIDENTIFIERLOOSE]})\\.(${f[C.NUMERICIDENTIFIERLOOSE]})`);S("PRERELEASEIDENTIFIER",`(?:${f[C.NONNUMERICIDENTIFIER]}|${f[C.NUMERICIDENTIFIER]})`);S("PRERELEASEIDENTIFIERLOOSE",`(?:${f[C.NONNUMERICIDENTIFIER]}|${f[C.NUMERICIDENTIFIERLOOSE]})`);S("PRERELEASE",`(?:-(${f[C.PRERELEASEIDENTIFIER]}(?:\\.${f[C.PRERELEASEIDENTIFIER]})*))`);S("PRERELEASELOOSE",`(?:-?(${f[C.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${f[C.PRERELEASEIDENTIFIERLOOSE]})*))`);S("BUILDIDENTIFIER",`${Ir}+`);S("BUILD",`(?:\\+(${f[C.BUILDIDENTIFIER]}(?:\\.${f[C.BUILDIDENTIFIER]})*))`);S("FULLPLAIN",`v?${f[C.MAINVERSION]}${f[C.PRERELEASE]}?${f[C.BUILD]}?`);S("FULL",`^${f[C.FULLPLAIN]}$`);S("LOOSEPLAIN",`[v=\\s]*${f[C.MAINVERSIONLOOSE]}${f[C.PRERELEASELOOSE]}?${f[C.BUILD]}?`);S("LOOSE",`^${f[C.LOOSEPLAIN]}$`);S("GTLT","((?:<|>)?=?)");S("XRANGEIDENTIFIERLOOSE",`${f[C.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);S("XRANGEIDENTIFIER",`${f[C.NUMERICIDENTIFIER]}|x|X|\\*`);S("XRANGEPLAIN",`[v=\\s]*(${f[C.XRANGEIDENTIFIER]})(?:\\.(${f[C.XRANGEIDENTIFIER]})(?:\\.(${f[C.XRANGEIDENTIFIER]})(?:${f[C.PRERELEASE]})?${f[C.BUILD]}?)?)?`);S("XRANGEPLAINLOOSE",`[v=\\s]*(${f[C.XRANGEIDENTIFIERLOOSE]})(?:\\.(${f[C.XRANGEIDENTIFIERLOOSE]})(?:\\.(${f[C.XRANGEIDENTIFIERLOOSE]})(?:${f[C.PRERELEASELOOSE]})?${f[C.BUILD]}?)?)?`);S("XRANGE",`^${f[C.GTLT]}\\s*${f[C.XRANGEPLAIN]}$`);S("XRANGELOOSE",`^${f[C.GTLT]}\\s*${f[C.XRANGEPLAINLOOSE]}$`);S("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Nr}})(?:\\.(\\d{1,${Nr}}))?(?:\\.(\\d{1,${Nr}}))?`);S("COERCE",`${f[C.COERCEPLAIN]}(?:$|[^\\d])`);S("COERCEFULL",f[C.COERCEPLAIN]+`(?:${f[C.PRERELEASE]})?(?:${f[C.BUILD]})?(?:$|[^\\d])`);S("COERCERTL",f[C.COERCE],!0);S("COERCERTLFULL",f[C.COERCEFULL],!0);S("LONETILDE","(?:~>?)");S("TILDETRIM",`(\\s*)${f[C.LONETILDE]}\\s+`,!0);G.tildeTrimReplace="$1~";S("TILDE",`^${f[C.LONETILDE]}${f[C.XRANGEPLAIN]}$`);S("TILDELOOSE",`^${f[C.LONETILDE]}${f[C.XRANGEPLAINLOOSE]}$`);S("LONECARET","(?:\\^)");S("CARETTRIM",`(\\s*)${f[C.LONECARET]}\\s+`,!0);G.caretTrimReplace="$1^";S("CARET",`^${f[C.LONECARET]}${f[C.XRANGEPLAIN]}$`);S("CARETLOOSE",`^${f[C.LONECARET]}${f[C.XRANGEPLAINLOOSE]}$`);S("COMPARATORLOOSE",`^${f[C.GTLT]}\\s*(${f[C.LOOSEPLAIN]})$|^$`);S("COMPARATOR",`^${f[C.GTLT]}\\s*(${f[C.FULLPLAIN]})$|^$`);S("COMPARATORTRIM",`(\\s*)${f[C.GTLT]}\\s*(${f[C.LOOSEPLAIN]}|${f[C.XRANGEPLAIN]})`,!0);G.comparatorTrimReplace="$1$2$3";S("HYPHENRANGE",`^\\s*(${f[C.XRANGEPLAIN]})\\s+-\\s+(${f[C.XRANGEPLAIN]})\\s*$`);S("HYPHENRANGELOOSE",`^\\s*(${f[C.XRANGEPLAINLOOSE]})\\s+-\\s+(${f[C.XRANGEPLAINLOOSE]})\\s*$`);S("STAR","(<|>)?=?\\s*\\*");S("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");S("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var wt=v((Mm,es)=>{"use strict";var ja=Object.freeze({loose:!0}),Ha=Object.freeze({}),za=a(s=>s?typeof s!="object"?ja:s:Ha,"parseOptions");es.exports=za});var Ar=v((Pm,os)=>{"use strict";var ts=/^[0-9]+$/,rs=a((s,e)=>{if(typeof s=="number"&&typeof e=="number")return s===e?0:s<e?-1:1;let t=ts.test(s),r=ts.test(e);return t&&r&&(s=+s,e=+e),s===e?0:t&&!r?-1:r&&!t?1:s<e?-1:1},"compareIdentifiers"),Fa=a((s,e)=>rs(e,s),"rcompareIdentifiers");os.exports={compareIdentifiers:rs,rcompareIdentifiers:Fa}});var A=v((bm,ns)=>{"use strict";var bt=_e(),{MAX_LENGTH:ss,MAX_SAFE_INTEGER:Nt}=De(),{safeRe:It,t:At}=Ce(),Ua=wt(),{compareIdentifiers:Or}=Ar(),xr=class s{static{a(this,"SemVer")}constructor(e,t){if(t=Ua(t),e instanceof s){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>ss)throw new TypeError(`version is longer than ${ss} characters`);bt("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?It[At.LOOSE]:It[At.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>Nt||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Nt||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Nt||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(o=>{if(/^[0-9]+$/.test(o)){let n=+o;if(n>=0&&n<Nt)return n}return o}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(bt("SemVer.compare",this.version,this.options,e),!(e instanceof s)){if(typeof e=="string"&&e===this.version)return 0;e=new s(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof s||(e=new s(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 s||(e=new s(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],o=e.prerelease[t];if(bt("prerelease compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return Or(r,o)}while(++t)}compareBuild(e){e instanceof s||(e=new s(e,this.options));let t=0;do{let r=this.build[t],o=e.build[t];if(bt("build compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return Or(r,o)}while(++t)}inc(e,t,r){if(e.startsWith("pre")){if(!t&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(t){let o=`-${t}`.match(this.options.loose?It[At.PRERELEASELOOSE]:It[At.PRERELEASE]);if(!o||o[1]!==t)throw new Error(`invalid identifier: ${t}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t,r),this.inc("pre",t,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",t,r),this.inc("pre",t,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let o=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[o];else{let n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(o)}}if(t){let n=[t,o];r===!1&&(n=[t]),Or(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};ns.exports=xr});var ne=v((Im,as)=>{"use strict";var is=A(),Va=a((s,e,t=!1)=>{if(s instanceof is)return s;try{return new is(s,e)}catch(r){if(!t)return null;throw r}},"parse");as.exports=Va});var ls=v((Om,cs)=>{"use strict";var Wa=ne(),qa=a((s,e)=>{let t=Wa(s,e);return t?t.version:null},"valid");cs.exports=qa});var us=v(($m,ps)=>{"use strict";var Ba=ne(),Ga=a((s,e)=>{let t=Ba(s.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");ps.exports=Ga});var hs=v((Dm,ds)=>{"use strict";var gs=A(),Ja=a((s,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new gs(s instanceof gs?s.version:s,t).inc(e,r,o).version}catch{return null}},"inc");ds.exports=Ja});var Cs=v((km,fs)=>{"use strict";var ms=ne(),Xa=a((s,e)=>{let t=ms(s,null,!0),r=ms(e,null,!0),o=t.compare(r);if(o===0)return null;let n=o>0,i=n?t:r,c=n?r:t,l=!!i.prerelease.length;if(!!c.prerelease.length&&!l){if(!c.patch&&!c.minor)return"major";if(c.compareMain(i)===0)return c.minor&&!c.patch?"minor":"patch"}let u=l?"pre":"";return t.major!==r.major?u+"major":t.minor!==r.minor?u+"minor":t.patch!==r.patch?u+"patch":"prerelease"},"diff");fs.exports=Xa});var vs=v((Hm,Es)=>{"use strict";var Ya=A(),Ka=a((s,e)=>new Ya(s,e).major,"major");Es.exports=Ka});var Rs=v((Fm,Ss)=>{"use strict";var Qa=A(),Za=a((s,e)=>new Qa(s,e).minor,"minor");Ss.exports=Za});var Ms=v((Vm,Ts)=>{"use strict";var ec=A(),tc=a((s,e)=>new ec(s,e).patch,"patch");Ts.exports=tc});var Ps=v((qm,ys)=>{"use strict";var rc=ne(),oc=a((s,e)=>{let t=rc(s,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");ys.exports=oc});var F=v((Gm,bs)=>{"use strict";var ws=A(),sc=a((s,e,t)=>new ws(s,t).compare(new ws(e,t)),"compare");bs.exports=sc});var Is=v((Xm,Ns)=>{"use strict";var nc=F(),ic=a((s,e,t)=>nc(e,s,t),"rcompare");Ns.exports=ic});var Os=v((Km,As)=>{"use strict";var ac=F(),cc=a((s,e)=>ac(s,e,!0),"compareLoose");As.exports=cc});var Ot=v((Zm,$s)=>{"use strict";var xs=A(),lc=a((s,e,t)=>{let r=new xs(s,t),o=new xs(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");$s.exports=lc});var Ds=v((tf,Ls)=>{"use strict";var pc=Ot(),uc=a((s,e)=>s.sort((t,r)=>pc(t,r,e)),"sort");Ls.exports=uc});var ks=v((of,_s)=>{"use strict";var gc=Ot(),dc=a((s,e)=>s.sort((t,r)=>gc(r,t,e)),"rsort");_s.exports=dc});var ke=v((nf,js)=>{"use strict";var hc=F(),mc=a((s,e,t)=>hc(s,e,t)>0,"gt");js.exports=mc});var xt=v((cf,Hs)=>{"use strict";var fc=F(),Cc=a((s,e,t)=>fc(s,e,t)<0,"lt");Hs.exports=Cc});var $r=v((pf,zs)=>{"use strict";var Ec=F(),vc=a((s,e,t)=>Ec(s,e,t)===0,"eq");zs.exports=vc});var Lr=v((gf,Fs)=>{"use strict";var Sc=F(),Rc=a((s,e,t)=>Sc(s,e,t)!==0,"neq");Fs.exports=Rc});var $t=v((hf,Us)=>{"use strict";var Tc=F(),Mc=a((s,e,t)=>Tc(s,e,t)>=0,"gte");Us.exports=Mc});var Lt=v((ff,Vs)=>{"use strict";var yc=F(),Pc=a((s,e,t)=>yc(s,e,t)<=0,"lte");Vs.exports=Pc});var Dr=v((Ef,Ws)=>{"use strict";var wc=$r(),bc=Lr(),Nc=ke(),Ic=$t(),Ac=xt(),Oc=Lt(),xc=a((s,e,t,r)=>{switch(e){case"===":return typeof s=="object"&&(s=s.version),typeof t=="object"&&(t=t.version),s===t;case"!==":return typeof s=="object"&&(s=s.version),typeof t=="object"&&(t=t.version),s!==t;case"":case"=":case"==":return wc(s,t,r);case"!=":return bc(s,t,r);case">":return Nc(s,t,r);case">=":return Ic(s,t,r);case"<":return Ac(s,t,r);case"<=":return Oc(s,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Ws.exports=xc});var Bs=v((Sf,qs)=>{"use strict";var $c=A(),Lc=ne(),{safeRe:Dt,t:_t}=Ce(),Dc=a((s,e)=>{if(s instanceof $c)return s;if(typeof s=="number"&&(s=String(s)),typeof s!="string")return null;e=e||{};let t=null;if(!e.rtl)t=s.match(e.includePrerelease?Dt[_t.COERCEFULL]:Dt[_t.COERCE]);else{let l=e.includePrerelease?Dt[_t.COERCERTLFULL]:Dt[_t.COERCERTL],p;for(;(p=l.exec(s))&&(!t||t.index+t[0].length!==s.length);)(!t||p.index+p[0].length!==t.index+t[0].length)&&(t=p),l.lastIndex=p.index+p[1].length+p[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],o=t[3]||"0",n=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",c=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Lc(`${r}.${o}.${n}${i}${c}`,e)},"coerce");qs.exports=Dc});var Js=v((Tf,Gs)=>{"use strict";var _r=class{static{a(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let o=this.map.keys().next().value;this.delete(o)}this.map.set(e,t)}return this}};Gs.exports=_r});var U=v((yf,Qs)=>{"use strict";var _c=/\s+/g,kr=class s{static{a(this,"Range")}constructor(e,t){if(t=jc(t),e instanceof s)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new s(e.raw,t);if(e instanceof jr)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(_c," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(o=>!Ys(o[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let o of this.set)if(o.length===1&&qc(o[0])){this.set=[o];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let t=this.set[e];for(let r=0;r<t.length;r++)r>0&&(this.formatted+=" "),this.formatted+=t[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let r=((this.options.includePrerelease&&Vc)|(this.options.loose&&Wc))+":"+e,o=Xs.get(r);if(o)return o;let n=this.options.loose,i=n?D[O.HYPHENRANGELOOSE]:D[O.HYPHENRANGE];e=e.replace(i,tl(this.options.includePrerelease)),y("hyphen replace",e),e=e.replace(D[O.COMPARATORTRIM],zc),y("comparator trim",e),e=e.replace(D[O.TILDETRIM],Fc),y("tilde trim",e),e=e.replace(D[O.CARETTRIM],Uc),y("caret trim",e);let c=e.split(" ").map(g=>Bc(g,this.options)).join(" ").split(/\s+/).map(g=>el(g,this.options));n&&(c=c.filter(g=>(y("loose invalid filter",g,this.options),!!g.match(D[O.COMPARATORLOOSE])))),y("range list",c);let l=new Map,p=c.map(g=>new jr(g,this.options));for(let g of p){if(Ys(g))return[g];l.set(g.value,g)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return Xs.set(r,u),u}intersects(e,t){if(!(e instanceof s))throw new TypeError("a Range is required");return this.set.some(r=>Ks(r,t)&&e.set.some(o=>Ks(o,t)&&r.every(n=>o.every(i=>n.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Hc(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(rl(this.set[t],e,this.options))return!0;return!1}};Qs.exports=kr;var kc=Js(),Xs=new kc,jc=wt(),jr=je(),y=_e(),Hc=A(),{safeRe:D,t:O,comparatorTrimReplace:zc,tildeTrimReplace:Fc,caretTrimReplace:Uc}=Ce(),{FLAG_INCLUDE_PRERELEASE:Vc,FLAG_LOOSE:Wc}=De(),Ys=a(s=>s.value==="<0.0.0-0","isNullSet"),qc=a(s=>s.value==="","isAny"),Ks=a((s,e)=>{let t=!0,r=s.slice(),o=r.pop();for(;t&&r.length;)t=r.every(n=>o.intersects(n,e)),o=r.pop();return t},"isSatisfiable"),Bc=a((s,e)=>(s=s.replace(D[O.BUILD],""),y("comp",s,e),s=Xc(s,e),y("caret",s),s=Gc(s,e),y("tildes",s),s=Kc(s,e),y("xrange",s),s=Zc(s,e),y("stars",s),s),"parseComparator"),_=a(s=>!s||s.toLowerCase()==="x"||s==="*","isX"),Gc=a((s,e)=>s.trim().split(/\s+/).map(t=>Jc(t,e)).join(" "),"replaceTildes"),Jc=a((s,e)=>{let t=e.loose?D[O.TILDELOOSE]:D[O.TILDE];return s.replace(t,(r,o,n,i,c)=>{y("tilde",s,r,o,n,i,c);let l;return _(o)?l="":_(n)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:_(i)?l=`>=${o}.${n}.0 <${o}.${+n+1}.0-0`:c?(y("replaceTilde pr",c),l=`>=${o}.${n}.${i}-${c} <${o}.${+n+1}.0-0`):l=`>=${o}.${n}.${i} <${o}.${+n+1}.0-0`,y("tilde return",l),l})},"replaceTilde"),Xc=a((s,e)=>s.trim().split(/\s+/).map(t=>Yc(t,e)).join(" "),"replaceCarets"),Yc=a((s,e)=>{y("caret",s,e);let t=e.loose?D[O.CARETLOOSE]:D[O.CARET],r=e.includePrerelease?"-0":"";return s.replace(t,(o,n,i,c,l)=>{y("caret",s,o,n,i,c,l);let p;return _(n)?p="":_(i)?p=`>=${n}.0.0${r} <${+n+1}.0.0-0`:_(c)?n==="0"?p=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:p=`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:l?(y("replaceCaret pr",l),n==="0"?i==="0"?p=`>=${n}.${i}.${c}-${l} <${n}.${i}.${+c+1}-0`:p=`>=${n}.${i}.${c}-${l} <${n}.${+i+1}.0-0`:p=`>=${n}.${i}.${c}-${l} <${+n+1}.0.0-0`):(y("no pr"),n==="0"?i==="0"?p=`>=${n}.${i}.${c}${r} <${n}.${i}.${+c+1}-0`:p=`>=${n}.${i}.${c}${r} <${n}.${+i+1}.0-0`:p=`>=${n}.${i}.${c} <${+n+1}.0.0-0`),y("caret return",p),p})},"replaceCaret"),Kc=a((s,e)=>(y("replaceXRanges",s,e),s.split(/\s+/).map(t=>Qc(t,e)).join(" ")),"replaceXRanges"),Qc=a((s,e)=>{s=s.trim();let t=e.loose?D[O.XRANGELOOSE]:D[O.XRANGE];return s.replace(t,(r,o,n,i,c,l)=>{y("xRange",s,r,o,n,i,c,l);let p=_(n),u=p||_(i),g=u||_(c),E=g;return o==="="&&E&&(o=""),l=e.includePrerelease?"-0":"",p?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&E?(u&&(i=0),c=0,o===">"?(o=">=",u?(n=+n+1,i=0,c=0):(i=+i+1,c=0)):o==="<="&&(o="<",u?n=+n+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+n}.${i}.${c}${l}`):u?r=`>=${n}.0.0${l} <${+n+1}.0.0-0`:g&&(r=`>=${n}.${i}.0${l} <${n}.${+i+1}.0-0`),y("xRange return",r),r})},"replaceXRange"),Zc=a((s,e)=>(y("replaceStars",s,e),s.trim().replace(D[O.STAR],"")),"replaceStars"),el=a((s,e)=>(y("replaceGTE0",s,e),s.trim().replace(D[e.includePrerelease?O.GTE0PRE:O.GTE0],"")),"replaceGTE0"),tl=a(s=>(e,t,r,o,n,i,c,l,p,u,g,E)=>(_(r)?t="":_(o)?t=`>=${r}.0.0${s?"-0":""}`:_(n)?t=`>=${r}.${o}.0${s?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${s?"-0":""}`,_(p)?l="":_(u)?l=`<${+p+1}.0.0-0`:_(g)?l=`<${p}.${+u+1}.0-0`:E?l=`<=${p}.${u}.${g}-${E}`:s?l=`<${p}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),rl=a((s,e,t)=>{for(let r=0;r<s.length;r++)if(!s[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<s.length;r++)if(y(s[r].semver),s[r].semver!==jr.ANY&&s[r].semver.prerelease.length>0){let o=s[r].semver;if(o.major===e.major&&o.minor===e.minor&&o.patch===e.patch)return!0}return!1}return!0},"testSet")});var je=v((wf,sn)=>{"use strict";var He=Symbol("SemVer ANY"),Fr=class s{static{a(this,"Comparator")}static get ANY(){return He}constructor(e,t){if(t=Zs(t),e instanceof s){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),zr("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===He?this.value="":this.value=this.operator+this.semver.version,zr("comp",this)}parse(e){let t=this.options.loose?en[tn.COMPARATORLOOSE]:en[tn.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 rn(r[2],this.options.loose):this.semver=He}toString(){return this.value}test(e){if(zr("Comparator.test",e,this.options.loose),this.semver===He||e===He)return!0;if(typeof e=="string")try{e=new rn(e,this.options)}catch{return!1}return Hr(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new on(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new on(this.value,t).test(e.semver):(t=Zs(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("=")||Hr(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Hr(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};sn.exports=Fr;var Zs=wt(),{safeRe:en,t:tn}=Ce(),Hr=Dr(),zr=_e(),rn=A(),on=U()});var ze=v((Nf,nn)=>{"use strict";var ol=U(),sl=a((s,e,t)=>{try{e=new ol(e,t)}catch{return!1}return e.test(s)},"satisfies");nn.exports=sl});var cn=v((Af,an)=>{"use strict";var nl=U(),il=a((s,e)=>new nl(s,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");an.exports=il});var pn=v((xf,ln)=>{"use strict";var al=A(),cl=U(),ll=a((s,e,t)=>{let r=null,o=null,n=null;try{n=new cl(e,t)}catch{return null}return s.forEach(i=>{n.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new al(r,t))}),r},"maxSatisfying");ln.exports=ll});var gn=v((Lf,un)=>{"use strict";var pl=A(),ul=U(),gl=a((s,e,t)=>{let r=null,o=null,n=null;try{n=new ul(e,t)}catch{return null}return s.forEach(i=>{n.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new pl(r,t))}),r},"minSatisfying");un.exports=gl});var mn=v((_f,hn)=>{"use strict";var Ur=A(),dl=U(),dn=ke(),hl=a((s,e)=>{s=new dl(s,e);let t=new Ur("0.0.0");if(s.test(t)||(t=new Ur("0.0.0-0"),s.test(t)))return t;t=null;for(let r=0;r<s.set.length;++r){let o=s.set[r],n=null;o.forEach(i=>{let c=new Ur(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!n||dn(c,n))&&(n=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),n&&(!t||dn(t,n))&&(t=n)}return t&&s.test(t)?t:null},"minVersion");hn.exports=hl});var Cn=v((jf,fn)=>{"use strict";var ml=U(),fl=a((s,e)=>{try{return new ml(s,e).range||"*"}catch{return null}},"validRange");fn.exports=fl});var kt=v((zf,Rn)=>{"use strict";var Cl=A(),Sn=je(),{ANY:El}=Sn,vl=U(),Sl=ze(),En=ke(),vn=xt(),Rl=Lt(),Tl=$t(),Ml=a((s,e,t,r)=>{s=new Cl(s,r),e=new vl(e,r);let o,n,i,c,l;switch(t){case">":o=En,n=Rl,i=vn,c=">",l=">=";break;case"<":o=vn,n=Tl,i=En,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Sl(s,e,r))return!1;for(let p=0;p<e.set.length;++p){let u=e.set[p],g=null,E=null;if(u.forEach(h=>{h.semver===El&&(h=new Sn(">=0.0.0")),g=g||h,E=E||h,o(h.semver,g.semver,r)?g=h:i(h.semver,E.semver,r)&&(E=h)}),g.operator===c||g.operator===l||(!E.operator||E.operator===c)&&n(s,E.semver))return!1;if(E.operator===l&&i(s,E.semver))return!1}return!0},"outside");Rn.exports=Ml});var Mn=v((Uf,Tn)=>{"use strict";var yl=kt(),Pl=a((s,e,t)=>yl(s,e,">",t),"gtr");Tn.exports=Pl});var Pn=v((Wf,yn)=>{"use strict";var wl=kt(),bl=a((s,e,t)=>wl(s,e,"<",t),"ltr");yn.exports=bl});var Nn=v((Bf,bn)=>{"use strict";var wn=U(),Nl=a((s,e,t)=>(s=new wn(s,t),e=new wn(e,t),s.intersects(e,t)),"intersects");bn.exports=Nl});var An=v((Jf,In)=>{"use strict";var Il=ze(),Al=F();In.exports=(s,e,t)=>{let r=[],o=null,n=null,i=s.sort((u,g)=>Al(u,g,t));for(let u of i)Il(u,e,t)?(n=u,o||(o=u)):(n&&r.push([o,n]),n=null,o=null);o&&r.push([o,null]);let c=[];for(let[u,g]of r)u===g?c.push(u):!g&&u===i[0]?c.push("*"):g?u===i[0]?c.push(`<=${g}`):c.push(`${u} - ${g}`):c.push(`>=${u}`);let l=c.join(" || "),p=typeof e.raw=="string"?e.raw:String(e);return l.length<p.length?l:e}});var _n=v((Xf,Dn)=>{"use strict";var On=U(),Wr=je(),{ANY:Vr}=Wr,Fe=ze(),qr=F(),Ol=a((s,e,t={})=>{if(s===e)return!0;s=new On(s,t),e=new On(e,t);let r=!1;e:for(let o of s.set){for(let n of e.set){let i=$l(o,n,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),xl=[new Wr(">=0.0.0-0")],xn=[new Wr(">=0.0.0")],$l=a((s,e,t)=>{if(s===e)return!0;if(s.length===1&&s[0].semver===Vr){if(e.length===1&&e[0].semver===Vr)return!0;t.includePrerelease?s=xl:s=xn}if(e.length===1&&e[0].semver===Vr){if(t.includePrerelease)return!0;e=xn}let r=new Set,o,n;for(let h of s)h.operator===">"||h.operator===">="?o=$n(o,h,t):h.operator==="<"||h.operator==="<="?n=Ln(n,h,t):r.add(h.semver);if(r.size>1)return null;let i;if(o&&n){if(i=qr(o.semver,n.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||n.operator!=="<="))return null}for(let h of r){if(o&&!Fe(h,String(o),t)||n&&!Fe(h,String(n),t))return null;for(let x of e)if(!Fe(h,String(x),t))return!1;return!0}let c,l,p,u,g=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1,E=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;g&&g.prerelease.length===1&&n.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",p=p||h.operator==="<"||h.operator==="<=",o){if(E&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===E.major&&h.semver.minor===E.minor&&h.semver.patch===E.patch&&(E=!1),h.operator===">"||h.operator===">="){if(c=$n(o,h,t),c===h&&c!==o)return!1}else if(o.operator===">="&&!Fe(o.semver,String(h),t))return!1}if(n){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=Ln(n,h,t),l===h&&l!==n)return!1}else if(n.operator==="<="&&!Fe(n.semver,String(h),t))return!1}if(!h.operator&&(n||o)&&i!==0)return!1}return!(o&&p&&!n&&i!==0||n&&u&&!o&&i!==0||E||g)},"simpleSubset"),$n=a((s,e,t)=>{if(!s)return e;let r=qr(s.semver,e.semver,t);return r>0?s:r<0||e.operator===">"&&s.operator===">="?e:s},"higherGT"),Ln=a((s,e,t)=>{if(!s)return e;let r=qr(s.semver,e.semver,t);return r<0?s:r>0||e.operator==="<"&&s.operator==="<="?e:s},"lowerLT");Dn.exports=Ol});var zn=v((Kf,Hn)=>{"use strict";var Br=Ce(),kn=De(),Ll=A(),jn=Ar(),Dl=ne(),_l=ls(),kl=us(),jl=hs(),Hl=Cs(),zl=vs(),Fl=Rs(),Ul=Ms(),Vl=Ps(),Wl=F(),ql=Is(),Bl=Os(),Gl=Ot(),Jl=Ds(),Xl=ks(),Yl=ke(),Kl=xt(),Ql=$r(),Zl=Lr(),ep=$t(),tp=Lt(),rp=Dr(),op=Bs(),sp=je(),np=U(),ip=ze(),ap=cn(),cp=pn(),lp=gn(),pp=mn(),up=Cn(),gp=kt(),dp=Mn(),hp=Pn(),mp=Nn(),fp=An(),Cp=_n();Hn.exports={parse:Dl,valid:_l,clean:kl,inc:jl,diff:Hl,major:zl,minor:Fl,patch:Ul,prerelease:Vl,compare:Wl,rcompare:ql,compareLoose:Bl,compareBuild:Gl,sort:Jl,rsort:Xl,gt:Yl,lt:Kl,eq:Ql,neq:Zl,gte:ep,lte:tp,cmp:rp,coerce:op,Comparator:sp,Range:np,satisfies:ip,toComparators:ap,maxSatisfying:cp,minSatisfying:lp,minVersion:pp,validRange:up,outside:gp,gtr:dp,ltr:hp,intersects:mp,simplifyRange:fp,subset:Cp,SemVer:Ll,re:Br.re,src:Br.src,tokens:Br.t,SEMVER_SPEC_VERSION:kn.SEMVER_SPEC_VERSION,RELEASE_TYPES:kn.RELEASE_TYPES,compareIdentifiers:jn.compareIdentifiers,rcompareIdentifiers:jn.rcompareIdentifiers}});import{exec as Ep,spawn as vp}from"child_process";import{promisify as Sp}from"util";var Ue,Fn,ie,Un=d(()=>{"use strict";k();Ue=wi(zn(),1),Fn=Sp(Ep),ie=class{static{a(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||R()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=vp("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((n,i)=>{o.stdout.on("data",c=>{let l=c.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),o.stderr.on("data",c=>{let l=c.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),o.on("close",c=>{let l=Date.now()-r;if(c===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),n();else{let p=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${c}`;this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:p,duration:l,timestamp:Date.now()}),i(new Error(p))}})})}async getCurrentVersion(){let{stdout:e}=await Fn("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 Fn("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(n=>n&&typeof n=="string"&&Ue.default.valid(n));return e!=="all"&&(o=o.filter(n=>{let i=Ue.default.prerelease(n);return e==="stable"?i===null:e==="rc"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("rc")===!0:e==="beta"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("beta")===!0:!0})),o.sort((n,i)=>Ue.default.rcompare(n,i))}catch{return[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],o=!1;try{o=Ue.default.gt(r,e)}catch{o=r!==e}return{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});var Gr=d(()=>{"use strict";Un()});import{z as Vn}from"zod";var Rp,jt,Wn=d(()=>{"use strict";Gr();T();k();Rp=Vn.object({version:Vn.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),jt=class{static{a(this,"UpdateApiHandler")}npmManager;logger=m;eventBus=R();activeInstalls=new Map;constructor(){this.npmManager=new ie(this.eventBus)}async performUpdate(e){try{let t=await e.req.json(),r=Rp.safeParse(t);if(!r.success)return e.json({success:!1,error:{code:"INVALID_VERSION",message:"\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",details:r.error.errors.map(i=>({field:i.path.join("."),message:i.message}))}},400);let{version:o}=r.data;return Array.from(this.activeInstalls.values()).some(i=>i)?e.json({success:!1,error:{code:"INSTALL_IN_PROGRESS",message:"\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5"}},409):(this.npmManager.installVersion(o).catch(i=>{this.logger.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",i)}),e.json({success:!0,data:{version:o,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},message:"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7"}))}catch(t){return this.logger.error("\u5904\u7406\u5B89\u88C5\u8BF7\u6C42\u5931\u8D25:",t),e.json({success:!1,error:{code:"REQUEST_FAILED",message:t instanceof Error?t.message:"\u8BF7\u6C42\u5904\u7406\u5931\u8D25"}},500)}}}});import Ht from"fs";import te from"path";import{fileURLToPath as qn}from"url";var Ee,Bn=d(()=>{"use strict";Ee=class s{static{a(this,"VersionUtils")}static cachedVersion=null;static getVersion(){if(s.cachedVersion)return s.cachedVersion;try{let e=qn(import.meta.url),t=te.dirname(e),r=[te.join(t,"..","..","package.json"),te.join(t,"..","..","..","package.json"),te.join(t,"..","..","..","..","package.json")];for(let o of r)if(Ht.existsSync(o)){let n=JSON.parse(Ht.readFileSync(o,"utf8"));if(n.version)return s.cachedVersion=n.version,n.version}return s.cachedVersion="unknown","unknown"}catch{return s.cachedVersion="unknown","unknown"}}static getVersionInfo(){try{let e=qn(import.meta.url),t=te.dirname(e),r=[te.join(t,"..","..","package.json"),te.join(t,"..","..","..","package.json"),te.join(t,"..","..","..","..","package.json")];for(let o of r)if(Ht.existsSync(o)){let n=JSON.parse(Ht.readFileSync(o,"utf8"));return{version:n.version||"unknown",name:n.name,description:n.description,author:n.author}}return{version:"unknown"}}catch{return{version:"unknown"}}}static compareVersions(e,t){let r=e.split(".").map(Number),o=t.split(".").map(Number),n=Math.max(r.length,o.length);for(let i=0;i<n;i++){let c=r[i]||0,l=o[i]||0;if(c>l)return 1;if(c<l)return-1}return 0}static isValidVersion(e){return/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(e)}static clearCache(){s.cachedVersion=null}}});var zt,Gn=d(()=>{"use strict";Gr();T();Bn();zt=class{static{a(this,"VersionApiHandler")}logger;constructor(){this.logger=m}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=Ee.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=Ee.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"),Ee.clearCache(),this.logger.info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.json(this.createSuccessResponse(null,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"))}catch(t){this.logger.error("\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25:",t);let r=this.createErrorResponse("CACHE_CLEAR_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7248\u672C\u7F13\u5B58\u5931\u8D25");return e.json(r,500)}}async getAvailableVersions(e){try{this.logger.debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t)){let i=this.createErrorResponse("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`);return e.json(i,400)}let n=await new ie().getAvailableVersions(t);return this.logger.debug(`\u83B7\u53D6\u5230 ${n.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.json(this.createSuccessResponse({versions:n,type:t,total:n.length}))}catch(t){this.logger.error("\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25:",t);let r=this.createErrorResponse("VERSIONS_FETCH_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u5931\u8D25");return e.json(r,500)}}async checkLatestVersion(e){try{this.logger.debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new ie().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 Jn=d(()=>{"use strict";_o();ko();jo();vr();Ho();Fo();Uo();Wo();qo();Bo();Jo();Yo();Wn();Gn()});var Ft,Xn=d(()=>{"use strict";T();k();Ft=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=m,this.eventBus=R()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.warn("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.updateClientInfo({status:"disconnected"},"heartbeat-timeout")},this.HEARTBEAT_TIMEOUT)}clearHeartbeatTimeout(){this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=void 0)}isClientConnected(){return this.clientInfo.status==="connected"}getLastHeartbeat(){return this.clientInfo.lastHeartbeat}getActiveMCPServers(){return[...this.clientInfo.activeMCPServers]}setActiveMCPServers(e){this.updateClientInfo({activeMCPServers:[...e]},"mcp-servers-update")}setMcpEndpoint(e){this.updateClientInfo({mcpEndpoint:e},"mcp-endpoint-update")}reset(){this.logger.info("\u91CD\u7F6E\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]},this.restartStatus=void 0}destroy(){this.logger.info("\u9500\u6BC1\u72B6\u6001\u670D\u52A1"),this.clearHeartbeatTimeout(),this.reset()}}});import{configManager as Tp}from "../config/index.js";var Ut,Yn=d(()=>{"use strict";T();k();Ut=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=m,this.eventBus=R(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=Tp.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:a(o=>{t.readyState===1&&t.send(o)},"send")};this.clients.set(e,r),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u518C: ${e}`),this.logger.debug(`\u5F53\u524D\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.sendQueuedMessages(e),this.eventBus.emitEvent("websocket:client:connected",{clientId:e,timestamp:Date.now()})}catch(r){this.logger.error(`\u6CE8\u518C\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,r),this.eventBus.emitEvent("notification:error",{error:r instanceof Error?r:new Error(String(r)),type:"client:register"})}}unregisterClient(e){try{this.clients.has(e)&&(this.clients.delete(e),this.messageQueue.delete(e),this.logger.info(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u9500: ${e}`),this.logger.debug(`\u5269\u4F59\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.eventBus.emitEvent("websocket:client:disconnected",{clientId:e,timestamp:Date.now()}))}catch(t){this.logger.error(`\u6CE8\u9500\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,t)}}broadcast(e,t){let r={type:e,data:t,timestamp:Date.now()};this.logger.debug(`\u5E7F\u64AD\u6D88\u606F: ${e}`,{clientCount:this.clients.size});for(let[o,n]of this.clients)this.sendMessageToClient(n,r,o)}sendToClient(e,t,r){let o={type:t,data:r,timestamp:Date.now()},n=this.clients.get(e);n?this.sendMessageToClient(n,o,e):this.queueMessage(e,o)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let o=JSON.stringify(t);e.send(o),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF ${r}: ${t.type}`)}else this.queueMessage(r,t),this.logger.warn(`\u5BA2\u6237\u7AEF ${r} \u8FDE\u63A5\u4E0D\u53EF\u7528\uFF0C\u6D88\u606F\u5DF2\u52A0\u5165\u961F\u5217`)}catch(o){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,o),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:o instanceof Error?o:new Error(String(o)),type:"message:send"})}}queueMessage(e,t){this.messageQueue.has(e)||this.messageQueue.set(e,[]);let r=this.messageQueue.get(e);r.push(t),r.length>this.maxQueueSize&&(r.shift(),this.logger.warn(`\u5BA2\u6237\u7AEF ${e} \u6D88\u606F\u961F\u5217\u5DF2\u6EE1\uFF0C\u79FB\u9664\u6700\u65E7\u6D88\u606F`))}sendQueuedMessages(e){let t=this.messageQueue.get(e);if(!t||t.length===0)return;let r=this.clients.get(e);if(r){this.logger.info(`\u53D1\u9001 ${t.length} \u6761\u6392\u961F\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${e}`);for(let o of t)this.sendMessageToClient(r,o,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let o={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",o)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,o)=>r+o.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var Kn=d(()=>{"use strict";T()});var Qn=d(()=>{"use strict";Xn();Yn();k();Kn();et()});var Ve,Zn=d(()=>{"use strict";mr();Ve=class{static{a(this,"RouteManager")}routes=new Map;registerRoute(e,t){this.routes.has(e),this.routes.set(e,t)}registerRoutes(e){for(let[t,r]of Object.entries(e))this.registerRoute(t,r)}getAllRoutes(){return new Map(this.routes)}getRoute(e){return this.routes.get(e)}applyToApp(e){let t=Array.from(this.routes.entries());t.sort(([r],[o])=>r==="static"?1:o==="static"?-1:0);for(let[r,o]of t)try{this.applyRouteConfig(e,o)}catch{}}applyRouteConfig(e,t){for(let r of t.routes){let o=t.path+r.path,n=[...t.middleware||[],...r.middleware||[]],i=a(async(p,u)=>{try{return await r.handler(p)}catch(g){let E=I("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",g instanceof Error?g.message:String(g));return p.json(E,500)}},"wrappedHandler"),l={GET:e.get.bind(e),POST:e.post.bind(e),PUT:e.put.bind(e),DELETE:e.delete.bind(e),PATCH:e.patch.bind(e)}[r.method];if(!l)throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${r.method}`);n.length>0?l(o,...n,i):l(o,i)}}clear(){this.routes.clear()}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}}});var Jr,ei=d(()=>{"use strict";Jr={name:"config",path:"/api/config",description:"\u914D\u7F6E\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.getConfig(s)},"handler")},{method:"PUT",path:"",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.updateConfig(s)},"handler")},{method:"GET",path:"/mcp-endpoint",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.getMcpEndpoint(s)},"handler")},{method:"GET",path:"/mcp-endpoints",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.getMcpEndpoints(s)},"handler")},{method:"GET",path:"/mcp-servers",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.getMcpServers(s)},"handler")},{method:"GET",path:"/connection",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.getConnectionConfig(s)},"handler")},{method:"POST",path:"/reload",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.reloadConfig(s)},"handler")},{method:"GET",path:"/path",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.getConfigPath(s)},"handler")},{method:"GET",path:"/exists",handler:a(s=>{let e=s.get("dependencies"),{configApiHandler:t}=e;return t.checkConfigExists(s)},"handler")}]}});var Xr,ti=d(()=>{"use strict";Xr={name:"status",path:"/api/status",description:"\u72B6\u6001\u67E5\u8BE2\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(s=>{let{statusApiHandler:e}=s.get("dependencies");return e.getStatus(s)},"handler")},{method:"GET",path:"/client",handler:a(s=>{let{statusApiHandler:e}=s.get("dependencies");return e.getClientStatus(s)},"handler")},{method:"PUT",path:"/client",handler:a(s=>{let{statusApiHandler:e}=s.get("dependencies");return e.updateClientStatus(s)},"handler")},{method:"POST",path:"/reset",handler:a(s=>{let{statusApiHandler:e}=s.get("dependencies");return e.resetStatus(s)},"handler")},{method:"GET",path:"/mcp-servers",handler:a(s=>{let{statusApiHandler:e}=s.get("dependencies");return e.getActiveMCPServers(s)},"handler")},{method:"PUT",path:"/mcp-servers",handler:a(s=>{let{statusApiHandler:e}=s.get("dependencies");return e.setActiveMCPServers(s)},"handler")}]}});var Yr,ri=d(()=>{"use strict";Yr={name:"tools",path:"/api/tools",description:"\u5DE5\u5177\u8C03\u7528\u76F8\u5173 API",routes:[{method:"POST",path:"/call",handler:a(s=>{let{toolApiHandler:e}=s.get("dependencies");return e.callTool(s)},"handler")},{method:"GET",path:"/list",handler:a(s=>{let{toolApiHandler:e}=s.get("dependencies");return e.listTools(s)},"handler")},{method:"GET",path:"/custom",handler:a(s=>{let{toolApiHandler:e}=s.get("dependencies");return e.getCustomTools(s)},"handler")},{method:"POST",path:"/custom",handler:a(s=>{let{toolApiHandler:e}=s.get("dependencies");return e.addCustomTool(s)},"handler")},{method:"PUT",path:"/custom/:toolName",handler:a(s=>{let{toolApiHandler:e}=s.get("dependencies");return e.updateCustomTool(s)},"handler")},{method:"DELETE",path:"/custom/:toolName",handler:a(s=>{let{toolApiHandler:e}=s.get("dependencies");return e.removeCustomTool(s)},"handler")}]}});var Kr,oi=d(()=>{"use strict";Kr={name:"mcp",path:"/mcp",description:"MCP \u534F\u8BAE\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(s=>{let{mcpRouteHandler:e}=s.get("dependencies");return e.handlePost(s)},"handler")},{method:"GET",path:"",handler:a(s=>{let{mcpRouteHandler:e}=s.get("dependencies");return e.handleGet(s)},"handler")}]}});var Qr,si=d(()=>{"use strict";Qr={name:"version",path:"/api/version",description:"\u7248\u672C\u4FE1\u606F\u76F8\u5173 API",routes:[{method:"GET",path:"",handler:a(s=>{let{versionApiHandler:e}=s.get("dependencies");return e.getVersion(s)},"handler")},{method:"GET",path:"/simple",handler:a(s=>{let{versionApiHandler:e}=s.get("dependencies");return e.getVersionSimple(s)},"handler")},{method:"DELETE",path:"/cache",handler:a(s=>{let{versionApiHandler:e}=s.get("dependencies");return e.clearVersionCache(s)},"handler")},{method:"GET",path:"/latest",handler:a(s=>{let{versionApiHandler:e}=s.get("dependencies");return e.checkLatestVersion(s)},"handler")}]}});var Zr,ni=d(()=>{"use strict";Zr={name:"services",path:"/api/services",description:"\u670D\u52A1\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/restart",handler:a(s=>{let{serviceApiHandler:e}=s.get("dependencies");return e.restartService(s)},"handler")},{method:"POST",path:"/stop",handler:a(s=>{let{serviceApiHandler:e}=s.get("dependencies");return e.stopService(s)},"handler")},{method:"POST",path:"/start",handler:a(s=>{let{serviceApiHandler:e}=s.get("dependencies");return e.startService(s)},"handler")},{method:"GET",path:"/status",handler:a(s=>{let{serviceApiHandler:e}=s.get("dependencies");return e.getServiceStatus(s)},"handler")},{method:"GET",path:"/health",handler:a(s=>{let{serviceApiHandler:e}=s.get("dependencies");return e.getServiceHealth(s)},"handler")}]}});var eo,ii=d(()=>{"use strict";eo={name:"update",path:"/api",description:"\u66F4\u65B0\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/update",handler:a(s=>{let{updateApiHandler:e}=s.get("dependencies");return e.performUpdate(s)},"handler")}]}});var to,ai=d(()=>{"use strict";to={name:"static",path:"/",description:"\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u7531",routes:[{method:"GET",path:"*",handler:a(async s=>s.req.path.startsWith("/api/")?s.notFound():await s.get("dependencies").staticFileHandler.handleStaticFile(s),"handler")}]}});var ro,ci=d(()=>{"use strict";ro={name:"coze",path:"/api/coze",description:"\u6263\u5B50 API \u76F8\u5173\u8DEF\u7531",routes:[{method:"GET",path:"/workspaces",handler:a(s=>{let{cozeApiHandler:e}=s.get("dependencies");return e.getWorkspaces(s)},"handler")},{method:"GET",path:"/workflows",handler:a(s=>{let{cozeApiHandler:e}=s.get("dependencies");return e.getWorkflows(s)},"handler")},{method:"POST",path:"/cache/clear",handler:a(s=>{let{cozeApiHandler:e}=s.get("dependencies");return e.clearCache(s)},"handler")},{method:"GET",path:"/cache/stats",handler:a(s=>{let{cozeApiHandler:e}=s.get("dependencies");return e.getCacheStats(s)},"handler")}]}});var oo,li=d(()=>{"use strict";oo={name:"tool-logs",path:"/api/tool-calls",description:"\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u76F8\u5173 API",routes:[{method:"GET",path:"/logs",handler:a(s=>{let{toolCallLogApiHandler:e}=s.get("dependencies");return e.getToolCallLogs(s)},"handler")}]}});var Vt,so,pi=d(()=>{"use strict";Vt=a(async(s,e)=>{let r=s.get("dependencies").mcpServerApiHandler;return r?await e(r):s.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),so={name:"mcpserver",path:"/api/mcp-servers",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"",handler:a(s=>Vt(s,e=>e.addMCPServer(s)),"handler")},{method:"DELETE",path:"/:serverName",handler:a(s=>Vt(s,e=>e.removeMCPServer(s)),"handler")},{method:"GET",path:"/:serverName/status",handler:a(s=>Vt(s,e=>e.getMCPServerStatus(s)),"handler")},{method:"GET",path:"",handler:a(s=>Vt(s,e=>e.listMCPServers(s)),"handler")}]}});var ui,We,no,gi=d(()=>{"use strict";ui=a((s,e)=>({error:{code:s,message:e}}),"createErrorResponse"),We=a(async(s,e)=>{let t=s.get("endpointHandler");if(!t){let r=ui("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");return s.json(r,503)}try{return await t[e](s)}catch(r){let o=ui("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return s.json(o,500)}},"withEndpointHandler"),no={name:"endpoint",path:"/api/endpoint",description:"\u7AEF\u70B9\u7BA1\u7406\u76F8\u5173 API",routes:[{method:"POST",path:"/status",handler:a(s=>We(s,"getEndpointStatus"),"handler")},{method:"POST",path:"/connect",handler:a(s=>We(s,"connectEndpoint"),"handler")},{method:"POST",path:"/disconnect",handler:a(s=>We(s,"disconnectEndpoint"),"handler")},{method:"POST",path:"/add",handler:a(s=>We(s,"addEndpoint"),"handler")},{method:"POST",path:"/remove",handler:a(s=>We(s,"removeEndpoint"),"handler")}]}});var io,di=d(()=>{"use strict";io={name:"misc",path:"/api",description:"\u901A\u7528 API \u8DEF\u7531",routes:[{method:"POST",path:"/restart",handler:a(s=>{let{serviceApiHandler:e}=s.get("dependencies");return e.restartService(s)},"handler")}]}});var hi=d(()=>{"use strict";ei();ti();ri();oi();si();ni();ii();ai();ci();li();pi();gi();di()});var mi=d(()=>{"use strict";Zn();hi()});var fi={};Bt(fi,{WebServer:()=>ao});import{createServer as Mp}from"http";import{serve as yp}from"@hono/node-server";import{convertLegacyToNew as Pp}from "../config/index.js";import{configManager as ve}from "../config/index.js";import{WebSocketServer as wp}from"ws";var ao,Ci=d(()=>{"use strict";go();Q();q();Jn();Rr();T();pr();Qn();fr();mi();ao=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;toolApiHandler;toolCallLogApiHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpServerApiHandler;updateApiHandler;cozeApiHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointConnection;endpointManager=null;mcpServiceManager=null;constructor(e){try{this.port=e??ve.getWebUIPort()??9999}catch{this.port=e??9999}this.logger=m,this.eventBus=R(),this.statusService=new Ft,this.notificationService=new Ut,this.configApiHandler=new lt,this.statusApiHandler=new Tt(this.statusService),this.serviceApiHandler=new vt(this.statusService),this.toolApiHandler=new yt,this.toolCallLogApiHandler=new Pt,this.versionApiHandler=new zt,this.staticFileHandler=new Rt,this.mcpRouteHandler=new ht,this.updateApiHandler=new jt,this.cozeApiHandler=new gt,this.realtimeNotificationHandler=new Ct(this.notificationService,this.statusService),this.heartbeatHandler=new dt(this.statusService,this.notificationService),this.app=Po(),this.setupMiddleware(),this.app.notFound(hr),this.setupEndpointStatusListener()}async initializeConnections(){try{this.logger.debug("\u5F00\u59CB\u521D\u59CB\u5316\u8FDE\u63A5..."),this.mcpServiceManager?this.logger.debug("\u4F7F\u7528\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u8DF3\u8FC7\u521B\u5EFA"):(this.logger.debug("\u521B\u5EFA\u65B0\u7684 MCPServiceManager \u5B9E\u4F8B"),this.mcpServiceManager=new se,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpServerApiHandler=new ft(this.mcpServiceManager,ve),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`);let r=t.map(o=>({name:o.name,description:o.description||"",inputSchema:Y(o.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint,r),this.logger.debug("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),this.mcpServiceManager||(this.logger.warn(`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u8FDB\u5165\u964D\u7EA7\u6A21\u5F0F\u3002\u5728\u964D\u7EA7\u6A21\u5F0F\u4E0B\uFF1A
|
|
89
89
|
1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
|
|
90
90
|
2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
|
|
91
91
|
3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
|
|
92
92
|
4. \u7528\u6237\u9700\u8981\u901A\u8FC7 API \u91CD\u65B0\u914D\u7F6E\u7AEF\u70B9\u6216\u670D\u52A1\u5668
|
|
93
|
-
5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new ie,await this.mcpServiceManager.start(),this.logger.info("\u964D\u7EA7\u6A21\u5F0F\u5DF2\u6FC0\u6D3B\uFF0CMCPServiceManager \u4F7F\u7528\u7A7A\u914D\u7F6E\u542F\u52A8"))}}async loadConfiguration(){if(!m.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");m.cleanupInvalidServerToolsConfig();let e=m.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let o=Eo(t,r);this.mcpServiceManager.addServiceConfig(t,o)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e,t){let o=(Array.isArray(e)?e:[e]).filter(s=>s&&!s.includes("<\u8BF7\u586B\u5199"));this.logger.debug(`\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\uFF0C\u7AEF\u70B9\u6570\u91CF: ${o.length}`);try{this.endpointManager||(this.endpointManager=new Ne(m,{connectionTimeout:1e4}),this.logger.debug("\u2705 \u65B0\u5EFA\u8FDE\u63A5\u7BA1\u7406\u5668\u5B9E\u4F8B")),this.mcpServiceManager&&this.endpointManager.setServiceManager(this.mcpServiceManager),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u8BBE\u7F6E\u5B8C\u6210"),o.length>0?(this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",o),await this.endpointManager.initialize(o,t),await this.endpointManager.connect(),this.endpointManager.on("configChange",s=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${s.type}`,s.data)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${o.length} \u4E2A\u7AEF\u70B9`)):(await this.endpointManager.initialize([],t),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF08\u65E0\u7AEF\u70B9\uFF09"))}catch(s){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",s),s}}setXiaozhiConnectionManager(e){this.endpointManager=e}getEndpointManager(){if(!this.endpointManager)throw new Error("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.endpointManager}setMCPServiceManager(e){this.mcpServiceManager&&this.mcpServiceManager!==e&&this.logger.warn("\u66FF\u6362\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u6CE8\u610F\u6E05\u7406\u539F\u6709\u5B9E\u4F8B\u7684\u8D44\u6E90"),this.mcpServiceManager=e,this.logger.debug("MCPServiceManager \u5B9E\u4F8B\u5DF2\u66F4\u65B0")}getMCPServiceManager(){if(!this.mcpServiceManager)throw new fe("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.mcpServiceManager}getEndpointConnectionStatus(){return this.endpointManager?{type:"multi-endpoint",manager:{connectedConnections:this.endpointManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.endpointManager.getConnectionStatus().length,healthCheckStats:{}},connections:this.endpointManager.getConnectionStatus()}:this.endpointConnection?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async connectWithRetry(e,t,r=5,o=1e3,s=3e4,i=2){let c=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(p){if(c=p,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,p),l<r){let g=Math.min(o*i**(l-1),s);this.logger.info(`${t} - ${g}ms \u540E\u91CD\u8BD5...`),await this.sleep(g)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${c?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",vr),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",yr),this.app?.use("*",Pr()),this.app?.use("*",br()),this.app?.use("*",Er),this.app?.onError(Sr),this.app?.use("*",async(e,t)=>{let r=this.createHandlerDependencies();e.set("dependencies",r),await t()})}createHandlerDependencies(){return{configApiHandler:this.configApiHandler,statusApiHandler:this.statusApiHandler,serviceApiHandler:this.serviceApiHandler,toolApiHandler:this.toolApiHandler,toolCallLogApiHandler:this.toolCallLogApiHandler,versionApiHandler:this.versionApiHandler,staticFileHandler:this.staticFileHandler,mcpRouteHandler:this.mcpRouteHandler,mcpServerApiHandler:this.mcpServerApiHandler,updateApiHandler:this.updateApiHandler,cozeApiHandler:this.cozeApiHandler}}setupRouteSystem(){this.routeManager=new qe}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:to,status:ro,tools:oo,mcp:no,version:so,services:io,update:ao,coze:lo,"tool-logs":po,mcpserver:uo,endpoint:go,misc:mo,static:co}),this.routeManager.applyToApp(this.app),this.logger.info("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5B8C\u6210")}catch(e){this.logger.error("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5931\u8D25:",e)}}setupWebSocket(){this.wss&&this.wss.on("connection",e=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let o=JSON.parse(r.toString());o.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,o,t):await this.realtimeNotificationHandler.handleMessage(e,o,t)}catch(o){this.logger.error("WebSocket message error:",o);let s={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:o instanceof Error?o.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(s))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=Bp({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:qp});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Gp({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://0.0.0.0:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`)}stop(){return new Promise(e=>{let t=!1,r=a(()=>{t||(t=!0,e())},"doResolve");this.endpointConnection?.disconnect(),(async()=>{try{this.endpointManager&&(await this.endpointManager.cleanup(),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u6E05\u7406"))}catch(o){this.logger.error("\u8FDE\u63A5\u7BA1\u7406\u5668\u6E05\u7406\u5931\u8D25:",o)}try{this.mcpServiceManager&&(await this.mcpServiceManager.stopAllServices(),this.mcpServiceManager=null,this.logger.debug("MCPServiceManager \u5DF2\u6E05\u7406"))}catch(o){this.logger.error("MCPServiceManager \u6E05\u7406\u5931\u8D25:",o)}if(this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let o of this.wss.clients)o.terminate();this.wss.close(()=>{this.httpServer?this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()}):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()),setTimeout(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.statusService.destroy(),this.notificationService.destroy(),Mo(),this.endpointConnection?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function Jp(){let n=await Promise.resolve().then(()=>(xi(),Oi)),e=await Promise.resolve().then(()=>(H(),No)),t=await Promise.resolve().then(()=>(R(),To));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}a(Jp,"importModules");async function Yp(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await Jp();process.env.XIAOZHI_CONFIG_DIR&&(r.initLogFile(process.env.XIAOZHI_CONFIG_DIR),r.enableFileLogging(!0));let o=new e;await o.start(),r.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F");let s=a(async()=>{r.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await o.stop(),process.exit(0)},"cleanup");process.on("SIGINT",s),process.on("SIGTERM",s)}catch{process.exit(1)}}a(Yp,"main");import.meta.url===`file://${process.argv[1]}`&&Yp();
|
|
93
|
+
5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new se,await this.mcpServiceManager.start(),this.logger.info("\u964D\u7EA7\u6A21\u5F0F\u5DF2\u6FC0\u6D3B\uFF0CMCPServiceManager \u4F7F\u7528\u7A7A\u914D\u7F6E\u542F\u52A8"))}}async loadConfiguration(){if(!ve.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");ve.cleanupInvalidServerToolsConfig();let e=ve.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??9999}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let o=Pp(t,r);this.mcpServiceManager.addServiceConfig(t,o)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e,t){let o=(Array.isArray(e)?e:[e]).filter(n=>n&&!n.includes("<\u8BF7\u586B\u5199"));this.logger.debug(`\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\uFF0C\u7AEF\u70B9\u6570\u91CF: ${o.length}`);try{this.endpointManager||(this.endpointManager=new Pe(ve,{connectionTimeout:1e4}),this.logger.debug("\u2705 \u65B0\u5EFA\u8FDE\u63A5\u7BA1\u7406\u5668\u5B9E\u4F8B")),this.mcpServiceManager&&this.endpointManager.setServiceManager(this.mcpServiceManager),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u8BBE\u7F6E\u5B8C\u6210"),o.length>0?(this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",o),await this.endpointManager.initialize(o,t),await this.endpointManager.connect(),this.endpointManager.on("configChange",n=>{this.logger.debug(`\u5C0F\u667A\u8FDE\u63A5\u914D\u7F6E\u53D8\u66F4: ${n.type}`,n.data)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${o.length} \u4E2A\u7AEF\u70B9`)):(await this.endpointManager.initialize([],t),this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF08\u65E0\u7AEF\u70B9\uFF09"))}catch(n){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",n),n}}setXiaozhiConnectionManager(e){this.endpointManager=e}getEndpointManager(){if(!this.endpointManager)throw new Error("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.endpointManager}setMCPServiceManager(e){this.mcpServiceManager&&this.mcpServiceManager!==e&&this.logger.warn("\u66FF\u6362\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u6CE8\u610F\u6E05\u7406\u539F\u6709\u5B9E\u4F8B\u7684\u8D44\u6E90"),this.mcpServiceManager=e,this.logger.debug("MCPServiceManager \u5B9E\u4F8B\u5DF2\u66F4\u65B0")}getMCPServiceManager(){if(!this.mcpServiceManager)throw new de("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.mcpServiceManager}getEndpointConnectionStatus(){return this.endpointManager?{type:"multi-endpoint",manager:{connectedConnections:this.endpointManager.getConnectionStatus().filter(e=>e.connected).length,totalConnections:this.endpointManager.getConnectionStatus().length,healthCheckStats:{}},connections:this.endpointManager.getConnectionStatus()}:this.endpointConnection?{type:"single-endpoint",connected:!0,endpoint:"unknown"}:{type:"none",connected:!1}}async connectWithRetry(e,t,r=5,o=1e3,n=3e4,i=2){let c=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(p){if(c=p,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,p),l<r){let u=Math.min(o*i**(l-1),n);this.logger.info(`${t} - ${u}ms \u540E\u91CD\u8BD5...`),await this.sleep(u)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${c?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",ur),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",Cr),this.app?.use("*",Er()),this.app?.use("*",Sr()),this.app?.use("*",gr),this.app?.onError(dr),this.app?.use("*",async(e,t)=>{let r=this.createHandlerDependencies();e.set("dependencies",r),await t()})}createHandlerDependencies(){return{configApiHandler:this.configApiHandler,statusApiHandler:this.statusApiHandler,serviceApiHandler:this.serviceApiHandler,toolApiHandler:this.toolApiHandler,toolCallLogApiHandler:this.toolCallLogApiHandler,versionApiHandler:this.versionApiHandler,staticFileHandler:this.staticFileHandler,mcpRouteHandler:this.mcpRouteHandler,mcpServerApiHandler:this.mcpServerApiHandler,updateApiHandler:this.updateApiHandler,cozeApiHandler:this.cozeApiHandler}}setupRouteSystem(){this.routeManager=new Ve}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Jr,status:Xr,tools:Yr,mcp:Kr,version:Qr,services:Zr,update:eo,coze:ro,"tool-logs":oo,mcpserver:so,endpoint:no,misc:io,static:to}),this.routeManager.applyToApp(this.app),this.logger.info("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5B8C\u6210")}catch(e){this.logger.error("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5931\u8D25:",e)}}setupWebSocket(){this.wss&&this.wss.on("connection",e=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let o=JSON.parse(r.toString());o.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,o,t):await this.realtimeNotificationHandler.handleMessage(e,o,t)}catch(o){this.logger.error("WebSocket message error:",o);let n={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:o instanceof Error?o.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(n))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=yp({fetch:this.app.fetch,port:this.port,hostname:"0.0.0.0",createServer:Mp});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new wp({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://0.0.0.0:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`)}stop(){return new Promise(e=>{let t=!1,r=a(()=>{t||(t=!0,e())},"doResolve");this.endpointConnection?.disconnect(),(async()=>{try{this.endpointManager&&(await this.endpointManager.cleanup(),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u6E05\u7406"))}catch(o){this.logger.error("\u8FDE\u63A5\u7BA1\u7406\u5668\u6E05\u7406\u5931\u8D25:",o)}try{this.mcpServiceManager&&(await this.mcpServiceManager.stopAllServices(),this.mcpServiceManager=null,this.logger.debug("MCPServiceManager \u5DF2\u6E05\u7406"))}catch(o){this.logger.error("MCPServiceManager \u6E05\u7406\u5931\u8D25:",o)}if(this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let o of this.wss.clients)o.terminate();this.wss.close(()=>{this.httpServer?this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()}):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()),setTimeout(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.statusService.destroy(),this.notificationService.destroy(),uo(),this.endpointConnection?.disconnect(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function bp(){let s=await Promise.resolve().then(()=>(Ci(),fi)),e=await import("@xiaozhi-client/config"),t=await Promise.resolve().then(()=>(T(),po));return{WebServer:s.WebServer,configManager:e.configManager,logger:t.logger}}a(bp,"importModules");async function Np(){let s=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await bp();process.env.XIAOZHI_CONFIG_DIR&&(r.initLogFile(process.env.XIAOZHI_CONFIG_DIR),r.enableFileLogging(!0));let o=new e;await o.start(),r.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F");let n=a(async()=>{r.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await o.stop(),process.exit(0)},"cleanup");process.on("SIGINT",n),process.on("SIGTERM",n)}catch{process.exit(1)}}a(Np,"main");import.meta.url===`file://${process.argv[1]}`&&Np();
|
|
94
94
|
//# sourceMappingURL=WebServerLauncher.js.map
|