xiaozhi-client 2.2.0 → 2.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +1 -1
  2. package/dist/backend/WebServer.js +10 -32
  3. package/dist/backend/WebServer.js.map +1 -1
  4. package/dist/backend/WebServerLauncher.js +10 -32
  5. package/dist/backend/WebServerLauncher.js.map +1 -1
  6. package/dist/backend/package.json +52 -8
  7. package/dist/frontend/assets/form-utils-n2_wJnKb.js +41 -0
  8. package/dist/frontend/assets/form-utils-n2_wJnKb.js.map +1 -0
  9. package/dist/frontend/assets/index-C3xvW3AQ.js +81 -0
  10. package/dist/frontend/assets/index-C3xvW3AQ.js.map +1 -0
  11. package/dist/frontend/assets/index-CLIN00a1.css +1 -0
  12. package/dist/frontend/assets/radix-ui-B9D1KdKb.js +2 -0
  13. package/dist/frontend/assets/radix-ui-B9D1KdKb.js.map +1 -0
  14. package/dist/frontend/assets/react-vendor-CmWLnLSk.js +67 -0
  15. package/dist/frontend/assets/react-vendor-CmWLnLSk.js.map +1 -0
  16. package/dist/frontend/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  17. package/dist/frontend/assets/utils-UasCLNM3.js +2 -0
  18. package/dist/frontend/assets/utils-UasCLNM3.js.map +1 -0
  19. package/dist/frontend/index.html +7 -6
  20. package/package.json +25 -11
  21. package/dist/frontend/assets/form-utils-Bskf0D3l.js +0 -41
  22. package/dist/frontend/assets/form-utils-Bskf0D3l.js.map +0 -1
  23. package/dist/frontend/assets/index-BAV6nu4X.js +0 -81
  24. package/dist/frontend/assets/index-BAV6nu4X.js.map +0 -1
  25. package/dist/frontend/assets/index-HDlbxheg.css +0 -1
  26. package/dist/frontend/assets/radix-ui-BQCqNqg0.js +0 -2
  27. package/dist/frontend/assets/radix-ui-BQCqNqg0.js.map +0 -1
  28. package/dist/frontend/assets/react-vendor-BPQojLhf.js +0 -67
  29. package/dist/frontend/assets/react-vendor-BPQojLhf.js.map +0 -1
  30. package/dist/frontend/assets/utils-BWIWSmq9.js +0 -2
  31. package/dist/frontend/assets/utils-BWIWSmq9.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var Ym=Object.create;var Tn=Object.defineProperty;var Qm=Object.getOwnPropertyDescriptor;var Zm=Object.getOwnPropertyNames;var eg=Object.getPrototypeOf,tg=Object.prototype.hasOwnProperty;var i=(n,e)=>Tn(n,"name",{value:e,configurable:!0});var d=(n,e)=>()=>(n&&(e=n(n=0)),e);var x=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ii=(n,e)=>{for(var t in e)Tn(n,t,{get:e[t],enumerable:!0})},oi=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Zm(e))!tg.call(n,s)&&s!==t&&Tn(n,s,{get:()=>e[s],enumerable:!(r=Qm(e,s))||r.enumerable});return n},ur=(n,e,t)=>(oi(n,e,"default"),t&&oi(t,e,"default")),rg=(n,e,t)=>(t=n!=null?Ym(eg(n)):{},oi(e||!n||!n.__esModule?Tn(t,"default",{value:n,enumerable:!0}):t,n));var Vl={};ii(Vl,{Logger:()=>hs,createLogger:()=>ig,getGlobalLogLevel:()=>lg,getLogger:()=>Ul,logger:()=>u,setGlobalLogLevel:()=>cg,setGlobalLogger:()=>ag});import*as pe from"fs";import*as _e from"path";import gs from"chalk";import pr from"pino";import{z as sg}from"zod";function og(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),s=String(n.getHours()).padStart(2,"0"),o=String(n.getMinutes()).padStart(2,"0"),a=String(n.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${s}:${o}:${a}`}function ig(n){return new hs(n||_n)}function Ul(){return dr||(dr=new hs(_n)),dr}function ag(n){dr=n}function cg(n){_n=n,dr&&dr.setLevel(n)}function lg(){return _n}var ng,hs,dr,_n,u,D=d(()=>{"use strict";ng=sg.enum(["fatal","error","warn","info","debug","trace"]);i(og,"formatDateTime");hs=class{static{i(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=ng.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:pr.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:pr.destination({dest:"/dev/null"})}),pr({level:this.logLevel,timestamp:pr.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((t,r)=>({level:r}),"level")},base:null,serializers:{err:pr.stdSerializers?.err||(t=>t)}},pr.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:gs.gray}],[30,{name:"INFO",color:gs.blue}],[40,{name:"WARN",color:gs.yellow}],[50,{name:"ERROR",color:gs.red}],[60,{name:"FATAL",color:gs.red}]]);return{write:i(t=>{try{let r=JSON.parse(t),s=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${s}
3
- `)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"&&process.stderr.write(e)}catch{}}formatConsoleMessageOptimized(e,t){let r=og(new Date),s=t.get(e.level)||{name:"UNKNOWN",color:i(c=>c,"color")},o=s.color(`[${s.name}]`),a=e.msg;if(e.args&&Array.isArray(e.args)){let c=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");a=`${a} ${c}`}return`[${r}] ${o} ${a}`}initLogFile(e){this.logFilePath=_e.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded();try{pe.existsSync(this.logFilePath)||pe.writeFileSync(this.logFilePath,"")}catch{this.logFilePath=null}this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){this.logInfo(e,...t)}logInfo(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){this.logInfo(e,...t)}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(s=>s instanceof Error?this.pinoInstance.level==="debug"?s.message:{message:s.message,stack:s.stack,name:s.name,cause:s.cause}:s);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){this.logInfo(e,...t)}enhanceErrorObject(e){let t={...e};for(let[r,s]of Object.entries(t))s instanceof Error&&(t[r]={message:s.message,stack:s.stack,name:s.name,cause:s.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!pe.existsSync(this.logFilePath)))try{pe.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=_e.dirname(this.logFilePath),t=_e.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=_e.join(e,`${t}.${s}.log`),a=_e.join(e,`${t}.${s+1}.log`);pe.existsSync(o)&&(s===this.maxLogFiles-1?pe.unlinkSync(o):pe.renameSync(o,a))}let r=_e.join(e,`${t}.1.log`);pe.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=_e.dirname(this.logFilePath),t=_e.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=_e.join(e,`${t}.${r}.log`);pe.existsSync(s)&&pe.unlinkSync(s)}}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}},dr=null,_n="info";i(ig,"createLogger");i(Ul,"getLogger");i(ag,"setGlobalLogger");i(cg,"setGlobalLogLevel");i(lg,"getGlobalLogLevel");u=Ul()});import{existsSync as $t,mkdirSync as ug,readFileSync as Bl,readdirSync as pg,rmSync as dg,statSync as fg,writeFileSync as zl}from"fs";import{dirname as ai,isAbsolute as Wl,resolve as Es}from"path";import{configManager as ci}from"@xiaozhi-client/config";function mg(n){let e=n.replace(/\\/g,"/");return!!(e.startsWith("./")||e.startsWith("../")||Wl(n))}function gg(n){try{let e=n.replace(/\\/g,"/"),t;if(Wl(e))t=e;else{let s=ci.getConfigPath(),o=ai(s);t=Es(o,e)}if(!$t(t))return null;let r=Bl(t,"utf-8").trim();return r||null}catch{return null}}function ql(n){return!n||n.trim()===""?jl:mg(n)?gg(n)||jl:n}function Gl(){try{let n=ci.getConfigPath(),e=ai(n),t=Es(e,"prompts");return $t(t)?pg(t).filter(o=>o.endsWith(".md")).map(o=>({fileName:o,relativePath:`./prompts/${o}`})):[]}catch{return[]}}function ui(n){let e=n.replace(/\\/g,"/");if(!e.startsWith("./prompts/"))return{valid:!1,error:"\u8DEF\u5F84\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5 ./prompts/ \u5F00\u5934"};if(e.includes(".."))return{valid:!1,error:"\u8DEF\u5F84\u4E0D\u80FD\u5305\u542B .."};let t=e.replace("./prompts/","");return Xl.test(t)?{valid:!0}:{valid:!1,error:"\u6587\u4EF6\u540D\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u4E2D\u5212\u7EBF\u3001\u4E2D\u6587\uFF0C\u4E14\u5FC5\u987B\u4EE5 .md \u7ED3\u5C3E"}}function hg(n){return Xl.test(n)?{valid:!0}:{valid:!1,error:"\u6587\u4EF6\u540D\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u4E2D\u5212\u7EBF\u3001\u4E2D\u6587\uFF0C\u4E14\u5FC5\u987B\u4EE5 .md \u7ED3\u5C3E"}}function Jl(){let n=ci.getConfigPath(),e=ai(n);return Es(e,"prompts")}function pi(n){let e=Jl(),t=n.replace("./prompts/","");return Es(e,t)}function Kl(n){let e=ui(n);if(!e.valid)throw new Error(e.error);let t=pi(n);if(!$t(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);if(fg(t).size>li)throw new Error("\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let s=Bl(t,"utf-8");return{fileName:n.replace("./prompts/",""),relativePath:n,content:s}}function Yl(n,e){let t=ui(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>li)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let r=pi(n);if(!$t(r))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);return zl(r,e,"utf-8"),{fileName:n.replace("./prompts/",""),relativePath:n,content:e}}function Ql(n,e){let t=hg(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>li)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let s=Jl();$t(s)||ug(s,{recursive:!0});let o=Es(s,n),a=`./prompts/${n}`;if($t(o))throw new Error(`\u6587\u4EF6\u5DF2\u5B58\u5728: ${n}`);return zl(o,e,"utf-8"),{fileName:n,relativePath:a,content:e}}function Zl(n){let e=ui(n);if(!e.valid)throw new Error(e.error);let t=pi(n);if(!$t(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);dg(t)}var jl,li,Xl,di=d(()=>{"use strict";jl="\u4F60\u662F\u4E00\u4E2A\u53CB\u597D\u7684\u8BED\u97F3\u52A9\u624B\uFF0C\u8BF7\u7528\u7B80\u6D01\u7684\u4E2D\u6587\u56DE\u7B54\u7528\u6237\u7684\u95EE\u9898\u3002";i(mg,"isPromptPath");i(gg,"resolvePromptFromPath");i(ql,"resolvePrompt");i(Gl,"listPromptFiles");li=100*1024,Xl=/^[\u4e00-\u9fa5a-zA-Z0-9_-]+\.md$/;i(ui,"validatePromptPath");i(hg,"validatePromptFileName");i(Jl,"getPromptsDir");i(pi,"resolvePromptPath");i(Kl,"readPromptFile");i(Yl,"updatePromptFile");i(Ql,"createPromptFile");i(Zl,"deletePromptFile")});var J,ke=d(()=>{"use strict";J=class{static{i(this,"BaseHandler")}handleError(e,t,r,s="OPERATION_FAILED",o="\u64CD\u4F5C\u5931\u8D25",a=500){let c=t instanceof Error?t.message:String(t),l=t instanceof Error&&"code"in t?String(t.code):s;return e.get("logger").error(`${r}\u5931\u8D25:`,t),e.fail(l,c||o,void 0,a)}async parseJsonBody(e,t="\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"){try{return await e.req.json()}catch(r){let s=r instanceof Error?`${t}: ${r.message}`:t;throw new Error(s)}}}});import{configManager as Re}from"@xiaozhi-client/config";var Rn,eu=d(()=>{"use strict";di();ke();Rn=class extends J{static{i(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=e.get("logger");try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=Re.getConfig();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.success(r)}catch(r){return t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r),e.fail("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25",void 0,500)}}async updateConfig(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let t=await e.req.json();if(Re.validateConfig(t),Re.updateConfig(t),t.mcpServerConfig)for(let[r,s]of Object.entries(t.mcpServerConfig))for(let[o,a]of Object.entries(s.tools))Re.setToolEnabled(r,o,a.enable);return e.get("logger").info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t),e.fail("CONFIG_UPDATE_ERROR",t instanceof Error?t.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async getMcpEndpoint(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let t=Re.getMcpEndpoint();return e.get("logger").debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.success({endpoint:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",t),e.fail("MCP_ENDPOINT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25",void 0,500)}}async getMcpEndpoints(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let t=Re.getMcpEndpoints();return e.get("logger").debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.success({endpoints:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",t),e.fail("MCP_ENDPOINTS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25",void 0,500)}}async getMcpServers(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let t=Re.getMcpServers();return e.get("logger").debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.success({servers:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",t),e.fail("MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25",void 0,500)}}async getConnectionConfig(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let t=Re.getConnectionConfig();return e.get("logger").debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.success({connection:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONNECTION_CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25",void 0,500)}}async reloadConfig(e){try{e.get("logger").info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42"),Re.reloadConfig();let t=Re.getConfig();return e.get("logger").info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.success(t,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F")}catch(t){return e.get("logger").error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONFIG_RELOAD_ERROR",t instanceof Error?t.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25",void 0,500)}}async getConfigPath(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let t=Re.getConfigPath();return e.get("logger").debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.success({path:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",t),e.fail("CONFIG_PATH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25",void 0,500)}}async checkConfigExists(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let t=Re.configExists();return e.get("logger").debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.success({exists:t})}catch(t){return e.get("logger").error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t),e.fail("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25",void 0,500)}}async getPromptFiles(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u8BF7\u6C42");let t=Gl();return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u6587\u4EF6`),e.success({prompts:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u5931\u8D25:",t),e.fail("PROMPT_FILES_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u5931\u8D25",void 0,500)}}async getPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=e.req.query("path");if(!t)return e.fail("INVALID_REQUEST","\u7F3A\u5C11 path \u53C2\u6570",void 0,400);let r=Kl(t);return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u6210\u529F: ${t}`),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async updatePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{path:r,content:s}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","path \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(s===void 0||typeof s!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let o=Yl(r,s);return e.get("logger").info(`\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(o,"\u63D0\u793A\u8BCD\u6587\u4EF6\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async createPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{fileName:r,content:s}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","fileName \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(s===void 0||typeof s!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let o=Ql(r,s);return e.get("logger").info(`\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(o,"\u63D0\u793A\u8BCD\u6587\u4EF6\u521B\u5EFA\u6210\u529F")}catch(t){return e.get("logger").error("\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_CREATE_ERROR",t instanceof Error?t.message:"\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}async deletePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=e.req.query("path");return t?(Zl(t),e.get("logger").info(`\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${t}`),e.success(void 0,"\u63D0\u793A\u8BCD\u6587\u4EF6\u5220\u9664\u6210\u529F")):e.fail("INVALID_REQUEST","\u7F3A\u5C11 path \u53C2\u6570",void 0,400)}catch(t){return e.get("logger").error("\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_DELETE_ERROR",t instanceof Error?t.message:"\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}}});var Cs,fi=d(()=>{"use strict";Cs={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 Pn(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Cs[e]||Cs.zh;return new Je.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var mi=d(()=>{"use strict";bn();fi();i(Pn,"createCozeClient")});import Eg from"node-cache";var ct,tu=d(()=>{"use strict";mi();ct=class{static{i(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Pn(this.token),this.cache=new Eg({stdTTL:300})}async getWorkspaces(){try{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}catch(e){let t=e instanceof Error?e.message:String(e);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25: ${t}`)}}async getWorkflows(e){try{let{workspace_id:t,page_num:r=1,page_size:s=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let o=`workflows:${t}:${r}:${s}`,a=this.cache.get(o);if(a)return a;let l=(await this.client.get("/v1/workflows",{workspace_id:t,page_num:r,page_size:s,workflow_mode:"workflow"})).data;return this.cache.set(o,l),l}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25: ${r}`)}}async callWorkflow(e,t){try{return await this.client.workflows.runs.create({workflow_id:e,parameters:t})}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`\u8FD0\u884C\u5DE5\u4F5C\u6D41\u5931\u8D25: ${s}`)}}clearCache(e){if(!e){this.cache.flushAll();return}let r=this.cache.keys().filter(s=>s.startsWith(e));this.cache.del(r)}getCacheStats(){let e=this.cache.getStats(),t=this.cache.keys(),r=e.hits+e.misses,s=r>0?e.hits/r:0;return{size:e.keys,keys:t,hits:e.hits,misses:e.misses,hitRate:s,ksize:e.ksize,vsize:e.vsize}}}});var Je={};ii(Je,{CozeApiService:()=>ct,config:()=>Cs,createCozeClient:()=>Pn});import*as Cy from"@coze/api";var bn=d(()=>{"use strict";fi();ur(Je,Cy);mi();tu()});import{configManager as fr}from"@xiaozhi-client/config";function gi(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 An(){let n=fr.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 ct(n)}var Ss,ru=d(()=>{"use strict";bn();ke();i(gi,"isErrorWithCode");i(An,"getCozeApiService");Ss=class extends J{static{i(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),gi(t)&&t.code==="AUTH_FAILED")return e.fail("AUTH_FAILED","\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E",void 0,401);if(gi(t)&&t.code==="RATE_LIMITED")return e.fail("RATE_LIMITED","\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,429);if(gi(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);let s=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:`${r}\u5931\u8D25`,s,500)}async getWorkspaces(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=An();e.get("logger").info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return e.get("logger").info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.success({workspaces:r})}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868")}}async getWorkflows(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),s=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return e.get("logger").warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id",void 0,400);if(r<1||r>1e3)return e.fail("INVALID_PARAMETER","page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4",void 0,400);if(s<1||s>100)return e.fail("INVALID_PARAMETER","page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4",void 0,400);let o={workspace_id:t,page_num:r,page_size:s},a=An();e.get("logger").info(`\u5F00\u59CB\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868\uFF0C\u9875\u7801: ${r}\uFF0C\u6BCF\u9875: ${s}`);let c=await a.getWorkflows(o);e.get("logger").info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=fr.getCustomMCPTools(),p=c.items.map(m=>{let f=l.find(S=>S.handler.type==="proxy"&&S.handler.platform==="coze"&&S.handler.config.workflow_id===m.workflow_id);return{...m,isAddedAsTool:!!f,toolName:f?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${p.filter(m=>m.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.success({items:p,has_more:c.has_more,page_num:r,page_size:s,total_count:c.items.length},`\u6210\u529F\u83B7\u53D6 ${p.length} \u4E2A\u5DE5\u4F5C\u6D41`)}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868")}}async clearCache(e){try{if(e.get("logger").info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=e.req.query("pattern"),r=An(),s=r.getCacheStats();e.get("logger").info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let o=r.getCacheStats();return e.get("logger").info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${s.size} \u9879\uFF0C\u6E05\u9664\u540E: ${o.size} \u9879`),e.success({cleared:s.size-o.size,remaining:o.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F")}catch(t){e.get("logger").error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25",r,500)}}async getCacheStats(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let r=An().getCacheStats();return e.success(r)}catch(t){e.get("logger").error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",r,500)}}}});var hi,Ei=d(()=>{"use strict";hi={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var ne,Ie,lt,mr,Dt,su=d(()=>{"use strict";ne={APPLICATION_JSON:"application/json",TEXT_HTML:"text/html",TEXT_PLAIN:"text/plain",TEXT_CSS:"text/css",APPLICATION_JAVASCRIPT:"application/javascript",APPLICATION_XML:"application/xml",APPLICATION_PDF:"application/pdf",APPLICATION_ZIP:"application/zip",APPLICATION_OCTET_STREAM:"application/octet-stream"},Ie={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},lt={OK:200,CREATED:201,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,REQUEST_TIMEOUT:408,INTERNAL_SERVER_ERROR:500,SERVICE_UNAVAILABLE:503},mr={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},Dt={REQUEST_TOO_LARGE:"Request too large",MESSAGE_TOO_LARGE:"Message too large",INVALID_REQUEST:"Invalid Request",INVALID_CONTENT_TYPE:"Content-Type must be application/json",PARSE_ERROR:"Parse error",INVALID_JSON:"Invalid JSON",INTERNAL_ERROR:"Internal error"}});var ut,vs,Ci,pt,Si,nu=d(()=>{"use strict";ut={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},vs=[ut.V2024_11_05,ut.V2025_06_18],Ci={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},pt={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"},Si={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"}});var wn,ou=d(()=>{"use strict";wn={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"}});var iu,au,vi,yi,In=d(()=>{"use strict";iu={TTL:3e5,CLEANUP_INTERVAL:6e4},au={DEFAULT:3e4,LONG_RUNNING:6e4},vi={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3},yi={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3}});var cu,Ti,lu,uu=d(()=>{"use strict";cu={DEFAULT:1024*1024,MAX:10*1024*1024},Ti={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},lu={SERVICE_TOOL_SEPARATOR:"__"}});function pu(){let n=new Set;for(let e of _i)n.add(e.scene);return Array.from(n)}var _i,Ri=d(()=>{"use strict";_i=[{name:"Vivi 2.0",voiceType:"zh_female_vv_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587\u3001\u65E5\u6587\u3001\u5370\u5C3C\u3001\u58A8\u897F\u54E5\u897F\u73ED\u7259\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C0F\u4F55 2.0",voiceType:"zh_female_xiaohe_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u4E91\u821F 2.0",voiceType:"zh_male_m191_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C0F\u5929 2.0",voiceType:"zh_male_taocheng_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5218\u98DE 2.0",voiceType:"zh_male_liufei_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9B45\u529B\u82CF\u83F2 2.0",voiceType:"zh_male_sophie_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6E05\u65B0\u5973\u58F0 2.0",voiceType:"zh_female_qingxinnvsheng_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u751C\u7F8E\u5C0F\u6E90 2.0",voiceType:"zh_female_tianmeixiaoyuan_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u751C\u7F8E\u6843\u5B50 2.0",voiceType:"zh_female_tianmeitaozi_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u723D\u5FEB\u601D\u601D 2.0",voiceType:"zh_female_shuangkuaisisi_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u90BB\u5BB6\u5973\u5B69 2.0",voiceType:"zh_female_linjianvhai_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C11\u5E74\u6893\u8F9B/Brayan 2.0",voiceType:"zh_male_shaonianzixin_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9B45\u529B\u5973\u53CB 2.0",voiceType:"zh_female_meilinvyou_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u77E5\u6027\u707F\u707F 2.0",voiceType:"zh_female_cancan_uranus_bigtts",scene:"\u89D2\u8272\u626E\u6F14",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6492\u5A07\u5B66\u59B9 2.0",voiceType:"zh_female_sajiaoxuemei_uranus_bigtts",scene:"\u89D2\u8272\u626E\u6F14",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u4F69\u5947\u732A 2.0",voiceType:"zh_female_peiqi_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u7334\u54E5 2.0",voiceType:"zh_male_sunwukong_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5927\u58F9 2.0",voiceType:"zh_male_dayi_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9ED1\u732B\u4FA6\u63A2\u793E\u54AA\u4ED4 2.0",voiceType:"zh_female_mizai_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9E21\u6C64\u5973 2.0",voiceType:"zh_female_jitangnv_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6D41\u7545\u5973\u58F0 2.0",voiceType:"zh_female_liuchangnv_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5112\u96C5\u9038\u8FB0 2.0",voiceType:"zh_male_ruyayichen_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Tina\u8001\u5E08 2.0",voiceType:"zh_female_yingyujiaoxue_uranus_bigtts",scene:"\u6559\u80B2\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6696\u9633\u5973\u58F0 2.0",voiceType:"zh_female_kefunvsheng_uranus_bigtts",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u8F7B\u76C8\u6735\u6735 2.0",voiceType:"saturn_zh_female_qingyingduoduo_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u6E29\u5A49\u73CA\u73CA 2.0",voiceType:"saturn_zh_female_wenwanshanshan_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u70ED\u60C5\u827E\u5A1C 2.0",voiceType:"saturn_zh_female_reqingaina_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u513F\u7AE5\u7ED8\u672C 2.0",voiceType:"zh_female_xiaoxue_uranus_bigtts",scene:"\u6709\u58F0\u9605\u8BFB",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Tim",voiceType:"en_male_tim_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Dacey",voiceType:"en_female_dacey_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Stokie",voiceType:"en_female_stokie_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"}];i(pu,"getVoiceScenes")});var dt=d(()=>{"use strict";Ei();su();nu();ou();In();uu();Ri()});function Fe(n,e,t,r){try{let s={type:"error",error:{code:e,message:t,timestamp:Date.now()}};n.send(JSON.stringify(s))}catch(s){r.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",s)}}var Pi=d(()=>{"use strict";i(Fe,"sendWebSocketError")});import{configManager as Cg}from"@xiaozhi-client/config";var Mn,du=d(()=>{"use strict";D();dt();Pi();Mn=class{static{i(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=u,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 s={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(s,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(s){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,s),Fe(e,"CLIENT_STATUS_ERROR",s instanceof Error?s.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25",this.logger)}}async sendLatestConfig(e,t){try{let s={type:"configUpdate",data:Cg.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(s)),this.logger.debug(`\u6700\u65B0\u914D\u7F6E\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u6700\u65B0\u914D\u7F6E\u5931\u8D25: ${t}`,r)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>vi.TIMEOUT_THRESHOLD&&(this.logger.debug("\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()},vi.MONITOR_INTERVAL)}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.debug("\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.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.debug(`\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{EventEmitter as Sg}from"events";function k(){return gr||(gr=new bi),gr}function fu(){gr&&(gr.destroy(),gr=null)}var bi,gr,Ce=d(()=>{"use strict";D();bi=class extends Sg{static{i(this,"EventBus")}logger;eventStats=new Map;maxListeners;constructor(){super(),this.logger=u;let e=process.env.NODE_ENV==="test"||process.env.VITEST==="true";this.maxListeners=e?200:50,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=i(s=>{try{t(s)}catch(o){throw this.emit("error",o),o}finally{this.offEvent(e,r)}},"onceListener");return this.on(e,r)}offEvent(e,t){return this.logger.debug(`\u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.off(e,t)}updateEventStats(e){let t=this.eventStats.get(e)||{count:0,lastEmitted:new Date};t.count++,t.lastEmitted=new Date,this.eventStats.set(e,t)}getEventStats(){let e={};for(let[t,r]of this.eventStats)e[t]={...r};return e}getListenerStats(){let e={};for(let t of this.eventNames())e[t]=this.listenerCount(t);return e}clearEventStats(){this.eventStats.clear(),this.logger.info("\u4E8B\u4EF6\u7EDF\u8BA1\u5DF2\u6E05\u7406")}getStatus(){return{totalEvents:this.eventStats.size,totalListeners:Object.values(this.getListenerStats()).reduce((e,t)=>e+t,0),eventStats:this.getEventStats(),listenerStats:this.getListenerStats()}}destroy(){this.removeAllListeners(),this.eventStats.clear(),this.logger.info("EventBus \u5DF2\u9500\u6BC1")}},gr=null;i(k,"getEventBus");i(fu,"destroyEventBus")});var ys,Ai=d(()=>{"use strict";D();Ce();ys=class{static{i(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=u,this.endpointManager=e,this.configManager=t,this.eventBus=k()}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(o){return this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",o),{ok:!1,response:e.fail(t,"JSON\u89E3\u6790\u5931\u8D25",o instanceof Error?o.message:void 0,500)}}let s=r.endpoint;return!s||typeof s!="string"?{ok:!1,response:e.fail("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",void 0,500)}:{ok:!0,endpoint:s}}validateEndpoint(e){let t=[];if(!e||typeof e!="string")return t.push("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:t};try{new URL(e)}catch{t.push("\u7AEF\u70B9 URL \u683C\u5F0F\u65E0\u6548")}return{isValid:t.length===0,errors:t}}async getEndpointStatus(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_STATUS_READ_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.debug(`\u5904\u7406\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u8BF7\u6C42: ${r}`);try{let o=this.endpointManager.getConnectionStatus().find(a=>a.endpoint===r);return o?(this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.success(o)):e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500)}catch(s){return this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",s),e.fail("ENDPOINT_STATUS_READ_ERROR",s instanceof Error?s.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",void 0,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{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",void 0,500);await this.endpointManager.connect(r);let a=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);return a?(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}`),e.success(a)):e.fail("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",void 0,500)}catch(s){return this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",s),e.fail("ENDPOINT_CONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",void 0,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{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);await this.endpointManager.disconnect(r);let a=this.endpointManager.getConnectionStatus().find(l=>l.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 c={endpoint:r,connected:!1,initialized:!0};return e.success(a||c)}catch(s){return this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",s),e.fail("ENDPOINT_DISCONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",void 0,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u6DFB\u52A0\u8BF7\u6C42: ${r}`);try{let s=this.validateEndpoint(r);if(!s.isValid)return e.fail("INVALID_ENDPOINT_FORMAT",s.errors.join(", "),void 0,500);if(this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_ALREADY_EXISTS","\u7AEF\u70B9\u5DF2\u5B58\u5728",void 0,500);this.endpointManager.addEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`);let a=this.endpointManager.getEndpoint(r);if(!a)return e.fail("ENDPOINT_NOT_FOUND_AFTER_ADD","\u7AEF\u70B9\u6DFB\u52A0\u540E\u672A\u627E\u5230",void 0,500);try{await this.endpointManager.connect(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u8FDE\u63A5: ${r}`)}catch(m){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,m)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(m){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,m);try{await a.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(f){this.logger.warn(`\u56DE\u6EDA\u65F6\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u5C06\u7EE7\u7EED\u4ECE\u7BA1\u7406\u5668\u79FB\u9664\u7AEF\u70B9: ${r}`,f)}throw await this.endpointManager.removeEndpoint(a),m}let l=this.endpointManager.getConnectionStatus().find(m=>m.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:l?.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 p={endpoint:r,connected:!1,initialized:!0};return e.success(l||p,"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F")}catch(s){return this.logger.error("\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25:",s),e.fail("ENDPOINT_ADD_ERROR",s instanceof Error?s.message:"\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}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.getEndpoint(r);if(!s)return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);let o=s.isConnected();try{this.configManager.removeMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u4E2D\u79FB\u9664: ${r}`)}catch(a){throw this.logger.error(`\u4ECE\u914D\u7F6E\u6587\u4EF6\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r}`,a),a}return await this.endpointManager.removeEndpoint(s),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u7BA1\u7406\u5668\u4E2D\u79FB\u9664: ${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}`),e.success({endpoint:r,operation:"removed",wasConnected:o},"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F")}catch(s){return this.logger.error("\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25:",s),e.fail("ENDPOINT_REMOVE_ERROR",s instanceof Error?s.message:"\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}}});function vg(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function xn(n){return vg(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var ft,hr=d(()=>{"use strict";i(vg,"isValidToolJSONSchema");i(xn,"ensureToolJSONSchema");ft=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{i(this,"ToolCallError")}}});import{createHash as yg}from"crypto";function He(n,e){let t=yg("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function wi(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Ts(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>_s.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}var _s,Ii=d(()=>{"use strict";i(He,"generateCacheKey");i(wi,"isCacheExpired");i(Ts,"shouldCleanupCache");_s={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function mu(n,e){return{content:[{type:"text",text:e?Tg(e,n):gu(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 Tg(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 oa=Object.create;var st=Object.defineProperty;var na=Object.getOwnPropertyDescriptor;var sa=Object.getOwnPropertyNames;var ia=Object.getPrototypeOf,aa=Object.prototype.hasOwnProperty;var a=(n,e)=>st(n,"name",{value:e,configurable:!0});var m=(n,e)=>()=>(n&&(e=n(n=0)),e);var T=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Zt=(n,e)=>{for(var t in e)st(n,t,{get:e[t],enumerable:!0})},Qt=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of sa(e))!aa.call(n,o)&&o!==t&&st(n,o,{get:()=>e[o],enumerable:!(r=na(e,o))||r.enumerable});return n},fe=(n,e,t)=>(Qt(n,e,"default"),t&&Qt(t,e,"default")),ca=(n,e,t)=>(t=n!=null?oa(ia(n)):{},Qt(e||!n||!n.__esModule?st(t,"default",{value:n,enumerable:!0}):t,n));var Po={};Zt(Po,{Logger:()=>_e,createLogger:()=>pa,getGlobalLogLevel:()=>fa,getLogger:()=>Mo,logger:()=>g,setGlobalLogLevel:()=>ma,setGlobalLogger:()=>da});import*as w from"fs";import*as V from"path";import Ae from"chalk";import he from"pino";import{z as la}from"zod";function ua(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 pa(n){return new _e(n||it)}function Mo(){return Ce||(Ce=new _e(it)),Ce}function da(n){Ce=n}function ma(n){it=n,Ce&&Ce.setLevel(n)}function fa(){return it}var ga,_e,Ce,it,g,I=m(()=>{"use strict";ga=la.enum(["fatal","error","warn","info","debug","trace"]);a(ua,"formatDateTime");_e=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=ga.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:he.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:he.destination({dest:"/dev/null"})}),he({level:this.logLevel,timestamp:he.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((t,r)=>({level:r}),"level")},base:null,serializers:{err:he.stdSerializers?.err||(t=>t)}},he.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Ae.gray}],[30,{name:"INFO",color:Ae.blue}],[40,{name:"WARN",color:Ae.yellow}],[50,{name:"ERROR",color:Ae.red}],[60,{name:"FATAL",color:Ae.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=ua(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=V.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded();try{w.existsSync(this.logFilePath)||w.writeFileSync(this.logFilePath,"")}catch{this.logFilePath=null}this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){this.logInfo(e,...t)}logInfo(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){this.logInfo(e,...t)}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){this.logInfo(e,...t)}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||!w.existsSync(this.logFilePath)))try{w.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=V.dirname(this.logFilePath),t=V.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let s=V.join(e,`${t}.${o}.log`),i=V.join(e,`${t}.${o+1}.log`);w.existsSync(s)&&(o===this.maxLogFiles-1?w.unlinkSync(s):w.renameSync(s,i))}let r=V.join(e,`${t}.1.log`);w.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=V.dirname(this.logFilePath),t=V.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=V.join(e,`${t}.${r}.log`);w.existsSync(o)&&w.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}},Ce=null,it="info";a(pa,"createLogger");a(Mo,"getLogger");a(da,"setGlobalLogger");a(ma,"setGlobalLogLevel");a(fa,"getGlobalLogLevel");g=Mo()});import{existsSync as Ee,mkdirSync as ha,readFileSync as Ca,readdirSync as Ea,rmSync as va,statSync as Ta,writeFileSync as yo}from"fs";import{dirname as Io,isAbsolute as Mu,resolve as at}from"path";import{configManager as Ao}from"@xiaozhi-client/config";function _o(){try{let n=Ao.getConfigPath(),e=Io(n),t=at(e,"prompts");return Ee(t)?Ea(t).filter(s=>s.endsWith(".md")).map(s=>({fileName:s,relativePath:`./prompts/${s}`})):[]}catch{return[]}}function tr(n){let e=n.replace(/\\/g,"/");if(!e.startsWith("./prompts/"))return{valid:!1,error:"\u8DEF\u5F84\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5 ./prompts/ \u5F00\u5934"};if(e.includes(".."))return{valid:!1,error:"\u8DEF\u5F84\u4E0D\u80FD\u5305\u542B .."};let t=e.replace("./prompts/","");return Oo.test(t)?{valid:!0}:{valid:!1,error:"\u6587\u4EF6\u540D\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u4E2D\u5212\u7EBF\u3001\u4E2D\u6587\uFF0C\u4E14\u5FC5\u987B\u4EE5 .md \u7ED3\u5C3E"}}function Sa(n){return Oo.test(n)?{valid:!0}:{valid:!1,error:"\u6587\u4EF6\u540D\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u4E2D\u5212\u7EBF\u3001\u4E2D\u6587\uFF0C\u4E14\u5FC5\u987B\u4EE5 .md \u7ED3\u5C3E"}}function No(){let n=Ao.getConfigPath(),e=Io(n);return at(e,"prompts")}function rr(n){let e=No(),t=n.replace("./prompts/","");return at(e,t)}function bo(n){let e=tr(n);if(!e.valid)throw new Error(e.error);let t=rr(n);if(!Ee(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);if(Ta(t).size>er)throw new Error("\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let o=Ca(t,"utf-8");return{fileName:n.replace("./prompts/",""),relativePath:n,content:o}}function wo(n,e){let t=tr(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>er)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let r=rr(n);if(!Ee(r))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);return yo(r,e,"utf-8"),{fileName:n.replace("./prompts/",""),relativePath:n,content:e}}function Lo(n,e){let t=Sa(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>er)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let o=No();Ee(o)||ha(o,{recursive:!0});let s=at(o,n),i=`./prompts/${n}`;if(Ee(s))throw new Error(`\u6587\u4EF6\u5DF2\u5B58\u5728: ${n}`);return yo(s,e,"utf-8"),{fileName:n,relativePath:i,content:e}}function xo(n){let e=tr(n);if(!e.valid)throw new Error(e.error);let t=rr(n);if(!Ee(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);va(t)}var er,Oo,Do=m(()=>{"use strict";a(_o,"listPromptFiles");er=100*1024,Oo=/^[\u4e00-\u9fa5a-zA-Z0-9_-]+\.md$/;a(tr,"validatePromptPath");a(Sa,"validatePromptFileName");a(No,"getPromptsDir");a(rr,"resolvePromptPath");a(bo,"readPromptFile");a(wo,"updatePromptFile");a(Lo,"createPromptFile");a(xo,"deletePromptFile")});var A,B=m(()=>{"use strict";A=class{static{a(this,"BaseHandler")}handleError(e,t,r,o="OPERATION_FAILED",s="\u64CD\u4F5C\u5931\u8D25",i=500){let c=t instanceof Error?t.message:String(t),l=t instanceof Error&&"code"in t?String(t.code):o;return e.get("logger").error(`${r}\u5931\u8D25:`,t),e.fail(l,c||s,void 0,i)}async parseJsonBody(e,t="\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"){try{return await e.req.json()}catch(r){let o=r instanceof Error?`${t}: ${r.message}`:t;throw new Error(o)}}}});import{configManager as U}from"@xiaozhi-client/config";var ct,$o=m(()=>{"use strict";Do();B();ct=class extends A{static{a(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=e.get("logger");try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=U.getConfig();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.success(r)}catch(r){return t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r),e.fail("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25",void 0,500)}}async updateConfig(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let t=await e.req.json();if(U.validateConfig(t),U.updateConfig(t),t.mcpServerConfig)for(let[r,o]of Object.entries(t.mcpServerConfig))for(let[s,i]of Object.entries(o.tools))U.setToolEnabled(r,s,i.enable);return e.get("logger").info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t),e.fail("CONFIG_UPDATE_ERROR",t instanceof Error?t.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async getMcpEndpoint(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let t=U.getMcpEndpoint();return e.get("logger").debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.success({endpoint:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",t),e.fail("MCP_ENDPOINT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25",void 0,500)}}async getMcpEndpoints(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let t=U.getMcpEndpoints();return e.get("logger").debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.success({endpoints:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",t),e.fail("MCP_ENDPOINTS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25",void 0,500)}}async getMcpServers(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let t=U.getMcpServers();return e.get("logger").debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.success({servers:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",t),e.fail("MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25",void 0,500)}}async getConnectionConfig(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let t=U.getConnectionConfig();return e.get("logger").debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.success({connection:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONNECTION_CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25",void 0,500)}}async reloadConfig(e){try{e.get("logger").info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42"),U.reloadConfig();let t=U.getConfig();return e.get("logger").info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.success(t,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F")}catch(t){return e.get("logger").error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONFIG_RELOAD_ERROR",t instanceof Error?t.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25",void 0,500)}}async getConfigPath(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let t=U.getConfigPath();return e.get("logger").debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.success({path:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",t),e.fail("CONFIG_PATH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25",void 0,500)}}async checkConfigExists(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let t=U.configExists();return e.get("logger").debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.success({exists:t})}catch(t){return e.get("logger").error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t),e.fail("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25",void 0,500)}}async getPromptFiles(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u8BF7\u6C42");let t=_o();return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u6587\u4EF6`),e.success({prompts:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u5931\u8D25:",t),e.fail("PROMPT_FILES_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u5931\u8D25",void 0,500)}}async getPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=e.req.query("path");if(!t)return e.fail("INVALID_REQUEST","\u7F3A\u5C11 path \u53C2\u6570",void 0,400);let r=bo(t);return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u6210\u529F: ${t}`),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async updatePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{path:r,content:o}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","path \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(o===void 0||typeof o!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let s=wo(r,o);return e.get("logger").info(`\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(s,"\u63D0\u793A\u8BCD\u6587\u4EF6\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async createPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{fileName:r,content:o}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","fileName \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(o===void 0||typeof o!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let s=Lo(r,o);return e.get("logger").info(`\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(s,"\u63D0\u793A\u8BCD\u6587\u4EF6\u521B\u5EFA\u6210\u529F")}catch(t){return e.get("logger").error("\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_CREATE_ERROR",t instanceof Error?t.message:"\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}async deletePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=e.req.query("path");return t?(xo(t),e.get("logger").info(`\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${t}`),e.success(void 0,"\u63D0\u793A\u8BCD\u6587\u4EF6\u5220\u9664\u6210\u529F")):e.fail("INVALID_REQUEST","\u7F3A\u5C11 path \u53C2\u6570",void 0,400)}catch(t){return e.get("logger").error("\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_DELETE_ERROR",t instanceof Error?t.message:"\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}}});var Oe,or=m(()=>{"use strict";Oe={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 lt(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Oe[e]||Oe.zh;return new K.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var nr=m(()=>{"use strict";gt();or();a(lt,"createCozeClient")});import Ra from"node-cache";var Z,ko=m(()=>{"use strict";nr();Z=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=lt(this.token),this.cache=new Ra({stdTTL:300})}async getWorkspaces(){try{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}catch(e){let t=e instanceof Error?e.message:String(e);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25: ${t}`)}}async getWorkflows(e){try{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}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25: ${r}`)}}async callWorkflow(e,t){try{return await this.client.workflows.runs.create({workflow_id:e,parameters:t})}catch(r){let o=r instanceof Error?r.message:String(r);throw new Error(`\u8FD0\u884C\u5DE5\u4F5C\u6D41\u5931\u8D25: ${o}`)}}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 K={};Zt(K,{CozeApiService:()=>Z,config:()=>Oe,createCozeClient:()=>lt});import*as Wu from"@coze/api";var gt=m(()=>{"use strict";or();fe(K,Wu);nr();ko()});import{configManager as ve}from"@xiaozhi-client/config";function sr(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 ut(){let n=ve.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 Z(n)}var Ne,Ho=m(()=>{"use strict";gt();B();a(sr,"isErrorWithCode");a(ut,"getCozeApiService");Ne=class extends A{static{a(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),sr(t)&&t.code==="AUTH_FAILED")return e.fail("AUTH_FAILED","\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E",void 0,401);if(sr(t)&&t.code==="RATE_LIMITED")return e.fail("RATE_LIMITED","\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,429);if(sr(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);let o=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:`${r}\u5931\u8D25`,o,500)}async getWorkspaces(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!ve.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=ut();e.get("logger").info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return e.get("logger").info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.success({workspaces:r})}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868")}}async getWorkflows(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!ve.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,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 e.get("logger").warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id",void 0,400);if(r<1||r>1e3)return e.fail("INVALID_PARAMETER","page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4",void 0,400);if(o<1||o>100)return e.fail("INVALID_PARAMETER","page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4",void 0,400);let s={workspace_id:t,page_num:r,page_size:o},i=ut();e.get("logger").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);e.get("logger").info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=ve.getCustomMCPTools(),u=c.items.map(p=>{let d=l.find(v=>v.handler.type==="proxy"&&v.handler.platform==="coze"&&v.handler.config.workflow_id===p.workflow_id);return{...p,isAddedAsTool:!!d,toolName:d?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${u.filter(p=>p.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.success({items:u,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length},`\u6210\u529F\u83B7\u53D6 ${u.length} \u4E2A\u5DE5\u4F5C\u6D41`)}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868")}}async clearCache(e){try{if(e.get("logger").info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!ve.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=e.req.query("pattern"),r=ut(),o=r.getCacheStats();e.get("logger").info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let s=r.getCacheStats();return e.get("logger").info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${s.size} \u9879`),e.success({cleared:o.size-s.size,remaining:s.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F")}catch(t){e.get("logger").error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25",r,500)}}async getCacheStats(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!ve.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let r=ut().getCacheStats();return e.success(r)}catch(t){e.get("logger").error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",r,500)}}}});var ir,ar=m(()=>{"use strict";ir={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var _,W,ee,Te,ue,Fo=m(()=>{"use strict";_={APPLICATION_JSON:"application/json",TEXT_HTML:"text/html",TEXT_PLAIN:"text/plain",TEXT_CSS:"text/css",APPLICATION_JAVASCRIPT:"application/javascript",APPLICATION_XML:"application/xml",APPLICATION_PDF:"application/pdf",APPLICATION_ZIP:"application/zip",APPLICATION_OCTET_STREAM:"application/octet-stream"},W={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},ee={OK:200,CREATED:201,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,REQUEST_TIMEOUT:408,INTERNAL_SERVER_ERROR:500,SERVICE_UNAVAILABLE:503},Te={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},ue={REQUEST_TOO_LARGE:"Request too large",MESSAGE_TOO_LARGE:"Message too large",INVALID_REQUEST:"Invalid Request",INVALID_CONTENT_TYPE:"Content-Type must be application/json",PARSE_ERROR:"Parse error",INVALID_JSON:"Invalid JSON",INTERNAL_ERROR:"Internal error"}});var te,be,cr,re,lr,Vo=m(()=>{"use strict";te={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},be=[te.V2024_11_05,te.V2025_06_18],cr={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},re={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"},lr={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"}});var pt,Uo=m(()=>{"use strict";pt={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"}});var zo,jo,gr,ur,dt=m(()=>{"use strict";zo={TTL:3e5,CLEANUP_INTERVAL:6e4},jo={DEFAULT:3e4,LONG_RUNNING:6e4},gr={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3},ur={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3}});var Wo,pr,Go,qo=m(()=>{"use strict";Wo={DEFAULT:1024*1024,MAX:10*1024*1024},pr={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},Go={SERVICE_TOOL_SEPARATOR:"__"}});function Bo(){let n=new Set;for(let e of dr)n.add(e.scene);return Array.from(n)}var dr,mr=m(()=>{"use strict";dr=[{name:"Vivi 2.0",voiceType:"zh_female_vv_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587\u3001\u65E5\u6587\u3001\u5370\u5C3C\u3001\u58A8\u897F\u54E5\u897F\u73ED\u7259\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C0F\u4F55 2.0",voiceType:"zh_female_xiaohe_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u4E91\u821F 2.0",voiceType:"zh_male_m191_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C0F\u5929 2.0",voiceType:"zh_male_taocheng_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5218\u98DE 2.0",voiceType:"zh_male_liufei_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9B45\u529B\u82CF\u83F2 2.0",voiceType:"zh_male_sophie_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6E05\u65B0\u5973\u58F0 2.0",voiceType:"zh_female_qingxinnvsheng_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u751C\u7F8E\u5C0F\u6E90 2.0",voiceType:"zh_female_tianmeixiaoyuan_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u751C\u7F8E\u6843\u5B50 2.0",voiceType:"zh_female_tianmeitaozi_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u723D\u5FEB\u601D\u601D 2.0",voiceType:"zh_female_shuangkuaisisi_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u90BB\u5BB6\u5973\u5B69 2.0",voiceType:"zh_female_linjianvhai_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C11\u5E74\u6893\u8F9B/Brayan 2.0",voiceType:"zh_male_shaonianzixin_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9B45\u529B\u5973\u53CB 2.0",voiceType:"zh_female_meilinvyou_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u77E5\u6027\u707F\u707F 2.0",voiceType:"zh_female_cancan_uranus_bigtts",scene:"\u89D2\u8272\u626E\u6F14",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6492\u5A07\u5B66\u59B9 2.0",voiceType:"zh_female_sajiaoxuemei_uranus_bigtts",scene:"\u89D2\u8272\u626E\u6F14",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u4F69\u5947\u732A 2.0",voiceType:"zh_female_peiqi_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u7334\u54E5 2.0",voiceType:"zh_male_sunwukong_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5927\u58F9 2.0",voiceType:"zh_male_dayi_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9ED1\u732B\u4FA6\u63A2\u793E\u54AA\u4ED4 2.0",voiceType:"zh_female_mizai_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9E21\u6C64\u5973 2.0",voiceType:"zh_female_jitangnv_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6D41\u7545\u5973\u58F0 2.0",voiceType:"zh_female_liuchangnv_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5112\u96C5\u9038\u8FB0 2.0",voiceType:"zh_male_ruyayichen_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Tina\u8001\u5E08 2.0",voiceType:"zh_female_yingyujiaoxue_uranus_bigtts",scene:"\u6559\u80B2\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6696\u9633\u5973\u58F0 2.0",voiceType:"zh_female_kefunvsheng_uranus_bigtts",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u8F7B\u76C8\u6735\u6735 2.0",voiceType:"saturn_zh_female_qingyingduoduo_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u6E29\u5A49\u73CA\u73CA 2.0",voiceType:"saturn_zh_female_wenwanshanshan_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u70ED\u60C5\u827E\u5A1C 2.0",voiceType:"saturn_zh_female_reqingaina_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u513F\u7AE5\u7ED8\u672C 2.0",voiceType:"zh_female_xiaoxue_uranus_bigtts",scene:"\u6709\u58F0\u9605\u8BFB",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Tim",voiceType:"en_male_tim_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Dacey",voiceType:"en_female_dacey_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Stokie",voiceType:"en_female_stokie_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"}];a(Bo,"getVoiceScenes")});var oe=m(()=>{"use strict";ar();Fo();Vo();Uo();dt();qo();mr()});function X(n,e,t,r){try{let o={type:"error",error:{code:e,message:t,timestamp:Date.now()}};n.send(JSON.stringify(o))}catch(o){r.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}var fr=m(()=>{"use strict";a(X,"sendWebSocketError")});import{configManager as Ma}from"@xiaozhi-client/config";var mt,Xo=m(()=>{"use strict";I();oe();fr();mt=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=g,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),X(e,"CLIENT_STATUS_ERROR",o instanceof Error?o.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25",this.logger)}}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)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>gr.TIMEOUT_THRESHOLD&&(this.logger.debug("\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()},gr.MONITOR_INTERVAL)}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.debug("\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.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.debug(`\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{EventEmitter as Pa}from"events";function M(){return Se||(Se=new hr),Se}function Yo(){Se&&(Se.destroy(),Se=null)}var hr,Se,H=m(()=>{"use strict";I();hr=class extends Pa{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners;constructor(){super(),this.logger=g;let e=process.env.NODE_ENV==="test"||process.env.VITEST==="true";this.maxListeners=e?200:50,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")}},Se=null;a(M,"getEventBus");a(Yo,"destroyEventBus")});var we,Cr=m(()=>{"use strict";I();H();we=class{static{a(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=g,this.endpointManager=e,this.configManager=t,this.eventBus=M()}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(s){return this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",s),{ok:!1,response:e.fail(t,"JSON\u89E3\u6790\u5931\u8D25",s instanceof Error?s.message:void 0,500)}}let o=r.endpoint;return!o||typeof o!="string"?{ok:!1,response:e.fail("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",void 0,500)}:{ok:!0,endpoint:o}}validateEndpoint(e){let t=[];if(!e||typeof e!="string")return t.push("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:t};try{new URL(e)}catch{t.push("\u7AEF\u70B9 URL \u683C\u5F0F\u65E0\u6548")}return{isValid:t.length===0,errors:t}}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);return s?(this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.success(s)):e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500)}catch(o){return this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",o),e.fail("ENDPOINT_STATUS_READ_ERROR",o instanceof Error?o.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",void 0,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{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",void 0,500);await this.endpointManager.connect(r);let i=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);return i?(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}`),e.success(i)):e.fail("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",void 0,500)}catch(o){return this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",o),e.fail("ENDPOINT_CONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",void 0,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{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);await this.endpointManager.disconnect(r);let i=this.endpointManager.getConnectionStatus().find(l=>l.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 c={endpoint:r,connected:!1,initialized:!0};return e.success(i||c)}catch(o){return this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",o),e.fail("ENDPOINT_DISCONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",void 0,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u6DFB\u52A0\u8BF7\u6C42: ${r}`);try{let o=this.validateEndpoint(r);if(!o.isValid)return e.fail("INVALID_ENDPOINT_FORMAT",o.errors.join(", "),void 0,500);if(this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_ALREADY_EXISTS","\u7AEF\u70B9\u5DF2\u5B58\u5728",void 0,500);this.endpointManager.addEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`);let i=this.endpointManager.getEndpoint(r);if(!i)return e.fail("ENDPOINT_NOT_FOUND_AFTER_ADD","\u7AEF\u70B9\u6DFB\u52A0\u540E\u672A\u627E\u5230",void 0,500);try{await this.endpointManager.connect(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u8FDE\u63A5: ${r}`)}catch(p){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,p)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(p){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,p);try{await i.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(d){this.logger.warn(`\u56DE\u6EDA\u65F6\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u5C06\u7EE7\u7EED\u4ECE\u7BA1\u7406\u5668\u79FB\u9664\u7AEF\u70B9: ${r}`,d)}throw await this.endpointManager.removeEndpoint(i),p}let l=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:l?.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 u={endpoint:r,connected:!1,initialized:!0};return e.success(l||u,"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F")}catch(o){return this.logger.error("\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25:",o),e.fail("ENDPOINT_ADD_ERROR",o instanceof Error?o.message:"\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}async removeEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_REMOVE_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u79FB\u9664\u8BF7\u6C42: ${r}`);try{let o=this.endpointManager.getEndpoint(r);if(!o)return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);let s=o.isConnected();try{this.configManager.removeMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u4E2D\u79FB\u9664: ${r}`)}catch(i){throw this.logger.error(`\u4ECE\u914D\u7F6E\u6587\u4EF6\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r}`,i),i}return await this.endpointManager.removeEndpoint(o),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u7BA1\u7406\u5668\u4E2D\u79FB\u9664: ${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}`),e.success({endpoint:r,operation:"removed",wasConnected:s},"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F")}catch(o){return this.logger.error("\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25:",o),e.fail("ENDPOINT_REMOVE_ERROR",o instanceof Error?o.message:"\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}}});function ya(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function ft(n){return ya(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var ne,Re=m(()=>{"use strict";a(ya,"isValidToolJSONSchema");a(ft,"ensureToolJSONSchema");ne=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{a(this,"ToolCallError")}}});import{createHash as Ia}from"crypto";function Y(n,e){let t=Ia("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function Er(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Le(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>xe.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}var xe,vr=m(()=>{"use strict";a(Y,"generateCacheKey");a(Er,"isCacheExpired");a(Le,"shouldCleanupCache");xe={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function Jo(n,e){return{content:[{type:"text",text:e?Aa(e,n):Ko(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 Aa(n,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
4
4
 
5
5
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
6
6
  - \u4EFB\u52A1ID: ${e}
@@ -11,7 +11,7 @@ var Ym=Object.create;var Tn=Object.defineProperty;var Qm=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:gu(e)};return t[n]||t.default}function gu(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
14
+ 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:Ko(e)};return t[n]||t.default}function Ko(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
15
15
 
16
16
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
17
17
  - \u4EFB\u52A1ID: ${n}
@@ -21,11 +21,11 @@ var Ym=Object.create;var Tn=Object.defineProperty;var Qm=Object.getOwnPropertyDe
21
21
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
22
22
  1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
23
23
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
24
- 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var Rs,Mi=d(()=>{"use strict";Rs=class n extends Error{static{i(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};i(mu,"createTimeoutResponse");i(Tg,"getToolSpecificTimeoutMessage");i(gu,"getDefaultTimeoutMessage")});import{configManager as hu}from"@xiaozhi-client/config";function _g(n){return n.type==="proxy"}var Ps,On=d(()=>{"use strict";D();bn();gt();hr();Ce();Ii();Mi();i(_g,"isProxyHandler");Ps=class{static{i(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=_s.TIMEOUT;CACHE_TTL=_s.CACHE_TTL;configUpdateListener=null;constructor(e,t){this.logger=u,this.cacheManager=e||new mt,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=hu.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new ct(e)}setupEventListeners(){let e=k();this.configUpdateListener=async t=>{if(t&&typeof t=="object"&&"type"in t&&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)}}},e.onEvent("config:updated",this.configUpdateListener)}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||hu.getCustomMCPTools();this.tools.clear();for(let r of t)_g(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})`));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:xn(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 s=this.tools.get(e);if(!s)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let o=await this.getCompletedResult(e,t);if(o)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),o;try{let a=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(s,t),this.createTimeoutPromise(e,a)]);return await this.cacheResult(e,t,c),c}catch(a){if(a instanceof Rs){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}`),mu(c,e)}throw a}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new Rs(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(!s.customMCPResults||!s.customMCPResults[r])return null;let o=s.customMCPResults[r];return o.status==="completed"&&!o.consumed&&!wi(o.timestamp,o.ttl)?o.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 s=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:s.workflow_id});try{let o=this.getCozeApiService();if(!s.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let a=await o.callWorkflow(s.workflow_id,t);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`),this.processWorkflowResponse(e.name,a)}catch(o){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,o),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`}],isError:!0}}}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(s.customMCPResults?.[r]){s.customMCPResults[r].consumed=!0;let o=s.customMCPResults[r];Ts(o)&&delete s.customMCPResults[r],await this.saveCache(s),this.logger.debug(`[CustomMCP] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}`)}}catch(r){this.logger.warn(`[CustomMCP] \u6E05\u7406\u7F13\u5B58\u5931\u8D25: ${r}`)}}async generateTaskId(e,t){return He(e,t)}generateCacheKey(e,t){return He(e,t)}async loadExtendedCache(){try{return await this.cacheManager.loadExistingCache()}catch{return{version:"1.0.0",mcpServers:{},metadata:{lastGlobalUpdate:new Date().toISOString(),totalWrites:0,createdAt:new Date().toISOString()},customMCPResults:{}}}}async updateCacheWithResult(e,t){try{let r=await this.loadExtendedCache();r.customMCPResults||(r.customMCPResults={}),r.customMCPResults[e]=t,await this.saveCache(r)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u7F13\u5B58\u5931\u8D25: ${r}`)}}async cacheResult(e,t,r){try{let s=this.generateCacheKey(e,t),o={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(s,o),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(s){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${s}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.configUpdateListener&&(k().offEvent("config:updated",this.configUpdateListener),this.configUpdateListener=null),this.tools.clear(),this.cacheManager.cleanup()}}});import{tmpdir as Rg}from"os";var bs,Eu=d(()=>{"use strict";bs=class{static{i(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||Rg()}}});import*as ht from"fs";import*as kt from"path";import Nn from"pino";var As,Ln,$n=d(()=>{"use strict";D();Eu();As=class{static{i(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=kt.resolve(kt.normalize(e.logFilePath));else{let r=t||bs.getTempDir();this.logFilePath=kt.join(kt.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),u.info("ToolCallLogger \u521D\u59CB\u5316",{maxRecords:this.maxRecords,path:this.logFilePath})}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:i(r=>{try{let s=JSON.parse(r),o=this.formatConsoleMessage(s)}catch{}},"write")}});try{t.push({level:"info",stream:Nn.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){u.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6",{error:r})}return Nn({level:"info",timestamp:Nn.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((r,s)=>({level:s}),"level")},base:null},Nn.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,s=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${s}`}async cleanupOldRecords(){try{if(!ht.existsSync(this.logFilePath))return;let t=ht.readFileSync(this.logFilePath,"utf8").trim().split(`
25
- `).filter(a=>a.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,s=t.slice(r),o=s.join(`
26
- `)+(s.length>0?`
27
- `:"");ht.writeFileSync(this.logFilePath,o,"utf8"),u.info("\u5DF2\u6E05\u7406\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55",{recordsToRemove:r,maxRecords:this.maxRecords})}catch(e){u.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25",{error:e})}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){u.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{error:t})}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},Ln=class{static{i(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||bs.getConfigDir()}getLogFilePath(){return new As({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!ht.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=ht.readFileSync(e,"utf8").trim().split(`
28
- `).filter(o=>o.trim()!==""),s=[];for(let o of r)try{let a=JSON.parse(o);a.time&&(a.timestamp=new Date(a.time).getTime()),a.timestamp||u.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233",{line:o}),s.push(a)}catch{u.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C",{line:o})}return s.sort((o,a)=>(a.timestamp||0)-(o.timestamp||0)),s}catch(t){throw u.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25",{error:t}),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(s=>s.toolName.toLowerCase().includes(t.toolName?.toLowerCase()??""))),t.serverName&&(r=r.filter(s=>s.serverName?.toLowerCase().includes(t.serverName?.toLowerCase()??""))),t.success!==void 0&&(r=r.filter(s=>s.success===t.success)),t.startDate||t.endDate){let s=t.startDate?new Date(t.startDate).getTime():0,o=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(a=>{let c=a.timestamp||0;return c>=s&&c<=o})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),s=r.length,o=Math.min(e.limit||50,1e3),a=e.offset||0,c=r.slice(a,a+o),l=a+o<s;return u.info("\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7",{count:c.length,total:s}),{records:c,total:s,hasMore:l}}}});var Er,xi=d(()=>{"use strict";D();dt();gt();Er=class{static{i(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=u}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case pt.INITIALIZE:return await this.handleInitialize(e.params,e.id);case pt.INITIALIZED:return await this.handleInitializedNotification(e.params);case pt.TOOLS_LIST:return await this.handleToolsList(e.id);case pt.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case pt.RESOURCES_LIST:return await this.handleResourcesList(e.id);case pt.PROMPTS_LIST:return await this.handlePromptsList(e.id);case pt.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=e.protocolVersion,s=vs.includes(r)?r:ut.DEFAULT;return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${r}, \u670D\u52A1\u5668\u54CD\u5E94=${s}`),{jsonrpc:"2.0",result:{serverInfo:{name:Ci.NAME,version:Ci.VERSION},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{let r=this.serviceManager.getAllTools().map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}));return{jsonrpc:"2.0",result:{tools:r},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=Cu(e),s=await this.serviceManager.callTool(r.name,r.arguments||{});return{jsonrpc:"2.0",result:{content:s.content,isError:s.isError||!1},id:t!==void 0?t:1}}catch(r){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,r),r}}async handlePing(e){return this.logger.debug("\u5904\u7406 ping \u8BF7\u6C42"),{jsonrpc:"2.0",result:{status:"ok",timestamp:new Date().toISOString()},id:e!==void 0?e:1}}async handleResourcesList(e){this.logger.debug("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.debug("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u63D0\u793A\u6A21\u677F`),{jsonrpc:"2.0",result:{prompts:t},id:e!==void 0?e:1}}createErrorResponse(e,t){let r=-32603;return e.message.includes("\u672A\u627E\u5230\u5DE5\u5177")||e.message.includes("\u672A\u77E5\u7684\u65B9\u6CD5")?r=-32601:(e.message.includes("\u53C2\u6570")||e.message.includes("\u4E0D\u80FD\u4E3A\u7A7A"))&&(r=-32602),{jsonrpc:"2.0",error:{code:r,message:e.message,data:{stack:e.stack}},id:t!==void 0?t:1}}getServiceManager(){return this.serviceManager}}});import{EventEmitter as Pg}from"events";import{isModelScopeURL as bg}from"@xiaozhi-client/config";import{configManager as Se}from"@xiaozhi-client/config";var ws,Su=d(()=>{"use strict";D();gt();gt();hr();Ce();On();$n();xi();ws=class extends Pg{static{i(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=k();toolCallLogger;retryTimers=new Map;failedServices=new Set;messageHandler;eventListeners;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 mt(r),this.customMCPHandler=new Ps(this.cacheManager,this);let s=Se.getToolCallLogConfig(),o=Se.getConfigDir();this.toolCallLogger=new As(s,o),this.eventListeners={serviceConnected:i(async a=>{await this.handleServiceConnected(a)},"serviceConnected"),serviceDisconnected:i(async a=>{await this.handleServiceDisconnected(a)},"serviceDisconnected"),serviceConnectionFailed:i(async a=>{await this.handleServiceConnectionFailed(a)},"serviceConnectionFailed")},this.setupEventListeners(),this.messageHandler=new Er(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.onEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.onEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}async handleServiceConnected(e){u.debug(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u6210\u529F\uFF0C\u5F00\u59CB\u5237\u65B0\u5DE5\u5177\u7F13\u5B58`);try{this.services.get(e.serviceName)&&(await this.refreshCustomMCPHandlerPublic(),u.info(`\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5237\u65B0\u5B8C\u6210`))}catch(t){u.error(`\u5237\u65B0\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5931\u8D25`,{error:t})}}async handleServiceDisconnected(e){u.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\uFF0C\u539F\u56E0: ${e.reason||"\u672A\u77E5"}`);try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic(),u.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5B8C\u6210`)}catch(t){u.error(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5931\u8D25`,{error:t})}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch(t){u.error("\u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}async startAllServices(){u.debug("[MCPManager] \u6B63\u5728\u542F\u52A8\u6240\u6709 MCP \u670D\u52A1...");try{this.customMCPHandler.initialize(),u.debug("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(c){u.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25",{error:c})}let e=Object.entries(this.configs);if(e.length===0){u.warn("[MCPManager] \u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\uFF0C\u8BF7\u4F7F\u7528 addServiceConfig() \u6DFB\u52A0\u670D\u52A1\u914D\u7F6E");return}u.info(`[MCPManager] \u5F00\u59CB\u5E76\u884C\u542F\u52A8 ${e.length} \u4E2A MCP \u670D\u52A1`);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),s=0,o=0,a=[];for(let c of r)c.status==="fulfilled"?c.value.success?s++:(o++,a.push(c.value.serviceName)):o++;u.info(`[MCPManager] \u670D\u52A1\u542F\u52A8\u5B8C\u6210 - \u6210\u529F: ${s}, \u5931\u8D25: ${o}`),a.length>0&&(u.warn(`[MCPManager] \u4EE5\u4E0B\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${a.join(", ")}`),o===e.length&&u.warn("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25\uFF0C\u4F46\u7CFB\u7EDF\u5C06\u7EE7\u7EED\u8FD0\u884C\u4EE5\u4FBF\u91CD\u8BD5")),a.length>0&&this.scheduleFailedServicesRetry(a)}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={name:e,...t},s=new Dn(r);await s.connect(),this.services.set(e,s),await this.refreshToolsCache();let o=s.getTools();u.debug(`[MCPManager] ${e} \u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u52A0\u8F7D\u4E86 ${o.length} \u4E2A\u5DE5\u5177:`,o.map(a=>a.name).join(", "))}catch(r){throw u.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),this.services.delete(e),r}}async stopService(e){u.info(`[MCPManager] \u505C\u6B62 MCP \u670D\u52A1: ${e}`);let t=this.services.get(e);if(!t){u.warn(`[MCPManager] \u670D\u52A1 ${e} \u4E0D\u5B58\u5728\u6216\u672A\u542F\u52A8`);return}try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache(),u.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){throw u.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),s=this.configs[e];s&&this.cacheManager.writeCacheEntry(e,r,s).then(()=>{u.debug(`[MCPManager] \u5DF2\u5C06 ${e} \u5DE5\u5177\u5217\u8868\u5199\u5165\u7F13\u5B58`)}).catch(o=>{u.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)});for(let o of r){let a=`${e}__${o.name}`;this.tools.set(a,{serviceName:e,originalName:o.name,tool:o})}}await this.syncToolsConfigToFile()}getAllTools(e="all"){let t=[];for(let[s,o]of this.services)try{if(o.isConnected()){let a=o.getTools();for(let c of a)try{let l=Se.isToolEnabled(s,c.name),p=Se.getMcpServerConfig()[s].tools[c.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let m=`${s}__${c.name}`;t.push({name:m,description:c.description||"",inputSchema:c.inputSchema,serviceName:s,originalName:c.name,enabled:l,usageCount:p.usageCount??0,lastUsedTime:p.lastUsedTime??""})}catch(l){u.warn(`[MCPManager] \u68C0\u67E5\u5DE5\u5177 ${s}.${c.name} \u542F\u7528\u72B6\u6001\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:l})}}}catch(a){u.warn(`[MCPManager] \u83B7\u53D6\u670D\u52A1 ${s} \u7684\u5DE5\u5177\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u670D\u52A1`,{error:a})}let r=[];try{r=this.customMCPHandler.getTools(),u.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A customMCP \u5DE5\u5177`)}catch(s){u.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5931\u8D25\uFF0C\u5C06\u53EA\u8FD4\u56DE\u6807\u51C6 MCP \u5DE5\u5177",{error:s}),r=[]}if(e!=="disabled")for(let s of r)try{t.push({name:s.name,description:s.description||"",inputSchema:s.inputSchema,serviceName:this.getServiceNameForTool(s),originalName:s.name,enabled:!0,usageCount:0,lastUsedTime:""})}catch(o){u.warn(`[MCPManager] \u5904\u7406 CustomMCP \u5DE5\u5177 ${s.name} \u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:o})}return u.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${t.length} \u4E2A\u53EF\u7528\u5DE5\u5177\uFF08status=${e}\uFF09`),t}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 s=Date.now(),o="unknown",a=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(o=this.getLogServerName(l),a=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),u.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);o=l.serviceName,a=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||{}),u.debug("[MCPManager] \u5DE5\u5177\u8C03\u7528\u6210\u529F",{toolName:e,result:c}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:a,serverName:o,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-s}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:a,serverName:o,arguments:t,result:null,success:!1,duration:Date.now()-s,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),u.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}else{let l=this.tools.get(e);l&&(this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1),u.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}throw c}}async updateToolStats(e,t,r,s){try{let o=new Date().toISOString();s?(await this.updateCustomMCPToolStats(e,o),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,o),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)):(await this.updateCustomMCPToolLastUsedTime(e,o),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,o),u.debug("[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177\u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F",{toolName:e}))}catch(o){throw u.error("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,error:o}),o}}async updateToolStatsSafe(e,t,r,s){try{await this.updateToolStats(e,t,r,s)}catch(o){let a=s?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F";u.warn("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,action:a,error:o})}}async updateCustomMCPToolStats(e,t){try{await Se.updateToolUsageStatsWithLock(e,!0),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u7EDF\u8BA1`)}catch(r){throw u.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u5931\u8D25`,{error:r}),r}}async updateCustomMCPToolLastUsedTime(e,t){try{await Se.updateToolUsageStatsWithLock(e,!1),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(r){throw u.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:r}),r}}async updateMCPServerToolStats(e,t,r){try{await Se.updateMCPServerToolStatsWithLock(e,t,r,!0),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1`)}catch(s){throw u.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u5931\u8D25`,{error:s}),s}}async updateMCPServerToolLastUsedTime(e,t,r){try{await Se.updateMCPServerToolStatsWithLock(e,t,r,!1),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(s){throw u.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:s}),s}}async callMCPTool(e,t,r){let{serviceName:s,toolName:o}=t;u.debug(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${s}.${o}`);let a=this.services.get(s);if(!a)throw new Error(`\u670D\u52A1 ${s} \u4E0D\u53EF\u7528`);if(!a.isConnected())throw new Error(`\u670D\u52A1 ${s} \u672A\u8FDE\u63A5`);try{let c=await a.callTool(o,r||{});return u.debug(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),c}catch(c){throw u.error(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}),c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){u.info("[MCPManager] \u6B63\u5728\u505C\u6B62\u6240\u6709 MCP \u670D\u52A1..."),this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect(),u.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){u.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message})}try{this.customMCPHandler.cleanup(),u.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){u.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u6E05\u7406\u5931\u8D25",{error:e})}try{Se.clearAllStatsUpdateLocks(),u.info("[MCPManager] \u7EDF\u8BA1\u66F4\u65B0\u9501\u5DF2\u6E05\u7406")}catch(e){u.error("[MCPManager] \u6E05\u7406\u7EDF\u8BA1\u66F4\u65B0\u9501\u5931\u8D25",{error:e})}this.services.clear(),this.tools.clear(),u.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u5DF2\u505C\u6B62")}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=Se.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch(e){return u.warn("[MCPManager] \u83B7\u53D6\u7EDF\u8BA1\u66F4\u65B0\u76D1\u63A7\u4FE1\u606F\u5931\u8D25",{error:e}),{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{u.debug("\u91CD\u65B0\u521D\u59CB\u5316CustomMCPHandler"),this.customMCPHandler.initialize(),u.debug("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw u.error("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25",{error:e}),e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch(t){return u.warn(`[MCPManager] \u68C0\u67E5 CustomMCP \u5DE5\u5177 ${e} \u662F\u5426\u5B58\u5728\u5931\u8D25`,{error:t}),!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch(e){return u.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5217\u8868\u5931\u8D25\uFF0C\u8FD4\u56DE\u7A7A\u6570\u7EC4",{error:e}),[]}}isModelScopeService(e){return e.url?bg(e.url):!1}handleModelScopeAuth(e,t,r){if(t.headers?.Authorization){u.info(`[MCPManager] \u670D\u52A1 ${e} \u4F7F\u7528\u5DF2\u6709\u7684 Authorization header`);return}let o=Se.getModelScopeApiKey();if(o){r.apiKey=o,u.info(`[MCPManager] \u4E3A ${e} \u670D\u52A1\u6DFB\u52A0 ModelScope API Key`);return}let a=t.url||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${e}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${a}\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,t){let r={...t};try{return this.isModelScopeService(t)&&this.handleModelScopeAuth(e,t,r),r}catch(s){throw u.error(`[MCPManager] \u914D\u7F6E\u589E\u5F3A\u5931\u8D25: ${e}`,{error:s}),s}}addServiceConfig(e,t){let r,s;if(typeof e=="string"&&t)s=e,r=t;else if(typeof e=="object"){let a=e;s=a.name,r=a}else throw new Error("Invalid arguments for addServiceConfig");let o=this.enhanceServiceConfig(s,r);this.configs[s]=o,u.debug(`[MCPManager] \u5DF2\u6DFB\u52A0\u670D\u52A1\u914D\u7F6E: ${s}`)}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(e,t);this.configs[e]=r,u.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5E76\u589E\u5F3A\u670D\u52A1\u914D\u7F6E: ${e}`)}removeServiceConfig(e){delete this.configs[e],u.debug(`[MCPManager] \u5DF2\u79FB\u9664\u670D\u52A1\u914D\u7F6E: ${e}`)}async syncToolsConfigToFile(){try{u.debug("[MCPManager] \u5F00\u59CB\u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6");let e=Se.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let s=r.getTools();if(s.length===0)continue;let o=e[t]?.tools||{},a={};for(let f of s){let S=o[f.name];S?a[f.name]={...S,description:f.description||S.description||""}:a[f.name]={description:f.description||"",enable:!0}}let c=s.map(f=>f.name),p=Object.keys(o).filter(f=>!c.includes(f));if(p.length>0&&u.info(`[MCPManager] \u68C0\u6D4B\u5230\u670D\u52A1 ${t} \u79FB\u9664\u4E86 ${p.length} \u4E2A\u5DE5\u5177: ${p.join(", ")}`),this.hasToolsConfigChanged(o,a)){Se.updateServerToolsConfig(t,a);let f=Object.keys(a).filter(g=>!o[g]),S=Object.keys(a).filter(g=>{let P=o[g],w=a[g];return P&&P.description!==w.description});u.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),f.length>0&&u.debug(` - \u65B0\u589E\u5DE5\u5177: ${f.join(", ")}`),S.length>0&&u.debug(` - \u66F4\u65B0\u5DE5\u5177: ${S.join(", ")}`),p.length>0&&u.debug(` - \u79FB\u9664\u5DE5\u5177: ${p.join(", ")}`)}}u.debug("[MCPManager] \u5DE5\u5177\u914D\u7F6E\u540C\u6B65\u5B8C\u6210")}catch(e){u.error("[MCPManager] \u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25",{error:e})}}hasToolsConfigChanged(e,t){let r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!0;let o=s.filter(c=>!r.includes(c)),a=r.filter(c=>!s.includes(c));if(o.length>0||a.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;u.info(`[MCPManager] \u5B89\u6392 ${e.length} \u4E2A\u5931\u8D25\u670D\u52A1\u7684\u91CD\u8BD5`);let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e)),u.debug(`[MCPManager] \u5B89\u6392\u670D\u52A1 ${e} \u5728 ${t}ms \u540E\u91CD\u8BD5`);let s=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,s)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e),u.info(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u6210\u529F`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){u.error("[MCPManager] \u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}catch(t){u.error(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u5931\u8D25`,{error:t.message});let r=this.getRetryDelay(e),s=Math.min(r*2,3e5);u.debug(`[MCPManager] \u670D\u52A1 ${e} \u4E0B\u6B21\u91CD\u8BD5\u5C06\u5728 ${s}ms \u540E\u8FDB\u884C`),this.scheduleServiceRetry(e,s)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,s)=>r+s.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e),u.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`)),this.failedServices.delete(e)}stopAllServiceRetries(){u.info("[MCPManager] \u505C\u6B62\u6240\u6709\u670D\u52A1\u91CD\u8BD5");for(let[e,t]of this.retryTimers)clearTimeout(t),u.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");u.info("\u542F\u52A8 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.startAllServices(),this.isRunning=!0,u.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw u.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u5931\u8D25",{error:e}),e}}async stop(){if(this.isRunning){u.info("\u505C\u6B62 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.stopAllServices(),this.isRunning=!1,u.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw u.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u5931\u8D25",{error:e}),e}}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,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(),u.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 customMCP \u72B6\u6001: ${e} \u4E2A\u5DE5\u5177`)}catch(c){u.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u72B6\u6001\u5931\u8D25\uFF0C\u5C06\u53EA\u5305\u542B\u6807\u51C6 MCP \u5DE5\u5177",{error:c}),e=0,t=[]}let r=this.tools.size+e,o=[...Array.from(this.tools.keys()),...t],a={services:{},totalTools:r,availableTools:o};for(let[c,l]of this.services){let p=l.getStatus();a.services[c]={connected:p.connected,clientName:`xiaozhi-${c}-client`}}return e>0&&(a.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),a}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}async cleanup(){await this.stopAllServices(),this.eventBus.offEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.offEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.offEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}}});import{MCPConnection as Ag}from"@xiaozhi-client/mcp-core";var Dn,vu=d(()=>{"use strict";dt();Ce();Dn=class{static{i(this,"MCPService")}connection;eventBus=k();constructor(e){let{name:t,...r}=e,s={onConnected:i(o=>{this.eventBus.emitEvent(wn.CONNECTED,o)},"onConnected"),onDisconnected:i(o=>{this.eventBus.emitEvent(wn.DISCONNECTED,o)},"onDisconnected"),onConnectionFailed:i(o=>{this.eventBus.emitEvent(wn.CONNECTION_FAILED,o)},"onConnectionFailed")};this.connection=new Ag(t,r,s)}async connect(){return this.connection.connect()}async disconnect(){return this.connection.disconnect()}async callTool(e,t){return this.connection.callTool(e,t)}getTools(){return this.connection.getTools()}getConfig(){return this.connection.getConfig()}getStatus(){return this.connection.getStatus()}isConnected(){return this.connection.isConnected()}}});import{TypeFieldNormalizer as r_}from"@xiaozhi-client/mcp-core";function Cu(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new ft(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new ft(-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 ft(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!t.allowEmptyArguments&&r.arguments!==void 0&&r.arguments!==null){let s=r.arguments;if(Object.keys(s).length===0)throw new ft(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let s=t.customValidator(r);if(s)throw new ft(-32602,s)}return{name:r.name,arguments:r.arguments}}var yu=d(()=>{"use strict";hr();i(Cu,"validateToolCallParams")});var Tu=d(()=>{"use strict"});import{Hono as wg}from"hono";var _u,kn,Fn=d(()=>{"use strict";_u=i(()=>new wg,"createApp"),kn=i(n=>{let e=n.get("mcpServiceManager");if(!e)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u68C0\u67E5 mcpServiceManagerMiddleware \u662F\u5426\u6B63\u786E\u914D\u7F6E");return e},"requireMCPServiceManager")});var Hn=d(()=>{"use strict"});var Oi=d(()=>{"use strict";Ii();Tu();Mi();Fn();Hn()});import{createHash as Ig}from"crypto";import{existsSync as Is,mkdirSync as Mg,readFileSync as Ru,renameSync as xg,writeFileSync as Pu}from"fs";import{dirname as Og,resolve as bu}from"path";import Ng from"dayjs";var mt,Au=d(()=>{"use strict";D();dt();Oi();mt=class{static{i(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=Si.CACHE_VERSION;CACHE_ENTRY_VERSION=Si.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=iu.CLEANUP_INTERVAL;constructor(e){this.logger=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ng().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return bu(e,Ti.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return bu(t,Ti.FILENAME)}}async ensureCacheFile(){try{if(!Is(this.cachePath)){let e=Og(this.cachePath);Is(e)||(Mg(e,{recursive:!0}),this.logger.debug(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55: ${e}`)),this.logger.debug("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u521D\u59CB\u7F13\u5B58\u6587\u4EF6");let t=await this.createInitialCache();await this.saveCache(t),this.logger.info(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u6587\u4EF6: ${this.cachePath}`)}}catch(e){this.logger.warn(`[CacheManager] \u521B\u5EFA\u7F13\u5B58\u6587\u4EF6\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async createInitialCache(){let e=this.formatTimestamp();return{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:e,totalWrites:0,createdAt:e}}}async writeCacheEntry(e,t,r){try{this.logger.debug(`[CacheManager] \u5F00\u59CB\u5199\u5165\u7F13\u5B58: ${e}`),await this.ensureCacheFile();let s=await this.loadExistingCache(),o=this.generateConfigHash(r),a={tools:t.map(c=>({name:c.name,description:c.description||"",inputSchema:c.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:o,version:this.CACHE_ENTRY_VERSION};s.mcpServers[e]=a,s.metadata.lastGlobalUpdate=this.formatTimestamp(),s.metadata.totalWrites+=1,await this.saveCache(s),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(s){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)}}async loadExistingCache(){try{if(!Is(this.cachePath))return await this.createInitialCache();let e=Ru(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{Pu(r,t,"utf8"),xg(r,e)}catch(s){try{Is(r)&&Pu(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return Ig("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:Is(this.cachePath)?Ru(this.cachePath,"utf8").length:0}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),null}}getFilePath(){return this.cachePath}async getAllCachedTools(){try{let e=await this.loadExistingCache(),t=[];for(let[r,s]of Object.entries(e.mcpServers))for(let o of s.tools)t.push({...o,name:`${r}${lu.SERVICE_TOOL_SEPARATOR}${o.name}`});return this.logger.debug(`[CacheManager] \u83B7\u53D6\u5230\u6240\u6709\u7F13\u5B58\u5DE5\u5177\uFF0C\u5171 ${t.length} \u4E2A`),t}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),[]}}async writeCustomMCPResult(e,t,r,s="completed",o,a=3e5){try{let c=await this.loadExtendedCache(),l=He(e,t),p={result:r,timestamp:new Date().toISOString(),ttl:a,status:s,consumed:!1,taskId:o,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: ${s}`)}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(),s=He(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return null;let o=r.customMCPResults[s],a=Date.now(),c=new Date(o.timestamp).getTime();return a-c>o.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):o}catch(r){return this.logger.warn(`[CacheManager] \u8BFB\u53D6CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),null}}async updateCustomMCPStatus(e,t,r,s,o){try{let a=await this.loadExtendedCache(),c=He(e,t);if(!a.customMCPResults||!a.customMCPResults[c])return!1;let l=a.customMCPResults[c],p=l.status;return l.status=r,l.timestamp=new Date().toISOString(),s&&(l.result=s),o&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${o}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(a),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${p} -> ${r}`),!0}catch(a){return this.logger.warn(`[CacheManager] \u66F4\u65B0CustomMCP\u7F13\u5B58\u72B6\u6001\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`),!1}}async markCustomMCPAsConsumed(e,t){try{let r=await this.loadExtendedCache(),s=He(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return!1;let o=r.customMCPResults[s];return o.consumed||(o.consumed=!0,o.timestamp=new Date().toISOString(),await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${e}`)),!0}catch(r){return this.logger.warn(`[CacheManager] \u6807\u8BB0CustomMCP\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async deleteCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),s=He(e,t);return!r.customMCPResults||!r.customMCPResults[s]?!1:(delete r.customMCPResults[s],await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u5220\u9664\u7F13\u5B58\u6761\u76EE: ${e}`),!0)}catch(r){return this.logger.warn(`[CacheManager] \u5220\u9664CustomMCP\u7F13\u5B58\u6761\u76EE\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async cleanupCustomMCPResults(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[s,o]of t)Ts(o)&&(delete e.customMCPResults[s],r++);return r>0&&(await this.saveExtendedCache(e),this.logger.info(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58: ${r}/${t.length}`)),{cleaned:r,total:t.length}}catch(e){return this.logger.warn(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{cleaned:0,total:0}}}async getCustomMCPStatistics(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0};let t=Object.values(e.customMCPResults),r=t.length,s=t.filter(m=>m.status==="pending").length,o=t.filter(m=>m.status==="completed").length,a=t.filter(m=>m.status==="failed").length,c=t.filter(m=>m.consumed).length,l=o>0?c/o*100:0,p=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:s,completedTasks:o,failedTasks:a,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 gt=d(()=>{"use strict";Su();vu();hr();yu();xi();Au();On();$n()});var Un,wu=d(()=>{"use strict";D();dt();gt();Un=class{static{i(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=u,this.config={maxMessageSize:e.maxMessageSize??cu.DEFAULT,enableMetrics:e.enableMetrics??!0},this.metrics={totalMessages:0,errorCount:0,averageResponseTime:0},this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxMessageSize:this.config.maxMessageSize,enableMetrics:this.config.enableMetrics})}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 s=r.getMCPServiceManager();return this.logger.debug("MCPServiceManager \u4ECE WebServer \u83B7\u53D6\uFF08Context \u4E2D\u672A\u627E\u5230\uFF09"),s}async initializeMessageHandler(e){if(!this.mcpMessageHandler)try{let t=this.getMCPServiceManager(e);this.mcpMessageHandler=new Er(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let s=e.req.header(Ie.CONTENT_LENGTH);if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${Dt.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(Ie.CONTENT_TYPE)?.includes(ne.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${Dt.INVALID_REQUEST}: ${Dt.INVALID_CONTENT_TYPE}`);let a=e.req.header("mcp-protocol-version")||e.req.header(Ie.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");a&&!vs.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${vs.join(", ")}`);let c;try{let m=await e.req.text();if(m.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(m),r=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,Dt.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${Dt.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 l=await this.mcpMessageHandler.handleMessage(c);this.metrics.totalMessages++;let p=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+p)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:c.method,messageId:r,responseTime:p,isNotification:l===null}),l===null?new Response(null,{status:lt.NO_CONTENT,headers:{[Ie.MCP_PROTOCOL_VERSION]:ut.DEFAULT,[Ie.X_RESPONSE_TIME]:p.toString()}}):e.json(l,lt.OK,{[Ie.CONTENT_TYPE]:ne.APPLICATION_JSON,[Ie.MCP_PROTOCOL_VERSION]:ut.DEFAULT,[Ie.X_RESPONSE_TIME]:p.toString()})}catch(s){this.metrics.errorCount++;let o=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:s instanceof Error?s.message:String(s),messageId:r,responseTime:o,stack:s instanceof Error?s.stack:void 0});let a=s instanceof Error?s.message:String(s);return this.createErrorResponse(-32603,`${Dt.INTERNAL_ERROR}: ${a}`,r)}}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let s=r??`error-${Date.now()}`,o={jsonrpc:"2.0",error:{code:e,message:t},id:s};return new Response(JSON.stringify(o),{status:lt.BAD_REQUEST,headers:{[Ie.CONTENT_TYPE]:ne.APPLICATION_JSON,[Ie.MCP_PROTOCOL_VERSION]:ut.DEFAULT}})}getStatus(){return{isInitialized:this.mcpMessageHandler!==null,metrics:this.config.enableMetrics?this.metrics:void 0,config:{maxMessageSize:this.config.maxMessageSize}}}destroy(){this.logger.info("\u6B63\u5728\u9500\u6BC1 MCPRouteHandler"),this.mcpMessageHandler=null,this.logger.info("MCPRouteHandler \u9500\u6BC1\u5B8C\u6210")}}});var Iu=d(()=>{"use strict";D()});var y,Vn,Ni,Li,$i,G_,Di=d(()=>{"use strict";Iu();y=class n extends Error{static{i(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",s="system",o={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=s,this.timestamp=new Date().toISOString(),this.details={...o,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,code:this.code,message:this.message,severity:this.severity,category:this.category,details:this.details,timestamp:this.timestamp}}static configError(e,t,r={}){return new n(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new n(e,t,"high","connection",r)}static operationError(e,t,r={}){return new n(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new n(e,t,"high","system",r)}static validationError(e,t,r={}){return new n(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new n(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},Vn=class{static{i(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof y)}handle(e,t){return y.fromError(e,"INTERNAL_ERROR","system")}},Ni=class{static{i(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 y.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Li=class{static{i(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 y.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},$i=class{static{i(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Ni),this.registerHandler(new Li),this.registerHandler(new Vn)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof y)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new Vn().handle(e,t)}},G_=new $i});import{normalizeServiceConfig as Dg}from"@xiaozhi-client/config";import{TypeFieldNormalizer as ki}from"@xiaozhi-client/mcp-core";var Ms,xe,Mu=d(()=>{"use strict";D();Di();Ce();Ms=class{static{i(this,"MCPHandler")}logger;mcpServiceManager;configManager;statusCache;constructor(e,t){this.logger=u,this.mcpServiceManager=e,this.configManager=t,this.statusCache=new Map}handleError(e,t,r){if(e instanceof y)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let o;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?o=y.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?o=y.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?o=y.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?o=y.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):o=y.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:o,operation:t,context:r}),o}let s=y.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:s,operation:t,context:r}),s}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let p=r,m=await this.addMCPServersBatch(p),f=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:m.addedCount,failedCount:m.failedCount,duration:f}),e.success(m,m.message,201)}let s=r,{name:o,config:a}=s,c=await this.addMCPServerSingle(o,a),l=Date.now()-t;return this.logger.info("addMCPServer",{serverName:o,toolsCount:c.tools?.length||0,duration:l,status:c.status}),e.success(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F",201)}catch(s){let o=this.handleError(s,"addMCPServer",{requestData:r}),a=500;return o.category==="validation"?a=400:o.category==="configuration"?o.code==="SERVER_ALREADY_EXISTS"?a=409:a=400:o.category==="connection"&&(a=500),e.fail(o.code,o.message,{error:o.details},a)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=ki.normalizeTypeField(t);try{let s=xe.validateServiceName(e);if(!s.isValid){let m=y.validationError("INVALID_SERVICE_NAME",s.errors.join(", "),{serverName:e,errors:s.errors});throw this.logger.error("addMCPServerSingle",{validationError:m,serverName:e,phase:"name_validation"}),m}if(xe.checkServiceExists(e,this.configManager)){let m=y.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:m,serverName:e,phase:"existence_check"}),m}let o=xe.validateConfig(r);if(!o.isValid){let m=y.configError("INVALID_CONFIG",o.errors.join(", "),{serverName:e,config:r,errors:o.errors});throw this.logger.error("addMCPServerSingle",{configError:m,serverName:e,phase:"config_validation"}),m}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let a=Dg(r);this.mcpServiceManager.addServiceConfig(e,a),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),p=this.getServiceTools(e).map(m=>m.name);return k().emitEvent("mcp:server:added",{serverName:e,config:r,tools:p,timestamp:new Date}),{...c,tools:p}}catch(s){let o=this.handleError(s,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:o,serverName:e}),o}}getServiceStatus(e){let r=this.configManager.getConfig().mcpServers[e];if(!r)return{name:e,status:"disconnected",connected:!1,tools:[],config:{}};try{let a=this.mcpServiceManager.services.get(e);if(a?.isConnected?.()){let c=a.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(o){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,o)}let s={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,s),s}checkAndEmitStatusChange(e,t){let r=this.getPreviousStatus(e);if(r&&r.status!==t.status&&(this.logger.info(`\u670D\u52A1 ${e} \u72B6\u6001\u53D8\u5316: ${r.status} -> ${t.status}`),k().emitEvent("mcp:server:status_changed",{serverName:e,oldStatus:r.status,newStatus:t.status,timestamp:new Date,reason:t.status==="connected"?"connection_established":"connection_lost"}),r.tools!==t.tools)){let s=t.tools.filter(a=>!r.tools.includes(a)),o=r.tools.filter(a=>!t.tools.includes(a));(s.length>0||o.length>0)&&k().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:s,removedTools:o,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){return this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=xe.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!xe.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let s=this.getServiceTools(t).map(o=>o.name);try{await this.mcpServiceManager.stopService(t)}catch(o){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,o)}return this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),k().emitEvent("mcp:server:removed",{serverName:t,affectedTools:s,timestamp:new Date}),e.success({name:t,operation:"removed",affectedTools:s},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F")}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"))return e.fail("SERVER_NOT_FOUND",t.message,void 0,404);if(t.message.includes("\u914D\u7F6E\u66F4\u65B0"))return e.fail("CONFIG_UPDATE_FAILED",t.message,void 0,500)}return e.fail("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=xe.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!xe.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let s=this.getServiceStatus(t);return e.success(s,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")?e.fail("SERVER_NOT_FOUND",t.message,void 0,404):e.fail("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},s=[];for(let[a,c]of Object.entries(r)){let l=this.getServiceStatus(a);s.push(l)}let o={servers:s,total:s.length};return e.success(o,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t),e.fail("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},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 y.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let s=[],o=[],a=this.validateBatchServers(t);if(!a.isValid)throw y.validationError("INVALID_CONFIG",a.errors.join(", "));try{for(let[m,f]of Object.entries(t)){let S=ki.normalizeTypeField(f);try{let g=await this.addMCPServerSingle(m,S);s.push({name:m,success:!0,config:S,tools:g.tools,status:g.status}),o.push(m),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:m,toolsCount:g.tools?.length||0})}catch(g){let P=this.handleError(g,"addMCPServersBatch",{serverName:m,serverConfig:S});s.push({name:m,success:!1,error:P.message,config:S}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:m,error:P.message})}}let c=o.length,l=r.length-c;if(c===0)throw y.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");k().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:c,failedCount:l,successfullyAddedServers:o,results:s,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:s,addedCount:c,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:c,failedCount:l}),p}catch(c){throw o.length>0&&await this.rollbackBatchAdd(o),c instanceof y?c:y.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[s,o]of Object.entries(e)){let a=xe.validateServiceName(s);if(!a.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${a.errors.join(", ")}`);continue}if(xe.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let c=ki.normalizeTypeField(o),l=xe.validateConfig(c);l.isValid||t.push(`\u670D\u52A1 "${s}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let s of e)try{try{await this.mcpServiceManager.stopService(s)}catch(o){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${s} \u5931\u8D25:`,o)}this.mcpServiceManager.removeServiceConfig(s),this.configManager.removeMcpServer(s),t.push(s),k().emitEvent("mcp:server:rollback",{serverName:s,timestamp:new Date})}catch(o){let a=this.handleError(o,"rollbackBatchAdd",{serverName:s});r.push(s),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${s} \u5931\u8D25:`,a.message)}r.length>0?this.logger.warn("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u90E8\u5206\u5931\u8D25",{totalServers:e.length,rollbackedCount:t.length,failedCount:r.length,failedServers:r}):this.logger.info("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u6210\u529F",{totalServers:e.length,rollbackedCount:t.length})}};(r=>{function n(s){let o=[];if(!s||typeof s!="object")return o.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:o};if("command"in s)(!s.command||typeof s.command!="string")&&o.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),s.args&&!Array.isArray(s.args)&&o.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),s.env&&typeof s.env!="object"&&o.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in s){(!s.url||typeof s.url!="string")&&o.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(s.url)}catch{o.push("URL \u683C\u5F0F\u65E0\u6548")}}else o.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:o.length===0,errors:o}}r.validateConfig=n,i(n,"validateConfig");function e(s){let o=[];return!s||typeof s!="string"?(o.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:o}):((s.length<1||s.length>50)&&o.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(s)||o.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:o.length===0,errors:o})}r.validateServiceName=e,i(e,"validateServiceName");function t(s,o){let a=o.getConfig();return a.mcpServers&&s in a.mcpServers}r.checkServiceExists=t,i(t,"checkServiceExists")})(xe||={})});import{configManager as xs}from"@xiaozhi-client/config";var jn,xu=d(()=>{"use strict";D();Ce();Pi();jn=class{static{i(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=u,this.notificationService=e,this.statusService=t,this.eventBus=k()}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}),Fe(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`,this.logger)}}catch(s){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,s),Fe(e,"MESSAGE_PROCESSING_ERROR",s instanceof Error?s.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25",this.logger)}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=xs.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),Fe(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25",this.logger)}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{if(xs.validateConfig(t),xs.updateConfig(t),t.mcpServerConfig)for(let[s,o]of Object.entries(t.mcpServerConfig))for(let[a,c]of Object.entries(o.tools))xs.setToolEnabled(s,a,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(s){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",s),Fe(e,"CONFIG_UPDATE_ERROR",s instanceof Error?s.message:String(s),this.logger)}}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),Fe(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25",this.logger)}}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),Fe(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",this.logger)}}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=xs.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let s=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:s.client})),s.restart&&e.send(JSON.stringify({type:"restartStatus",data:s.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),Fe(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25",this.logger)}}handleClientDisconnect(e){this.logger.debug(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{spawn as kg}from"child_process";var Bn,Ou=d(()=>{"use strict";D();In();Ce();Fn();Bn=class{static{i(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u,this.statusService=e,this.eventBus=k()}spawnXiaozhiProcess(e){let t=kg("xiaozhi",e,{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}});return t.unref(),this.logger.info(`MCP \u670D\u52A1\u547D\u4EE4\u5DF2\u53D1\u9001: xiaozhi ${e.join(" ")}`),t}async restartService(e){try{e.get("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");let t=kn(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},yi.SUCCESS_NOTIFICATION_DELAY)}catch(r){e.get("logger").error("\u670D\u52A1\u91CD\u542F\u5931\u8D25:",r),this.statusService.updateRestartStatus("failed",r instanceof Error?r.message:"\u672A\u77E5\u9519\u8BEF")}},yi.EXECUTION_DELAY),e.success(null,"\u91CD\u542F\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25:",t),e.fail("RESTART_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async executeRestart(e){this.logger.info("\u6B63\u5728\u91CD\u542F MCP \u670D\u52A1...");try{if(!e.getStatus().isRunning){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),this.spawnXiaozhiProcess(["start","--daemon"]);return}this.spawnXiaozhiProcess(["restart","--daemon"])}catch(t){throw this.logger.error("\u91CD\u542F\u670D\u52A1\u5931\u8D25:",t),t}}async stopService(e){try{return e.get("logger").info("\u5904\u7406\u670D\u52A1\u505C\u6B62\u8BF7\u6C42"),this.spawnXiaozhiProcess(["stop"]),e.success(null,"\u505C\u6B62\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25:",t),e.fail("STOP_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async startService(e){try{return e.get("logger").info("\u5904\u7406\u670D\u52A1\u542F\u52A8\u8BF7\u6C42"),this.spawnXiaozhiProcess(["start","--daemon"]),e.success(null,"\u542F\u52A8\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25:",t),e.fail("START_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async getServiceStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u8BF7\u6C42");let r=kn(e).getStatus();return e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25",void 0,500)}}async getServiceHealth(e){try{e.get("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 e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_HEALTH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25",void 0,500)}}}});import{existsSync as zn}from"fs";import{readFile as Fg}from"fs/promises";import{dirname as Hg,join as oe}from"path";import{fileURLToPath as Ug}from"url";var Os,Nu=d(()=>{"use strict";D();dt();ke();Os=class extends J{static{i(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=u,this.initializeWebPath()}initializeWebPath(){try{let e=Hg(Ug(import.meta.url));u.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[oe(e,"..","..","..","frontend"),oe(e,"..","..","frontend"),oe(e,"..","frontend"),oe(e,"..","..","apps","frontend","dist"),oe(e,"..","apps","frontend","dist"),oe(e,"..","..","apps","frontend"),oe(e,"..","apps","frontend"),oe(e,"..","..","web","dist"),oe(e,"..","web","dist"),oe(e,"..","..","web"),oe(e,"..","web"),oe(e,"..","..","..","apps","frontend","dist"),oe(e,"..","..","..","apps","frontend"),oe(e,"..","..","..","web","dist"),oe(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=zn(r);return u.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${s?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),s})||null,this.webPath?u.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(u.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),u.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){u.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(e.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 e.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",lt.FORBIDDEN);let s=oe(this.webPath,r);if(!zn(s)){let a=oe(this.webPath,"index.html");return zn(a)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,a,ne.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${s}`),e.text("Not Found",lt.NOT_FOUND))}let o=this.getContentType(s);return e.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${s}, Content-Type: ${o}`),this.serveFile(e,s,o)}catch(r){return e.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",lt.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let s=await Fg(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(s.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(s),200,{"Content-Type":r})}catch(s){throw u.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,s),s}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:ne.TEXT_HTML,htm:ne.TEXT_HTML,js:ne.APPLICATION_JAVASCRIPT,mjs:ne.APPLICATION_JAVASCRIPT,css:ne.TEXT_CSS,json:ne.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:ne.APPLICATION_PDF,txt:ne.TEXT_PLAIN,xml:ne.APPLICATION_XML,zip:ne.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||ne.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
24
+ 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var De,Tr=m(()=>{"use strict";De=class n extends Error{static{a(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};a(Jo,"createTimeoutResponse");a(Aa,"getToolSpecificTimeoutMessage");a(Ko,"getDefaultTimeoutMessage")});import{configManager as Qo}from"@xiaozhi-client/config";function _a(n){return n.type==="proxy"}var $e,ht=m(()=>{"use strict";I();gt();ie();Re();H();vr();Tr();a(_a,"isProxyHandler");$e=class{static{a(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=xe.TIMEOUT;CACHE_TTL=xe.CACHE_TTL;configUpdateListener=null;constructor(e,t){this.logger=g,this.cacheManager=e||new se,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=Qo.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new Z(e)}setupEventListeners(){let e=M();this.configUpdateListener=async t=>{if(t&&typeof t=="object"&&"type"in t&&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)}}},e.onEvent("config:updated",this.configUpdateListener)}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||Qo.getCustomMCPTools();this.tools.clear();for(let r of t)_a(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})`));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:ft(e.inputSchema)}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}getToolInfo(e){return this.tools.get(e)}reinitialize(){this.logger.debug("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668..."),this.initialize()}async callTool(e,t,r){let o=this.tools.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let s=await this.getCompletedResult(e,t);if(s)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),s;try{let i=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,c),c}catch(i){if(i instanceof De){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}`),Jo(c,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new De(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(!o.customMCPResults||!o.customMCPResults[r])return null;let s=o.customMCPResults[r];return s.status==="completed"&&!s.consumed&&!Er(s.timestamp,s.ttl)?s.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}processWorkflowResponse(e,t){try{let r=t.data||t;return typeof r=="string"?{content:[{type:"text",text:r}],isError:!1}:{content:[{type:"text",text:JSON.stringify(r,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406\u5DE5\u4F5C\u6D41\u54CD\u5E94\u5931\u8D25: ${e}`,r),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async callCozeWorkflow(e,t){let o=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:o.workflow_id});try{let s=this.getCozeApiService();if(!o.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let i=await s.callWorkflow(o.workflow_id,t);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`),this.processWorkflowResponse(e.name,i)}catch(s){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(o.customMCPResults?.[r]){o.customMCPResults[r].consumed=!0;let s=o.customMCPResults[r];Le(s)&&delete o.customMCPResults[r],await this.saveCache(o),this.logger.debug(`[CustomMCP] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}`)}}catch(r){this.logger.warn(`[CustomMCP] \u6E05\u7406\u7F13\u5B58\u5931\u8D25: ${r}`)}}async generateTaskId(e,t){return Y(e,t)}generateCacheKey(e,t){return Y(e,t)}async loadExtendedCache(){try{return await this.cacheManager.loadExistingCache()}catch{return{version:"1.0.0",mcpServers:{},metadata:{lastGlobalUpdate:new Date().toISOString(),totalWrites:0,createdAt:new Date().toISOString()},customMCPResults:{}}}}async updateCacheWithResult(e,t){try{let r=await this.loadExtendedCache();r.customMCPResults||(r.customMCPResults={}),r.customMCPResults[e]=t,await this.saveCache(r)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u7F13\u5B58\u5931\u8D25: ${r}`)}}async cacheResult(e,t,r){try{let o=this.generateCacheKey(e,t),s={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(o,s),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(o){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${o}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.configUpdateListener&&(M().offEvent("config:updated",this.configUpdateListener),this.configUpdateListener=null),this.tools.clear(),this.cacheManager.cleanup()}}});import{tmpdir as Oa}from"os";var ke,Zo=m(()=>{"use strict";ke=class{static{a(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||Oa()}}});import*as ae from"fs";import*as pe from"path";import Ct from"pino";var He,Et,vt=m(()=>{"use strict";I();Zo();He=class{static{a(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=pe.resolve(pe.normalize(e.logFilePath));else{let r=t||ke.getTempDir();this.logFilePath=pe.join(pe.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),g.info("ToolCallLogger \u521D\u59CB\u5316",{maxRecords:this.maxRecords,path:this.logFilePath})}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:a(r=>{try{let o=JSON.parse(r),s=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:Ct.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){g.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6",{error:r})}return Ct({level:"info",timestamp:Ct.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((r,o)=>({level:o}),"level")},base:null},Ct.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(!ae.existsSync(this.logFilePath))return;let t=ae.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),s=o.join(`
26
+ `)+(o.length>0?`
27
+ `:"");ae.writeFileSync(this.logFilePath,s,"utf8"),g.info("\u5DF2\u6E05\u7406\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55",{recordsToRemove:r,maxRecords:this.maxRecords})}catch(e){g.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25",{error:e})}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){g.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{error:t})}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},Et=class{static{a(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||ke.getConfigDir()}getLogFilePath(){return new He({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!ae.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=ae.readFileSync(e,"utf8").trim().split(`
28
+ `).filter(s=>s.trim()!==""),o=[];for(let s of r)try{let i=JSON.parse(s);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp||g.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233",{line:s}),o.push(i)}catch{g.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C",{line:s})}return o.sort((s,i)=>(i.timestamp||0)-(s.timestamp||0)),o}catch(t){throw g.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25",{error:t}),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(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 g.info("\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7",{count:c.length,total:o}),{records:c,total:o,hasMore:l}}}});var Me,Sr=m(()=>{"use strict";I();oe();ie();Me=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=g}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 re.INITIALIZE:return await this.handleInitialize(e.params,e.id);case re.INITIALIZED:return await this.handleInitializedNotification(e.params);case re.TOOLS_LIST:return await this.handleToolsList(e.id);case re.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case re.RESOURCES_LIST:return await this.handleResourcesList(e.id);case re.PROMPTS_LIST:return await this.handlePromptsList(e.id);case re.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=e.protocolVersion,o=be.includes(r)?r:te.DEFAULT;return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${r}, \u670D\u52A1\u5668\u54CD\u5E94=${o}`),{jsonrpc:"2.0",result:{serverInfo:{name:cr.NAME,version:cr.VERSION},capabilities:{tools:{},logging:{}},protocolVersion:o},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.debug("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.debug("\u5904\u7406 tools/list \u8BF7\u6C42");try{let r=this.serviceManager.getAllTools().map(o=>({name:o.name,description:o.description,inputSchema:o.inputSchema}));return{jsonrpc:"2.0",result:{tools:r},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=en(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}}});import{EventEmitter as Na}from"events";import{isModelScopeURL as ba}from"@xiaozhi-client/config";import{configManager as F}from"@xiaozhi-client/config";var Fe,tn=m(()=>{"use strict";I();ie();ie();Re();H();ht();vt();Sr();Fe=class extends Na{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=M();toolCallLogger;retryTimers=new Map;failedServices=new Set;messageHandler;eventListeners;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 se(r),this.customMCPHandler=new $e(this.cacheManager,this);let o=F.getToolCallLogConfig(),s=F.getConfigDir();this.toolCallLogger=new He(o,s),this.eventListeners={serviceConnected:a(async i=>{await this.handleServiceConnected(i)},"serviceConnected"),serviceDisconnected:a(async i=>{await this.handleServiceDisconnected(i)},"serviceDisconnected"),serviceConnectionFailed:a(async i=>{await this.handleServiceConnectionFailed(i)},"serviceConnectionFailed")},this.setupEventListeners(),this.messageHandler=new Me(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.onEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.onEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}async handleServiceConnected(e){g.debug(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u6210\u529F\uFF0C\u5F00\u59CB\u5237\u65B0\u5DE5\u5177\u7F13\u5B58`);try{this.services.get(e.serviceName)&&(await this.refreshCustomMCPHandlerPublic(),g.info(`\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5237\u65B0\u5B8C\u6210`))}catch(t){g.error(`\u5237\u65B0\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5931\u8D25`,{error:t})}}async handleServiceDisconnected(e){g.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\uFF0C\u539F\u56E0: ${e.reason||"\u672A\u77E5"}`);try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic(),g.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5B8C\u6210`)}catch(t){g.error(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5931\u8D25`,{error:t})}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch(t){g.error("\u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}async startAllServices(){g.debug("[MCPManager] \u6B63\u5728\u542F\u52A8\u6240\u6709 MCP \u670D\u52A1...");try{this.customMCPHandler.initialize(),g.debug("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(c){g.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25",{error:c})}let e=Object.entries(this.configs);if(e.length===0){g.warn("[MCPManager] \u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\uFF0C\u8BF7\u4F7F\u7528 addServiceConfig() \u6DFB\u52A0\u670D\u52A1\u914D\u7F6E");return}g.info(`[MCPManager] \u5F00\u59CB\u5E76\u884C\u542F\u52A8 ${e.length} \u4E2A MCP \u670D\u52A1`);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++;g.info(`[MCPManager] \u670D\u52A1\u542F\u52A8\u5B8C\u6210 - \u6210\u529F: ${o}, \u5931\u8D25: ${s}`),i.length>0&&(g.warn(`[MCPManager] \u4EE5\u4E0B\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${i.join(", ")}`),s===e.length&&g.warn("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25\uFF0C\u4F46\u7CFB\u7EDF\u5C06\u7EE7\u7EED\u8FD0\u884C\u4EE5\u4FBF\u91CD\u8BD5")),i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r={name:e,...t},o=new Tt(r);await o.connect(),this.services.set(e,o),await this.refreshToolsCache();let s=o.getTools();g.debug(`[MCPManager] ${e} \u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u52A0\u8F7D\u4E86 ${s.length} \u4E2A\u5DE5\u5177:`,s.map(i=>i.name).join(", "))}catch(r){throw g.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),this.services.delete(e),r}}async stopService(e){g.info(`[MCPManager] \u505C\u6B62 MCP \u670D\u52A1: ${e}`);let t=this.services.get(e);if(!t){g.warn(`[MCPManager] \u670D\u52A1 ${e} \u4E0D\u5B58\u5728\u6216\u672A\u542F\u52A8`);return}try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache(),g.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){throw g.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),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(()=>{g.debug(`[MCPManager] \u5DF2\u5C06 ${e} \u5DE5\u5177\u5217\u8868\u5199\u5165\u7F13\u5B58`)}).catch(s=>{g.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${s instanceof Error?s.message:String(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(e="all"){let t=[];for(let[o,s]of this.services)try{if(s.isConnected()){let i=s.getTools();for(let c of i)try{let l=F.isToolEnabled(o,c.name),u=F.getMcpServerConfig()[o].tools[c.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let p=`${o}__${c.name}`;t.push({name:p,description:c.description||"",inputSchema:c.inputSchema,serviceName:o,originalName:c.name,enabled:l,usageCount:u.usageCount??0,lastUsedTime:u.lastUsedTime??""})}catch(l){g.warn(`[MCPManager] \u68C0\u67E5\u5DE5\u5177 ${o}.${c.name} \u542F\u7528\u72B6\u6001\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:l})}}}catch(i){g.warn(`[MCPManager] \u83B7\u53D6\u670D\u52A1 ${o} \u7684\u5DE5\u5177\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u670D\u52A1`,{error:i})}let r=[];try{r=this.customMCPHandler.getTools(),g.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A customMCP \u5DE5\u5177`)}catch(o){g.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5931\u8D25\uFF0C\u5C06\u53EA\u8FD4\u56DE\u6807\u51C6 MCP \u5DE5\u5177",{error:o}),r=[]}if(e!=="disabled")for(let o of r)try{t.push({name:o.name,description:o.description||"",inputSchema:o.inputSchema,serviceName:this.getServiceNameForTool(o),originalName:o.name,enabled:!0,usageCount:0,lastUsedTime:""})}catch(s){g.warn(`[MCPManager] \u5904\u7406 CustomMCP \u5DE5\u5177 ${o.name} \u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:s})}return g.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${t.length} \u4E2A\u53EF\u7528\u5DE5\u5177\uFF08status=${e}\uFF09`),t}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),g.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),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 u=this.services.get(l.serviceName);if(!u)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!u.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await u.callTool(l.originalName,t||{}),g.debug("[MCPManager] \u5DE5\u5177\u8C03\u7528\u6210\u529F",{toolName:e,result:c}),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),g.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}else{let l=this.tools.get(e);l&&(this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1),g.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}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),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)):(await this.updateCustomMCPToolLastUsedTime(e,s),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,s),g.debug("[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177\u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F",{toolName:e}))}catch(s){throw g.error("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,error:s}),s}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch(s){let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F";g.warn("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,action:i,error:s})}}async updateCustomMCPToolStats(e,t){try{await F.updateToolUsageStatsWithLock(e,!0),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u7EDF\u8BA1`)}catch(r){throw g.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u5931\u8D25`,{error:r}),r}}async updateCustomMCPToolLastUsedTime(e,t){try{await F.updateToolUsageStatsWithLock(e,!1),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(r){throw g.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:r}),r}}async updateMCPServerToolStats(e,t,r){try{await F.updateMCPServerToolStatsWithLock(e,t,r,!0),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1`)}catch(o){throw g.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u5931\u8D25`,{error:o}),o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await F.updateMCPServerToolStatsWithLock(e,t,r,!1),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(o){throw g.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:o}),o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:s}=t;g.debug(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${o}.${s}`);let 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{let c=await i.callTool(s,r||{});return g.debug(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),c}catch(c){throw g.error(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}),c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){g.info("[MCPManager] \u6B63\u5728\u505C\u6B62\u6240\u6709 MCP \u670D\u52A1..."),this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect(),g.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){g.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message})}try{this.customMCPHandler.cleanup(),g.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){g.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u6E05\u7406\u5931\u8D25",{error:e})}try{F.clearAllStatsUpdateLocks(),g.info("[MCPManager] \u7EDF\u8BA1\u66F4\u65B0\u9501\u5DF2\u6E05\u7406")}catch(e){g.error("[MCPManager] \u6E05\u7406\u7EDF\u8BA1\u66F4\u65B0\u9501\u5931\u8D25",{error:e})}this.services.clear(),this.tools.clear(),g.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u5DF2\u505C\u6B62")}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=F.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch(e){return g.warn("[MCPManager] \u83B7\u53D6\u7EDF\u8BA1\u66F4\u65B0\u76D1\u63A7\u4FE1\u606F\u5931\u8D25",{error:e}),{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{g.debug("\u91CD\u65B0\u521D\u59CB\u5316CustomMCPHandler"),this.customMCPHandler.initialize(),g.debug("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw g.error("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25",{error:e}),e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch(t){return g.warn(`[MCPManager] \u68C0\u67E5 CustomMCP \u5DE5\u5177 ${e} \u662F\u5426\u5B58\u5728\u5931\u8D25`,{error:t}),!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch(e){return g.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5217\u8868\u5931\u8D25\uFF0C\u8FD4\u56DE\u7A7A\u6570\u7EC4",{error:e}),[]}}isModelScopeService(e){return e.url?ba(e.url):!1}handleModelScopeAuth(e,t,r){if(t.headers?.Authorization){g.info(`[MCPManager] \u670D\u52A1 ${e} \u4F7F\u7528\u5DF2\u6709\u7684 Authorization header`);return}let s=F.getModelScopeApiKey();if(s){r.apiKey=s,g.info(`[MCPManager] \u4E3A ${e} \u670D\u52A1\u6DFB\u52A0 ModelScope API Key`);return}let i=t.url||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${e}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${i}\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,t){let r={...t};try{return this.isModelScopeService(t)&&this.handleModelScopeAuth(e,t,r),r}catch(o){throw g.error(`[MCPManager] \u914D\u7F6E\u589E\u5F3A\u5931\u8D25: ${e}`,{error:o}),o}}addServiceConfig(e,t){let r,o;if(typeof e=="string"&&t)o=e,r=t;else if(typeof e=="object"){let i=e;o=i.name,r=i}else throw new Error("Invalid arguments for addServiceConfig");let s=this.enhanceServiceConfig(o,r);this.configs[o]=s,g.debug(`[MCPManager] \u5DF2\u6DFB\u52A0\u670D\u52A1\u914D\u7F6E: ${o}`)}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(e,t);this.configs[e]=r,g.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5E76\u589E\u5F3A\u670D\u52A1\u914D\u7F6E: ${e}`)}removeServiceConfig(e){delete this.configs[e],g.debug(`[MCPManager] \u5DF2\u79FB\u9664\u670D\u52A1\u914D\u7F6E: ${e}`)}async syncToolsConfigToFile(){try{g.debug("[MCPManager] \u5F00\u59CB\u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6");let e=F.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 d of o){let v=s[d.name];v?i[d.name]={...v,description:d.description||v.description||""}:i[d.name]={description:d.description||"",enable:!0}}let c=o.map(d=>d.name),u=Object.keys(s).filter(d=>!c.includes(d));if(u.length>0&&g.info(`[MCPManager] \u68C0\u6D4B\u5230\u670D\u52A1 ${t} \u79FB\u9664\u4E86 ${u.length} \u4E2A\u5DE5\u5177: ${u.join(", ")}`),this.hasToolsConfigChanged(s,i)){F.updateServerToolsConfig(t,i);let d=Object.keys(i).filter(E=>!s[E]),v=Object.keys(i).filter(E=>{let k=s[E],nt=i[E];return k&&k.description!==nt.description});g.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),d.length>0&&g.debug(` - \u65B0\u589E\u5DE5\u5177: ${d.join(", ")}`),v.length>0&&g.debug(` - \u66F4\u65B0\u5DE5\u5177: ${v.join(", ")}`),u.length>0&&g.debug(` - \u79FB\u9664\u5DE5\u5177: ${u.join(", ")}`)}}g.debug("[MCPManager] \u5DE5\u5177\u914D\u7F6E\u540C\u6B65\u5B8C\u6210")}catch(e){g.error("[MCPManager] \u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25",{error:e})}}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],u=t[c];if(l.description!==u.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;g.info(`[MCPManager] \u5B89\u6392 ${e.length} \u4E2A\u5931\u8D25\u670D\u52A1\u7684\u91CD\u8BD5`);let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e)),g.debug(`[MCPManager] \u5B89\u6392\u670D\u52A1 ${e} \u5728 ${t}ms \u540E\u91CD\u8BD5`);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),g.info(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u6210\u529F`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){g.error("[MCPManager] \u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}catch(t){g.error(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u5931\u8D25`,{error:t.message});let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);g.debug(`[MCPManager] \u670D\u52A1 ${e} \u4E0B\u6B21\u91CD\u8BD5\u5C06\u5728 ${o}ms \u540E\u8FDB\u884C`),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),g.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`)),this.failedServices.delete(e)}stopAllServiceRetries(){g.info("[MCPManager] \u505C\u6B62\u6240\u6709\u670D\u52A1\u91CD\u8BD5");for(let[e,t]of this.retryTimers)clearTimeout(t),g.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");g.info("\u542F\u52A8 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.startAllServices(),this.isRunning=!0,g.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw g.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u5931\u8D25",{error:e}),e}}async stop(){if(this.isRunning){g.info("\u505C\u6B62 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.stopAllServices(),this.isRunning=!1,g.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw g.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u5931\u8D25",{error:e}),e}}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,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(),g.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 customMCP \u72B6\u6001: ${e} \u4E2A\u5DE5\u5177`)}catch(c){g.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u72B6\u6001\u5931\u8D25\uFF0C\u5C06\u53EA\u5305\u542B\u6807\u51C6 MCP \u5DE5\u5177",{error:c}),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 u=l.getStatus();i.services[c]={connected:u.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}async cleanup(){await this.stopAllServices(),this.eventBus.offEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.offEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.offEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}}});import{MCPConnection as wa}from"@xiaozhi-client/mcp-core";var Tt,rn=m(()=>{"use strict";oe();H();Tt=class{static{a(this,"MCPService")}connection;eventBus=M();constructor(e){let{name:t,...r}=e,o={onConnected:a(s=>{this.eventBus.emitEvent(pt.CONNECTED,s)},"onConnected"),onDisconnected:a(s=>{this.eventBus.emitEvent(pt.DISCONNECTED,s)},"onDisconnected"),onConnectionFailed:a(s=>{this.eventBus.emitEvent(pt.CONNECTION_FAILED,s)},"onConnectionFailed")};this.connection=new wa(t,r,o)}async connect(){return this.connection.connect()}async disconnect(){return this.connection.disconnect()}async callTool(e,t){return this.connection.callTool(e,t)}getTools(){return this.connection.getTools()}getConfig(){return this.connection.getConfig()}getStatus(){return this.connection.getStatus()}isConnected(){return this.connection.isConnected()}}});import{TypeFieldNormalizer as _d}from"@xiaozhi-client/mcp-core";function en(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new ne(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new ne(-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 ne(-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 ne(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new ne(-32602,o)}return{name:r.name,arguments:r.arguments}}var on=m(()=>{"use strict";Re();a(en,"validateToolCallParams")});var nn=m(()=>{"use strict"});import{Hono as La}from"hono";var sn,St,Rt=m(()=>{"use strict";sn=a(()=>new La,"createApp"),St=a(n=>{let e=n.get("mcpServiceManager");if(!e)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u68C0\u67E5 mcpServiceManagerMiddleware \u662F\u5426\u6B63\u786E\u914D\u7F6E");return e},"requireMCPServiceManager")});var Rr=m(()=>{"use strict";vr();nn();Tr();Rt()});import{createHash as xa}from"crypto";import{existsSync as Ve,mkdirSync as Da,readFileSync as an,renameSync as $a,writeFileSync as cn}from"fs";import{dirname as ka,resolve as ln}from"path";import Ha from"dayjs";var se,gn=m(()=>{"use strict";I();oe();Rr();se=class{static{a(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=lr.CACHE_VERSION;CACHE_ENTRY_VERSION=lr.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=zo.CLEANUP_INTERVAL;constructor(e){this.logger=g,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ha().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return ln(e,pr.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return ln(t,pr.FILENAME)}}async ensureCacheFile(){try{if(!Ve(this.cachePath)){let e=ka(this.cachePath);Ve(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(!Ve(this.cachePath))return await this.createInitialCache();let e=an(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{cn(r,t,"utf8"),$a(r,e)}catch(o){try{Ve(r)&&cn(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return xa("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:Ve(this.cachePath)?an(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}${Go.SERVICE_TOOL_SEPARATOR}${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=Y(e,t),u={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:s,retryCount:0};c.customMCPResults||(c.customMCPResults={}),c.customMCPResults[l]=u,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=Y(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=Y(e,t);if(!i.customMCPResults||!i.customMCPResults[c])return!1;let l=i.customMCPResults[c],u=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} ${u} -> ${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=Y(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=Y(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)Le(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(p=>p.status==="pending").length,s=t.filter(p=>p.status==="completed").length,i=t.filter(p=>p.status==="failed").length,c=t.filter(p=>p.consumed).length,l=s>0?c/s*100:0,u=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:s,failedTasks:i,consumedEntries:c,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:u}}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 ie=m(()=>{"use strict";tn();rn();Re();on();Sr();gn();ht();vt()});var Mt,un=m(()=>{"use strict";I();oe();ie();Mt=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=g,this.config={maxMessageSize:e.maxMessageSize??Wo.DEFAULT,enableMetrics:e.enableMetrics??!0},this.metrics={totalMessages:0,errorCount:0,averageResponseTime:0},this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxMessageSize:this.config.maxMessageSize,enableMetrics:this.config.enableMetrics})}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 Me(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.header(W.CONTENT_LENGTH);if(o&&Number.parseInt(o)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${ue.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(W.CONTENT_TYPE)?.includes(_.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${ue.INVALID_REQUEST}: ${ue.INVALID_CONTENT_TYPE}`);let i=e.req.header("mcp-protocol-version")||e.req.header(W.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");i&&!be.includes(i)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${i}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${be.join(", ")}`);let c;try{let p=await e.req.text();if(p.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);c=JSON.parse(p),r=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,ue.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${ue.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 l=await this.mcpMessageHandler.handleMessage(c);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:c.method,messageId:r,responseTime:u,isNotification:l===null}),l===null?new Response(null,{status:ee.NO_CONTENT,headers:{[W.MCP_PROTOCOL_VERSION]:te.DEFAULT,[W.X_RESPONSE_TIME]:u.toString()}}):e.json(l,ee.OK,{[W.CONTENT_TYPE]:_.APPLICATION_JSON,[W.MCP_PROTOCOL_VERSION]:te.DEFAULT,[W.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,`${ue.INTERNAL_ERROR}: ${i}`,r)}}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:ee.BAD_REQUEST,headers:{[W.CONTENT_TYPE]:_.APPLICATION_JSON,[W.MCP_PROTOCOL_VERSION]:te.DEFAULT}})}getStatus(){return{isInitialized:this.mcpMessageHandler!==null,metrics:this.config.enableMetrics?this.metrics:void 0,config:{maxMessageSize:this.config.maxMessageSize}}}destroy(){this.logger.info("\u6B63\u5728\u9500\u6BC1 MCPRouteHandler"),this.mcpMessageHandler=null,this.logger.info("MCPRouteHandler \u9500\u6BC1\u5B8C\u6210")}}});var pn=m(()=>{"use strict";I()});var f,Pt,Mr,Pr,yr,Cm,Ir=m(()=>{"use strict";pn();f=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}})}},Pt=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof f)}handle(e,t){return f.fromError(e,"INTERNAL_ERROR","system")}},Mr=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 f.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Pr=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 f.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},yr=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Mr),this.registerHandler(new Pr),this.registerHandler(new Pt)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof f)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new Pt().handle(e,t)}},Cm=new yr});import{normalizeServiceConfig as Ua}from"@xiaozhi-client/config";import{TypeFieldNormalizer as Ar}from"@xiaozhi-client/mcp-core";var Ue,q,dn=m(()=>{"use strict";I();Ir();H();Ue=class{static{a(this,"MCPHandler")}logger;mcpServiceManager;configManager;statusCache;constructor(e,t){this.logger=g,this.mcpServiceManager=e,this.configManager=t,this.statusCache=new Map}handleError(e,t,r){if(e instanceof f)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=f.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?s=f.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?s=f.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?s=f.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):s=f.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=f.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:o,operation:t,context:r}),o}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let u=r,p=await this.addMCPServersBatch(u),d=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:p.addedCount,failedCount:p.failedCount,duration:d}),e.success(p,p.message,201)}let o=r,{name:s,config:i}=o,c=await this.addMCPServerSingle(s,i),l=Date.now()-t;return this.logger.info("addMCPServer",{serverName:s,toolsCount:c.tools?.length||0,duration:l,status:c.status}),e.success(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F",201)}catch(o){let s=this.handleError(o,"addMCPServer",{requestData:r}),i=500;return s.category==="validation"?i=400:s.category==="configuration"?s.code==="SERVER_ALREADY_EXISTS"?i=409:i=400:s.category==="connection"&&(i=500),e.fail(s.code,s.message,{error:s.details},i)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=Ar.normalizeTypeField(t);try{let o=q.validateServiceName(e);if(!o.isValid){let p=f.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(q.checkServiceExists(e,this.configManager)){let p=f.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=q.validateConfig(r);if(!s.isValid){let p=f.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=Ua(r);this.mcpServiceManager.addServiceConfig(e,i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),u=this.getServiceTools(e).map(p=>p.name);return M().emitEvent("mcp:server:added",{serverName:e,config:r,tools:u,timestamp:new Date}),{...c,tools:u}}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(u=>u.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){return this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=q.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!q.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let o=this.getServiceTools(t).map(s=>s.name);try{await this.mcpServiceManager.stopService(t)}catch(s){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,s)}return this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),M().emitEvent("mcp:server:removed",{serverName:t,affectedTools:o,timestamp:new Date}),e.success({name:t,operation:"removed",affectedTools:o},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F")}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"))return e.fail("SERVER_NOT_FOUND",t.message,void 0,404);if(t.message.includes("\u914D\u7F6E\u66F4\u65B0"))return e.fail("CONFIG_UPDATE_FAILED",t.message,void 0,500)}return e.fail("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=q.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!q.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let o=this.getServiceStatus(t);return e.success(o,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")?e.fail("SERVER_NOT_FOUND",t.message,void 0,404):e.fail("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},o=[];for(let[i,c]of Object.entries(r)){let l=this.getServiceStatus(i);o.push(l)}let s={servers:o,total:o.length};return e.success(s,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t),e.fail("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},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 f.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 f.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[p,d]of Object.entries(t)){let v=Ar.normalizeTypeField(d);try{let E=await this.addMCPServerSingle(p,v);o.push({name:p,success:!0,config:v,tools:E.tools,status:E.status}),s.push(p),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:p,toolsCount:E.tools?.length||0})}catch(E){let k=this.handleError(E,"addMCPServersBatch",{serverName:p,serverConfig:v});o.push({name:p,success:!1,error:k.message,config:v}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:p,error:k.message})}}let c=s.length,l=r.length-c;if(c===0)throw f.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 u={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}),u}catch(c){throw s.length>0&&await this.rollbackBatchAdd(s),c instanceof f?c:f.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=q.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(q.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=Ar.normalizeTypeField(s),l=q.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")})(q||={})});import{configManager as ze}from"@xiaozhi-client/config";var yt,mn=m(()=>{"use strict";I();H();fr();yt=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=g,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}),X(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`,this.logger)}}catch(o){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,o),X(e,"MESSAGE_PROCESSING_ERROR",o instanceof Error?o.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25",this.logger)}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=ze.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),X(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25",this.logger)}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{if(ze.validateConfig(t),ze.updateConfig(t),t.mcpServerConfig)for(let[o,s]of Object.entries(t.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))ze.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),X(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o),this.logger)}}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),X(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25",this.logger)}}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),X(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",this.logger)}}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=ze.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),X(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25",this.logger)}}handleClientDisconnect(e){this.logger.debug(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{spawn as za}from"child_process";var It,fn=m(()=>{"use strict";I();dt();H();Rt();It=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=g,this.statusService=e,this.eventBus=M()}spawnXiaozhiProcess(e){let t=za("xiaozhi",e,{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}});return t.unref(),this.logger.info(`MCP \u670D\u52A1\u547D\u4EE4\u5DF2\u53D1\u9001: xiaozhi ${e.join(" ")}`),t}async restartService(e){try{e.get("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");let t=St(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},ur.SUCCESS_NOTIFICATION_DELAY)}catch(r){e.get("logger").error("\u670D\u52A1\u91CD\u542F\u5931\u8D25:",r),this.statusService.updateRestartStatus("failed",r instanceof Error?r.message:"\u672A\u77E5\u9519\u8BEF")}},ur.EXECUTION_DELAY),e.success(null,"\u91CD\u542F\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25:",t),e.fail("RESTART_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async executeRestart(e){this.logger.info("\u6B63\u5728\u91CD\u542F MCP \u670D\u52A1...");try{if(!e.getStatus().isRunning){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),this.spawnXiaozhiProcess(["start","--daemon"]);return}this.spawnXiaozhiProcess(["restart","--daemon"])}catch(t){throw this.logger.error("\u91CD\u542F\u670D\u52A1\u5931\u8D25:",t),t}}async stopService(e){try{return e.get("logger").info("\u5904\u7406\u670D\u52A1\u505C\u6B62\u8BF7\u6C42"),this.spawnXiaozhiProcess(["stop"]),e.success(null,"\u505C\u6B62\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25:",t),e.fail("STOP_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async startService(e){try{return e.get("logger").info("\u5904\u7406\u670D\u52A1\u542F\u52A8\u8BF7\u6C42"),this.spawnXiaozhiProcess(["start","--daemon"]),e.success(null,"\u542F\u52A8\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25:",t),e.fail("START_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async getServiceStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u8BF7\u6C42");let r=St(e).getStatus();return e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25",void 0,500)}}async getServiceHealth(e){try{e.get("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 e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_HEALTH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25",void 0,500)}}}});import{existsSync as At}from"fs";import{readFile as ja}from"fs/promises";import{dirname as Wa,join as O}from"path";import{fileURLToPath as Ga}from"url";var je,hn=m(()=>{"use strict";I();oe();B();je=class extends A{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=g,this.initializeWebPath()}initializeWebPath(){try{let e=Wa(Ga(import.meta.url));g.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[O(e,"..","..","..","frontend"),O(e,"..","..","frontend"),O(e,"..","frontend"),O(e,"..","..","apps","frontend","dist"),O(e,"..","apps","frontend","dist"),O(e,"..","..","apps","frontend"),O(e,"..","apps","frontend"),O(e,"..","..","web","dist"),O(e,"..","web","dist"),O(e,"..","..","web"),O(e,"..","web"),O(e,"..","..","..","apps","frontend","dist"),O(e,"..","..","..","apps","frontend"),O(e,"..","..","..","web","dist"),O(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=At(r);return g.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?g.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(g.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),g.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){g.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(e.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 e.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",ee.FORBIDDEN);let o=O(this.webPath,r);if(!At(o)){let i=O(this.webPath,"index.html");return At(i)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,_.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",ee.NOT_FOUND))}let s=this.getContentType(o);return e.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${s}`),this.serveFile(e,o,s)}catch(r){return e.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",ee.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let o=await ja(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 g.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=`
29
29
  <!DOCTYPE html>
30
30
  <html>
31
31
  <head>
@@ -82,32 +82,10 @@ var Ym=Object.create;var Tn=Object.defineProperty;var Qm=Object.getOwnPropertyDe
82
82
  </div>
83
83
  </body>
84
84
  </html>
85
- `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&zn(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var Wn,Lu=d(()=>{"use strict";ke();Wn=class extends J{static{i(this,"StatusApiHandler")}statusService;constructor(e){super(),this.statusService=e}async getStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return e.get("logger").debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u72B6\u6001","STATUS_READ_ERROR")}}async getClientStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return e.get("logger").debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001","CLIENT_STATUS_READ_ERROR")}}async getRestartStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return e.get("logger").debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u91CD\u542F\u72B6\u6001","RESTART_STATUS_READ_ERROR")}}async checkClientConnected(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return e.get("logger").debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.success({connected:t})}catch(t){return this.handleError(e,t,"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5","CLIENT_CONNECTION_CHECK_ERROR")}}async getLastHeartbeat(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return e.get("logger").debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.success({lastHeartbeat:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4","HEARTBEAT_READ_ERROR")}}async getActiveMCPServers(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return e.get("logger").debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.success({servers:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668","ACTIVE_MCP_SERVERS_READ_ERROR")}}async updateClientStatus(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return!t||typeof t!="object"?e.fail("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61",void 0,400):(this.statusService.updateClientInfo(t,"http-api"),e.get("logger").info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){return this.handleError(e,t,"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001","CLIENT_STATUS_UPDATE_ERROR","\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25",400)}}async setActiveMCPServers(e){try{e.get("logger").debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF");return Array.isArray(t)?(this.statusService.setActiveMCPServers(t),e.get("logger").info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.success(void 0,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F")):e.fail("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4",void 0,400)}catch(t){return this.handleError(e,t,"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668","ACTIVE_MCP_SERVERS_UPDATE_ERROR","\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25",400)}}async resetStatus(e){try{return e.get("logger").info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),e.get("logger").info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.success(void 0,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F")}catch(t){return this.handleError(e,t,"\u91CD\u7F6E\u72B6\u6001","STATUS_RESET_ERROR")}}}});var Fi,$u=d(()=>{"use strict";Fi=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(Fi||{})});function Du(n,e){let t=Vg[e.field];return t?[...n].sort(t):(u.warn(`[sortTools] \u672A\u77E5\u7684\u6392\u5E8F\u5B57\u6BB5: ${e.field}`),n)}var Vg,ku=d(()=>{"use strict";D();Vg={name:i((n,e)=>n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN"),"name"),enabled:i((n,e)=>{let t=Number(e.enabled)-Number(n.enabled);return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"enabled"),usageCount:i((n,e)=>{let t=e.usageCount-n.usageCount;return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"usageCount"),lastUsedTime:i((n,e)=>{if(!n.lastUsedTime)return 1;if(!e.lastUsedTime)return-1;let t=new Date(e.lastUsedTime).getTime()-new Date(n.lastUsedTime).getTime();return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"lastUsedTime")};i(Du,"sortTools")});import{configManager as $}from"@xiaozhi-client/config";import jg from"ajv";import qn from"dayjs";var Gn,Fu=d(()=>{"use strict";D();In();Di();gt();$u();ku();Gn=class n{static{i(this,"MCPToolHandler")}static UNDERSCORE_TRIM_REGEX=/^_+|_+$/g;static LETTER_START_REGEX=/^[a-zA-Z]/;static CHINESE_CHAR_REGEX=/[\u4e00-\u9fa5]/;static DIGITS_ONLY_REGEX=/^\d+$/;static ALPHANUMERIC_UNDERSCORE_REGEX=/^[a-zA-Z0-9_-]+$/;static IDENTIFIER_REGEX=/^[a-zA-Z_][a-zA-Z0-9_]*$/;logger;ajv;static TOOL_TYPE_VALUES=Object.values(Fi);constructor(){this.logger=u,this.ajv=new jg({allErrors:!0,verbose:!0})}async callTool(e){try{e.get("logger").info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:s,args:o}=t;if(!r||!s)return e.fail("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570",void 0,400);e.get("logger").info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${s}\uFF0C\u53C2\u6570:`,JSON.stringify(o));let a=e.get("mcpServiceManager");if(!a)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);await this.validateServiceAndTool(a,r,s),r==="customMCP"&&await this.validateCustomMCPArguments(a,s,o||{});let c;if(r==="customMCP")c=await a.callTool(s,o||{},{timeout:au.LONG_RUNNING});else{let l=`${r}__${s}`;c=await a.callTool(l,o||{})}return e.success(c,"\u5DE5\u5177\u8C03\u7528\u6210\u529F")}catch(t){e.get("logger").error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),s="TOOL_CALL_ERROR";return r.includes("\u4E0D\u5B58\u5728")?s="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?s="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?s="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?s="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?s="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?s="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(s="TIMEOUT_ERROR"),e.fail(s,r,void 0,500)}}async getCustomTools(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!$.configExists())return e.fail("CONFIG_NOT_FOUND","\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E",void 0,404);let t=[],r="";try{t=$.getCustomMCPTools(),r=$.getConfigPath()}catch(o){return e.get("logger").error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",o),e.fail("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"}`,void 0,500)}return!t||t.length===0?(e.get("logger").info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.success({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")):$.validateCustomMCPTools(t)?(e.get("logger").info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.success({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F")):(e.get("logger").warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),e.fail("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",void 0,400))}catch(t){return e.get("logger").error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async listTools(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=e.req.query("sortBy"),s=["name","enabled","usageCount","lastUsedTime"],o=s.includes(r)?r:"name";if(r&&!s.includes(r))return e.fail("INVALID_SORT_FIELD",`\u65E0\u6548\u7684\u6392\u5E8F\u5B57\u6BB5: ${r}\u3002\u652F\u6301\u7684\u6392\u5E8F\u5B57\u6BB5: ${s.join(", ")}`,void 0,400);let a=e.get("mcpServiceManager");if(!a)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);let c=a.getAllTools(t);c=Du(c,{field:o});let l=c.map(m=>({name:m.name,description:m.description,inputSchema:m.inputSchema,handler:{type:"mcp",config:{serviceName:m.serviceName,toolName:m.originalName}},enabled:m.enabled,usageCount:m.usageCount,lastUsedTime:m.lastUsedTime})),p={list:l,total:l.length};return e.success(p,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`)}catch(t){return e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let s=e.getCustomMCPTools().map(o=>o.name);throw s.length===0?y.validationError("TOOL_NOT_FOUND",`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`):y.validationError("TOOL_NOT_FOUND",`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u53EF\u7528\u7684 customMCP \u5DE5\u5177: ${s.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let o=e.getCustomMCPTools().find(a=>a.name===r);o&&!o.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),o&&!o.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(s){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,s),y.validationError("TOOL_VALIDATION_FAILED",`customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49\u3002`)}return}}async validateCustomMCPArguments(e,t,r){try{let o=e.getCustomMCPTools().find(l=>l.name===t);if(!o)throw y.validationError("TOOL_NOT_FOUND",`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!o.inputSchema){this.logger.warn(`customMCP \u5DE5\u5177 '${t}' \u6CA1\u6709\u5B9A\u4E49 inputSchema\uFF0C\u8DF3\u8FC7\u53C2\u6570\u9A8C\u8BC1`);return}let a=this.ajv.compile(o.inputSchema);if(!a(r)){let m=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(a.errors||[]).map(f=>{let S=f.instancePath||f.schemaPath||"",g=f.message||"\u672A\u77E5\u9519\u8BEF";if(f.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${f.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(f.keyword==="type"){let P=f.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${S} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${P}`}if(f.keyword==="enum"){let P=f.params?.allowedValues||[];return`\u53C2\u6570 ${S} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${P.join(", ")}`}return`\u53C2\u6570 ${S} ${g}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,m),y.validationError("TOOL_VALIDATION_FAILED",m)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(s){throw s instanceof Error&&s.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?s:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,s),y.validationError("TOOL_VALIDATION_FAILED",`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{e.get("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){e.get("logger").error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{code:r,message:s,status:o}=this.handleAddToolError(t);return e.fail(r,s,void 0,o)}}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:s}=t;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!n.TOOL_TYPE_VALUES.includes(r))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${n.TOOL_TYPE_VALUES.join(", ")}`,void 0,400);switch(r){case"mcp":return await this.handleAddMCPTool(e,s);case"coze":return await this.handleAddCozeTool(e,s);case"http":case"function":return e.fail("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`,void 0,501);default:return e.fail("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`,void 0,400)}}async handleLegacyFormatAddTool(e,t){e.get("logger").info("\u5904\u7406\u65E7\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF08\u5411\u540E\u517C\u5BB9\uFF09");let{workflow:r,customName:s,customDescription:o,parameterConfig:a}=t,c=this.performPreChecks(r,s,o);if(c)return e.fail(c.code,c.message,void 0,c.status);let l=this.convertWorkflowToTool(r,s,o,a);return $.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.success({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`)}async handleAddMCPTool(e,t){let{serviceName:r,toolName:s,customName:o,customDescription:a}=t;if(e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${s}`),!r||!s)return e.fail("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5",void 0,400);let c=e.get("mcpServiceManager");if(!c)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);try{await this.validateServiceAndTool(c,r,s)}catch(b){let G=b instanceof Error?b.message:String(b);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",G,void 0,404)}let p=await new mt().getAllCachedTools(),m=`${r}__${s}`,f=p.find(b=>b.name===m);if(!f)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`,void 0,404);let S=o||m,g=$.getCustomMCPTools();if(new Set(g.map(b=>b.name)).has(S))return e.fail("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${S}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`,void 0,409);let w={name:S,description:a||f.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:f.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:qn().format("YYYY-MM-DD HH:mm:ss")}};$.addCustomMCPTool(w),e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`);let U=$.getServerToolsConfig(r);U?.toolName&&(U[s].enable=!0,$.updateServerToolsConfig(r,U),e.get("logger").info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${s}`)),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${S}`);let H={tool:w,toolName:S,toolType:"mcp",addedAt:qn().format("YYYY-MM-DD HH:mm:ss")};return e.success(H,`MCP \u5DE5\u5177 "${S}" \u6DFB\u52A0\u6210\u529F`)}async handleAddCozeTool(e,t){let{workflow:r,customName:s,customDescription:o,parameterConfig:a}=t;e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let c=this.performPreChecks(r,s,o);if(c)return e.fail(c.code,c.message,void 0,c.status);let l=this.convertWorkflowToTool(r,s,o,a);$.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let p={tool:l,toolName:l.name,toolType:"coze",addedAt:qn().format("YYYY-MM-DD HH:mm:ss")};return e.success(p,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`)}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t)return e.fail("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",void 0,400);e.get("logger").info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();return!r||typeof r!="object"?e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61",void 0,400):this.isNewFormatRequest(r)?await this.handleNewFormatUpdateTool(e,t,r):e.fail("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42",void 0,400)}catch(t){e.get("logger").error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{code:r,message:s,status:o}=this.handleUpdateToolError(t);return e.fail(r,s,void 0,o)}}async handleNewFormatUpdateTool(e,t,r){let{type:s,data:o}=r;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${s}`),!n.TOOL_TYPE_VALUES.includes(s))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${s}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${n.TOOL_TYPE_VALUES.join(", ")}`,void 0,400);switch(s){case"coze":return await this.handleUpdateCozeTool(e,t,o);case"mcp":case"http":case"function":return e.fail("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${s} \u6682\u4E0D\u652F\u6301\u66F4\u65B0\u64CD\u4F5C\uFF0C\u76EE\u524D\u4EC5\u652F\u6301 Coze \u7C7B\u578B`,void 0,501);default:return e.fail("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${s}`,void 0,400)}}async handleUpdateCozeTool(e,t,r){let{workflow:s,customName:o,customDescription:a,parameterConfig:c}=r;e.get("logger").info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let p=$.getCustomMCPTools().find(g=>g.name===t);if(!p)return e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`,void 0,404);if(p.handler.type!=="proxy"||p.handler.platform!=="coze")return e.fail("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`,void 0,400);!s.workflow_id&&p.handler?.config?.workflow_id&&(s.workflow_id=p.handler.config.workflow_id),!s.workflow_id&&s.app_id&&e.get("logger").warn(`\u5DE5\u4F5C\u6D41 ${t} \u7F3A\u5C11 workflow_id\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u67D0\u4E9B\u529F\u80FD`),this.validateWorkflowUpdateData(s);let m=this.generateInputSchema(s,c),f={...p,description:a||p.description,inputSchema:m};$.updateCustomMCPTool(t,f),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let S={tool:f,toolName:t,toolType:"coze",updatedAt:qn().format("YYYY-MM-DD HH:mm:ss")};return e.success(S,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`)}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{code:"TOOL_NOT_FOUND",message:`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`,status:404}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{code:"INVALID_TOOL_TYPE",message:t,status:400}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{code:"INVALID_REQUEST",message:`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`,status:400}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{code:"CONFIGURATION_ERROR",message:`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`,status:422}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{code:"TOOL_TYPE_NOT_IMPLEMENTED",message:t,status:501}:{code:"UPDATE_CUSTOM_TOOL_ERROR",message:`\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`,status:500}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t)return e.fail("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",void 0,400);e.get("logger").info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let s=$.getCustomMCPTools().find(o=>o.name===t);if(s&&s.handler.type==="mcp"){let o=s.handler.config;if(o.serviceName&&o.toolName){e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${o.serviceName}/${o.toolName}`);let a=$.getServerToolsConfig(o.serviceName);a?.[o.toolName]&&(a[o.toolName].enable=!1,$.updateServerToolsConfig(o.serviceName,a),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${o.serviceName}/${o.toolName}`))}}return $.removeCustomMCPTool(t),e.get("logger").info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.success(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`)}catch(t){e.get("logger").error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{code:r,message:s,status:o}=this.handleRemoveToolError(t);return e.fail(r,s,void 0,o)}}convertWorkflowToTool(e,t,r,s){this.validateWorkflowData(e);let o=t||this.sanitizeToolName(e.workflow_name),a=this.resolveToolNameConflict(o),c=this.generateToolDescription(e,r),l=this.generateInputSchema(e,s),p=this.createHttpHandler(e),m={name:a,description:c,inputSchema:l,handler:p};return this.validateGeneratedTool(m),m}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(n.UNDERSCORE_TRIM_REGEX,""),n.LETTER_START_REGEX.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[s,o]of Object.entries(t))r=r.replace(new RegExp(s,"g"),o);return n.CHINESE_CHAR_REGEX.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!n.DIGITS_ONLY_REGEX.test(e.workflow_id))throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.app_id))throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}validateRequiredFields(e){let t=[{field:"workflow_id",name:"\u5DE5\u4F5C\u6D41ID"},{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0"},{field:"app_id",name:"\u5E94\u7528ID"}];for(let{field:r,name:s}of t){let o=e[r];if(!o||typeof o!="string"||o.trim()==="")throw y.validationError("TOOL_VALIDATION_FAILED",`${s}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!n.DIGITS_ONLY_REGEX.test(e.workflow_id))throw y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.app_id))throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u66F4\u65B0\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233")}validateFieldLengths(e){let t=[{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0",max:100},{field:"description",name:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0",max:500},{field:"app_id",name:"\u5E94\u7528ID",max:50}];for(let{field:r,name:s,max:o}of t){let a=e[r];if(a&&a.length>o)throw y.validationError("TOOL_VALIDATION_FAILED",`${s}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${o}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw y.validationError("TOOL_VALIDATION_FAILED","\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4");let t=["admin","root","system","config","password","token"],r=e.workflow_name.toLowerCase();for(let s of t)if(r.includes(s))throw y.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${s}`)}resolveToolNameConflict(e){let t=$.getCustomMCPTools(),r=new Set(t.map(a=>a.name)),s=e,o=1;for(;r.has(s);)if(s=`${e}_${o}`,o++,o>999)throw y.operationError("OPERATION_FAILED",`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return s}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=$.getCozePlatformConfig();if(!e||!e.token)throw y.configError("INVALID_CONFIG","\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!$.validateCustomMCPTools([e]))throw y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED","\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 y.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw y.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw y.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw y.validationError("TOOL_VALIDATION_FAILED","HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw y.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw y.validationError("TOOL_VALIDATION_FAILED","Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw y.configError("INVALID_CONFIG","\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw y.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw y.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw y.validationError("TOOL_VALIDATION_FAILED",`\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 y.validationError("TOOL_VALIDATION_FAILED","Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.token))throw y.validationError("TOOL_VALIDATION_FAILED","Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw y.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw y.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let s=r.slice(2,-2).trim();if(!s||!n.IDENTIFIER_REGEX.test(s))throw y.validationError("TOOL_VALIDATION_FAILED",`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw y.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw y.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw y.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw y.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684required\u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4")}generateInputSchema(e,t){return t&&t.parameters.length>0?this.generateInputSchemaFromConfig(t):{type:"object",properties:{input:{type:"string",description:"\u8F93\u5165\u5185\u5BB9"}},required:["input"],additionalProperties:!1}}generateInputSchemaFromConfig(e){let t={},r=[];for(let s of e.parameters)t[s.fieldName]={type:s.type,description:s.description},s.required&&r.push(s.fieldName);return{type:"object",properties:t,required:r.length>0?r:void 0,additionalProperties:!1}}handleAddToolError(e){let t=e instanceof Error?e.message:"\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("TOOL_TYPE")?{code:"INVALID_TOOL_TYPE",message:t,status:400}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{code:"MISSING_REQUIRED_FIELD",message:t,status:400}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{code:"SERVICE_OR_TOOL_NOT_FOUND",message:t,status:404}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{code:"SERVICE_NOT_INITIALIZED",message:t,status:503}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{code:"TOOL_NAME_CONFLICT",message:`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`,status:409}:this.isValidationError(t)?{code:"VALIDATION_ERROR",message:this.formatValidationError(t),status:400}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{code:"CONFIGURATION_ERROR",message:`${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`,status:422}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{code:"RESOURCE_LIMIT_EXCEEDED",message:t,status:429}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{code:"TOOL_TYPE_NOT_IMPLEMENTED",message:t,status:501}:{code:"ADD_CUSTOM_TOOL_ERROR",message:`\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`,status:500}}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")?{code:"TOOL_NOT_FOUND",message:`${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`,status:404}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{code:"INVALID_REQUEST",message:`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`,status:400}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{code:"CONFIGURATION_ERROR",message:`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`,status:422}:{code:"REMOVE_CUSTOM_TOOL_ERROR",message:`\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`,status:500}}isValidationError(e){return["\u4E0D\u80FD\u4E3A\u7A7A","\u5FC5\u987B\u662F","\u683C\u5F0F\u65E0\u6548","\u8FC7\u957F","\u8FC7\u77ED","\u9A8C\u8BC1\u5931\u8D25","\u65E0\u6548","\u4E0D\u7B26\u5408","\u8D85\u8FC7","\u5C11\u4E8E","\u654F\u611F\u8BCD","\u65F6\u95F4","URL"].some(r=>e.includes(r))}formatValidationError(e){let t={\u5DE5\u4F5C\u6D41ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41ID",\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41\u540D\u79F0",\u5E94\u7528ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5E94\u7528ID",\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548:"\u5DE5\u4F5C\u6D41ID\u5E94\u4E3A\u6570\u5B57\u683C\u5F0F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u914D\u7F6E",\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548:"\u5E94\u7528ID\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26",\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u540D\u79F0",\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7500\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u63CF\u8FF0",\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u56FE\u6807URL\u5730\u5740",\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4:"\u5DE5\u4F5C\u6D41\u7684\u65F6\u95F4\u4FE1\u606F\u6709\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u6570\u636E",\u654F\u611F\u8BCD:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u5305\u542B\u654F\u611F\u8BCD\u6C47\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5"};for(let[r,s]of Object.entries(t))if(e.includes(r))return s;return e}performPreChecks(e,t,r){let s=this.checkBasicParameters(e,t,r);if(s)return s;let o=this.checkSystemStatus();if(o)return o;let a=this.checkResourceLimits();return a||null}checkBasicParameters(e,t,r){if(!e)return{code:"INVALID_REQUEST",message:"\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570",status:400};if(typeof e!="object")return{code:"INVALID_REQUEST",message:"workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B",status:400};if(!Array.isArray(e)){let s=e;if(!s.workflow_id||typeof s.workflow_id!="string"||!s.workflow_id.trim())return{code:"INVALID_REQUEST",message:"workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32",status:400};if(!s.workflow_name||typeof s.workflow_name!="string"||!s.workflow_name.trim())return{code:"INVALID_REQUEST",message:"workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32",status:400}}if(t!==void 0){if(typeof t!="string")return{code:"INVALID_REQUEST",message:"customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B",status:400};if(t.trim()==="")return{code:"INVALID_REQUEST",message:"customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32",status:400};if(t.length>50)return{code:"INVALID_REQUEST",message:"customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26",status:400}}if(r!==void 0){if(typeof r!="string")return{code:"INVALID_REQUEST",message:"customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B",status:400};if(r.length>200)return{code:"INVALID_REQUEST",message:"customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26",status:400}}return null}checkSystemStatus(){try{let e=$.getCozePlatformConfig();if(!e||!e.token)return{code:"CONFIGURATION_ERROR",message:"\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token",status:422};if(typeof e.token!="string"||e.token.trim()==="")return{code:"CONFIGURATION_ERROR",message:"\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token",status:422}}catch{return{code:"SYSTEM_ERROR",message:"\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",status:500}}return null}checkResourceLimits(){try{let e=$.getCustomMCPTools(),t=100;if(e.length>=t)return{code:"RESOURCE_LIMIT_EXCEEDED",message:`\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`,status:429};let r=JSON.stringify(e).length,s=1024*1024;if(r>s)return{code:"PAYLOAD_TOO_LARGE",message:"\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4",status:413}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}async manageMCPTool(e){try{let t=await e.req.json(),{action:r,serverName:s,toolName:o,description:a}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","action \u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let c=["enable","disable","status","toggle"];if(!c.includes(r))return e.fail("INVALID_ACTION",`\u65E0\u6548\u7684 action: ${r}\u3002\u652F\u6301\u7684 action: ${c.join(", ")}`,void 0,400);switch(this.validateToolIdentifier(s,o),r){case"enable":return this.handleEnableTool(e,s,o,a);case"disable":return this.handleDisableTool(e,s,o);case"status":return this.handleGetToolStatus(e,s,o);case"toggle":return this.handleToggleTool(e,s,o);default:return e.fail("INVALID_ACTION",`\u672A\u5B9E\u73B0\u7684 action: ${r}`,void 0,400)}}catch(t){e.get("logger").error("\u7BA1\u7406 MCP \u5DE5\u5177\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u7BA1\u7406 MCP \u5DE5\u5177\u5931\u8D25";return e.fail("TOOL_MANAGE_ERROR",r,void 0,500)}}async listMCPTools(e){try{let t=await e.req.json(),{serverName:r,includeUsageStats:s}=t;return r?this.handleListServerTools(e,r,s):this.handleListAllTools(e,s)}catch(t){return e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_TOOL_LIST_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async handleEnableTool(e,t,r,s){await this.validateServiceAndToolExistence(t,r),$.setToolEnabled(t,r,!0,s);let a=$.getServerToolsConfig(t)[r];return e.get("logger").info(`\u5DE5\u5177\u5DF2\u542F\u7528: ${t}/${r}`),e.success({serverName:t,toolName:r,enabled:!0,description:a?.description||s||""},`\u5DE5\u5177 "${t}__${r}" \u542F\u7528\u6210\u529F`)}async handleDisableTool(e,t,r){return await this.validateServiceAndToolExistence(t,r),$.setToolEnabled(t,r,!1),e.get("logger").info(`\u5DE5\u5177\u5DF2\u7981\u7528: ${t}/${r}`),e.success({serverName:t,toolName:r,enabled:!1},`\u5DE5\u5177 "${t}__${r}" \u7981\u7528\u6210\u529F`)}async handleGetToolStatus(e,t,r){let o=$.getServerToolsConfig(t)[r];return o?e.success({serverName:t,toolName:r,enabled:o.enable!==!1,description:o.description||"",usageCount:o.usageCount,lastUsedTime:o.lastUsedTime},"\u5DE5\u5177\u72B6\u6001\u83B7\u53D6\u6210\u529F"):e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}__${r}" \u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`,void 0,404)}async handleToggleTool(e,t,r){await this.validateServiceAndToolExistence(t,r);let o=!$.isToolEnabled(t,r);return $.setToolEnabled(t,r,o),e.get("logger").info(`\u5DE5\u5177\u72B6\u6001\u5DF2\u5207\u6362: ${t}/${r} -> ${o}`),e.success({serverName:t,toolName:r,enabled:o},`\u5DE5\u5177 "${t}__${r}" \u5DF2${o?"\u542F\u7528":"\u7981\u7528"}`)}async handleListServerTools(e,t,r){if(!$.getMcpServers()[t])return e.fail("SERVICE_NOT_FOUND",`MCP \u670D\u52A1 "${t}" \u4E0D\u5B58\u5728`,void 0,404);let o=$.getServerToolsConfig(t),a=Object.entries(o).map(([p,m])=>{let f={toolName:p,enabled:m.enable!==!1,description:m.description||""};return r&&(f.usageCount=m.usageCount,f.lastUsedTime=m.lastUsedTime),f}),c=a.filter(p=>p.enabled).length,l=a.length-c;return e.success({serverName:t,tools:a,total:a.length,enabledCount:c,disabledCount:l},"\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F")}async handleListAllTools(e,t){let r=$.getMcpServerConfig(),s={servers:[],totalTools:0,totalEnabled:0,totalDisabled:0};for(let[o,a]of Object.entries(r)){let c=Object.entries(a.tools||{}).map(([p,m])=>{let f={toolName:p,enabled:m.enable!==!1,description:m.description||""};return t&&(f.usageCount=m.usageCount,f.lastUsedTime=m.lastUsedTime),f}),l=c.filter(p=>p.enabled).length;s.servers.push({serverName:o,tools:c,total:c.length,enabledCount:l,disabledCount:c.length-l}),s.totalTools+=c.length,s.totalEnabled+=l,s.totalDisabled+=c.length-l}return e.success(s,"\u83B7\u53D6\u6240\u6709\u5DE5\u5177\u5217\u8868\u6210\u529F")}validateToolIdentifier(e,t){if(!e||typeof e!="string"||e.trim()==="")throw y.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e))throw y.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(t))throw y.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26")}async validateServiceAndToolExistence(e,t){if(!$.getMcpServers()[e])throw y.validationError("SERVER_NOT_FOUND",`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!$.getServerToolsConfig(e)[t])throw y.validationError("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}}});import{z as Et}from"zod";var Bg,Xn,Hu=d(()=>{"use strict";Ei();$n();ke();Bg=Et.object({limit:Et.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=hi.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${hi.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Et.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:Et.string().optional(),serverName:Et.string().optional(),success:Et.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Et.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:Et.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"]}),Xn=class extends J{static{i(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new Ln}parseAndValidateQueryParams(e){let t=e.req.query(),r=Bg.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.issues.map(s=>({field:s.path.join("."),message:s.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return e.fail("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error,400);let r=await this.toolCallLogService.getToolCallLogs(t.data);return e.get("logger").debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),e.success(r)}catch(t){e.get("logger").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")?e.fail("LOG_FILE_NOT_FOUND",r,void 0,404):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?e.fail("LOG_FILE_READ_ERROR",r,void 0,500):e.fail("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r},500)}}}});var Ns=x((JR,Uu)=>{"use strict";var zg="2.0.0",Wg=Number.MAX_SAFE_INTEGER||9007199254740991,qg=16,Gg=250,Xg=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Uu.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:qg,MAX_SAFE_BUILD_LENGTH:Gg,MAX_SAFE_INTEGER:Wg,RELEASE_TYPES:Xg,SEMVER_SPEC_VERSION:zg,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Ls=x((KR,Vu)=>{"use strict";var Jg=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};Vu.exports=Jg});var Cr=x((Ue,ju)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Hi,MAX_SAFE_BUILD_LENGTH:Kg,MAX_LENGTH:Yg}=Ns(),Qg=Ls();Ue=ju.exports={};var Zg=Ue.re=[],eh=Ue.safeRe=[],_=Ue.src=[],th=Ue.safeSrc=[],R=Ue.t={},rh=0,Ui="[a-zA-Z0-9-]",sh=[["\\s",1],["\\d",Yg],[Ui,Kg]],nh=i(n=>{for(let[e,t]of sh)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),N=i((n,e,t)=>{let r=nh(e),s=rh++;Qg(n,s,e),R[n]=s,_[s]=e,th[s]=r,Zg[s]=new RegExp(e,t?"g":void 0),eh[s]=new RegExp(r,t?"g":void 0)},"createToken");N("NUMERICIDENTIFIER","0|[1-9]\\d*");N("NUMERICIDENTIFIERLOOSE","\\d+");N("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Ui}*`);N("MAINVERSION",`(${_[R.NUMERICIDENTIFIER]})\\.(${_[R.NUMERICIDENTIFIER]})\\.(${_[R.NUMERICIDENTIFIER]})`);N("MAINVERSIONLOOSE",`(${_[R.NUMERICIDENTIFIERLOOSE]})\\.(${_[R.NUMERICIDENTIFIERLOOSE]})\\.(${_[R.NUMERICIDENTIFIERLOOSE]})`);N("PRERELEASEIDENTIFIER",`(?:${_[R.NONNUMERICIDENTIFIER]}|${_[R.NUMERICIDENTIFIER]})`);N("PRERELEASEIDENTIFIERLOOSE",`(?:${_[R.NONNUMERICIDENTIFIER]}|${_[R.NUMERICIDENTIFIERLOOSE]})`);N("PRERELEASE",`(?:-(${_[R.PRERELEASEIDENTIFIER]}(?:\\.${_[R.PRERELEASEIDENTIFIER]})*))`);N("PRERELEASELOOSE",`(?:-?(${_[R.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${_[R.PRERELEASEIDENTIFIERLOOSE]})*))`);N("BUILDIDENTIFIER",`${Ui}+`);N("BUILD",`(?:\\+(${_[R.BUILDIDENTIFIER]}(?:\\.${_[R.BUILDIDENTIFIER]})*))`);N("FULLPLAIN",`v?${_[R.MAINVERSION]}${_[R.PRERELEASE]}?${_[R.BUILD]}?`);N("FULL",`^${_[R.FULLPLAIN]}$`);N("LOOSEPLAIN",`[v=\\s]*${_[R.MAINVERSIONLOOSE]}${_[R.PRERELEASELOOSE]}?${_[R.BUILD]}?`);N("LOOSE",`^${_[R.LOOSEPLAIN]}$`);N("GTLT","((?:<|>)?=?)");N("XRANGEIDENTIFIERLOOSE",`${_[R.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);N("XRANGEIDENTIFIER",`${_[R.NUMERICIDENTIFIER]}|x|X|\\*`);N("XRANGEPLAIN",`[v=\\s]*(${_[R.XRANGEIDENTIFIER]})(?:\\.(${_[R.XRANGEIDENTIFIER]})(?:\\.(${_[R.XRANGEIDENTIFIER]})(?:${_[R.PRERELEASE]})?${_[R.BUILD]}?)?)?`);N("XRANGEPLAINLOOSE",`[v=\\s]*(${_[R.XRANGEIDENTIFIERLOOSE]})(?:\\.(${_[R.XRANGEIDENTIFIERLOOSE]})(?:\\.(${_[R.XRANGEIDENTIFIERLOOSE]})(?:${_[R.PRERELEASELOOSE]})?${_[R.BUILD]}?)?)?`);N("XRANGE",`^${_[R.GTLT]}\\s*${_[R.XRANGEPLAIN]}$`);N("XRANGELOOSE",`^${_[R.GTLT]}\\s*${_[R.XRANGEPLAINLOOSE]}$`);N("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Hi}})(?:\\.(\\d{1,${Hi}}))?(?:\\.(\\d{1,${Hi}}))?`);N("COERCE",`${_[R.COERCEPLAIN]}(?:$|[^\\d])`);N("COERCEFULL",_[R.COERCEPLAIN]+`(?:${_[R.PRERELEASE]})?(?:${_[R.BUILD]})?(?:$|[^\\d])`);N("COERCERTL",_[R.COERCE],!0);N("COERCERTLFULL",_[R.COERCEFULL],!0);N("LONETILDE","(?:~>?)");N("TILDETRIM",`(\\s*)${_[R.LONETILDE]}\\s+`,!0);Ue.tildeTrimReplace="$1~";N("TILDE",`^${_[R.LONETILDE]}${_[R.XRANGEPLAIN]}$`);N("TILDELOOSE",`^${_[R.LONETILDE]}${_[R.XRANGEPLAINLOOSE]}$`);N("LONECARET","(?:\\^)");N("CARETTRIM",`(\\s*)${_[R.LONECARET]}\\s+`,!0);Ue.caretTrimReplace="$1^";N("CARET",`^${_[R.LONECARET]}${_[R.XRANGEPLAIN]}$`);N("CARETLOOSE",`^${_[R.LONECARET]}${_[R.XRANGEPLAINLOOSE]}$`);N("COMPARATORLOOSE",`^${_[R.GTLT]}\\s*(${_[R.LOOSEPLAIN]})$|^$`);N("COMPARATOR",`^${_[R.GTLT]}\\s*(${_[R.FULLPLAIN]})$|^$`);N("COMPARATORTRIM",`(\\s*)${_[R.GTLT]}\\s*(${_[R.LOOSEPLAIN]}|${_[R.XRANGEPLAIN]})`,!0);Ue.comparatorTrimReplace="$1$2$3";N("HYPHENRANGE",`^\\s*(${_[R.XRANGEPLAIN]})\\s+-\\s+(${_[R.XRANGEPLAIN]})\\s*$`);N("HYPHENRANGELOOSE",`^\\s*(${_[R.XRANGEPLAINLOOSE]})\\s+-\\s+(${_[R.XRANGEPLAINLOOSE]})\\s*$`);N("STAR","(<|>)?=?\\s*\\*");N("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");N("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Jn=x((QR,Bu)=>{"use strict";var oh=Object.freeze({loose:!0}),ih=Object.freeze({}),ah=i(n=>n?typeof n!="object"?oh:n:ih,"parseOptions");Bu.exports=ah});var Vi=x((eP,qu)=>{"use strict";var zu=/^[0-9]+$/,Wu=i((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=zu.test(n),r=zu.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),ch=i((n,e)=>Wu(e,n),"rcompareIdentifiers");qu.exports={compareIdentifiers:Wu,rcompareIdentifiers:ch}});var ae=x((rP,Xu)=>{"use strict";var Kn=Ls(),{MAX_LENGTH:Gu,MAX_SAFE_INTEGER:Yn}=Ns(),{safeRe:Qn,t:Zn}=Cr(),lh=Jn(),{compareIdentifiers:ji}=Vi(),Bi=class n{static{i(this,"SemVer")}constructor(e,t){if(t=lh(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>Gu)throw new TypeError(`version is longer than ${Gu} characters`);Kn("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Qn[Zn.LOOSE]:Qn[Zn.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>Yn||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Yn||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Yn||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(s=>{if(/^[0-9]+$/.test(s)){let o=+s;if(o>=0&&o<Yn)return o}return s}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(Kn("SemVer.compare",this.version,this.options,e),!(e instanceof n)){if(typeof e=="string"&&e===this.version)return 0;e=new n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof n||(e=new n(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof n||(e=new n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],s=e.prerelease[t];if(Kn("prerelease compare",t,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return ji(r,s)}while(++t)}compareBuild(e){e instanceof n||(e=new n(e,this.options));let t=0;do{let r=this.build[t],s=e.build[t];if(Kn("build compare",t,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return ji(r,s)}while(++t)}inc(e,t,r){if(e.startsWith("pre")){if(!t&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(t){let s=`-${t}`.match(this.options.loose?Qn[Zn.PRERELEASELOOSE]:Qn[Zn.PRERELEASE]);if(!s||s[1]!==t)throw new Error(`invalid identifier: ${t}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t,r),this.inc("pre",t,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",t,r),this.inc("pre",t,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let s=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[s];else{let o=this.prerelease.length;for(;--o>=0;)typeof this.prerelease[o]=="number"&&(this.prerelease[o]++,o=-2);if(o===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(s)}}if(t){let o=[t,s];r===!1&&(o=[t]),ji(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=o):this.prerelease=o}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};Xu.exports=Bi});var Ft=x((nP,Ku)=>{"use strict";var Ju=ae(),uh=i((n,e,t=!1)=>{if(n instanceof Ju)return n;try{return new Ju(n,e)}catch(r){if(!t)return null;throw r}},"parse");Ku.exports=uh});var Qu=x((iP,Yu)=>{"use strict";var ph=Ft(),dh=i((n,e)=>{let t=ph(n,e);return t?t.version:null},"valid");Yu.exports=dh});var ep=x((cP,Zu)=>{"use strict";var fh=Ft(),mh=i((n,e)=>{let t=fh(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Zu.exports=mh});var sp=x((uP,rp)=>{"use strict";var tp=ae(),gh=i((n,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new tp(n instanceof tp?n.version:n,t).inc(e,r,s).version}catch{return null}},"inc");rp.exports=gh});var ip=x((dP,op)=>{"use strict";var np=Ft(),hh=i((n,e)=>{let t=np(n,null,!0),r=np(e,null,!0),s=t.compare(r);if(s===0)return null;let o=s>0,a=o?t:r,c=o?r:t,l=!!a.prerelease.length;if(!!c.prerelease.length&&!l){if(!c.patch&&!c.minor)return"major";if(c.compareMain(a)===0)return c.minor&&!c.patch?"minor":"patch"}let m=l?"pre":"";return t.major!==r.major?m+"major":t.minor!==r.minor?m+"minor":t.patch!==r.patch?m+"patch":"prerelease"},"diff");op.exports=hh});var cp=x((mP,ap)=>{"use strict";var Eh=ae(),Ch=i((n,e)=>new Eh(n,e).major,"major");ap.exports=Ch});var up=x((hP,lp)=>{"use strict";var Sh=ae(),vh=i((n,e)=>new Sh(n,e).minor,"minor");lp.exports=vh});var dp=x((CP,pp)=>{"use strict";var yh=ae(),Th=i((n,e)=>new yh(n,e).patch,"patch");pp.exports=Th});var mp=x((vP,fp)=>{"use strict";var _h=Ft(),Rh=i((n,e)=>{let t=_h(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");fp.exports=Rh});var Pe=x((TP,hp)=>{"use strict";var gp=ae(),Ph=i((n,e,t)=>new gp(n,t).compare(new gp(e,t)),"compare");hp.exports=Ph});var Cp=x((RP,Ep)=>{"use strict";var bh=Pe(),Ah=i((n,e,t)=>bh(e,n,t),"rcompare");Ep.exports=Ah});var vp=x((bP,Sp)=>{"use strict";var wh=Pe(),Ih=i((n,e)=>wh(n,e,!0),"compareLoose");Sp.exports=Ih});var eo=x((wP,Tp)=>{"use strict";var yp=ae(),Mh=i((n,e,t)=>{let r=new yp(n,t),s=new yp(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");Tp.exports=Mh});var Rp=x((MP,_p)=>{"use strict";var xh=eo(),Oh=i((n,e)=>n.sort((t,r)=>xh(t,r,e)),"sort");_p.exports=Oh});var bp=x((OP,Pp)=>{"use strict";var Nh=eo(),Lh=i((n,e)=>n.sort((t,r)=>Nh(r,t,e)),"rsort");Pp.exports=Lh});var $s=x((LP,Ap)=>{"use strict";var $h=Pe(),Dh=i((n,e,t)=>$h(n,e,t)>0,"gt");Ap.exports=Dh});var to=x((DP,wp)=>{"use strict";var kh=Pe(),Fh=i((n,e,t)=>kh(n,e,t)<0,"lt");wp.exports=Fh});var zi=x((FP,Ip)=>{"use strict";var Hh=Pe(),Uh=i((n,e,t)=>Hh(n,e,t)===0,"eq");Ip.exports=Uh});var Wi=x((UP,Mp)=>{"use strict";var Vh=Pe(),jh=i((n,e,t)=>Vh(n,e,t)!==0,"neq");Mp.exports=jh});var ro=x((jP,xp)=>{"use strict";var Bh=Pe(),zh=i((n,e,t)=>Bh(n,e,t)>=0,"gte");xp.exports=zh});var so=x((zP,Op)=>{"use strict";var Wh=Pe(),qh=i((n,e,t)=>Wh(n,e,t)<=0,"lte");Op.exports=qh});var qi=x((qP,Np)=>{"use strict";var Gh=zi(),Xh=Wi(),Jh=$s(),Kh=ro(),Yh=to(),Qh=so(),Zh=i((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 Gh(n,t,r);case"!=":return Xh(n,t,r);case">":return Jh(n,t,r);case">=":return Kh(n,t,r);case"<":return Yh(n,t,r);case"<=":return Qh(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Np.exports=Zh});var $p=x((XP,Lp)=>{"use strict";var eE=ae(),tE=Ft(),{safeRe:no,t:oo}=Cr(),rE=i((n,e)=>{if(n instanceof eE)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?no[oo.COERCEFULL]:no[oo.COERCE]);else{let l=e.includePrerelease?no[oo.COERCERTLFULL]:no[oo.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],s=t[3]||"0",o=t[4]||"0",a=e.includePrerelease&&t[5]?`-${t[5]}`:"",c=e.includePrerelease&&t[6]?`+${t[6]}`:"";return tE(`${r}.${s}.${o}${a}${c}`,e)},"coerce");Lp.exports=rE});var kp=x((KP,Dp)=>{"use strict";var Gi=class{static{i(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let s=this.map.keys().next().value;this.delete(s)}this.map.set(e,t)}return this}};Dp.exports=Gi});var be=x((QP,Vp)=>{"use strict";var sE=/\s+/g,Xi=class n{static{i(this,"Range")}constructor(e,t){if(t=oE(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof Ji)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(sE," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(s=>!Hp(s[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let s of this.set)if(s.length===1&&dE(s[0])){this.set=[s];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let t=this.set[e];for(let r=0;r<t.length;r++)r>0&&(this.formatted+=" "),this.formatted+=t[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let r=((this.options.includePrerelease&&uE)|(this.options.loose&&pE))+":"+e,s=Fp.get(r);if(s)return s;let o=this.options.loose,a=o?de[ce.HYPHENRANGELOOSE]:de[ce.HYPHENRANGE];e=e.replace(a,TE(this.options.includePrerelease)),B("hyphen replace",e),e=e.replace(de[ce.COMPARATORTRIM],aE),B("comparator trim",e),e=e.replace(de[ce.TILDETRIM],cE),B("tilde trim",e),e=e.replace(de[ce.CARETTRIM],lE),B("caret trim",e);let c=e.split(" ").map(f=>fE(f,this.options)).join(" ").split(/\s+/).map(f=>yE(f,this.options));o&&(c=c.filter(f=>(B("loose invalid filter",f,this.options),!!f.match(de[ce.COMPARATORLOOSE])))),B("range list",c);let l=new Map,p=c.map(f=>new Ji(f,this.options));for(let f of p){if(Hp(f))return[f];l.set(f.value,f)}l.size>1&&l.has("")&&l.delete("");let m=[...l.values()];return Fp.set(r,m),m}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Up(r,t)&&e.set.some(s=>Up(s,t)&&r.every(o=>s.every(a=>o.intersects(a,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new iE(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(_E(this.set[t],e,this.options))return!0;return!1}};Vp.exports=Xi;var nE=kp(),Fp=new nE,oE=Jn(),Ji=Ds(),B=Ls(),iE=ae(),{safeRe:de,t:ce,comparatorTrimReplace:aE,tildeTrimReplace:cE,caretTrimReplace:lE}=Cr(),{FLAG_INCLUDE_PRERELEASE:uE,FLAG_LOOSE:pE}=Ns(),Hp=i(n=>n.value==="<0.0.0-0","isNullSet"),dE=i(n=>n.value==="","isAny"),Up=i((n,e)=>{let t=!0,r=n.slice(),s=r.pop();for(;t&&r.length;)t=r.every(o=>s.intersects(o,e)),s=r.pop();return t},"isSatisfiable"),fE=i((n,e)=>(n=n.replace(de[ce.BUILD],""),B("comp",n,e),n=hE(n,e),B("caret",n),n=mE(n,e),B("tildes",n),n=CE(n,e),B("xrange",n),n=vE(n,e),B("stars",n),n),"parseComparator"),fe=i(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),mE=i((n,e)=>n.trim().split(/\s+/).map(t=>gE(t,e)).join(" "),"replaceTildes"),gE=i((n,e)=>{let t=e.loose?de[ce.TILDELOOSE]:de[ce.TILDE];return n.replace(t,(r,s,o,a,c)=>{B("tilde",n,r,s,o,a,c);let l;return fe(s)?l="":fe(o)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:fe(a)?l=`>=${s}.${o}.0 <${s}.${+o+1}.0-0`:c?(B("replaceTilde pr",c),l=`>=${s}.${o}.${a}-${c} <${s}.${+o+1}.0-0`):l=`>=${s}.${o}.${a} <${s}.${+o+1}.0-0`,B("tilde return",l),l})},"replaceTilde"),hE=i((n,e)=>n.trim().split(/\s+/).map(t=>EE(t,e)).join(" "),"replaceCarets"),EE=i((n,e)=>{B("caret",n,e);let t=e.loose?de[ce.CARETLOOSE]:de[ce.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(s,o,a,c,l)=>{B("caret",n,s,o,a,c,l);let p;return fe(o)?p="":fe(a)?p=`>=${o}.0.0${r} <${+o+1}.0.0-0`:fe(c)?o==="0"?p=`>=${o}.${a}.0${r} <${o}.${+a+1}.0-0`:p=`>=${o}.${a}.0${r} <${+o+1}.0.0-0`:l?(B("replaceCaret pr",l),o==="0"?a==="0"?p=`>=${o}.${a}.${c}-${l} <${o}.${a}.${+c+1}-0`:p=`>=${o}.${a}.${c}-${l} <${o}.${+a+1}.0-0`:p=`>=${o}.${a}.${c}-${l} <${+o+1}.0.0-0`):(B("no pr"),o==="0"?a==="0"?p=`>=${o}.${a}.${c}${r} <${o}.${a}.${+c+1}-0`:p=`>=${o}.${a}.${c}${r} <${o}.${+a+1}.0-0`:p=`>=${o}.${a}.${c} <${+o+1}.0.0-0`),B("caret return",p),p})},"replaceCaret"),CE=i((n,e)=>(B("replaceXRanges",n,e),n.split(/\s+/).map(t=>SE(t,e)).join(" ")),"replaceXRanges"),SE=i((n,e)=>{n=n.trim();let t=e.loose?de[ce.XRANGELOOSE]:de[ce.XRANGE];return n.replace(t,(r,s,o,a,c,l)=>{B("xRange",n,r,s,o,a,c,l);let p=fe(o),m=p||fe(a),f=m||fe(c),S=f;return s==="="&&S&&(s=""),l=e.includePrerelease?"-0":"",p?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&S?(m&&(a=0),c=0,s===">"?(s=">=",m?(o=+o+1,a=0,c=0):(a=+a+1,c=0)):s==="<="&&(s="<",m?o=+o+1:a=+a+1),s==="<"&&(l="-0"),r=`${s+o}.${a}.${c}${l}`):m?r=`>=${o}.0.0${l} <${+o+1}.0.0-0`:f&&(r=`>=${o}.${a}.0${l} <${o}.${+a+1}.0-0`),B("xRange return",r),r})},"replaceXRange"),vE=i((n,e)=>(B("replaceStars",n,e),n.trim().replace(de[ce.STAR],"")),"replaceStars"),yE=i((n,e)=>(B("replaceGTE0",n,e),n.trim().replace(de[e.includePrerelease?ce.GTE0PRE:ce.GTE0],"")),"replaceGTE0"),TE=i(n=>(e,t,r,s,o,a,c,l,p,m,f,S)=>(fe(r)?t="":fe(s)?t=`>=${r}.0.0${n?"-0":""}`:fe(o)?t=`>=${r}.${s}.0${n?"-0":""}`:a?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,fe(p)?l="":fe(m)?l=`<${+p+1}.0.0-0`:fe(f)?l=`<${p}.${+m+1}.0-0`:S?l=`<=${p}.${m}.${f}-${S}`:n?l=`<${p}.${m}.${+f+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),_E=i((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(B(n[r].semver),n[r].semver!==Ji.ANY&&n[r].semver.prerelease.length>0){let s=n[r].semver;if(s.major===e.major&&s.minor===e.minor&&s.patch===e.patch)return!0}return!1}return!0},"testSet")});var Ds=x((eb,Gp)=>{"use strict";var ks=Symbol("SemVer ANY"),Qi=class n{static{i(this,"Comparator")}static get ANY(){return ks}constructor(e,t){if(t=jp(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Yi("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ks?this.value="":this.value=this.operator+this.semver.version,Yi("comp",this)}parse(e){let t=this.options.loose?Bp[zp.COMPARATORLOOSE]:Bp[zp.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 Wp(r[2],this.options.loose):this.semver=ks}toString(){return this.value}test(e){if(Yi("Comparator.test",e,this.options.loose),this.semver===ks||e===ks)return!0;if(typeof e=="string")try{e=new Wp(e,this.options)}catch{return!1}return Ki(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 qp(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new qp(this.value,t).test(e.semver):(t=jp(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("=")||Ki(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Ki(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Gp.exports=Qi;var jp=Jn(),{safeRe:Bp,t:zp}=Cr(),Ki=qi(),Yi=Ls(),Wp=ae(),qp=be()});var Fs=x((rb,Xp)=>{"use strict";var RE=be(),PE=i((n,e,t)=>{try{e=new RE(e,t)}catch{return!1}return e.test(n)},"satisfies");Xp.exports=PE});var Kp=x((nb,Jp)=>{"use strict";var bE=be(),AE=i((n,e)=>new bE(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");Jp.exports=AE});var Qp=x((ib,Yp)=>{"use strict";var wE=ae(),IE=be(),ME=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new IE(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===-1)&&(r=a,s=new wE(r,t))}),r},"maxSatisfying");Yp.exports=ME});var ed=x((cb,Zp)=>{"use strict";var xE=ae(),OE=be(),NE=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new OE(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===1)&&(r=a,s=new xE(r,t))}),r},"minSatisfying");Zp.exports=NE});var sd=x((ub,rd)=>{"use strict";var Zi=ae(),LE=be(),td=$s(),$E=i((n,e)=>{n=new LE(n,e);let t=new Zi("0.0.0");if(n.test(t)||(t=new Zi("0.0.0-0"),n.test(t)))return t;t=null;for(let r=0;r<n.set.length;++r){let s=n.set[r],o=null;s.forEach(a=>{let c=new Zi(a.semver.version);switch(a.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!o||td(c,o))&&(o=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${a.operator}`)}}),o&&(!t||td(t,o))&&(t=o)}return t&&n.test(t)?t:null},"minVersion");rd.exports=$E});var od=x((db,nd)=>{"use strict";var DE=be(),kE=i((n,e)=>{try{return new DE(n,e).range||"*"}catch{return null}},"validRange");nd.exports=kE});var io=x((mb,ld)=>{"use strict";var FE=ae(),cd=Ds(),{ANY:HE}=cd,UE=be(),VE=Fs(),id=$s(),ad=to(),jE=so(),BE=ro(),zE=i((n,e,t,r)=>{n=new FE(n,r),e=new UE(e,r);let s,o,a,c,l;switch(t){case">":s=id,o=jE,a=ad,c=">",l=">=";break;case"<":s=ad,o=BE,a=id,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(VE(n,e,r))return!1;for(let p=0;p<e.set.length;++p){let m=e.set[p],f=null,S=null;if(m.forEach(g=>{g.semver===HE&&(g=new cd(">=0.0.0")),f=f||g,S=S||g,s(g.semver,f.semver,r)?f=g:a(g.semver,S.semver,r)&&(S=g)}),f.operator===c||f.operator===l||(!S.operator||S.operator===c)&&o(n,S.semver))return!1;if(S.operator===l&&a(n,S.semver))return!1}return!0},"outside");ld.exports=zE});var pd=x((hb,ud)=>{"use strict";var WE=io(),qE=i((n,e,t)=>WE(n,e,">",t),"gtr");ud.exports=qE});var fd=x((Cb,dd)=>{"use strict";var GE=io(),XE=i((n,e,t)=>GE(n,e,"<",t),"ltr");dd.exports=XE});var hd=x((vb,gd)=>{"use strict";var md=be(),JE=i((n,e,t)=>(n=new md(n,t),e=new md(e,t),n.intersects(e,t)),"intersects");gd.exports=JE});var Cd=x((Tb,Ed)=>{"use strict";var KE=Fs(),YE=Pe();Ed.exports=(n,e,t)=>{let r=[],s=null,o=null,a=n.sort((m,f)=>YE(m,f,t));for(let m of a)KE(m,e,t)?(o=m,s||(s=m)):(o&&r.push([s,o]),o=null,s=null);s&&r.push([s,null]);let c=[];for(let[m,f]of r)m===f?c.push(m):!f&&m===a[0]?c.push("*"):f?m===a[0]?c.push(`<=${f}`):c.push(`${m} - ${f}`):c.push(`>=${m}`);let l=c.join(" || "),p=typeof e.raw=="string"?e.raw:String(e);return l.length<p.length?l:e}});var Rd=x((_b,_d)=>{"use strict";var Sd=be(),ta=Ds(),{ANY:ea}=ta,Hs=Fs(),ra=Pe(),QE=i((n,e,t={})=>{if(n===e)return!0;n=new Sd(n,t),e=new Sd(e,t);let r=!1;e:for(let s of n.set){for(let o of e.set){let a=eC(s,o,t);if(r=r||a!==null,a)continue e}if(r)return!1}return!0},"subset"),ZE=[new ta(">=0.0.0-0")],vd=[new ta(">=0.0.0")],eC=i((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===ea){if(e.length===1&&e[0].semver===ea)return!0;t.includePrerelease?n=ZE:n=vd}if(e.length===1&&e[0].semver===ea){if(t.includePrerelease)return!0;e=vd}let r=new Set,s,o;for(let g of n)g.operator===">"||g.operator===">="?s=yd(s,g,t):g.operator==="<"||g.operator==="<="?o=Td(o,g,t):r.add(g.semver);if(r.size>1)return null;let a;if(s&&o){if(a=ra(s.semver,o.semver,t),a>0)return null;if(a===0&&(s.operator!==">="||o.operator!=="<="))return null}for(let g of r){if(s&&!Hs(g,String(s),t)||o&&!Hs(g,String(o),t))return null;for(let P of e)if(!Hs(g,String(P),t))return!1;return!0}let c,l,p,m,f=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1,S=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1;f&&f.prerelease.length===1&&o.operator==="<"&&f.prerelease[0]===0&&(f=!1);for(let g of e){if(m=m||g.operator===">"||g.operator===">=",p=p||g.operator==="<"||g.operator==="<=",s){if(S&&g.semver.prerelease&&g.semver.prerelease.length&&g.semver.major===S.major&&g.semver.minor===S.minor&&g.semver.patch===S.patch&&(S=!1),g.operator===">"||g.operator===">="){if(c=yd(s,g,t),c===g&&c!==s)return!1}else if(s.operator===">="&&!Hs(s.semver,String(g),t))return!1}if(o){if(f&&g.semver.prerelease&&g.semver.prerelease.length&&g.semver.major===f.major&&g.semver.minor===f.minor&&g.semver.patch===f.patch&&(f=!1),g.operator==="<"||g.operator==="<="){if(l=Td(o,g,t),l===g&&l!==o)return!1}else if(o.operator==="<="&&!Hs(o.semver,String(g),t))return!1}if(!g.operator&&(o||s)&&a!==0)return!1}return!(s&&p&&!o&&a!==0||o&&m&&!s&&a!==0||S||f)},"simpleSubset"),yd=i((n,e,t)=>{if(!n)return e;let r=ra(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),Td=i((n,e,t)=>{if(!n)return e;let r=ra(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");_d.exports=QE});var wd=x((Pb,Ad)=>{"use strict";var sa=Cr(),Pd=Ns(),tC=ae(),bd=Vi(),rC=Ft(),sC=Qu(),nC=ep(),oC=sp(),iC=ip(),aC=cp(),cC=up(),lC=dp(),uC=mp(),pC=Pe(),dC=Cp(),fC=vp(),mC=eo(),gC=Rp(),hC=bp(),EC=$s(),CC=to(),SC=zi(),vC=Wi(),yC=ro(),TC=so(),_C=qi(),RC=$p(),PC=Ds(),bC=be(),AC=Fs(),wC=Kp(),IC=Qp(),MC=ed(),xC=sd(),OC=od(),NC=io(),LC=pd(),$C=fd(),DC=hd(),kC=Cd(),FC=Rd();Ad.exports={parse:rC,valid:sC,clean:nC,inc:oC,diff:iC,major:aC,minor:cC,patch:lC,prerelease:uC,compare:pC,rcompare:dC,compareLoose:fC,compareBuild:mC,sort:gC,rsort:hC,gt:EC,lt:CC,eq:SC,neq:vC,gte:yC,lte:TC,cmp:_C,coerce:RC,Comparator:PC,Range:bC,satisfies:AC,toComparators:wC,maxSatisfying:IC,minSatisfying:MC,minVersion:xC,validRange:OC,outside:NC,gtr:LC,ltr:$C,intersects:DC,simplifyRange:kC,subset:FC,SemVer:tC,re:sa.re,src:sa.src,tokens:sa.t,SEMVER_SPEC_VERSION:Pd.SEMVER_SPEC_VERSION,RELEASE_TYPES:Pd.RELEASE_TYPES,compareIdentifiers:bd.compareIdentifiers,rcompareIdentifiers:bd.rcompareIdentifiers}});import{exec as HC,spawn as UC}from"child_process";import{promisify as VC}from"util";var Us,Id,Ht,Md=d(()=>{"use strict";D();Ce();Us=rg(wd(),1),Id=VC(HC),Ht=class{static{i(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||k()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();u.info("\u5F00\u59CB\u5B89\u88C5",{version:e,installId:t}),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let s=UC("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]),o=i(()=>{s.removeAllListeners("error"),s.removeAllListeners("close"),s.stdout?.removeAllListeners("data"),s.stderr?.removeAllListeners("data"),s.stdout?.destroy(),s.stderr?.destroy()},"cleanup");return new Promise((a,c)=>{s.on("error",l=>{let p=`\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${l.message}`;o(),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:p,duration:Date.now()-r,timestamp:Date.now()}),c(l)}),s.stdout.on("data",l=>{let p=l.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:p,timestamp:Date.now()})}),s.stderr.on("data",l=>{let p=l.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:p,timestamp:Date.now()})}),s.on("close",l=>{let p=Date.now()-r;if(o(),l===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:p,timestamp:Date.now()}),a();else{let m=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${l}`;u.error("\u5B89\u88C5\u5931\u8D25",{code:l}),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:m,duration:p,timestamp:Date.now()}),c(new Error(m))}})})}async getCurrentVersion(){let{stdout:e}=await Id("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 Id("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(o=>o&&typeof o=="string"&&Us.default.valid(o));return e!=="all"&&(s=s.filter(o=>{let a=Us.default.prerelease(o);return e==="stable"?a===null:e==="rc"?a!==null&&a[0]?.toString()?.toLowerCase()?.startsWith("rc")===!0:e==="beta"?a!==null&&a[0]?.toString()?.toLowerCase()?.startsWith("beta")===!0:!0})),s.sort((o,a)=>Us.default.rcompare(o,a))}catch(t){return u.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25",{error:t}),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],s=!1;try{s=Us.default.gt(r,e)}catch(o){u.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u5B57\u7B26\u4E32\u6BD4\u8F83",{error:o}),s=r!==e}return u.debug("\u7248\u672C\u68C0\u67E5\u5B8C\u6210",{currentVersion:e,latestVersion:r,hasUpdate:s}),{currentVersion:e,latestVersion:r,hasUpdate:s}}catch(e){return u.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25",{error:e}),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});var na=d(()=>{"use strict";Md()});import{z as xd}from"zod";var jC,ao,Od=d(()=>{"use strict";na();Ce();ke();jC=xd.object({version:xd.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),ao=class extends J{static{i(this,"UpdateApiHandler")}npmManager;eventBus=k();activeInstalls=new Map;constructor(){super(),this.npmManager=new Ht(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=jC.safeParse(t);if(!r.success)return e.fail("INVALID_VERSION","\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",r.error.issues.map(c=>({field:c.path.join("."),message:c.message})),400);let{version:s}=r.data;if(Array.from(this.activeInstalls.values()).some(c=>c))return e.fail("INSTALL_IN_PROGRESS","\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5",void 0,409);let a=e.get("logger");return this.npmManager.installVersion(s).catch(c=>{a.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",c)}),e.success({version:s,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7")}catch(t){return this.handleError(e,t,"\u5904\u7406\u5B89\u88C5\u8BF7\u6C42","REQUEST_FAILED")}}}});import{VersionUtils as oa}from"@xiaozhi-client/version";var co,Nd=d(()=>{"use strict";na();ke();co=class extends J{static{i(this,"VersionApiHandler")}async getVersion(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=oa.getVersionInfo();return e.get("logger").debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u7248\u672C\u4FE1\u606F","VERSION_READ_ERROR")}}async getVersionSimple(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=oa.getVersion();return e.get("logger").debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.success({version:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u7248\u672C\u53F7","VERSION_READ_ERROR")}}async clearVersionCache(e){try{return e.get("logger").debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),oa.clearCache(),e.get("logger").info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.success(void 0,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664")}catch(t){return this.handleError(e,t,"\u6E05\u9664\u7248\u672C\u7F13\u5B58","CACHE_CLEAR_ERROR")}}async getAvailableVersions(e){try{e.get("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))return e.fail("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`,void 0,400);let o=await new Ht().getAvailableVersions(t);return e.get("logger").debug(`\u83B7\u53D6\u5230 ${o.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.success({versions:o,type:t,total:o.length})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868","VERSIONS_FETCH_ERROR")}}async checkLatestVersion(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new Ht().checkForLatestVersion();return e.get("logger").debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.success({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error}):e.success({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate})}catch(t){return this.handleError(e,t,"\u68C0\u67E5\u6700\u65B0\u7248\u672C","LATEST_VERSION_CHECK_ERROR")}}}});import BC from"fs";import{configManager as zC}from"@xiaozhi-client/config";import{TTS as WC}from"@xiaozhi-client/tts";var Vs,Ld=d(()=>{"use strict";Ri();ke();Vs=class extends J{static{i(this,"TTSApiHandler")}constructor(){super()}async synthesize(e){try{e.get("logger").info("\u5904\u7406\u8BED\u97F3\u5408\u6210\u8BF7\u6C42");let t=await this.parseJsonBody(e);if(!t.text)return e.get("logger").warn("\u7F3A\u5C11 text \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: text",void 0,400);let r=zC.getTTSConfig(),s=t.appid||r.appid,o=t.accessToken||r.accessToken,a=t.voice_type||r.voice_type,c=t.cluster||r.cluster,l=t.endpoint||r.endpoint,p=t.encoding||r.encoding||"wav";if(!s)return e.get("logger").warn("\u7F3A\u5C11 appid \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 appid \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.appid",void 0,400);if(!o)return e.get("logger").warn("\u7F3A\u5C11 accessToken \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 accessToken \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.accessToken",void 0,400);if(!a)return e.get("logger").warn("\u7F3A\u5C11 voice_type \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 voice_type \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.voice_type",void 0,400);let m=new WC({bytedance:{v1:{app:{appid:s,accessToken:o},audio:{voice_type:a,encoding:p||"wav"},cluster:c,endpoint:l}}});e.get("logger").info(`\u5F00\u59CB\u8BED\u97F3\u5408\u6210: text=${t.text.substring(0,20)}..., voice_type=${a}`);let f=await m.synthesize(t.text);return BC.writeFileSync("audio.wav",Buffer.from(f)),e.get("logger").info(`\u8BED\u97F3\u5408\u6210\u6210\u529F: audioSize=${f.length} bytes`),new Response(Buffer.from(f),{headers:{"Content-Type":`audio/${p}`,"Content-Disposition":`attachment; filename="tts_${Date.now()}.${p}"`}})}catch(t){return this.handleError(e,t,"\u8BED\u97F3\u5408\u6210")}}async getVoices(e){try{e.get("logger").info("\u83B7\u53D6\u97F3\u8272\u5217\u8868");let t=_i,r=pu(),s={voices:t,total:t.length,scenes:r};return e.success(s)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u97F3\u8272\u5217\u8868")}}}});var js,$d=d(()=>{"use strict";Hn();ke();js=class extends J{static{i(this,"ESP32Handler")}esp32Service;constructor(e){super(),this.esp32Service=e}async handleOTA(e){let t=e.get("logger");try{let r=e.req.header("Device-Id")||e.req.header("device-id"),s=e.req.header("Client-Id")||e.req.header("client-id");if(!r)return e.fail("MISSING_DEVICE_ID","\u7F3A\u5C11 Device-Id \u8BF7\u6C42\u5934",void 0,400);if(!s)return e.fail("MISSING_DEVICE_ID","\u7F3A\u5C11 Client-Id \u8BF7\u6C42\u5934",void 0,400);let o=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF");t.debug(`\u6536\u5230OTA\u8BF7\u6C42: deviceId=${r}, clientId=${s}`);let a=await this.esp32Service.handleOTARequest(r,s,o,{deviceModel:e.req.header("device-model")||e.req.header("Device-Model")||void 0,deviceVersion:e.req.header("device-version")||e.req.header("Device-Version")||void 0},e.req.header("host"));return t.debug("OTA\u54CD\u5E94",{response:a}),e.json(a)}catch(r){return this.handleError(e,r,"\u5904\u7406OTA\u8BF7\u6C42")}}}});var Dd=d(()=>{"use strict";eu();ru();du();Ai();wu();Mu();xu();Ou();Nu();Lu();Fu();Hu();Od();Nd();Ld();$d()});var ia,kd=d(()=>{"use strict";D();ia=i(async(n,e)=>{n.set("logger",u),n.logger=u,await e()},"loggerMiddleware")});import{cors as GC}from"hono/cors";var aa,Fd=d(()=>{"use strict";aa=GC({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var ca,la,Hd=d(()=>{"use strict";ca=i((n,e)=>(e.logger.error("HTTP request error:",n),process.env.NODE_ENV,e.fail("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?n.stack:void 0,500)),"errorHandlerMiddleware"),la=i(n=>n.req.path.startsWith("/api/")?n.fail("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method},404):n.fail("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method},404),"notFoundHandlerMiddleware")});var ua,Ud=d(()=>{"use strict";ua=i(async(n,e)=>{n.success=(t,r,s=200)=>{let o={success:!0,message:r};return t!==void 0&&(o.data=t),n.json(o,s)},n.fail=(t,r,s,o=400)=>{let a={success:!1,error:{code:t,message:r}};return s!==void 0&&(a.error.details=s),n.json(a,o)},n.paginate=(t,r,s)=>{let o={success:!0,data:t,pagination:r,message:s};return n.json(o,200)},await e()},"responseEnhancerMiddleware")});var Sr,Bs,pa=d(()=>{"use strict";Sr=class extends Error{static{i(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},Bs=class extends Error{static{i(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var da,Vd=d(()=>{"use strict";pa();da=i(async(n,e)=>{if(!n.get("mcpServiceManager"))try{n.logger.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let t=n.get("webServer");if(!t)throw new Bs("WebServer \u672A\u6CE8\u5165\u5230 Context");let r=t.getMCPServiceManager();n.set("mcpServiceManager",r),n.logger.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){if(t instanceof Sr)n.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof Bs?(n.logger.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(n.logger.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware")});var fa,jd=d(()=>{"use strict";fa=i(()=>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.logger.warn("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u4F7F\u7528 null \u503C:",r.message),n.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware")});import{configManager as XC}from"@xiaozhi-client/config";var ma,Bd=d(()=>{"use strict";Ai();ma=i(()=>{let n=null,e;return async(t,r)=>{let s=t.get("endpointManager");s!==e&&(e=s,s?n=new ys(s,XC):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var zd=d(()=>{"use strict";kd();Fd();Hd();Ud();Vd();jd();Bd();Fn()});var lo,Wd=d(()=>{"use strict";D();Ce();lo=class{static{i(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=u,this.eventBus=k()}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.debug("\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 JC}from"@xiaozhi-client/config";var uo,qd=d(()=>{"use strict";D();Ce();uo=class{static{i(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=u,this.eventBus=k(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=JC.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:i(s=>{t.readyState===1&&t.send(s)},"send")};this.clients.set(e,r),this.logger.debug(`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.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u9500: ${e}`),this.logger.debug(`\u5269\u4F59\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.eventBus.emitEvent("websocket:client:disconnected",{clientId:e,timestamp:Date.now()}))}catch(t){this.logger.error(`\u6CE8\u9500\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,t)}}broadcast(e,t){let r={type:e,data:t,timestamp:Date.now()};this.logger.debug(`\u5E7F\u64AD\u6D88\u606F: ${e}`,{clientCount:this.clients.size});for(let[s,o]of this.clients)this.sendMessageToClient(o,r,s)}sendToClient(e,t,r){let s={type:t,data:r,timestamp:Date.now()},o=this.clients.get(e);o?this.sendMessageToClient(o,s,e):this.queueMessage(e,s)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let s=JSON.stringify(t);e.send(s),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF ${r}: ${t.type}`)}else this.queueMessage(r,t),this.logger.warn(`\u5BA2\u6237\u7AEF ${r} \u8FDE\u63A5\u4E0D\u53EF\u7528\uFF0C\u6D88\u606F\u5DF2\u52A0\u5165\u961F\u5217`)}catch(s){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,s),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:s instanceof Error?s:new Error(String(s)),type:"message:send"})}}queueMessage(e,t){this.messageQueue.has(e)||this.messageQueue.set(e,[]);let r=this.messageQueue.get(e);r.push(t),r.length>this.maxQueueSize&&(r.shift(),this.logger.warn(`\u5BA2\u6237\u7AEF ${e} \u6D88\u606F\u961F\u5217\u5DF2\u6EE1\uFF0C\u79FB\u9664\u6700\u65E7\u6D88\u606F`))}sendQueuedMessages(e){let t=this.messageQueue.get(e);if(!t||t.length===0)return;let r=this.clients.get(e);if(r){this.logger.debug(`\u53D1\u9001 ${t.length} \u6761\u6392\u961F\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${e}`);for(let s of t)this.sendMessageToClient(r,s,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let s={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",s)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,s)=>r+s.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.debug(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.debug("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var po,Gd=d(()=>{"use strict";D();po=class{static{i(this,"DeviceRegistryService")}activeDevices;constructor(){this.activeDevices=new Map}createDevice(e,t,r){let s=new Date,o={deviceId:e,macAddress:e,board:t,appVersion:r,status:"active",createdAt:s,lastSeenAt:s};return this.activeDevices.set(e,o),u.info(`\u81EA\u52A8\u6FC0\u6D3B\u65B0\u8BBE\u5907: deviceId=${e}, board=${t}, appVersion=${r}`),o}getDevice(e){return this.activeDevices.get(e)??null}updateDeviceStatus(e,t){let r=this.activeDevices.get(e);if(!r){u.warn(`\u8BBE\u5907\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u66F4\u65B0\u72B6\u6001: ${e}`);return}r.status=t,u.debug(`\u8BBE\u5907\u72B6\u6001\u5DF2\u66F4\u65B0: deviceId=${e}, status=${t}`)}updateLastSeen(e){let t=this.activeDevices.get(e);if(!t){u.warn(`\u8BBE\u5907\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u66F4\u65B0\u6700\u540E\u6D3B\u8DC3\u65F6\u95F4: ${e}`);return}t.lastSeenAt=new Date,u.debug(`\u8BBE\u5907\u6700\u540E\u6D3B\u8DC3\u65F6\u95F4\u5DF2\u66F4\u65B0: deviceId=${e}`)}destroy(){this.activeDevices.clear(),u.debug("\u8BBE\u5907\u6CE8\u518C\u670D\u52A1\u5DF2\u9500\u6BC1")}}});function Xd(n,e,t="opus"){let r=Buffer.allocUnsafe(16+n.length);return r.writeUInt16BE(2,0),r.writeUInt16BE(t==="opus"?0:1,2),r.writeUInt32BE(0,4),r.writeUInt32BE(e,8),r.writeUInt32BE(n.length,12),r.set(n,16),r}function Jd(n){if(n.length<16)return null;let e=n.readUInt16BE(0);if(e!==2)return null;let r=n.readUInt16BE(2)===0?"opus":"json",s=n.readUInt32BE(8),o=n.readUInt32BE(12);if(n.length<16+o)return null;let a=new Uint8Array(n.buffer,n.byteOffset+16,o);return{protocolVersion:e,type:r,timestamp:s,payload:a}}function Kd(n){if(n.length<16||n.readUInt16BE(0)!==2)return!1;let t=n.readUInt32BE(12);if(n.length<16+t)return!1;let r=n.readUInt16BE(2);return!(r!==0&&r!==1)}function Yd(n){if(n.length<4)return!1;let e=n[0];if(e!==0&&e!==1)return!1;let t=n.readUInt16BE(2);return!(n.length<4+t)}function Qd(n){if(n.length<4)return null;let t=n[0]===0?"opus":"json",r=n.readUInt16BE(2);if(n.length<4+r)return null;let s=new Uint8Array(n.buffer,n.byteOffset+4,r);return{protocolVersion:3,type:t,timestamp:0,payload:s}}var Zd=d(()=>{"use strict";i(Xd,"encodeBinaryProtocol2");i(Jd,"parseBinaryProtocol2");i(Kd,"isBinaryProtocol2");i(Yd,"isBinaryProtocol3");i(Qd,"parseBinaryProtocol3")});function ef(n,e){let t=KC(n,e),r=YC(n,e);return{boardType:t,appVersion:r}}function KC(n,e){let t=e?.deviceModel;if(t||(t=n.board?.type),!t){let r=n.application.board;r?.type&&(u.debug(`\u4F7F\u7528\u65E7\u683C\u5F0F\u6570\u636E\u7ED3\u6784: application.board.type=${r.type}`),t=r.type)}if(!t)throw new Error("\u65E0\u6CD5\u83B7\u53D6\u8BBE\u5907\u578B\u53F7\uFF0C\u8BF7\u786E\u4FDD\u8BF7\u6C42\u5934\u5305\u542B device-model \u6216\u8BF7\u6C42\u4F53\u5305\u542B board.type",{cause:"MISSING_DEVICE_MODEL"});return t}function YC(n,e){let t=e?.deviceVersion;if(t||(t=n.application?.version),!t)throw new Error("\u65E0\u6CD5\u83B7\u53D6\u56FA\u4EF6\u7248\u672C\uFF0C\u8BF7\u786E\u4FDD\u8BF7\u6C42\u4F53\u5305\u542B application.version",{cause:"MISSING_APP_VERSION"});return t}function vr(n,e=new WeakSet){if(n==null||typeof n!="object"||e.has(n))return n;if(e.add(n),Array.isArray(n))return n.map(r=>vr(r,e));let t={};for(let r of Object.keys(n)){let s=r.replace(/([A-Z])/g,"_$1").toLowerCase();t[s]=vr(n[r],e)}return t}var ga=d(()=>{"use strict";D();i(ef,"extractDeviceInfo");i(KC,"extractBoardType");i(YC,"extractAppVersion");i(vr,"camelToSnakeCase")});import{randomBytes as QC}from"crypto";function ZC(n){try{let e=n.toString("utf-8");return Buffer.from(e,"utf-8").equals(n)?!e.includes("\uFFFD"):!1}catch{return!1}}var fo,tf=d(()=>{"use strict";D();Zd();Hn();ga();fo=class{static{i(this,"ESP32Connection")}deviceId;clientId;ws;state="connecting";lastActivity;sessionId;config;heartbeatTimeoutMs;helloCompleted=!1;getASRService;constructor(e,t,r,s){this.deviceId=e,this.clientId=t,this.ws=r,this.lastActivity=new Date,this.sessionId=this.generateSessionId(),this.getASRService=s.getASRService,this.heartbeatTimeoutMs=s.heartbeatTimeoutMs??3e4,this.config={onMessage:s.onMessage,onClose:s.onClose,onError:s.onError,heartbeatTimeoutMs:this.heartbeatTimeoutMs,getASRService:s.getASRService},this.setupWebSocket()}generateSessionId(){let e=QC(8).toString("hex");return`${this.deviceId}-${Date.now()}-${e}`}setupWebSocket(){this.ws.on("message",async e=>{await this.handleMessage(e)}),this.ws.on("close",()=>{u.debug(`WebSocket\u8FDE\u63A5\u5173\u95ED: deviceId=${this.deviceId}`),this.state="disconnected",this.config.onClose()}),this.ws.on("error",e=>{u.error(`WebSocket\u8FDE\u63A5\u9519\u8BEF: deviceId=${this.deviceId}`,e),this.config.onError(e)}),this.ws.on("pong",()=>{this.updateActivity()})}updateActivity(){this.lastActivity=new Date}async handleMessage(e){this.updateActivity();try{let t=e.toString("utf-8"),r=JSON.parse(t);if(u.debug(`\u6536\u5230WebSocket\u6D88\u606F: deviceId=${this.deviceId}, type=${r.type}`),r.type==="hello"){await this.handleHello(r),await this.config.onMessage(r);return}if(!this.helloCompleted){u.warn(`\u6536\u5230\u6D88\u606F\u4F46\u672A\u5B8C\u6210Hello\u63E1\u624B: deviceId=${this.deviceId}`),await this.sendError("INVALID_MESSAGE_FORMAT","\u5FC5\u987B\u5148\u5B8C\u6210Hello\u63E1\u624B");return}await this.config.onMessage(r)}catch(t){if(e.length>0&&!ZC(e)){if(Kd(e)){let s=Jd(e);if(s){await this.config.onMessage({type:"audio",data:s.payload,_parsed:{protocolVersion:s.protocolVersion,dataType:s.type,timestamp:s.timestamp}});return}u.info("\u534F\u8BAE2\u89E3\u6790\u5931\u8D25\uFF0C\u5C1D\u8BD5\u5176\u4ED6\u534F\u8BAE")}if(Yd(e)){let s=Qd(e);if(s){u.info(`\u89E3\u6790\u97F3\u9891\u5305\u6210\u529F(\u534F\u8BAE3): type=${s.type}, timestamp=${s.timestamp}, payloadSize=${s.payload.length}`),await this.config.onMessage({type:"audio",data:s.payload,_parsed:{protocolVersion:s.protocolVersion,dataType:s.type,timestamp:s.timestamp}});return}u.info("\u534F\u8BAE3\u89E3\u6790\u5931\u8D25\uFF0C\u4F5C\u4E3A\u539F\u59CB\u6570\u636E\u5904\u7406")}let r=e.readUInt16BE(0);u.info(`\u97F3\u9891\u534F\u8BAE\u89E3\u6790\u5931\u8D25\uFF0C\u4F5C\u4E3A\u539F\u59CB\u6570\u636E\u5904\u7406, version=${r}`),await this.config.onMessage({type:"audio",data:new Uint8Array(e)})}else u.error(`\u6D88\u606F\u89E3\u6790\u5931\u8D25: deviceId=${this.deviceId}`,t),await this.sendError("INVALID_MESSAGE_FORMAT",t instanceof Error?t.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25")}}async handleHello(e){if(this.helloCompleted){u.warn(`[HELLO] \u91CD\u590D\u7684Hello\u6D88\u606F: deviceId=${this.deviceId}`);return}u.info(`[HELLO] \u6536\u5230\u8BBE\u5907Hello\u6D88\u606F: deviceId=${this.deviceId}, version=${e.version}`),u.info(`[HELLO] \u97F3\u9891\u53C2\u6570: format=${e.audioParams?.format}, sampleRate=${e.audioParams?.sampleRate}, channels=${e.audioParams?.channels}, frameDuration=${e.audioParams?.frameDuration}`),u.info(`[HELLO] \u7279\u6027: mcp=${e.features?.mcp}, transport=${e.transport}`);let t={type:"hello",version:1,transport:"websocket",sessionId:this.sessionId,audioParams:{format:"opus",sampleRate:24e3,channels:1,frameDuration:60}};u.info(`[HELLO] \u51C6\u5907\u53D1\u9001ServerHello\u54CD\u5E94: sessionId=${this.sessionId}`),await this.send(t),u.info("[HELLO] ServerHello\u54CD\u5E94\u5DF2\u53D1\u9001");let r=this.getASRService();r&&(u.info(`[HELLO] \u51C6\u5907 ASR \u670D\u52A1: deviceId=${this.deviceId}`),await r.prepare(this.deviceId)),this.helloCompleted=!0,this.state="connected",u.info(`[HELLO] Hello\u63E1\u624B\u5B8C\u6210: deviceId=${this.deviceId}, state=${this.state}`)}async send(e){if(this.state==="disconnected")throw u.error(`[SEND] \u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F: deviceId=${this.deviceId}, type=${e.type}`),new Error(`\u8FDE\u63A5\u5DF2\u65AD\u5F00: ${this.deviceId}`);try{let t=vr(e),r=JSON.stringify(t);u.info(`[SEND] \u53D1\u9001\u6D88\u606F: deviceId=${this.deviceId}, type=${e.type}, data=${r}`),this.ws.send(r),this.updateActivity(),u.debug(`[SEND] \u6D88\u606F\u5DF2\u53D1\u9001: deviceId=${this.deviceId}, type=${e.type}`)}catch(t){throw u.error(`[SEND] \u53D1\u9001\u6D88\u606F\u5931\u8D25: deviceId=${this.deviceId}, type=${e.type}`,t),t}}async sendBinary(e){if(this.state==="disconnected")throw new Error(`\u8FDE\u63A5\u5DF2\u65AD\u5F00: ${this.deviceId}`);try{let t=Buffer.from(e);this.ws.send(t),this.updateActivity(),u.debug(`\u4E8C\u8FDB\u5236\u6570\u636E\u5DF2\u53D1\u9001: deviceId=${this.deviceId}, size=${e.length}`)}catch(t){throw u.error(`\u53D1\u9001\u4E8C\u8FDB\u5236\u6570\u636E\u5931\u8D25: deviceId=${this.deviceId}`,t),t}}async sendBinaryProtocol2(e,t){u.debug(`[ESP32Connection] sendBinaryProtocol2: deviceId=${this.deviceId}, dataSize=${e.length}`);let s=Xd(e,t??0,"opus");u.debug(`[ESP32Connection] \u534F\u8BAE\u7F16\u7801\u5B8C\u6210: deviceId=${this.deviceId}, packetSize=${s.length}`),await this.sendBinary(new Uint8Array(s))}async sendError(e,t){try{await this.send({type:"error",code:e,message:t})}catch(r){u.error(`\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25: deviceId=${this.deviceId}`,r)}}checkTimeout(){if(this.state==="disconnected")return!1;let t=Date.now()-this.lastActivity.getTime();return t>this.heartbeatTimeoutMs?(u.warn(`\u8FDE\u63A5\u8D85\u65F6: deviceId=${this.deviceId}, elapsed=${t}ms, timeout=${this.heartbeatTimeoutMs}ms`),!0):!1}async close(){if(this.state!=="disconnected"){if(u.info(`\u5173\u95ED\u8FDE\u63A5: deviceId=${this.deviceId}`),this.ws.readyState!==this.ws.OPEN&&this.ws.readyState!==this.ws.CONNECTING){this.state="disconnected";return}return this.state="disconnected",new Promise(e=>{let t=i(()=>{this.ws.removeListener("close",t),e()},"onClose");this.ws.once("close",t),this.ws.close(1e3,"Normal closure"),setTimeout(()=>{this.ws.removeListener("close",t),e()},1e3)})}}getDeviceId(){return this.deviceId}getClientId(){return this.clientId}getState(){return this.state}getSessionId(){return this.sessionId}isHelloCompleted(){return this.helloCompleted}};i(ZC,"isValidUTF8")});import{ASR as eS,AudioFormat as tS,AuthMethod as rS,OpusDecoder as sS}from"@xiaozhi-client/asr";import{configManager as nS}from"@xiaozhi-client/config";var mo,rf=d(()=>{"use strict";D();mo=class{static{i(this,"ASRService")}events;deviceStates=new Map;asrClients=new Map;audioQueues=new Map;audioEnded=new Map;listenTasks=new Map;constructor(e={}){this.events=e.events||{}}async prepare(e){let t=this.getOrCreateDeviceState(e);if(t.prepared){u.debug(`[ASRService] ASR \u5DF2\u51C6\u5907\u597D\uFF0C\u8DF3\u8FC7: deviceId=${e}`);return}this.audioQueues.set(e,[]),this.audioEnded.set(e,!1),t.prepared=!0,u.info(`[ASRService] ASR \u670D\u52A1\u5DF2\u51C6\u5907: deviceId=${e}`)}async connect(e){let t=this.getOrCreateDeviceState(e);if(this.asrClients.get(e)?.isConnected()){u.debug(`[ASRService] ASR \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5\uFF0C\u8DF3\u8FC7: deviceId=${e}`);return}if(t.connecting&&t.connectPromise){u.debug(`[ASRService] ASR \u6B63\u5728\u8FDE\u63A5\uFF0C\u7B49\u5F85: deviceId=${e}`),await t.connectPromise;return}t.connecting=!0,t.connectPromise=this.doConnect(e);try{await t.connectPromise}finally{t.connecting=!1,t.connectPromise=void 0}}async doConnect(e){let t=this.asrClients.get(e);t&&(u.warn(`[ASRService] ASR \u5BA2\u6237\u7AEF\u5B58\u5728\u4F46\u672A\u8FDE\u63A5\uFF0C\u5173\u95ED\u65E7\u7684: deviceId=${e}`),await t.close(),this.asrClients.delete(e)),await this.prepare(e),await this.createASRClient(e),u.info(`[ASRService] ASR \u8FDE\u63A5\u5DF2\u5EFA\u7ACB: deviceId=${e}`)}async createASRClient(e){let t=nS.getASRConfig();if(!t.appid||!t.accessToken){u.error("[ASRService] ASR \u914D\u7F6E\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6");return}let r=new eS({bytedance:{v2:{app:{appid:t.appid,token:t.accessToken,cluster:t.cluster||"volcengine_streaming_common"},user:{uid:`device_${e}`},audio:{format:tS.RAW,language:"zh-CN"},request:{reqid:`req_${e}_${Date.now()}`,sequence:1}}},authMethod:rS.TOKEN});r.on("error",o=>{u.error(`[ASRService] ASR \u9519\u8BEF: deviceId=${e}, error=${o.message}`),this.events.onError?.(e,o)}),r.on("close",()=>{u.info(`[ASRService] ASR \u8FDE\u63A5\u5173\u95ED: deviceId=${e}`),this.asrClients.delete(e),this.events.onClose?.(e)}),this.asrClients.set(e,r);let s=this.startListenTask(e,r);this.listenTasks.set(e,s),u.info(`[ASRService] ASR \u5BA2\u6237\u7AEF\u5DF2\u521B\u5EFA\uFF08V2\uFF09: deviceId=${e}`)}async init(e){await this.prepare(e),await this.connect(e)}async handleAudioData(e,t){let r=Buffer.from(t);if(u.debug(`[ASRService] \u6536\u5230\u97F3\u9891\u6570\u636E: deviceId=${e}, size=${t.length}`),this.getOrCreateDeviceState(e).prepared||(u.warn(`[ASRService] ASR \u672A\u51C6\u5907\u597D\uFF0C\u81EA\u52A8\u51C6\u5907: deviceId=${e}`),await this.prepare(e)),this.audioEnded.get(e)){u.debug(`[ASRService] \u97F3\u9891\u5DF2\u7ED3\u675F\uFF0C\u5FFD\u7565\u65B0\u6570\u636E: deviceId=${e}`);return}try{let o=await sS.toPcm(r),a=this.audioQueues.get(e);a||(a=[],this.audioQueues.set(e,a)),a.push(o),u.debug(`[ASRService] \u5DF2\u5C06 PCM \u63A8\u5165\u961F\u5217: deviceId=${e}, pcmSize=${o.length}, queueLength=${a.length}`)}catch(o){u.error(`[ASRService] PCM \u89E3\u7801\u5931\u8D25: deviceId=${e}`,o)}}getOrCreateDeviceState(e){let t=this.deviceStates.get(e);return t||(t={prepared:!1,connecting:!1},this.deviceStates.set(e,t)),t}async*createAudioStream(e){let t=this.audioQueues.get(e)||[];for(;;){for(;t.length===0;){if(this.audioEnded.get(e)){u.debug(`[ASRService] \u97F3\u9891\u6D41\u7ED3\u675F: deviceId=${e}`);return}await new Promise(s=>setTimeout(s,50))}yield t.shift()}}async startListenTask(e,t){try{let r=this.createAudioStream(e);for await(let s of t.bytedance.v2.listen(r)){u.info(`[ASRService] ASR \u8BC6\u522B\u7ED3\u679C: deviceId=${e}, isFinal=${s.isFinal}, text=${s.text}`),s.isFinal&&(this.audioEnded.set(e,!0),u.info(`[ASRService] ASR \u8BC6\u522B\u5B8C\u6210\uFF0C\u505C\u6B62 listen: deviceId=${e}`));try{this.events.onResult?.(e,s.text||"",s.isFinal)}catch(o){u.error(`[ASRService] onResult \u56DE\u8C03\u6267\u884C\u5931\u8D25: deviceId=${e}`,o)}if(s.isFinal)break}u.info(`[ASRService] listen \u4EFB\u52A1\u5B8C\u6210: deviceId=${e}`),this.audioQueues.set(e,[]),this.audioEnded.set(e,!1),u.info(`[ASRService] \u97F3\u9891\u7F13\u51B2\u533A\u5DF2\u91CD\u7F6E\uFF0C\u51C6\u5907\u4E0B\u4E00\u6B21\u8BC6\u522B: deviceId=${e}`)}catch(r){u.error(`[ASRService] listen \u4EFB\u52A1\u51FA\u9519: deviceId=${e}`,r)}}async end(e){this.audioEnded.set(e,!0);let t=this.listenTasks.get(e);if(t)try{await t,u.info(`[ASRService] ASR listen \u4EFB\u52A1\u5DF2\u7ED3\u675F: deviceId=${e}`)}catch(s){u.error(`[ASRService] \u7B49\u5F85 listen \u4EFB\u52A1\u5931\u8D25: deviceId=${e}`,s)}let r=this.asrClients.get(e);if(r)try{await r.close()}catch(s){u.error(`[ASRService] ASR \u5173\u95ED\u5931\u8D25: deviceId=${e}`,s)}this.asrClients.delete(e),this.audioQueues.delete(e),this.audioEnded.delete(e),this.listenTasks.delete(e),u.info(`[ASRService] ASR \u8D44\u6E90\u5DF2\u6E05\u7406: deviceId=${e}`)}async reset(e){u.info(`[ASRService] \u91CD\u7F6E ASR \u670D\u52A1\u72B6\u6001: deviceId=${e}`),await this.end(e);let t=this.deviceStates.get(e);t&&(t.prepared=!1,t.connecting=!1,t.connectPromise=void 0),await this.prepare(e),u.info(`[ASRService] ASR \u670D\u52A1\u5DF2\u91CD\u7F6E: deviceId=${e}`)}destroy(){for(let e of this.asrClients.values())e.close();this.asrClients.clear(),this.audioQueues.clear(),this.audioEnded.clear(),this.listenTasks.clear(),this.deviceStates.clear(),u.debug("[ASRService] \u670D\u52A1\u5DF2\u9500\u6BC1")}}});function I(n,e,t,r,s){if(r==="m")throw new TypeError("Private method is not writable");if(r==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?n!==e||!s:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r==="a"?s.call(n,t):s?s.value=t:e.set(n,t),t}function h(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)}var Ae=d(()=>{"use strict";i(I,"__classPrivateFieldSet");i(h,"__classPrivateFieldGet")});var ha,Ea=d(()=>{"use strict";ha=i(function(){let{crypto:n}=globalThis;if(n?.randomUUID)return ha=n.randomUUID.bind(n),n.randomUUID();let e=new Uint8Array(1),t=n?()=>n.getRandomValues(e)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,r=>(+r^t()&15>>+r/4).toString(16))},"uuid4")});function zs(n){return typeof n=="object"&&n!==null&&("name"in n&&n.name==="AbortError"||"message"in n&&String(n.message).includes("FetchRequestCanceledException"))}var Ws,go=d(()=>{"use strict";i(zs,"isAbortError");Ws=i(n=>{if(n instanceof Error)return n;if(typeof n=="object"&&n!==null){try{if(Object.prototype.toString.call(n)==="[object Error]"){let e=new Error(n.message,n.cause?{cause:n.cause}:{});return n.stack&&(e.stack=n.stack),n.cause&&!e.cause&&(e.cause=n.cause),n.name&&(e.name=n.name),e}}catch{}try{return new Error(JSON.stringify(n))}catch{}}return new Error(n)},"castToError")});var T,Q,K,Ct,St,yr,Tr,_r,Rr,Pr,br,Ar,wr,Ir,Mr,Ve,je=d(()=>{"use strict";go();T=class extends Error{static{i(this,"OpenAIError")}},Q=class n extends T{static{i(this,"APIError")}constructor(e,t,r,s){super(`${n.makeMessage(e,t,r)}`),this.status=e,this.headers=s,this.requestID=s?.get("x-request-id"),this.error=t;let o=t;this.code=o?.code,this.param=o?.param,this.type=o?.type}static makeMessage(e,t,r){let s=t?.message?typeof t.message=="string"?t.message:JSON.stringify(t.message):t?JSON.stringify(t):r;return e&&s?`${e} ${s}`:e?`${e} status code (no body)`:s||"(no status code or body)"}static generate(e,t,r,s){if(!e||!s)return new Ct({message:r,cause:Ws(t)});let o=t?.error;return e===400?new yr(e,o,r,s):e===401?new Tr(e,o,r,s):e===403?new _r(e,o,r,s):e===404?new Rr(e,o,r,s):e===409?new Pr(e,o,r,s):e===422?new br(e,o,r,s):e===429?new Ar(e,o,r,s):e>=500?new wr(e,o,r,s):new n(e,o,r,s)}},K=class extends Q{static{i(this,"APIUserAbortError")}constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},Ct=class extends Q{static{i(this,"APIConnectionError")}constructor({message:e,cause:t}){super(void 0,void 0,e||"Connection error.",void 0),t&&(this.cause=t)}},St=class extends Ct{static{i(this,"APIConnectionTimeoutError")}constructor({message:e}={}){super({message:e??"Request timed out."})}},yr=class extends Q{static{i(this,"BadRequestError")}},Tr=class extends Q{static{i(this,"AuthenticationError")}},_r=class extends Q{static{i(this,"PermissionDeniedError")}},Rr=class extends Q{static{i(this,"NotFoundError")}},Pr=class extends Q{static{i(this,"ConflictError")}},br=class extends Q{static{i(this,"UnprocessableEntityError")}},Ar=class extends Q{static{i(this,"RateLimitError")}},wr=class extends Q{static{i(this,"InternalServerError")}},Ir=class extends T{static{i(this,"LengthFinishReasonError")}constructor(){super("Could not parse response content as the length limit was reached")}},Mr=class extends T{static{i(this,"ContentFilterFinishReasonError")}constructor(){super("Could not parse response content as the request was rejected by the content filter")}},Ve=class extends Error{static{i(this,"InvalidWebhookSignatureError")}constructor(e){super(e)}}});function Sa(n){return typeof n!="object"?{}:n??{}}function nf(n){if(!n)return!0;for(let e in n)return!1;return!0}function of(n,e){return Object.prototype.hasOwnProperty.call(n,e)}function qs(n){return n!=null&&typeof n=="object"&&!Array.isArray(n)}var iS,sf,le,Ca,af,cf,Ke=d(()=>{"use strict";je();iS=/^[a-z][a-z0-9+.-]*:/i,sf=i(n=>iS.test(n),"isAbsoluteURL"),le=i(n=>(le=Array.isArray,le(n)),"isArray"),Ca=le;i(Sa,"maybeObj");i(nf,"isEmptyObj");i(of,"hasOwn");i(qs,"isObj");af=i((n,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new T(`${n} must be an integer`);if(e<0)throw new T(`${n} must be a positive integer`);return e},"validatePositiveInteger"),cf=i(n=>{try{return JSON.parse(n)}catch{return}},"safeJSON")});var Be,xr=d(()=>{"use strict";Be=i(n=>new Promise(e=>setTimeout(e,n)),"sleep")});var vt,va=d(()=>{"use strict";vt="6.24.0"});function aS(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}function lS(){if(typeof navigator>"u"||!navigator)return null;let n=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:e,pattern:t}of n){let r=t.exec(navigator.userAgent);if(r){let s=r[1]||0,o=r[2]||0,a=r[3]||0;return{browser:e,version:`${s}.${o}.${a}`}}}return null}var df,cS,lf,uf,pf,ff,ya=d(()=>{"use strict";va();df=i(()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u","isRunningInBrowser");i(aS,"getDetectedPlatform");cS=i(()=>{let n=aS();if(n==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":vt,"X-Stainless-OS":uf(Deno.build.os),"X-Stainless-Arch":lf(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version=="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":vt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(n==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":vt,"X-Stainless-OS":uf(globalThis.process.platform??"unknown"),"X-Stainless-Arch":lf(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=lS();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":vt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${e.browser}`,"X-Stainless-Runtime-Version":e.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":vt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},"getPlatformProperties");i(lS,"getBrowserInfo");lf=i(n=>n==="x32"?"x32":n==="x86_64"||n==="x64"?"x64":n==="arm"?"arm":n==="aarch64"||n==="arm64"?"arm64":n?`other:${n}`:"unknown","normalizeArch"),uf=i(n=>(n=n.toLowerCase(),n.includes("ios")?"iOS":n==="android"?"Android":n==="darwin"?"MacOS":n==="win32"?"Windows":n==="freebsd"?"FreeBSD":n==="openbsd"?"OpenBSD":n==="linux"?"Linux":n?`Other:${n}`:"Unknown"),"normalizePlatform"),ff=i(()=>pf??(pf=cS()),"getPlatformHeaders")});function mf(){if(typeof fetch<"u")return fetch;throw new Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new OpenAI({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function Ta(...n){let e=globalThis.ReadableStream;if(typeof e>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new e(...n)}function ho(n){let e=Symbol.asyncIterator in n?n[Symbol.asyncIterator]():n[Symbol.iterator]();return Ta({start(){},async pull(t){let{done:r,value:s}=await e.next();r?t.close():t.enqueue(s)},async cancel(){await e.return?.()}})}function _a(n){if(n[Symbol.asyncIterator])return n;let e=n.getReader();return{async next(){try{let t=await e.read();return t?.done&&e.releaseLock(),t}catch(t){throw e.releaseLock(),t}},async return(){let t=e.cancel();return e.releaseLock(),await t,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function gf(n){if(n===null||typeof n!="object")return;if(n[Symbol.asyncIterator]){await n[Symbol.asyncIterator]().return?.();return}let e=n.getReader(),t=e.cancel();e.releaseLock(),await t}var Gs=d(()=>{"use strict";i(mf,"getDefaultFetch");i(Ta,"makeReadableStream");i(ho,"ReadableStreamFrom");i(_a,"ReadableStreamToAsyncIterable");i(gf,"CancelReadableStream")});var hf,Ef=d(()=>{"use strict";hf=i(({headers:n,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)}),"FallbackEncoder")});var Eo,Ra,Co,Pa,So=d(()=>{"use strict";Eo="RFC3986",Ra=i(n=>String(n),"default_formatter"),Co={RFC1738:i(n=>String(n).replace(/%20/g,"+"),"RFC1738"),RFC3986:Ra},Pa="RFC1738"});function Sf(n){return!n||typeof n!="object"?!1:!!(n.constructor&&n.constructor.isBuffer&&n.constructor.isBuffer(n))}function Aa(n,e){if(le(n)){let t=[];for(let r=0;r<n.length;r+=1)t.push(e(n[r]));return t}return e(n)}var vo,ze,ba,Cf,vf=d(()=>{"use strict";So();Ke();vo=i((n,e)=>(vo=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),vo(n,e)),"has"),ze=(()=>{let n=[];for(let e=0;e<256;++e)n.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return n})(),ba=1024,Cf=i((n,e,t,r,s)=>{if(n.length===0)return n;let o=n;if(typeof n=="symbol"?o=Symbol.prototype.toString.call(n):typeof n!="string"&&(o=String(n)),t==="iso-8859-1")return escape(o).replace(/%u[0-9a-f]{4}/gi,function(c){return"%26%23"+parseInt(c.slice(2),16)+"%3B"});let a="";for(let c=0;c<o.length;c+=ba){let l=o.length>=ba?o.slice(c,c+ba):o,p=[];for(let m=0;m<l.length;++m){let f=l.charCodeAt(m);if(f===45||f===46||f===95||f===126||f>=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||s===Pa&&(f===40||f===41)){p[p.length]=l.charAt(m);continue}if(f<128){p[p.length]=ze[f];continue}if(f<2048){p[p.length]=ze[192|f>>6]+ze[128|f&63];continue}if(f<55296||f>=57344){p[p.length]=ze[224|f>>12]+ze[128|f>>6&63]+ze[128|f&63];continue}m+=1,f=65536+((f&1023)<<10|l.charCodeAt(m)&1023),p[p.length]=ze[240|f>>18]+ze[128|f>>12&63]+ze[128|f>>6&63]+ze[128|f&63]}a+=p.join("")}return a},"encode");i(Sf,"is_buffer");i(Aa,"maybe_map")});function dS(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"||typeof n=="symbol"||typeof n=="bigint"}function Rf(n,e,t,r,s,o,a,c,l,p,m,f,S,g,P,w,U,H){let b=n,G=H,z=0,Ee=!1;for(;(G=G.get(wa))!==void 0&&!Ee;){let X=G.get(n);if(z+=1,typeof X<"u"){if(X===z)throw new RangeError("Cyclic object value");Ee=!0}typeof G.get(wa)>"u"&&(z=0)}if(typeof p=="function"?b=p(e,b):b instanceof Date?b=S?.(b):t==="comma"&&le(b)&&(b=Aa(b,function(X){return X instanceof Date?S?.(X):X})),b===null){if(o)return l&&!w?l(e,Z.encoder,U,"key",g):e;b=""}if(dS(b)||Sf(b)){if(l){let X=w?e:l(e,Z.encoder,U,"key",g);return[P?.(X)+"="+P?.(l(b,Z.encoder,U,"value",g))]}return[P?.(e)+"="+P?.(String(b))]}let ue=[];if(typeof b>"u")return ue;let W;if(t==="comma"&&le(b))w&&l&&(b=Aa(b,l)),W=[{value:b.length>0?b.join(",")||null:void 0}];else if(le(p))W=p;else{let X=Object.keys(b);W=m?X.sort(m):X}let te=c?String(e).replace(/\./g,"%2E"):String(e),re=r&&le(b)&&b.length===1?te+"[]":te;if(s&&le(b)&&b.length===0)return re+"[]";for(let X=0;X<W.length;++X){let Y=W[X],Fl=typeof Y=="object"&&typeof Y.value<"u"?Y.value:b[Y];if(a&&Fl===null)continue;let ni=f&&c?Y.replace(/\./g,"%2E"):Y,Km=le(b)?typeof t=="function"?t(re,ni):re:re+(f?"."+ni:"["+ni+"]");H.set(n,z);let Hl=new WeakMap;Hl.set(wa,H),_f(ue,Rf(Fl,Km,t,r,s,o,a,c,t==="comma"&&w&&le(b)?null:l,p,m,f,S,g,P,w,U,Hl))}return ue}function fS(n=Z){if(typeof n.allowEmptyArrays<"u"&&typeof n.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof n.encodeDotInKeys<"u"&&typeof n.encodeDotInKeys!="boolean")throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(n.encoder!==null&&typeof n.encoder<"u"&&typeof n.encoder!="function")throw new TypeError("Encoder has to be a function.");let e=n.charset||Z.charset;if(typeof n.charset<"u"&&n.charset!=="utf-8"&&n.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let t=Eo;if(typeof n.format<"u"){if(!vo(Co,n.format))throw new TypeError("Unknown format option provided.");t=n.format}let r=Co[t],s=Z.filter;(typeof n.filter=="function"||le(n.filter))&&(s=n.filter);let o;if(n.arrayFormat&&n.arrayFormat in Tf?o=n.arrayFormat:"indices"in n?o=n.indices?"indices":"repeat":o=Z.arrayFormat,"commaRoundTrip"in n&&typeof n.commaRoundTrip!="boolean")throw new TypeError("`commaRoundTrip` must be a boolean, or absent");let a=typeof n.allowDots>"u"?n.encodeDotInKeys?!0:Z.allowDots:!!n.allowDots;return{addQueryPrefix:typeof n.addQueryPrefix=="boolean"?n.addQueryPrefix:Z.addQueryPrefix,allowDots:a,allowEmptyArrays:typeof n.allowEmptyArrays=="boolean"?!!n.allowEmptyArrays:Z.allowEmptyArrays,arrayFormat:o,charset:e,charsetSentinel:typeof n.charsetSentinel=="boolean"?n.charsetSentinel:Z.charsetSentinel,commaRoundTrip:!!n.commaRoundTrip,delimiter:typeof n.delimiter>"u"?Z.delimiter:n.delimiter,encode:typeof n.encode=="boolean"?n.encode:Z.encode,encodeDotInKeys:typeof n.encodeDotInKeys=="boolean"?n.encodeDotInKeys:Z.encodeDotInKeys,encoder:typeof n.encoder=="function"?n.encoder:Z.encoder,encodeValuesOnly:typeof n.encodeValuesOnly=="boolean"?n.encodeValuesOnly:Z.encodeValuesOnly,filter:s,format:t,formatter:r,serializeDate:typeof n.serializeDate=="function"?n.serializeDate:Z.serializeDate,skipNulls:typeof n.skipNulls=="boolean"?n.skipNulls:Z.skipNulls,sort:typeof n.sort=="function"?n.sort:null,strictNullHandling:typeof n.strictNullHandling=="boolean"?n.strictNullHandling:Z.strictNullHandling}}function Ia(n,e={}){let t=n,r=fS(e),s,o;typeof r.filter=="function"?(o=r.filter,t=o("",t)):le(r.filter)&&(o=r.filter,s=o);let a=[];if(typeof t!="object"||t===null)return"";let c=Tf[r.arrayFormat],l=c==="comma"&&r.commaRoundTrip;s||(s=Object.keys(t)),r.sort&&s.sort(r.sort);let p=new WeakMap;for(let S=0;S<s.length;++S){let g=s[S];r.skipNulls&&t[g]===null||_f(a,Rf(t[g],g,c,l,r.allowEmptyArrays,r.strictNullHandling,r.skipNulls,r.encodeDotInKeys,r.encode?r.encoder:null,r.filter,r.sort,r.allowDots,r.serializeDate,r.format,r.formatter,r.encodeValuesOnly,r.charset,p))}let m=a.join(r.delimiter),f=r.addQueryPrefix===!0?"?":"";return r.charsetSentinel&&(r.charset==="iso-8859-1"?f+="utf8=%26%2310003%3B&":f+="utf8=%E2%9C%93&"),m.length>0?f+m:""}var Tf,_f,yf,Z,wa,Pf=d(()=>{"use strict";vf();So();Ke();Tf={brackets(n){return String(n)+"[]"},comma:"comma",indices(n,e){return String(n)+"["+e+"]"},repeat(n){return String(n)}},_f=i(function(n,e){Array.prototype.push.apply(n,le(e)?e:[e])},"push_to_array"),Z={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:Cf,encodeValuesOnly:!1,format:Eo,formatter:Ra,indices:!1,serializeDate(n){return(yf??(yf=Function.prototype.call.bind(Date.prototype.toISOString)))(n)},skipNulls:!1,strictNullHandling:!1};i(dS,"is_non_nullish_primitive");wa={};i(Rf,"inner_stringify");i(fS,"normalize_stringify_options");i(Ia,"stringify")});var bf=d(()=>{"use strict";So();Pf()});function If(n){let e=0;for(let s of n)e+=s.length;let t=new Uint8Array(e),r=0;for(let s of n)t.set(s,r),r+=s.length;return t}function Or(n){let e;return(Af??(e=new globalThis.TextEncoder,Af=e.encode.bind(e)))(n)}function Ma(n){let e;return(wf??(e=new globalThis.TextDecoder,wf=e.decode.bind(e)))(n)}var Af,wf,yo=d(()=>{"use strict";i(If,"concatBytes");i(Or,"encodeUTF8");i(Ma,"decodeUTF8")});function gS(n,e){for(let s=e??0;s<n.length;s++){if(n[s]===10)return{preceding:s,index:s+1,carriage:!1};if(n[s]===13)return{preceding:s,index:s+1,carriage:!0}}return null}function Mf(n){for(let r=0;r<n.length-1;r++){if(n[r]===10&&n[r+1]===10||n[r]===13&&n[r+1]===13)return r+2;if(n[r]===13&&n[r+1]===10&&r+3<n.length&&n[r+2]===13&&n[r+3]===10)return r+4}return-1}var ve,ye,Ut,xf=d(()=>{"use strict";Ae();yo();Ut=class{static{i(this,"LineDecoder")}constructor(){ve.set(this,void 0),ye.set(this,void 0),I(this,ve,new Uint8Array,"f"),I(this,ye,null,"f")}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?Or(e):e;I(this,ve,If([h(this,ve,"f"),t]),"f");let r=[],s;for(;(s=gS(h(this,ve,"f"),h(this,ye,"f")))!=null;){if(s.carriage&&h(this,ye,"f")==null){I(this,ye,s.index,"f");continue}if(h(this,ye,"f")!=null&&(s.index!==h(this,ye,"f")+1||s.carriage)){r.push(Ma(h(this,ve,"f").subarray(0,h(this,ye,"f")-1))),I(this,ve,h(this,ve,"f").subarray(h(this,ye,"f")),"f"),I(this,ye,null,"f");continue}let o=h(this,ye,"f")!==null?s.preceding-1:s.preceding,a=Ma(h(this,ve,"f").subarray(0,o));r.push(a),I(this,ve,h(this,ve,"f").subarray(s.index),"f"),I(this,ye,null,"f")}return r}flush(){return h(this,ve,"f").length?this.decode(`
86
- `):[]}};ve=new WeakMap,ye=new WeakMap;Ut.NEWLINE_CHARS=new Set([`
87
- `,"\r"]);Ut.NEWLINE_REGEXP=/\r\n|[\n\r]/g;i(gS,"findNewlineIndex");i(Mf,"findDoubleNewlineIndex")});function Xs(){}function To(n,e,t){return!e||_o[n]>_o[t]?Xs:e[n].bind(e)}function q(n){let e=n.logger,t=n.logLevel??"off";if(!e)return hS;let r=Of.get(e);if(r&&r[0]===t)return r[1];let s={error:To("error",e,t),warn:To("warn",e,t),info:To("info",e,t),debug:To("debug",e,t)};return Of.set(e,[t,s]),s}var _o,xa,hS,Of,Ye,Js=d(()=>{"use strict";Ke();_o={off:0,error:200,warn:300,info:400,debug:500},xa=i((n,e,t)=>{if(n){if(of(_o,n))return n;q(t).warn(`${e} was set to ${JSON.stringify(n)}, expected one of ${JSON.stringify(Object.keys(_o))}`)}},"parseLogLevel");i(Xs,"noop");i(To,"makeLogFn");hS={error:Xs,warn:Xs,info:Xs,debug:Xs},Of=new WeakMap;i(q,"loggerFor");Ye=i(n=>(n.options&&(n.options={...n.options},delete n.options.headers),n.headers&&(n.headers=Object.fromEntries((n.headers instanceof Headers?[...n.headers]:Object.entries(n.headers)).map(([e,t])=>[e,e.toLowerCase()==="authorization"||e.toLowerCase()==="cookie"||e.toLowerCase()==="set-cookie"?"***":t]))),"retryOfRequestLogID"in n&&(n.retryOfRequestLogID&&(n.retryOf=n.retryOfRequestLogID),delete n.retryOfRequestLogID),n),"formatRequestDetails")});async function*ES(n,e){if(!n.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new T("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new T("Attempted to iterate over a response with no body");let t=new Oa,r=new Ut,s=_a(n.body);for await(let o of CS(s))for(let a of r.decode(o)){let c=t.decode(a);c&&(yield c)}for(let o of r.flush()){let a=t.decode(o);a&&(yield a)}}async function*CS(n){let e=new Uint8Array;for await(let t of n){if(t==null)continue;let r=t instanceof ArrayBuffer?new Uint8Array(t):typeof t=="string"?Or(t):t,s=new Uint8Array(e.length+r.length);s.set(e),s.set(r,e.length),e=s;let o;for(;(o=Mf(e))!==-1;)yield e.slice(0,o),e=e.slice(o)}e.length>0&&(yield e)}function SS(n,e){let t=n.indexOf(e);return t!==-1?[n.substring(0,t),e,n.substring(t+e.length)]:[n,"",""]}var Ks,We,Oa,Na=d(()=>{"use strict";Ae();je();Gs();xf();Gs();go();yo();Js();je();We=class n{static{i(this,"Stream")}constructor(e,t,r){this.iterator=e,Ks.set(this,void 0),this.controller=t,I(this,Ks,r,"f")}static fromSSEResponse(e,t,r){let s=!1,o=r?q(r):console;async function*a(){if(s)throw new T("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let c=!1;try{for await(let l of ES(e,t))if(!c){if(l.data.startsWith("[DONE]")){c=!0;continue}if(l.event===null||!l.event.startsWith("thread.")){let p;try{p=JSON.parse(l.data)}catch(m){throw o.error("Could not parse message into JSON:",l.data),o.error("From chunk:",l.raw),m}if(p&&p.error)throw new Q(void 0,p.error,void 0,e.headers);yield p}else{let p;try{p=JSON.parse(l.data)}catch(m){throw m}if(l.event=="error")throw new Q(void 0,p.error,p.message,void 0);yield{event:l.event,data:p}}}c=!0}catch(l){if(zs(l))return;throw l}finally{c||t.abort()}}return i(a,"iterator"),new n(a,t,r)}static fromReadableStream(e,t,r){let s=!1;async function*o(){let c=new Ut,l=_a(e);for await(let p of l)for(let m of c.decode(p))yield m;for(let p of c.flush())yield p}i(o,"iterLines");async function*a(){if(s)throw new T("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let c=!1;try{for await(let l of o())c||l&&(yield JSON.parse(l));c=!0}catch(l){if(zs(l))return;throw l}finally{c||t.abort()}}return i(a,"iterator"),new n(a,t,r)}[(Ks=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let e=[],t=[],r=this.iterator(),s=i(o=>({next:i(()=>{if(o.length===0){let a=r.next();e.push(a),t.push(a)}return o.shift()},"next")}),"teeIterator");return[new n(()=>s(e),this.controller,h(this,Ks,"f")),new n(()=>s(t),this.controller,h(this,Ks,"f"))]}toReadableStream(){let e=this,t;return Ta({async start(){t=e[Symbol.asyncIterator]()},async pull(r){try{let{value:s,done:o}=await t.next();if(o)return r.close();let a=Or(JSON.stringify(s)+`
88
- `);r.enqueue(a)}catch(s){r.error(s)}},async cancel(){await t.return?.()}})}};i(ES,"_iterSSEMessages");i(CS,"iterSSEChunks");Oa=class{static{i(this,"SSEDecoder")}constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith("\r")&&(e=e.substring(0,e.length-1)),!e){if(!this.event&&!this.data.length)return null;let o={event:this.event,data:this.data.join(`
89
- `),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],o}if(this.chunks.push(e),e.startsWith(":"))return null;let[t,r,s]=SS(e,":");return s.startsWith(" ")&&(s=s.substring(1)),t==="event"?this.event=s:t==="data"&&this.data.push(s),null}};i(SS,"partition")});async function Ro(n,e){let{response:t,requestLogID:r,retryOfRequestLogID:s,startTime:o}=e,a=await(async()=>{if(e.options.stream)return q(n).debug("response",t.status,t.url,t.headers,t.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(t,e.controller,n):We.fromSSEResponse(t,e.controller,n);if(t.status===204)return null;if(e.options.__binaryResponse)return t;let l=t.headers.get("content-type")?.split(";")[0]?.trim();if(l?.includes("application/json")||l?.endsWith("+json")){if(t.headers.get("content-length")==="0")return;let S=await t.json();return La(S,t)}return await t.text()})();return q(n).debug(`[${r}] response parsed`,Ye({retryOfRequestLogID:s,url:t.url,status:t.status,body:a,durationMs:Date.now()-o})),a}function La(n,e){return!n||typeof n!="object"||Array.isArray(n)?n:Object.defineProperty(n,"_request_id",{value:e.headers.get("x-request-id"),enumerable:!1})}var $a=d(()=>{"use strict";Na();Js();i(Ro,"defaultParseResponse");i(La,"addRequestID")});var Ys,Vt,Po=d(()=>{"use strict";Ae();$a();Vt=class n extends Promise{static{i(this,"APIPromise")}constructor(e,t,r=Ro){super(s=>{s(null)}),this.responsePromise=t,this.parseResponse=r,Ys.set(this,void 0),I(this,Ys,e,"f")}_thenUnwrap(e){return new n(h(this,Ys,"f"),this.responsePromise,async(t,r)=>La(e(await this.parseResponse(t,r),r),r.response))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t,request_id:t.headers.get("x-request-id")}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(e=>this.parseResponse(h(this,Ys,"f"),e))),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};Ys=new WeakMap});var bo,Qs,Zs,qe,O,Qe,F=d(()=>{"use strict";Ae();je();$a();Po();Ke();Qs=class{static{i(this,"AbstractPage")}constructor(e,t,r,s){bo.set(this,void 0),I(this,bo,e,"f"),this.options=s,this.response=t,this.body=r}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new T("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await h(this,bo,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(bo=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},Zs=class extends Vt{static{i(this,"PagePromise")}constructor(e,t,r){super(e,t,async(s,o)=>new r(s,o.response,await Ro(s,o),o.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},qe=class extends Qs{static{i(this,"Page")}constructor(e,t,r,s){super(e,t,r,s),this.data=r.data||[],this.object=r.object}getPaginatedItems(){return this.data??[]}nextPageRequestOptions(){return null}},O=class extends Qs{static{i(this,"CursorPage")}constructor(e,t,r,s){super(e,t,r,s),this.data=r.data||[],this.has_more=r.has_more||!1}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let e=this.getPaginatedItems(),t=e[e.length-1]?.id;return t?{...this.options,query:{...Sa(this.options.query),after:t}}:null}},Qe=class extends Qs{static{i(this,"ConversationCursorPage")}constructor(e,t,r,s){super(e,t,r,s),this.data=r.data||[],this.has_more=r.has_more||!1,this.last_id=r.last_id||""}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let e=this.last_id;return e?{...this.options,query:{...Sa(this.options.query),after:e}}:null}}});function Nr(n,e,t){return Fa(),new File(n,e??"unknown_file",t)}function en(n){return(typeof n=="object"&&n!==null&&("name"in n&&n.name&&String(n.name)||"url"in n&&n.url&&String(n.url)||"filename"in n&&n.filename&&String(n.filename)||"path"in n&&n.path&&String(n.path))||"").split(/[\\/]/).pop()||void 0}function yS(n){let e=typeof n=="function"?n:n.fetch,t=Nf.get(e);if(t)return t;let r=(async()=>{try{let s="Response"in e?e.Response:(await e("data:,")).constructor,o=new FormData;return o.toString()!==await new s(o).text()}catch{return!0}})();return Nf.set(e,r),r}var Fa,Ao,Ze,Oe,Nf,Lf,$f,TS,Da,ka,we=d(()=>{"use strict";Gs();Fa=i(()=>{if(typeof File>"u"){let{process:n}=globalThis,e=typeof n?.versions?.node=="string"&&parseInt(n.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(e?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}},"checkFileSupport");i(Nr,"makeFile");i(en,"getName");Ao=i(n=>n!=null&&typeof n=="object"&&typeof n[Symbol.asyncIterator]=="function","isAsyncIterable"),Ze=i(async(n,e)=>Da(n.body)?{...n,body:await Lf(n.body,e)}:n,"maybeMultipartFormRequestOptions"),Oe=i(async(n,e)=>({...n,body:await Lf(n.body,e)}),"multipartFormRequestOptions"),Nf=new WeakMap;i(yS,"supportsFormData");Lf=i(async(n,e)=>{if(!await yS(e))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let t=new FormData;return await Promise.all(Object.entries(n||{}).map(([r,s])=>ka(t,r,s))),t},"createForm"),$f=i(n=>n instanceof Blob&&"name"in n,"isNamedBlob"),TS=i(n=>typeof n=="object"&&n!==null&&(n instanceof Response||Ao(n)||$f(n)),"isUploadable"),Da=i(n=>{if(TS(n))return!0;if(Array.isArray(n))return n.some(Da);if(n&&typeof n=="object"){for(let e in n)if(Da(n[e]))return!0}return!1},"hasUploadableValue"),ka=i(async(n,e,t)=>{if(t!==void 0){if(t==null)throw new TypeError(`Received null for "${e}"; to pass null in FormData, you must use the string 'null'`);if(typeof t=="string"||typeof t=="number"||typeof t=="boolean")n.append(e,String(t));else if(t instanceof Response)n.append(e,Nr([await t.blob()],en(t)));else if(Ao(t))n.append(e,Nr([await new Response(ho(t)).blob()],en(t)));else if($f(t))n.append(e,t,en(t));else if(Array.isArray(t))await Promise.all(t.map(r=>ka(n,e+"[]",r)));else if(typeof t=="object")await Promise.all(Object.entries(t).map(([r,s])=>ka(n,`${e}[${r}]`,s)));else throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${t} instead`)}},"addFormValue")});async function wo(n,e,t){if(Fa(),n=await n,_S(n))return n instanceof File?n:Nr([await n.arrayBuffer()],n.name);if(RS(n)){let s=await n.blob();return e||(e=new URL(n.url).pathname.split(/[\\/]/).pop()),Nr(await Ha(s),e,t)}let r=await Ha(n);if(e||(e=en(n)),!t?.type){let s=r.find(o=>typeof o=="object"&&"type"in o&&o.type);typeof s=="string"&&(t={...t,type:s})}return Nr(r,e,t)}async function Ha(n){let e=[];if(typeof n=="string"||ArrayBuffer.isView(n)||n instanceof ArrayBuffer)e.push(n);else if(Df(n))e.push(n instanceof Blob?n:await n.arrayBuffer());else if(Ao(n))for await(let t of n)e.push(...await Ha(t));else{let t=n?.constructor?.name;throw new Error(`Unexpected data type: ${typeof n}${t?`; constructor: ${t}`:""}${PS(n)}`)}return e}function PS(n){return typeof n!="object"||n===null?"":`; props: [${Object.getOwnPropertyNames(n).map(t=>`"${t}"`).join(", ")}]`}var Df,_S,RS,kf=d(()=>{"use strict";we();we();Df=i(n=>n!=null&&typeof n=="object"&&typeof n.size=="number"&&typeof n.type=="string"&&typeof n.text=="function"&&typeof n.slice=="function"&&typeof n.arrayBuffer=="function","isBlobLike"),_S=i(n=>n!=null&&typeof n=="object"&&typeof n.name=="string"&&typeof n.lastModified=="number"&&Df(n),"isFileLike"),RS=i(n=>n!=null&&typeof n=="object"&&typeof n.url=="string"&&typeof n.blob=="function","isResponseLike");i(wo,"toFile");i(Ha,"getBytes");i(PS,"propsForError")});var Ua=d(()=>{"use strict";kf()});var C,A=d(()=>{"use strict";C=class{static{i(this,"APIResource")}constructor(e){this._client=e}}});function Hf(n){return n.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}var Ff,AS,E,L=d(()=>{"use strict";je();i(Hf,"encodeURIPath");Ff=Object.freeze(Object.create(null)),AS=i((n=Hf)=>i(function(t,...r){if(t.length===1)return t[0];let s=!1,o=[],a=t.reduce((m,f,S)=>{/[?#]/.test(f)&&(s=!0);let g=r[S],P=(s?encodeURIComponent:n)(""+g);return S!==r.length&&(g==null||typeof g=="object"&&g.toString===Object.getPrototypeOf(Object.getPrototypeOf(g.hasOwnProperty??Ff)??Ff)?.toString)&&(P=g+"",o.push({start:m.length+f.length,length:P.length,error:`Value of type ${Object.prototype.toString.call(g).slice(8,-1)} is not a valid path parameter`})),m+f+(S===r.length?"":P)},""),c=a.split(/[?#]/,1)[0],l=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,p;for(;(p=l.exec(c))!==null;)o.push({start:p.index,length:p[0].length,error:`Value "${p[0]}" can't be safely passed as a path parameter`});if(o.sort((m,f)=>m.start-f.start),o.length>0){let m=0,f=o.reduce((S,g)=>{let P=" ".repeat(g.start-m),w="^".repeat(g.length);return m=g.start+g.length,S+P+w},"");throw new T(`Path parameters result in path with invalid segments:
90
- ${o.map(S=>S.error).join(`
91
- `)}
92
- ${a}
93
- ${f}`)}return a},"path"),"createPathTagFunction"),E=AS(Hf)});var jt,Io=d(()=>{"use strict";A();F();L();jt=class extends C{static{i(this,"Messages")}list(e,t={},r){return this._client.getAPIList(E`/chat/completions/${e}/messages`,O,{query:t,...r})}}});var Ne=d(()=>{"use strict";je()});function tn(n){return n!==void 0&&"function"in n&&n.function!==void 0}function rn(n){return n?.$brand==="auto-parseable-response-format"}function Bt(n){return n?.$brand==="auto-parseable-tool"}function Uf(n,e){return!e||!Va(e)?{...n,choices:n.choices.map(t=>(jf(t.message.tool_calls),{...t,message:{...t.message,parsed:null,...t.message.tool_calls?{tool_calls:t.message.tool_calls}:void 0}}))}:sn(n,e)}function sn(n,e){let t=n.choices.map(r=>{if(r.finish_reason==="length")throw new Ir;if(r.finish_reason==="content_filter")throw new Mr;return jf(r.message.tool_calls),{...r,message:{...r.message,...r.message.tool_calls?{tool_calls:r.message.tool_calls?.map(s=>xS(e,s))??void 0}:void 0,parsed:r.message.content&&!r.message.refusal?MS(e,r.message.content):null}}});return{...n,choices:t}}function MS(n,e){return n.response_format?.type!=="json_schema"?null:n.response_format?.type==="json_schema"?"$parseRaw"in n.response_format?n.response_format.$parseRaw(e):JSON.parse(e):null}function xS(n,e){let t=n.tools?.find(r=>tn(r)&&r.function?.name===e.function.name);return{...e,function:{...e.function,parsed_arguments:Bt(t)?t.$parseRaw(e.function.arguments):t?.function.strict?JSON.parse(e.function.arguments):null}}}function Vf(n,e){if(!n||!("tools"in n)||!n.tools)return!1;let t=n.tools?.find(r=>tn(r)&&r.function?.name===e.function.name);return tn(t)&&(Bt(t)||t?.function.strict||!1)}function Va(n){return rn(n.response_format)?!0:n.tools?.some(e=>Bt(e)||e.type==="function"&&e.function.strict===!0)??!1}function jf(n){for(let e of n||[])if(e.type!=="function")throw new T(`Currently only \`function\` tool calls are supported; Received \`${e.type}\``)}function Bf(n){for(let e of n??[]){if(e.type!=="function")throw new T(`Currently only \`function\` tool types support auto-parsing; Received \`${e.type}\``);if(e.function.strict!==!0)throw new T(`The \`${e.function.name}\` tool is not marked with \`strict: true\`. Only strict function tools can be auto-parsed`)}}var nn=d(()=>{"use strict";Ne();i(tn,"isChatCompletionFunctionTool");i(rn,"isAutoParsableResponseFormat");i(Bt,"isAutoParsableTool");i(Uf,"maybeParseChatCompletion");i(sn,"parseChatCompletion");i(MS,"parseResponseFormat");i(xS,"parseToolCall");i(Vf,"shouldParseToolCall");i(Va,"hasAutoParseableInput");i(jf,"assertToolCallsAreChatCompletionFunctionToolCalls");i(Bf,"validateInputTools")});var Lr,ja,Ba=d(()=>{"use strict";Lr=i(n=>n?.role==="assistant","isAssistantMessage"),ja=i(n=>n?.role==="tool","isToolMessage")});var za,Mo,xo,on,an,Oo,cn,et,ln,No,Lo,$r,zf,yt,$o=d(()=>{"use strict";Ae();Ne();yt=class{static{i(this,"EventStream")}constructor(){za.add(this),this.controller=new AbortController,Mo.set(this,void 0),xo.set(this,()=>{}),on.set(this,()=>{}),an.set(this,void 0),Oo.set(this,()=>{}),cn.set(this,()=>{}),et.set(this,{}),ln.set(this,!1),No.set(this,!1),Lo.set(this,!1),$r.set(this,!1),I(this,Mo,new Promise((e,t)=>{I(this,xo,e,"f"),I(this,on,t,"f")}),"f"),I(this,an,new Promise((e,t)=>{I(this,Oo,e,"f"),I(this,cn,t,"f")}),"f"),h(this,Mo,"f").catch(()=>{}),h(this,an,"f").catch(()=>{})}_run(e){setTimeout(()=>{e().then(()=>{this._emitFinal(),this._emit("end")},h(this,za,"m",zf).bind(this))},0)}_connected(){this.ended||(h(this,xo,"f").call(this),this._emit("connect"))}get ended(){return h(this,ln,"f")}get errored(){return h(this,No,"f")}get aborted(){return h(this,Lo,"f")}abort(){this.controller.abort()}on(e,t){return(h(this,et,"f")[e]||(h(this,et,"f")[e]=[])).push({listener:t}),this}off(e,t){let r=h(this,et,"f")[e];if(!r)return this;let s=r.findIndex(o=>o.listener===t);return s>=0&&r.splice(s,1),this}once(e,t){return(h(this,et,"f")[e]||(h(this,et,"f")[e]=[])).push({listener:t,once:!0}),this}emitted(e){return new Promise((t,r)=>{I(this,$r,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,t)})}async done(){I(this,$r,!0,"f"),await h(this,an,"f")}_emit(e,...t){if(h(this,ln,"f"))return;e==="end"&&(I(this,ln,!0,"f"),h(this,Oo,"f").call(this));let r=h(this,et,"f")[e];if(r&&(h(this,et,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...t))),e==="abort"){let s=t[0];!h(this,$r,"f")&&!r?.length&&Promise.reject(s),h(this,on,"f").call(this,s),h(this,cn,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=t[0];!h(this,$r,"f")&&!r?.length&&Promise.reject(s),h(this,on,"f").call(this,s),h(this,cn,"f").call(this,s),this._emit("end")}}_emitFinal(){}};Mo=new WeakMap,xo=new WeakMap,on=new WeakMap,an=new WeakMap,Oo=new WeakMap,cn=new WeakMap,et=new WeakMap,ln=new WeakMap,No=new WeakMap,Lo=new WeakMap,$r=new WeakMap,za=new WeakSet,zf=i(function(e){if(I(this,No,!0,"f"),e instanceof Error&&e.name==="AbortError"&&(e=new K),e instanceof K)return I(this,Lo,!0,"f"),this._emit("abort",e);if(e instanceof T)return this._emit("error",e);if(e instanceof Error){let t=new T(e.message);return t.cause=e,this._emit("error",t)}return this._emit("error",new T(String(e)))},"_EventStream_handleError")});function Wf(n){return typeof n.parse=="function"}var Wa=d(()=>{"use strict";i(Wf,"isRunnableFunctionWithParse")});var me,qa,Do,Ga,Xa,Ja,qf,Gf,OS,Dr,Ka=d(()=>{"use strict";Ae();Ne();nn();Ba();$o();Wa();OS=10,Dr=class extends yt{static{i(this,"AbstractChatCompletionRunner")}constructor(){super(...arguments),me.add(this),this._chatCompletions=[],this.messages=[]}_addChatCompletion(e){this._chatCompletions.push(e),this._emit("chatCompletion",e);let t=e.choices[0]?.message;return t&&this._addMessage(t),e}_addMessage(e,t=!0){if("content"in e||(e.content=null),this.messages.push(e),t){if(this._emit("message",e),ja(e)&&e.content)this._emit("functionToolCallResult",e.content);else if(Lr(e)&&e.tool_calls)for(let r of e.tool_calls)r.type==="function"&&this._emit("functionToolCall",r.function)}}async finalChatCompletion(){await this.done();let e=this._chatCompletions[this._chatCompletions.length-1];if(!e)throw new T("stream ended without producing a ChatCompletion");return e}async finalContent(){return await this.done(),h(this,me,"m",qa).call(this)}async finalMessage(){return await this.done(),h(this,me,"m",Do).call(this)}async finalFunctionToolCall(){return await this.done(),h(this,me,"m",Ga).call(this)}async finalFunctionToolCallResult(){return await this.done(),h(this,me,"m",Xa).call(this)}async totalUsage(){return await this.done(),h(this,me,"m",Ja).call(this)}allChatCompletions(){return[...this._chatCompletions]}_emitFinal(){let e=this._chatCompletions[this._chatCompletions.length-1];e&&this._emit("finalChatCompletion",e);let t=h(this,me,"m",Do).call(this);t&&this._emit("finalMessage",t);let r=h(this,me,"m",qa).call(this);r&&this._emit("finalContent",r);let s=h(this,me,"m",Ga).call(this);s&&this._emit("finalFunctionToolCall",s);let o=h(this,me,"m",Xa).call(this);o!=null&&this._emit("finalFunctionToolCallResult",o),this._chatCompletions.some(a=>a.usage)&&this._emit("totalUsage",h(this,me,"m",Ja).call(this))}async _createChatCompletion(e,t,r){let s=r?.signal;s&&(s.aborted&&this.controller.abort(),s.addEventListener("abort",()=>this.controller.abort())),h(this,me,"m",qf).call(this,t);let o=await e.chat.completions.create({...t,stream:!1},{...r,signal:this.controller.signal});return this._connected(),this._addChatCompletion(sn(o,t))}async _runChatCompletion(e,t,r){for(let s of t.messages)this._addMessage(s,!1);return await this._createChatCompletion(e,t,r)}async _runTools(e,t,r){let s="tool",{tool_choice:o="auto",stream:a,...c}=t,l=typeof o!="string"&&o.type==="function"&&o?.function?.name,{maxChatCompletions:p=OS}=r||{},m=t.tools.map(g=>{if(Bt(g)){if(!g.$callback)throw new T("Tool given to `.runTools()` that does not have an associated function");return{type:"function",function:{function:g.$callback,name:g.function.name,description:g.function.description||"",parameters:g.function.parameters,parse:g.$parseRaw,strict:!0}}}return g}),f={};for(let g of m)g.type==="function"&&(f[g.function.name||g.function.function.name]=g.function);let S="tools"in t?m.map(g=>g.type==="function"?{type:"function",function:{name:g.function.name||g.function.function.name,parameters:g.function.parameters,description:g.function.description,strict:g.function.strict}}:g):void 0;for(let g of t.messages)this._addMessage(g,!1);for(let g=0;g<p;++g){let w=(await this._createChatCompletion(e,{...c,tool_choice:o,tools:S,messages:[...this.messages]},r)).choices[0]?.message;if(!w)throw new T("missing message in ChatCompletion response");if(!w.tool_calls?.length)return;for(let U of w.tool_calls){if(U.type!=="function")continue;let H=U.id,{name:b,arguments:G}=U.function,z=f[b];if(z){if(l&&l!==b){let te=`Invalid tool_call: ${JSON.stringify(b)}. ${JSON.stringify(l)} requested. Please try again`;this._addMessage({role:s,tool_call_id:H,content:te});continue}}else{let te=`Invalid tool_call: ${JSON.stringify(b)}. Available options are: ${Object.keys(f).map(re=>JSON.stringify(re)).join(", ")}. Please try again`;this._addMessage({role:s,tool_call_id:H,content:te});continue}let Ee;try{Ee=Wf(z)?await z.parse(G):G}catch(te){let re=te instanceof Error?te.message:String(te);this._addMessage({role:s,tool_call_id:H,content:re});continue}let ue=await z.function(Ee,this),W=h(this,me,"m",Gf).call(this,ue);if(this._addMessage({role:s,tool_call_id:H,content:W}),l)return}}}};me=new WeakSet,qa=i(function(){return h(this,me,"m",Do).call(this).content??null},"_AbstractChatCompletionRunner_getFinalContent"),Do=i(function(){let e=this.messages.length;for(;e-- >0;){let t=this.messages[e];if(Lr(t))return{...t,content:t.content??null,refusal:t.refusal??null}}throw new T("stream ended without producing a ChatCompletionMessage with role=assistant")},"_AbstractChatCompletionRunner_getFinalMessage"),Ga=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(Lr(t)&&t?.tool_calls?.length)return t.tool_calls.filter(r=>r.type==="function").at(-1)?.function}},"_AbstractChatCompletionRunner_getFinalFunctionToolCall"),Xa=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(ja(t)&&t.content!=null&&typeof t.content=="string"&&this.messages.some(r=>r.role==="assistant"&&r.tool_calls?.some(s=>s.type==="function"&&s.id===t.tool_call_id)))return t.content}},"_AbstractChatCompletionRunner_getFinalFunctionToolCallResult"),Ja=i(function(){let e={completion_tokens:0,prompt_tokens:0,total_tokens:0};for(let{usage:t}of this._chatCompletions)t&&(e.completion_tokens+=t.completion_tokens,e.prompt_tokens+=t.prompt_tokens,e.total_tokens+=t.total_tokens);return e},"_AbstractChatCompletionRunner_calculateTotalUsage"),qf=i(function(e){if(e.n!=null&&e.n>1)throw new T("ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.")},"_AbstractChatCompletionRunner_validateParams"),Gf=i(function(e){return typeof e=="string"?e:e===void 0?"undefined":JSON.stringify(e)},"_AbstractChatCompletionRunner_stringifyFunctionCallResult")});var un,Ya=d(()=>{"use strict";Ka();Ba();un=class n extends Dr{static{i(this,"ChatCompletionRunner")}static runTools(e,t,r){let s=new n,o={...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"runTools"}};return s._run(()=>s._runTools(e,t,o)),s}_addMessage(e,t=!0){super._addMessage(e,t),Lr(e)&&e.content&&this._emit("content",e.content)}}});function NS(n,e=se.ALL){if(typeof n!="string")throw new TypeError(`expecting str, got ${typeof n}`);if(!n.trim())throw new Error(`${n} is empty`);return LS(n.trim(),e)}var se,Qa,Za,LS,ec,Xf=d(()=>{"use strict";se={STR:1,NUM:2,ARR:4,OBJ:8,NULL:16,BOOL:32,NAN:64,INFINITY:128,MINUS_INFINITY:256,INF:384,SPECIAL:496,ATOM:499,COLLECTION:12,ALL:511},Qa=class extends Error{static{i(this,"PartialJSON")}},Za=class extends Error{static{i(this,"MalformedJSON")}};i(NS,"parseJSON");LS=i((n,e)=>{let t=n.length,r=0,s=i(S=>{throw new Qa(`${S} at position ${r}`)},"markPartialJSON"),o=i(S=>{throw new Za(`${S} at position ${r}`)},"throwMalformedError"),a=i(()=>(f(),r>=t&&s("Unexpected end of input"),n[r]==='"'?c():n[r]==="{"?l():n[r]==="["?p():n.substring(r,r+4)==="null"||se.NULL&e&&t-r<4&&"null".startsWith(n.substring(r))?(r+=4,null):n.substring(r,r+4)==="true"||se.BOOL&e&&t-r<4&&"true".startsWith(n.substring(r))?(r+=4,!0):n.substring(r,r+5)==="false"||se.BOOL&e&&t-r<5&&"false".startsWith(n.substring(r))?(r+=5,!1):n.substring(r,r+8)==="Infinity"||se.INFINITY&e&&t-r<8&&"Infinity".startsWith(n.substring(r))?(r+=8,1/0):n.substring(r,r+9)==="-Infinity"||se.MINUS_INFINITY&e&&1<t-r&&t-r<9&&"-Infinity".startsWith(n.substring(r))?(r+=9,-1/0):n.substring(r,r+3)==="NaN"||se.NAN&e&&t-r<3&&"NaN".startsWith(n.substring(r))?(r+=3,NaN):m()),"parseAny"),c=i(()=>{let S=r,g=!1;for(r++;r<t&&(n[r]!=='"'||g&&n[r-1]==="\\");)g=n[r]==="\\"?!g:!1,r++;if(n.charAt(r)=='"')try{return JSON.parse(n.substring(S,++r-Number(g)))}catch(P){o(String(P))}else if(se.STR&e)try{return JSON.parse(n.substring(S,r-Number(g))+'"')}catch{return JSON.parse(n.substring(S,n.lastIndexOf("\\"))+'"')}s("Unterminated string literal")},"parseStr"),l=i(()=>{r++,f();let S={};try{for(;n[r]!=="}";){if(f(),r>=t&&se.OBJ&e)return S;let g=c();f(),r++;try{let P=a();Object.defineProperty(S,g,{value:P,writable:!0,enumerable:!0,configurable:!0})}catch(P){if(se.OBJ&e)return S;throw P}f(),n[r]===","&&r++}}catch{if(se.OBJ&e)return S;s("Expected '}' at end of object")}return r++,S},"parseObj"),p=i(()=>{r++;let S=[];try{for(;n[r]!=="]";)S.push(a()),f(),n[r]===","&&r++}catch{if(se.ARR&e)return S;s("Expected ']' at end of array")}return r++,S},"parseArr"),m=i(()=>{if(r===0){n==="-"&&se.NUM&e&&s("Not sure what '-' is");try{return JSON.parse(n)}catch(g){if(se.NUM&e)try{return n[n.length-1]==="."?JSON.parse(n.substring(0,n.lastIndexOf("."))):JSON.parse(n.substring(0,n.lastIndexOf("e")))}catch{}o(String(g))}}let S=r;for(n[r]==="-"&&r++;n[r]&&!",]}".includes(n[r]);)r++;r==t&&!(se.NUM&e)&&s("Unterminated number literal");try{return JSON.parse(n.substring(S,r))}catch{n.substring(S,r)==="-"&&se.NUM&e&&s("Not sure what '-' is");try{return JSON.parse(n.substring(S,n.lastIndexOf("e")))}catch(P){o(String(P))}}},"parseNum"),f=i(()=>{for(;r<t&&`
94
- \r `.includes(n[r]);)r++},"skipBlank");return a()},"_parseJSON"),ec=i(n=>NS(n,se.ALL^se.NUM),"partialParse")});var tc=d(()=>{"use strict";Na()});function $S(n,e){let{id:t,choices:r,created:s,model:o,system_fingerprint:a,...c}=n,l={...c,id:t,choices:r.map(({message:p,finish_reason:m,index:f,logprobs:S,...g})=>{if(!m)throw new T(`missing finish_reason for choice ${f}`);let{content:P=null,function_call:w,tool_calls:U,...H}=p,b=p.role;if(!b)throw new T(`missing role for choice ${f}`);if(w){let{arguments:G,name:z}=w;if(G==null)throw new T(`missing function_call.arguments for choice ${f}`);if(!z)throw new T(`missing function_call.name for choice ${f}`);return{...g,message:{content:P,function_call:{arguments:G,name:z},role:b,refusal:p.refusal??null},finish_reason:m,index:f,logprobs:S}}return U?{...g,index:f,finish_reason:m,logprobs:S,message:{...H,role:b,content:P,refusal:p.refusal??null,tool_calls:U.map((G,z)=>{let{function:Ee,type:ue,id:W,...te}=G,{arguments:re,name:X,...Y}=Ee||{};if(W==null)throw new T(`missing choices[${f}].tool_calls[${z}].id
95
- ${Ho(n)}`);if(ue==null)throw new T(`missing choices[${f}].tool_calls[${z}].type
96
- ${Ho(n)}`);if(X==null)throw new T(`missing choices[${f}].tool_calls[${z}].function.name
97
- ${Ho(n)}`);if(re==null)throw new T(`missing choices[${f}].tool_calls[${z}].function.arguments
98
- ${Ho(n)}`);return{...te,id:W,type:ue,function:{...Y,name:X,arguments:re}}})}}:{...g,message:{...H,content:P,role:b,refusal:p.refusal??null},finish_reason:m,index:f,logprobs:S}}),created:s,model:o,object:"chat.completion",...a?{system_fingerprint:a}:{}};return Uf(l,e)}function Ho(n){return JSON.stringify(n)}var ee,tt,kr,Tt,rc,ko,sc,nc,oc,Fo,ic,Jf,zt,Uo=d(()=>{"use strict";Ae();Xf();Ne();nn();tc();Ka();zt=class n extends Dr{static{i(this,"ChatCompletionStream")}constructor(e){super(),ee.add(this),tt.set(this,void 0),kr.set(this,void 0),Tt.set(this,void 0),I(this,tt,e,"f"),I(this,kr,[],"f")}get currentChatCompletionSnapshot(){return h(this,Tt,"f")}static fromReadableStream(e){let t=new n(null);return t._run(()=>t._fromReadableStream(e)),t}static createChatCompletion(e,t,r){let s=new n(t);return s._run(()=>s._runChatCompletion(e,{...t,stream:!0},{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}async _createChatCompletion(e,t,r){super._createChatCompletion;let s=r?.signal;s&&(s.aborted&&this.controller.abort(),s.addEventListener("abort",()=>this.controller.abort())),h(this,ee,"m",rc).call(this);let o=await e.chat.completions.create({...t,stream:!0},{...r,signal:this.controller.signal});this._connected();for await(let a of o)h(this,ee,"m",sc).call(this,a);if(o.controller.signal?.aborted)throw new K;return this._addChatCompletion(h(this,ee,"m",Fo).call(this))}async _fromReadableStream(e,t){let r=t?.signal;r&&(r.aborted&&this.controller.abort(),r.addEventListener("abort",()=>this.controller.abort())),h(this,ee,"m",rc).call(this),this._connected();let s=We.fromReadableStream(e,this.controller),o;for await(let a of s)o&&o!==a.id&&this._addChatCompletion(h(this,ee,"m",Fo).call(this)),h(this,ee,"m",sc).call(this,a),o=a.id;if(s.controller.signal?.aborted)throw new K;return this._addChatCompletion(h(this,ee,"m",Fo).call(this))}[(tt=new WeakMap,kr=new WeakMap,Tt=new WeakMap,ee=new WeakSet,rc=i(function(){this.ended||I(this,Tt,void 0,"f")},"_ChatCompletionStream_beginRequest"),ko=i(function(t){let r=h(this,kr,"f")[t.index];return r||(r={content_done:!1,refusal_done:!1,logprobs_content_done:!1,logprobs_refusal_done:!1,done_tool_calls:new Set,current_tool_call_index:null},h(this,kr,"f")[t.index]=r,r)},"_ChatCompletionStream_getChoiceEventState"),sc=i(function(t){if(this.ended)return;let r=h(this,ee,"m",Jf).call(this,t);this._emit("chunk",t,r);for(let s of t.choices){let o=r.choices[s.index];s.delta.content!=null&&o.message?.role==="assistant"&&o.message?.content&&(this._emit("content",s.delta.content,o.message.content),this._emit("content.delta",{delta:s.delta.content,snapshot:o.message.content,parsed:o.message.parsed})),s.delta.refusal!=null&&o.message?.role==="assistant"&&o.message?.refusal&&this._emit("refusal.delta",{delta:s.delta.refusal,snapshot:o.message.refusal}),s.logprobs?.content!=null&&o.message?.role==="assistant"&&this._emit("logprobs.content.delta",{content:s.logprobs?.content,snapshot:o.logprobs?.content??[]}),s.logprobs?.refusal!=null&&o.message?.role==="assistant"&&this._emit("logprobs.refusal.delta",{refusal:s.logprobs?.refusal,snapshot:o.logprobs?.refusal??[]});let a=h(this,ee,"m",ko).call(this,o);o.finish_reason&&(h(this,ee,"m",oc).call(this,o),a.current_tool_call_index!=null&&h(this,ee,"m",nc).call(this,o,a.current_tool_call_index));for(let c of s.delta.tool_calls??[])a.current_tool_call_index!==c.index&&(h(this,ee,"m",oc).call(this,o),a.current_tool_call_index!=null&&h(this,ee,"m",nc).call(this,o,a.current_tool_call_index)),a.current_tool_call_index=c.index;for(let c of s.delta.tool_calls??[]){let l=o.message.tool_calls?.[c.index];l?.type&&(l?.type==="function"?this._emit("tool_calls.function.arguments.delta",{name:l.function?.name,index:c.index,arguments:l.function.arguments,parsed_arguments:l.function.parsed_arguments,arguments_delta:c.function?.arguments??""}):(l?.type,void 0))}}},"_ChatCompletionStream_addChunk"),nc=i(function(t,r){if(h(this,ee,"m",ko).call(this,t).done_tool_calls.has(r))return;let o=t.message.tool_calls?.[r];if(!o)throw new Error("no tool call snapshot");if(!o.type)throw new Error("tool call snapshot missing `type`");if(o.type==="function"){let a=h(this,tt,"f")?.tools?.find(c=>tn(c)&&c.function.name===o.function.name);this._emit("tool_calls.function.arguments.done",{name:o.function.name,index:r,arguments:o.function.arguments,parsed_arguments:Bt(a)?a.$parseRaw(o.function.arguments):a?.function.strict?JSON.parse(o.function.arguments):null})}else o.type},"_ChatCompletionStream_emitToolCallDoneEvent"),oc=i(function(t){let r=h(this,ee,"m",ko).call(this,t);if(t.message.content&&!r.content_done){r.content_done=!0;let s=h(this,ee,"m",ic).call(this);this._emit("content.done",{content:t.message.content,parsed:s?s.$parseRaw(t.message.content):null})}t.message.refusal&&!r.refusal_done&&(r.refusal_done=!0,this._emit("refusal.done",{refusal:t.message.refusal})),t.logprobs?.content&&!r.logprobs_content_done&&(r.logprobs_content_done=!0,this._emit("logprobs.content.done",{content:t.logprobs.content})),t.logprobs?.refusal&&!r.logprobs_refusal_done&&(r.logprobs_refusal_done=!0,this._emit("logprobs.refusal.done",{refusal:t.logprobs.refusal}))},"_ChatCompletionStream_emitContentDoneEvents"),Fo=i(function(){if(this.ended)throw new T("stream has ended, this shouldn't happen");let t=h(this,Tt,"f");if(!t)throw new T("request ended without sending any chunks");return I(this,Tt,void 0,"f"),I(this,kr,[],"f"),$S(t,h(this,tt,"f"))},"_ChatCompletionStream_endRequest"),ic=i(function(){let t=h(this,tt,"f")?.response_format;return rn(t)?t:null},"_ChatCompletionStream_getAutoParseableResponseFormat"),Jf=i(function(t){var r,s,o,a;let c=h(this,Tt,"f"),{choices:l,...p}=t;c?Object.assign(c,p):c=I(this,Tt,{...p,choices:[]},"f");for(let{delta:m,finish_reason:f,index:S,logprobs:g=null,...P}of t.choices){let w=c.choices[S];if(w||(w=c.choices[S]={finish_reason:f,index:S,message:{},logprobs:g,...P}),g)if(!w.logprobs)w.logprobs=Object.assign({},g);else{let{content:ue,refusal:W,...te}=g;Object.assign(w.logprobs,te),ue&&((r=w.logprobs).content??(r.content=[]),w.logprobs.content.push(...ue)),W&&((s=w.logprobs).refusal??(s.refusal=[]),w.logprobs.refusal.push(...W))}if(f&&(w.finish_reason=f,h(this,tt,"f")&&Va(h(this,tt,"f")))){if(f==="length")throw new Ir;if(f==="content_filter")throw new Mr}if(Object.assign(w,P),!m)continue;let{content:U,refusal:H,function_call:b,role:G,tool_calls:z,...Ee}=m;if(Object.assign(w.message,Ee),H&&(w.message.refusal=(w.message.refusal||"")+H),G&&(w.message.role=G),b&&(w.message.function_call?(b.name&&(w.message.function_call.name=b.name),b.arguments&&((o=w.message.function_call).arguments??(o.arguments=""),w.message.function_call.arguments+=b.arguments)):w.message.function_call=b),U&&(w.message.content=(w.message.content||"")+U,!w.message.refusal&&h(this,ee,"m",ic).call(this)&&(w.message.parsed=ec(w.message.content))),z){w.message.tool_calls||(w.message.tool_calls=[]);for(let{index:ue,id:W,type:te,function:re,...X}of z){let Y=(a=w.message.tool_calls)[ue]??(a[ue]={});Object.assign(Y,X),W&&(Y.id=W),te&&(Y.type=te),re&&(Y.function??(Y.function={name:re.name??"",arguments:""})),re?.name&&(Y.function.name=re.name),re?.arguments&&(Y.function.arguments+=re.arguments,Vf(h(this,tt,"f"),Y)&&(Y.function.parsed_arguments=ec(Y.function.arguments)))}}}return c},"_ChatCompletionStream_accumulateChatCompletion"),Symbol.asyncIterator)](){let e=[],t=[],r=!1;return this.on("chunk",s=>{let o=t.shift();o?o.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of t)s.resolve(void 0);t.length=0}),this.on("abort",s=>{r=!0;for(let o of t)o.reject(s);t.length=0}),this.on("error",s=>{r=!0;for(let o of t)o.reject(s);t.length=0}),{next:i(async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((o,a)=>t.push({resolve:o,reject:a})).then(o=>o?{value:o,done:!1}:{value:void 0,done:!0}),"next"),return:i(async()=>(this.abort(),{value:void 0,done:!0}),"return")}}toReadableStream(){return new We(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}};i($S,"finalizeChatCompletion");i(Ho,"str")});var pn,ac=d(()=>{"use strict";Uo();pn=class n extends zt{static{i(this,"ChatCompletionStreamingRunner")}static fromReadableStream(e){let t=new n(null);return t._run(()=>t._fromReadableStream(e)),t}static runTools(e,t,r){let s=new n(t),o={...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"runTools"}};return s._run(()=>s._runTools(e,t,o)),s}}});var rt,dn=d(()=>{"use strict";A();Io();Io();F();L();Ya();ac();Uo();nn();ac();Wa();Uo();Ya();rt=class extends C{static{i(this,"Completions")}constructor(){super(...arguments),this.messages=new jt(this._client)}create(e,t){return this._client.post("/chat/completions",{body:e,...t,stream:e.stream??!1})}retrieve(e,t){return this._client.get(E`/chat/completions/${e}`,t)}update(e,t,r){return this._client.post(E`/chat/completions/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/chat/completions",O,{query:e,...t})}delete(e,t){return this._client.delete(E`/chat/completions/${e}`,t)}parse(e,t){return Bf(e.tools),this._client.chat.completions.create(e,{...t,headers:{...t?.headers,"X-Stainless-Helper-Method":"chat.completions.parse"}})._thenUnwrap(r=>sn(r,e))}runTools(e,t){return e.stream?pn.runTools(this._client,e,t):un.runTools(this._client,e,t)}stream(e,t){return zt.createChatCompletion(this._client,e,t)}};rt.Messages=jt});var _t,cc=d(()=>{"use strict";A();dn();dn();_t=class extends C{static{i(this,"Chat")}constructor(){super(...arguments),this.completions=new rt(this._client)}};_t.Completions=rt});var Kf=d(()=>{"use strict";dn();dn();Io()});var Yf=d(()=>{"use strict";cc();Kf()});var Qf=d(()=>{"use strict"});function*kS(n){if(!n)return;if(Zf in n){let{values:r,nulls:s}=n;yield*r.entries();for(let o of s)yield[o,null];return}let e=!1,t;n instanceof Headers?t=n.entries():Ca(n)?t=n:(e=!0,t=Object.entries(n??{}));for(let r of t){let s=r[0];if(typeof s!="string")throw new TypeError("expected header name to be a string");let o=Ca(r[1])?r[1]:[r[1]],a=!1;for(let c of o)c!==void 0&&(e&&!a&&(a=!0,yield[s,null]),yield[s,c])}}var Zf,v,V=d(()=>{"use strict";Ke();Zf=Symbol("brand.privateNullableHeaders");i(kS,"iterateHeaders");v=i(n=>{let e=new Headers,t=new Set;for(let r of n){let s=new Set;for(let[o,a]of kS(r)){let c=o.toLowerCase();s.has(c)||(e.delete(o),s.add(c)),a===null?(e.delete(o),t.add(c)):(e.append(o,a),t.delete(c))}}return{[Zf]:!0,values:e,nulls:t}},"buildHeaders")});var Fr,lc=d(()=>{"use strict";A();V();Fr=class extends C{static{i(this,"Speech")}create(e,t){return this._client.post("/audio/speech",{body:e,...t,headers:v([{Accept:"application/octet-stream"},t?.headers]),__binaryResponse:!0})}}});var Hr,uc=d(()=>{"use strict";A();we();Hr=class extends C{static{i(this,"Transcriptions")}create(e,t){return this._client.post("/audio/transcriptions",Oe({body:e,...t,stream:e.stream??!1,__metadata:{model:e.model}},this._client))}}});var Ur,pc=d(()=>{"use strict";A();we();Ur=class extends C{static{i(this,"Translations")}create(e,t){return this._client.post("/audio/translations",Oe({body:e,...t,__metadata:{model:e.model}},this._client))}}});var Ge,dc=d(()=>{"use strict";A();lc();lc();uc();uc();pc();pc();Ge=class extends C{static{i(this,"Audio")}constructor(){super(...arguments),this.transcriptions=new Hr(this._client),this.translations=new Ur(this._client),this.speech=new Fr(this._client)}};Ge.Transcriptions=Hr;Ge.Translations=Ur;Ge.Speech=Fr});var Wt,fc=d(()=>{"use strict";A();F();L();Wt=class extends C{static{i(this,"Batches")}create(e,t){return this._client.post("/batches",{body:e,...t})}retrieve(e,t){return this._client.get(E`/batches/${e}`,t)}list(e={},t){return this._client.getAPIList("/batches",O,{query:e,...t})}cancel(e,t){return this._client.post(E`/batches/${e}/cancel`,t)}}});var Vr,mc=d(()=>{"use strict";A();F();V();L();Vr=class extends C{static{i(this,"Assistants")}create(e,t){return this._client.post("/assistants",{body:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(E`/assistants/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(E`/assistants/${e}`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e={},t){return this._client.getAPIList("/assistants",O,{query:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}delete(e,t){return this._client.delete(E`/assistants/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}}});var jr,gc=d(()=>{"use strict";A();V();jr=class extends C{static{i(this,"Sessions")}create(e,t){return this._client.post("/realtime/sessions",{body:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}}});var Br,hc=d(()=>{"use strict";A();V();Br=class extends C{static{i(this,"TranscriptionSessions")}create(e,t){return this._client.post("/realtime/transcription_sessions",{body:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}}});var Rt,Ec=d(()=>{"use strict";A();gc();gc();hc();hc();Rt=class extends C{static{i(this,"Realtime")}constructor(){super(...arguments),this.sessions=new jr(this._client),this.transcriptionSessions=new Br(this._client)}};Rt.Sessions=jr;Rt.TranscriptionSessions=Br});var zr,Cc=d(()=>{"use strict";A();V();L();zr=class extends C{static{i(this,"Sessions")}create(e,t){return this._client.post("/chatkit/sessions",{body:e,...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}cancel(e,t){return this._client.post(E`/chatkit/sessions/${e}/cancel`,{...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}}});var Wr,Sc=d(()=>{"use strict";A();F();V();L();Wr=class extends C{static{i(this,"Threads")}retrieve(e,t){return this._client.get(E`/chatkit/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}list(e={},t){return this._client.getAPIList("/chatkit/threads",Qe,{query:e,...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}delete(e,t){return this._client.delete(E`/chatkit/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}listItems(e,t={},r){return this._client.getAPIList(E`/chatkit/threads/${e}/items`,Qe,{query:t,...r,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},r?.headers])})}}});var Pt,vc=d(()=>{"use strict";A();Cc();Cc();Sc();Sc();Pt=class extends C{static{i(this,"ChatKit")}constructor(){super(...arguments),this.sessions=new zr(this._client),this.threads=new Wr(this._client)}};Pt.Sessions=zr;Pt.Threads=Wr});var qr,yc=d(()=>{"use strict";A();F();V();L();qr=class extends C{static{i(this,"Messages")}create(e,t,r){return this._client.post(E`/threads/${e}/messages`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{thread_id:s}=t;return this._client.get(E`/threads/${s}/messages/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{thread_id:s,...o}=t;return this._client.post(E`/threads/${s}/messages/${e}`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(E`/threads/${e}/messages`,O,{query:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t,r){let{thread_id:s}=t;return this._client.delete(E`/threads/${s}/messages/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}}});var Gr,Tc=d(()=>{"use strict";A();F();V();L();Gr=class extends C{static{i(this,"Steps")}retrieve(e,t,r){let{thread_id:s,run_id:o,...a}=t;return this._client.get(E`/threads/${s}/runs/${o}/steps/${e}`,{query:a,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t,r){let{thread_id:s,...o}=t;return this._client.getAPIList(E`/threads/${s}/runs/${e}/steps`,O,{query:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}}});var em,tm=d(()=>{"use strict";je();yo();em=i(n=>{if(typeof Buffer<"u"){let e=Buffer.from(n,"base64");return Array.from(new Float32Array(e.buffer,e.byteOffset,e.length/Float32Array.BYTES_PER_ELEMENT))}else{let e=atob(n),t=e.length,r=new Uint8Array(t);for(let s=0;s<t;s++)r[s]=e.charCodeAt(s);return Array.from(new Float32Array(r.buffer))}},"toFloat32Array")});var bt,_c=d(()=>{"use strict";bt=i(n=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[n]?.trim()??void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(n)?.trim()},"readEnv")});var fn=d(()=>{"use strict";Ke();tm();_c();Js();Ea();xr()});var ie,Gt,Rc,Xe,Vo,Le,Xt,Xr,qt,zo,Te,jo,Bo,hn,mn,gn,rm,sm,nm,om,im,am,cm,st,Pc=d(()=>{"use strict";Ae();tc();Ne();$o();fn();st=class extends yt{static{i(this,"AssistantStream")}constructor(){super(...arguments),ie.add(this),Rc.set(this,[]),Xe.set(this,{}),Vo.set(this,{}),Le.set(this,void 0),Xt.set(this,void 0),Xr.set(this,void 0),qt.set(this,void 0),zo.set(this,void 0),Te.set(this,void 0),jo.set(this,void 0),Bo.set(this,void 0),hn.set(this,void 0)}[(Rc=new WeakMap,Xe=new WeakMap,Vo=new WeakMap,Le=new WeakMap,Xt=new WeakMap,Xr=new WeakMap,qt=new WeakMap,zo=new WeakMap,Te=new WeakMap,jo=new WeakMap,Bo=new WeakMap,hn=new WeakMap,ie=new WeakSet,Symbol.asyncIterator)](){let e=[],t=[],r=!1;return this.on("event",s=>{let o=t.shift();o?o.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of t)s.resolve(void 0);t.length=0}),this.on("abort",s=>{r=!0;for(let o of t)o.reject(s);t.length=0}),this.on("error",s=>{r=!0;for(let o of t)o.reject(s);t.length=0}),{next:i(async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((o,a)=>t.push({resolve:o,reject:a})).then(o=>o?{value:o,done:!1}:{value:void 0,done:!0}),"next"),return:i(async()=>(this.abort(),{value:void 0,done:!0}),"return")}}static fromReadableStream(e){let t=new Gt;return t._run(()=>t._fromReadableStream(e)),t}async _fromReadableStream(e,t){let r=t?.signal;r&&(r.aborted&&this.controller.abort(),r.addEventListener("abort",()=>this.controller.abort())),this._connected();let s=We.fromReadableStream(e,this.controller);for await(let o of s)h(this,ie,"m",mn).call(this,o);if(s.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",gn).call(this))}toReadableStream(){return new We(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}static createToolAssistantStream(e,t,r,s){let o=new Gt;return o._run(()=>o._runToolAssistantStream(e,t,r,{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),o}async _createToolAssistantStream(e,t,r,s){let o=s?.signal;o&&(o.aborted&&this.controller.abort(),o.addEventListener("abort",()=>this.controller.abort()));let a={...r,stream:!0},c=await e.submitToolOutputs(t,a,{...s,signal:this.controller.signal});this._connected();for await(let l of c)h(this,ie,"m",mn).call(this,l);if(c.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",gn).call(this))}static createThreadAssistantStream(e,t,r){let s=new Gt;return s._run(()=>s._threadAssistantStream(e,t,{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}static createAssistantStream(e,t,r,s){let o=new Gt;return o._run(()=>o._runAssistantStream(e,t,r,{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),o}currentEvent(){return h(this,jo,"f")}currentRun(){return h(this,Bo,"f")}currentMessageSnapshot(){return h(this,Le,"f")}currentRunStepSnapshot(){return h(this,hn,"f")}async finalRunSteps(){return await this.done(),Object.values(h(this,Xe,"f"))}async finalMessages(){return await this.done(),Object.values(h(this,Vo,"f"))}async finalRun(){if(await this.done(),!h(this,Xt,"f"))throw Error("Final run was not received.");return h(this,Xt,"f")}async _createThreadAssistantStream(e,t,r){let s=r?.signal;s&&(s.aborted&&this.controller.abort(),s.addEventListener("abort",()=>this.controller.abort()));let o={...t,stream:!0},a=await e.createAndRun(o,{...r,signal:this.controller.signal});this._connected();for await(let c of a)h(this,ie,"m",mn).call(this,c);if(a.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",gn).call(this))}async _createAssistantStream(e,t,r,s){let o=s?.signal;o&&(o.aborted&&this.controller.abort(),o.addEventListener("abort",()=>this.controller.abort()));let a={...r,stream:!0},c=await e.create(t,a,{...s,signal:this.controller.signal});this._connected();for await(let l of c)h(this,ie,"m",mn).call(this,l);if(c.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",gn).call(this))}static accumulateDelta(e,t){for(let[r,s]of Object.entries(t)){if(!e.hasOwnProperty(r)){e[r]=s;continue}let o=e[r];if(o==null){e[r]=s;continue}if(r==="index"||r==="type"){e[r]=s;continue}if(typeof o=="string"&&typeof s=="string")o+=s;else if(typeof o=="number"&&typeof s=="number")o+=s;else if(qs(o)&&qs(s))o=this.accumulateDelta(o,s);else if(Array.isArray(o)&&Array.isArray(s)){if(o.every(a=>typeof a=="string"||typeof a=="number")){o.push(...s);continue}for(let a of s){if(!qs(a))throw new Error(`Expected array delta entry to be an object but got: ${a}`);let c=a.index;if(c==null)throw new Error("Expected array delta entry to have an `index` property");if(typeof c!="number")throw new Error(`Expected array delta entry \`index\` property to be a number but got ${c}`);let l=o[c];l==null?o.push(a):o[c]=this.accumulateDelta(l,a)}continue}else throw Error(`Unhandled record type: ${r}, deltaValue: ${s}, accValue: ${o}`);e[r]=o}return e}_addRun(e){return e}async _threadAssistantStream(e,t,r){return await this._createThreadAssistantStream(t,e,r)}async _runAssistantStream(e,t,r,s){return await this._createAssistantStream(t,e,r,s)}async _runToolAssistantStream(e,t,r,s){return await this._createToolAssistantStream(t,e,r,s)}};Gt=st,mn=i(function(e){if(!this.ended)switch(I(this,jo,e,"f"),h(this,ie,"m",nm).call(this,e),e.event){case"thread.created":break;case"thread.run.created":case"thread.run.queued":case"thread.run.in_progress":case"thread.run.requires_action":case"thread.run.completed":case"thread.run.incomplete":case"thread.run.failed":case"thread.run.cancelling":case"thread.run.cancelled":case"thread.run.expired":h(this,ie,"m",cm).call(this,e);break;case"thread.run.step.created":case"thread.run.step.in_progress":case"thread.run.step.delta":case"thread.run.step.completed":case"thread.run.step.failed":case"thread.run.step.cancelled":case"thread.run.step.expired":h(this,ie,"m",sm).call(this,e);break;case"thread.message.created":case"thread.message.in_progress":case"thread.message.delta":case"thread.message.completed":case"thread.message.incomplete":h(this,ie,"m",rm).call(this,e);break;case"error":throw new Error("Encountered an error event in event processing - errors should be processed earlier");default:}},"_AssistantStream_addEvent"),gn=i(function(){if(this.ended)throw new T("stream has ended, this shouldn't happen");if(!h(this,Xt,"f"))throw Error("Final run has not been received");return h(this,Xt,"f")},"_AssistantStream_endRequest"),rm=i(function(e){let[t,r]=h(this,ie,"m",im).call(this,e,h(this,Le,"f"));I(this,Le,t,"f"),h(this,Vo,"f")[t.id]=t;for(let s of r){let o=t.content[s.index];o?.type=="text"&&this._emit("textCreated",o.text)}switch(e.event){case"thread.message.created":this._emit("messageCreated",e.data);break;case"thread.message.in_progress":break;case"thread.message.delta":if(this._emit("messageDelta",e.data.delta,t),e.data.delta.content)for(let s of e.data.delta.content){if(s.type=="text"&&s.text){let o=s.text,a=t.content[s.index];if(a&&a.type=="text")this._emit("textDelta",o,a.text);else throw Error("The snapshot associated with this text delta is not text or missing")}if(s.index!=h(this,Xr,"f")){if(h(this,qt,"f"))switch(h(this,qt,"f").type){case"text":this._emit("textDone",h(this,qt,"f").text,h(this,Le,"f"));break;case"image_file":this._emit("imageFileDone",h(this,qt,"f").image_file,h(this,Le,"f"));break}I(this,Xr,s.index,"f")}I(this,qt,t.content[s.index],"f")}break;case"thread.message.completed":case"thread.message.incomplete":if(h(this,Xr,"f")!==void 0){let s=e.data.content[h(this,Xr,"f")];if(s)switch(s.type){case"image_file":this._emit("imageFileDone",s.image_file,h(this,Le,"f"));break;case"text":this._emit("textDone",s.text,h(this,Le,"f"));break}}h(this,Le,"f")&&this._emit("messageDone",e.data),I(this,Le,void 0,"f")}},"_AssistantStream_handleMessage"),sm=i(function(e){let t=h(this,ie,"m",om).call(this,e);switch(I(this,hn,t,"f"),e.event){case"thread.run.step.created":this._emit("runStepCreated",e.data);break;case"thread.run.step.delta":let r=e.data.delta;if(r.step_details&&r.step_details.type=="tool_calls"&&r.step_details.tool_calls&&t.step_details.type=="tool_calls")for(let o of r.step_details.tool_calls)o.index==h(this,zo,"f")?this._emit("toolCallDelta",o,t.step_details.tool_calls[o.index]):(h(this,Te,"f")&&this._emit("toolCallDone",h(this,Te,"f")),I(this,zo,o.index,"f"),I(this,Te,t.step_details.tool_calls[o.index],"f"),h(this,Te,"f")&&this._emit("toolCallCreated",h(this,Te,"f")));this._emit("runStepDelta",e.data.delta,t);break;case"thread.run.step.completed":case"thread.run.step.failed":case"thread.run.step.cancelled":case"thread.run.step.expired":I(this,hn,void 0,"f"),e.data.step_details.type=="tool_calls"&&h(this,Te,"f")&&(this._emit("toolCallDone",h(this,Te,"f")),I(this,Te,void 0,"f")),this._emit("runStepDone",e.data,t);break;case"thread.run.step.in_progress":break}},"_AssistantStream_handleRunStep"),nm=i(function(e){h(this,Rc,"f").push(e),this._emit("event",e)},"_AssistantStream_handleEvent"),om=i(function(e){switch(e.event){case"thread.run.step.created":return h(this,Xe,"f")[e.data.id]=e.data,e.data;case"thread.run.step.delta":let t=h(this,Xe,"f")[e.data.id];if(!t)throw Error("Received a RunStepDelta before creation of a snapshot");let r=e.data;if(r.delta){let s=Gt.accumulateDelta(t,r.delta);h(this,Xe,"f")[e.data.id]=s}return h(this,Xe,"f")[e.data.id];case"thread.run.step.completed":case"thread.run.step.failed":case"thread.run.step.cancelled":case"thread.run.step.expired":case"thread.run.step.in_progress":h(this,Xe,"f")[e.data.id]=e.data;break}if(h(this,Xe,"f")[e.data.id])return h(this,Xe,"f")[e.data.id];throw new Error("No snapshot available")},"_AssistantStream_accumulateRunStep"),im=i(function(e,t){let r=[];switch(e.event){case"thread.message.created":return[e.data,r];case"thread.message.delta":if(!t)throw Error("Received a delta with no existing snapshot (there should be one from message creation)");let s=e.data;if(s.delta.content)for(let o of s.delta.content)if(o.index in t.content){let a=t.content[o.index];t.content[o.index]=h(this,ie,"m",am).call(this,o,a)}else t.content[o.index]=o,r.push(o);return[t,r];case"thread.message.in_progress":case"thread.message.completed":case"thread.message.incomplete":if(t)return[t,r];throw Error("Received thread message event with no existing snapshot")}throw Error("Tried to accumulate a non-message event")},"_AssistantStream_accumulateMessage"),am=i(function(e,t){return Gt.accumulateDelta(t,e)},"_AssistantStream_accumulateContent"),cm=i(function(e){switch(I(this,Bo,e.data,"f"),e.event){case"thread.run.created":break;case"thread.run.queued":break;case"thread.run.in_progress":break;case"thread.run.requires_action":case"thread.run.cancelled":case"thread.run.failed":case"thread.run.completed":case"thread.run.expired":case"thread.run.incomplete":I(this,Xt,e.data,"f"),h(this,Te,"f")&&(this._emit("toolCallDone",h(this,Te,"f")),I(this,Te,void 0,"f"));break;case"thread.run.cancelling":break}},"_AssistantStream_handleRun")});var Jt,bc=d(()=>{"use strict";A();Tc();Tc();F();V();Pc();xr();L();Jt=class extends C{static{i(this,"Runs")}constructor(){super(...arguments),this.steps=new Gr(this._client)}create(e,t,r){let{include:s,...o}=t;return this._client.post(E`/threads/${e}/runs`,{query:{include:s},body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers]),stream:t.stream??!1})}retrieve(e,t,r){let{thread_id:s}=t;return this._client.get(E`/threads/${s}/runs/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{thread_id:s,...o}=t;return this._client.post(E`/threads/${s}/runs/${e}`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(E`/threads/${e}/runs`,O,{query:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}cancel(e,t,r){let{thread_id:s}=t;return this._client.post(E`/threads/${s}/runs/${e}/cancel`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}async createAndPoll(e,t,r){let s=await this.create(e,t,r);return await this.poll(s.id,{thread_id:e},r)}createAndStream(e,t,r){return st.createAssistantStream(e,this._client.beta.threads.runs,t,r)}async poll(e,t,r){let s=v([r?.headers,{"X-Stainless-Poll-Helper":"true","X-Stainless-Custom-Poll-Interval":r?.pollIntervalMs?.toString()??void 0}]);for(;;){let{data:o,response:a}=await this.retrieve(e,t,{...r,headers:{...r?.headers,...s}}).withResponse();switch(o.status){case"queued":case"in_progress":case"cancelling":let c=5e3;if(r?.pollIntervalMs)c=r.pollIntervalMs;else{let l=a.headers.get("openai-poll-after-ms");if(l){let p=parseInt(l);isNaN(p)||(c=p)}}await Be(c);break;case"requires_action":case"incomplete":case"cancelled":case"completed":case"failed":case"expired":return o}}}stream(e,t,r){return st.createAssistantStream(e,this._client.beta.threads.runs,t,r)}submitToolOutputs(e,t,r){let{thread_id:s,...o}=t;return this._client.post(E`/threads/${s}/runs/${e}/submit_tool_outputs`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers]),stream:t.stream??!1})}async submitToolOutputsAndPoll(e,t,r){let s=await this.submitToolOutputs(e,t,r);return await this.poll(s.id,t,r)}submitToolOutputsStream(e,t,r){return st.createToolAssistantStream(e,this._client.beta.threads.runs,t,r)}};Jt.Steps=Gr});var At,Ac=d(()=>{"use strict";A();yc();yc();bc();bc();V();Pc();L();At=class extends C{static{i(this,"Threads")}constructor(){super(...arguments),this.runs=new Jt(this._client),this.messages=new qr(this._client)}create(e={},t){return this._client.post("/threads",{body:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(E`/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(E`/threads/${e}`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t){return this._client.delete(E`/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}createAndRun(e,t){return this._client.post("/threads/runs",{body:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers]),stream:e.stream??!1})}async createAndRunPoll(e,t){let r=await this.createAndRun(e,t);return await this.runs.poll(r.id,{thread_id:r.thread_id},t)}createAndRunStream(e,t){return st.createThreadAssistantStream(e,this._client.beta.threads,t)}};At.Runs=Jt;At.Messages=qr});var $e,wc=d(()=>{"use strict";A();mc();mc();Ec();Ec();vc();vc();Ac();Ac();$e=class extends C{static{i(this,"Beta")}constructor(){super(...arguments),this.realtime=new Rt(this._client),this.chatkit=new Pt(this._client),this.assistants=new Vr(this._client),this.threads=new At(this._client)}};$e.Realtime=Rt;$e.ChatKit=Pt;$e.Assistants=Vr;$e.Threads=At});var Kt,Ic=d(()=>{"use strict";A();Kt=class extends C{static{i(this,"Completions")}create(e,t){return this._client.post("/completions",{body:e,...t,stream:e.stream??!1})}}});var Jr,Mc=d(()=>{"use strict";A();V();L();Jr=class extends C{static{i(this,"Content")}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(E`/containers/${s}/files/${e}/content`,{...r,headers:v([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}}});var Yt,xc=d(()=>{"use strict";A();Mc();Mc();F();V();we();L();Yt=class extends C{static{i(this,"Files")}constructor(){super(...arguments),this.content=new Jr(this._client)}create(e,t,r){return this._client.post(E`/containers/${e}/files`,Ze({body:t,...r},this._client))}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(E`/containers/${s}/files/${e}`,r)}list(e,t={},r){return this._client.getAPIList(E`/containers/${e}/files`,O,{query:t,...r})}delete(e,t,r){let{container_id:s}=t;return this._client.delete(E`/containers/${s}/files/${e}`,{...r,headers:v([{Accept:"*/*"},r?.headers])})}};Yt.Content=Jr});var wt,Oc=d(()=>{"use strict";A();xc();xc();F();V();L();wt=class extends C{static{i(this,"Containers")}constructor(){super(...arguments),this.files=new Yt(this._client)}create(e,t){return this._client.post("/containers",{body:e,...t})}retrieve(e,t){return this._client.get(E`/containers/${e}`,t)}list(e={},t){return this._client.getAPIList("/containers",O,{query:e,...t})}delete(e,t){return this._client.delete(E`/containers/${e}`,{...t,headers:v([{Accept:"*/*"},t?.headers])})}};wt.Files=Yt});var Kr,Nc=d(()=>{"use strict";A();F();L();Kr=class extends C{static{i(this,"Items")}create(e,t,r){let{include:s,...o}=t;return this._client.post(E`/conversations/${e}/items`,{query:{include:s},body:o,...r})}retrieve(e,t,r){let{conversation_id:s,...o}=t;return this._client.get(E`/conversations/${s}/items/${e}`,{query:o,...r})}list(e,t={},r){return this._client.getAPIList(E`/conversations/${e}/items`,Qe,{query:t,...r})}delete(e,t,r){let{conversation_id:s}=t;return this._client.delete(E`/conversations/${s}/items/${e}`,r)}}});var It,Lc=d(()=>{"use strict";A();Nc();Nc();L();It=class extends C{static{i(this,"Conversations")}constructor(){super(...arguments),this.items=new Kr(this._client)}create(e={},t){return this._client.post("/conversations",{body:e,...t})}retrieve(e,t){return this._client.get(E`/conversations/${e}`,t)}update(e,t,r){return this._client.post(E`/conversations/${e}`,{body:t,...r})}delete(e,t){return this._client.delete(E`/conversations/${e}`,t)}};It.Items=Kr});var Qt,$c=d(()=>{"use strict";A();fn();Qt=class extends C{static{i(this,"Embeddings")}create(e,t){let r=!!e.encoding_format,s=r?e.encoding_format:"base64";r&&q(this._client).debug("embeddings/user defined encoding_format:",e.encoding_format);let o=this._client.post("/embeddings",{body:{...e,encoding_format:s},...t});return r?o:(q(this._client).debug("embeddings/decoding base64 embeddings from base64"),o._thenUnwrap(a=>(a&&a.data&&a.data.forEach(c=>{let l=c.embedding;c.embedding=em(l)}),a)))}}});var Yr,Dc=d(()=>{"use strict";A();F();L();Yr=class extends C{static{i(this,"OutputItems")}retrieve(e,t,r){let{eval_id:s,run_id:o}=t;return this._client.get(E`/evals/${s}/runs/${o}/output_items/${e}`,r)}list(e,t,r){let{eval_id:s,...o}=t;return this._client.getAPIList(E`/evals/${s}/runs/${e}/output_items`,O,{query:o,...r})}}});var Zt,kc=d(()=>{"use strict";A();Dc();Dc();F();L();Zt=class extends C{static{i(this,"Runs")}constructor(){super(...arguments),this.outputItems=new Yr(this._client)}create(e,t,r){return this._client.post(E`/evals/${e}/runs`,{body:t,...r})}retrieve(e,t,r){let{eval_id:s}=t;return this._client.get(E`/evals/${s}/runs/${e}`,r)}list(e,t={},r){return this._client.getAPIList(E`/evals/${e}/runs`,O,{query:t,...r})}delete(e,t,r){let{eval_id:s}=t;return this._client.delete(E`/evals/${s}/runs/${e}`,r)}cancel(e,t,r){let{eval_id:s}=t;return this._client.post(E`/evals/${s}/runs/${e}`,r)}};Zt.OutputItems=Yr});var Mt,Fc=d(()=>{"use strict";A();kc();kc();F();L();Mt=class extends C{static{i(this,"Evals")}constructor(){super(...arguments),this.runs=new Zt(this._client)}create(e,t){return this._client.post("/evals",{body:e,...t})}retrieve(e,t){return this._client.get(E`/evals/${e}`,t)}update(e,t,r){return this._client.post(E`/evals/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/evals",O,{query:e,...t})}delete(e,t){return this._client.delete(E`/evals/${e}`,t)}};Mt.Runs=Zt});var er,Hc=d(()=>{"use strict";A();F();V();xr();Ne();we();L();er=class extends C{static{i(this,"Files")}create(e,t){return this._client.post("/files",Oe({body:e,...t},this._client))}retrieve(e,t){return this._client.get(E`/files/${e}`,t)}list(e={},t){return this._client.getAPIList("/files",O,{query:e,...t})}delete(e,t){return this._client.delete(E`/files/${e}`,t)}content(e,t){return this._client.get(E`/files/${e}/content`,{...t,headers:v([{Accept:"application/binary"},t?.headers]),__binaryResponse:!0})}async waitForProcessing(e,{pollInterval:t=5e3,maxWait:r=1800*1e3}={}){let s=new Set(["processed","error","deleted"]),o=Date.now(),a=await this.retrieve(e);for(;!a.status||!s.has(a.status);)if(await Be(t),a=await this.retrieve(e),Date.now()-o>r)throw new St({message:`Giving up on waiting for file ${e} to finish processing after ${r} milliseconds.`});return a}}});var Qr,Uc=d(()=>{"use strict";A();Qr=class extends C{static{i(this,"Methods")}}});var Zr,Vc=d(()=>{"use strict";A();Zr=class extends C{static{i(this,"Graders")}run(e,t){return this._client.post("/fine_tuning/alpha/graders/run",{body:e,...t})}validate(e,t){return this._client.post("/fine_tuning/alpha/graders/validate",{body:e,...t})}}});var tr,jc=d(()=>{"use strict";A();Vc();Vc();tr=class extends C{static{i(this,"Alpha")}constructor(){super(...arguments),this.graders=new Zr(this._client)}};tr.Graders=Zr});var es,Bc=d(()=>{"use strict";A();F();L();es=class extends C{static{i(this,"Permissions")}create(e,t,r){return this._client.getAPIList(E`/fine_tuning/checkpoints/${e}/permissions`,qe,{body:t,method:"post",...r})}retrieve(e,t={},r){return this._client.get(E`/fine_tuning/checkpoints/${e}/permissions`,{query:t,...r})}delete(e,t,r){let{fine_tuned_model_checkpoint:s}=t;return this._client.delete(E`/fine_tuning/checkpoints/${s}/permissions/${e}`,r)}}});var rr,zc=d(()=>{"use strict";A();Bc();Bc();rr=class extends C{static{i(this,"Checkpoints")}constructor(){super(...arguments),this.permissions=new es(this._client)}};rr.Permissions=es});var ts,Wc=d(()=>{"use strict";A();F();L();ts=class extends C{static{i(this,"Checkpoints")}list(e,t={},r){return this._client.getAPIList(E`/fine_tuning/jobs/${e}/checkpoints`,O,{query:t,...r})}}});var sr,qc=d(()=>{"use strict";A();Wc();Wc();F();L();sr=class extends C{static{i(this,"Jobs")}constructor(){super(...arguments),this.checkpoints=new ts(this._client)}create(e,t){return this._client.post("/fine_tuning/jobs",{body:e,...t})}retrieve(e,t){return this._client.get(E`/fine_tuning/jobs/${e}`,t)}list(e={},t){return this._client.getAPIList("/fine_tuning/jobs",O,{query:e,...t})}cancel(e,t){return this._client.post(E`/fine_tuning/jobs/${e}/cancel`,t)}listEvents(e,t={},r){return this._client.getAPIList(E`/fine_tuning/jobs/${e}/events`,O,{query:t,...r})}pause(e,t){return this._client.post(E`/fine_tuning/jobs/${e}/pause`,t)}resume(e,t){return this._client.post(E`/fine_tuning/jobs/${e}/resume`,t)}};sr.Checkpoints=ts});var De,Gc=d(()=>{"use strict";A();Uc();Uc();jc();jc();zc();zc();qc();qc();De=class extends C{static{i(this,"FineTuning")}constructor(){super(...arguments),this.methods=new Qr(this._client),this.jobs=new sr(this._client),this.checkpoints=new rr(this._client),this.alpha=new tr(this._client)}};De.Methods=Qr;De.Jobs=sr;De.Checkpoints=rr;De.Alpha=tr});var rs,Xc=d(()=>{"use strict";A();rs=class extends C{static{i(this,"GraderModels")}}});var xt,Jc=d(()=>{"use strict";A();Xc();Xc();xt=class extends C{static{i(this,"Graders")}constructor(){super(...arguments),this.graderModels=new rs(this._client)}};xt.GraderModels=rs});var nr,Kc=d(()=>{"use strict";A();we();nr=class extends C{static{i(this,"Images")}createVariation(e,t){return this._client.post("/images/variations",Oe({body:e,...t},this._client))}edit(e,t){return this._client.post("/images/edits",Oe({body:e,...t,stream:e.stream??!1},this._client))}generate(e,t){return this._client.post("/images/generations",{body:e,...t,stream:e.stream??!1})}}});var or,Yc=d(()=>{"use strict";A();F();L();or=class extends C{static{i(this,"Models")}retrieve(e,t){return this._client.get(E`/models/${e}`,t)}list(e){return this._client.getAPIList("/models",qe,e)}delete(e,t){return this._client.delete(E`/models/${e}`,t)}}});var ir,Qc=d(()=>{"use strict";A();ir=class extends C{static{i(this,"Moderations")}create(e,t){return this._client.post("/moderations",{body:e,...t})}}});var ss,Zc=d(()=>{"use strict";A();V();L();ss=class extends C{static{i(this,"Calls")}accept(e,t,r){return this._client.post(E`/realtime/calls/${e}/accept`,{body:t,...r,headers:v([{Accept:"*/*"},r?.headers])})}hangup(e,t){return this._client.post(E`/realtime/calls/${e}/hangup`,{...t,headers:v([{Accept:"*/*"},t?.headers])})}refer(e,t,r){return this._client.post(E`/realtime/calls/${e}/refer`,{body:t,...r,headers:v([{Accept:"*/*"},r?.headers])})}reject(e,t={},r){return this._client.post(E`/realtime/calls/${e}/reject`,{body:t,...r,headers:v([{Accept:"*/*"},r?.headers])})}}});var ns,el=d(()=>{"use strict";A();ns=class extends C{static{i(this,"ClientSecrets")}create(e,t){return this._client.post("/realtime/client_secrets",{body:e,...t})}}});var nt,tl=d(()=>{"use strict";A();Zc();Zc();el();el();nt=class extends C{static{i(this,"Realtime")}constructor(){super(...arguments),this.clientSecrets=new ns(this._client),this.calls=new ss(this._client)}};nt.ClientSecrets=ns;nt.Calls=ss});function lm(n,e){return!e||!mv(e)?{...n,output_parsed:null,output:n.output.map(t=>t.type==="function_call"?{...t,parsed_arguments:null}:t.type==="message"?{...t,content:t.content.map(r=>({...r,parsed:null}))}:t)}:rl(n,e)}function rl(n,e){let t=n.output.map(s=>{if(s.type==="function_call")return{...s,parsed_arguments:Ev(e,s)};if(s.type==="message"){let o=s.content.map(a=>a.type==="output_text"?{...a,parsed:fv(e,a.text)}:a);return{...s,content:o}}return s}),r=Object.assign({},n,{output:t});return Object.getOwnPropertyDescriptor(n,"output_text")||Wo(r),Object.defineProperty(r,"output_parsed",{enumerable:!0,get(){for(let s of r.output)if(s.type==="message"){for(let o of s.content)if(o.type==="output_text"&&o.parsed!==null)return o.parsed}return null}}),r}function fv(n,e){return n.text?.format?.type!=="json_schema"?null:"$parseRaw"in n.text?.format?(n.text?.format).$parseRaw(e):JSON.parse(e)}function mv(n){return!!rn(n.text?.format)}function gv(n){return n?.$brand==="auto-parseable-tool"}function hv(n,e){return n.find(t=>t.type==="function"&&t.name===e)}function Ev(n,e){let t=hv(n.tools??[],e.name);return{...e,...e,parsed_arguments:gv(t)?t.$parseRaw(e.arguments):t?.strict?JSON.parse(e.arguments):null}}function Wo(n){let e=[];for(let t of n.output)if(t.type==="message")for(let r of t.content)r.type==="output_text"&&e.push(r.text);n.output_text=e.join("")}var sl=d(()=>{"use strict";Ne();nn();i(lm,"maybeParseResponse");i(rl,"parseResponse");i(fv,"parseTextFormat");i(mv,"hasAutoParseableInput");i(gv,"isAutoParsableTool");i(hv,"getInputToolByName");i(Ev,"parseToolCall");i(Wo,"addOutputText")});function Cv(n,e){return lm(n,e)}var os,qo,Ot,Go,um,pm,dm,fm,Xo,mm=d(()=>{"use strict";Ae();Ne();$o();sl();Xo=class n extends yt{static{i(this,"ResponseStream")}constructor(e){super(),os.add(this),qo.set(this,void 0),Ot.set(this,void 0),Go.set(this,void 0),I(this,qo,e,"f")}static createResponse(e,t,r){let s=new n(t);return s._run(()=>s._createOrRetrieveResponse(e,t,{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}async _createOrRetrieveResponse(e,t,r){let s=r?.signal;s&&(s.aborted&&this.controller.abort(),s.addEventListener("abort",()=>this.controller.abort())),h(this,os,"m",um).call(this);let o,a=null;"response_id"in t?(o=await e.responses.retrieve(t.response_id,{stream:!0},{...r,signal:this.controller.signal,stream:!0}),a=t.starting_after??null):o=await e.responses.create({...t,stream:!0},{...r,signal:this.controller.signal}),this._connected();for await(let c of o)h(this,os,"m",pm).call(this,c,a);if(o.controller.signal?.aborted)throw new K;return h(this,os,"m",dm).call(this)}[(qo=new WeakMap,Ot=new WeakMap,Go=new WeakMap,os=new WeakSet,um=i(function(){this.ended||I(this,Ot,void 0,"f")},"_ResponseStream_beginRequest"),pm=i(function(t,r){if(this.ended)return;let s=i((a,c)=>{(r==null||c.sequence_number>r)&&this._emit(a,c)},"maybeEmit"),o=h(this,os,"m",fm).call(this,t);switch(s("event",t),t.type){case"response.output_text.delta":{let a=o.output[t.output_index];if(!a)throw new T(`missing output at index ${t.output_index}`);if(a.type==="message"){let c=a.content[t.content_index];if(!c)throw new T(`missing content at index ${t.content_index}`);if(c.type!=="output_text")throw new T(`expected content to be 'output_text', got ${c.type}`);s("response.output_text.delta",{...t,snapshot:c.text})}break}case"response.function_call_arguments.delta":{let a=o.output[t.output_index];if(!a)throw new T(`missing output at index ${t.output_index}`);a.type==="function_call"&&s("response.function_call_arguments.delta",{...t,snapshot:a.arguments});break}default:s(t.type,t);break}},"_ResponseStream_addEvent"),dm=i(function(){if(this.ended)throw new T("stream has ended, this shouldn't happen");let t=h(this,Ot,"f");if(!t)throw new T("request ended without sending any events");I(this,Ot,void 0,"f");let r=Cv(t,h(this,qo,"f"));return I(this,Go,r,"f"),r},"_ResponseStream_endRequest"),fm=i(function(t){let r=h(this,Ot,"f");if(!r){if(t.type!=="response.created")throw new T(`When snapshot hasn't been set yet, expected 'response.created' event, got ${t.type}`);return r=I(this,Ot,t.response,"f"),r}switch(t.type){case"response.output_item.added":{r.output.push(t.item);break}case"response.content_part.added":{let s=r.output[t.output_index];if(!s)throw new T(`missing output at index ${t.output_index}`);let o=s.type,a=t.part;o==="message"&&a.type!=="reasoning_text"?s.content.push(a):o==="reasoning"&&a.type==="reasoning_text"&&(s.content||(s.content=[]),s.content.push(a));break}case"response.output_text.delta":{let s=r.output[t.output_index];if(!s)throw new T(`missing output at index ${t.output_index}`);if(s.type==="message"){let o=s.content[t.content_index];if(!o)throw new T(`missing content at index ${t.content_index}`);if(o.type!=="output_text")throw new T(`expected content to be 'output_text', got ${o.type}`);o.text+=t.delta}break}case"response.function_call_arguments.delta":{let s=r.output[t.output_index];if(!s)throw new T(`missing output at index ${t.output_index}`);s.type==="function_call"&&(s.arguments+=t.delta);break}case"response.reasoning_text.delta":{let s=r.output[t.output_index];if(!s)throw new T(`missing output at index ${t.output_index}`);if(s.type==="reasoning"){let o=s.content?.[t.content_index];if(!o)throw new T(`missing content at index ${t.content_index}`);if(o.type!=="reasoning_text")throw new T(`expected content to be 'reasoning_text', got ${o.type}`);o.text+=t.delta}break}case"response.completed":{I(this,Ot,t.response,"f");break}}return r},"_ResponseStream_accumulateResponse"),Symbol.asyncIterator)](){let e=[],t=[],r=!1;return this.on("event",s=>{let o=t.shift();o?o.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of t)s.resolve(void 0);t.length=0}),this.on("abort",s=>{r=!0;for(let o of t)o.reject(s);t.length=0}),this.on("error",s=>{r=!0;for(let o of t)o.reject(s);t.length=0}),{next:i(async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((o,a)=>t.push({resolve:o,reject:a})).then(o=>o?{value:o,done:!1}:{value:void 0,done:!0}),"next"),return:i(async()=>(this.abort(),{value:void 0,done:!0}),"return")}}async finalResponse(){await this.done();let e=h(this,Go,"f");if(!e)throw new T("stream ended without producing a ChatCompletion");return e}};i(Cv,"finalizeResponse")});var is,nl=d(()=>{"use strict";A();F();L();is=class extends C{static{i(this,"InputItems")}list(e,t={},r){return this._client.getAPIList(E`/responses/${e}/input_items`,O,{query:t,...r})}}});var as,ol=d(()=>{"use strict";A();as=class extends C{static{i(this,"InputTokens")}count(e={},t){return this._client.post("/responses/input_tokens",{body:e,...t})}}});var ot,il=d(()=>{"use strict";sl();mm();A();nl();nl();ol();ol();V();L();ot=class extends C{static{i(this,"Responses")}constructor(){super(...arguments),this.inputItems=new is(this._client),this.inputTokens=new as(this._client)}create(e,t){return this._client.post("/responses",{body:e,...t,stream:e.stream??!1})._thenUnwrap(r=>("object"in r&&r.object==="response"&&Wo(r),r))}retrieve(e,t={},r){return this._client.get(E`/responses/${e}`,{query:t,...r,stream:t?.stream??!1})._thenUnwrap(s=>("object"in s&&s.object==="response"&&Wo(s),s))}delete(e,t){return this._client.delete(E`/responses/${e}`,{...t,headers:v([{Accept:"*/*"},t?.headers])})}parse(e,t){return this._client.responses.create(e,t)._thenUnwrap(r=>rl(r,e))}stream(e,t){return Xo.createResponse(this._client,e,t)}cancel(e,t){return this._client.post(E`/responses/${e}/cancel`,t)}compact(e,t){return this._client.post("/responses/compact",{body:e,...t})}};ot.InputItems=is;ot.InputTokens=as});var cs,al=d(()=>{"use strict";A();V();L();cs=class extends C{static{i(this,"Content")}retrieve(e,t){return this._client.get(E`/skills/${e}/content`,{...t,headers:v([{Accept:"application/binary"},t?.headers]),__binaryResponse:!0})}}});var ls,cl=d(()=>{"use strict";A();V();L();ls=class extends C{static{i(this,"Content")}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(E`/skills/${s}/versions/${e}/content`,{...r,headers:v([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}}});var ar,ll=d(()=>{"use strict";A();cl();cl();F();we();L();ar=class extends C{static{i(this,"Versions")}constructor(){super(...arguments),this.content=new ls(this._client)}create(e,t={},r){return this._client.post(E`/skills/${e}/versions`,Ze({body:t,...r},this._client))}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(E`/skills/${s}/versions/${e}`,r)}list(e,t={},r){return this._client.getAPIList(E`/skills/${e}/versions`,O,{query:t,...r})}delete(e,t,r){let{skill_id:s}=t;return this._client.delete(E`/skills/${s}/versions/${e}`,r)}};ar.Content=ls});var it,ul=d(()=>{"use strict";A();al();al();ll();ll();F();we();L();it=class extends C{static{i(this,"Skills")}constructor(){super(...arguments),this.content=new cs(this._client),this.versions=new ar(this._client)}create(e={},t){return this._client.post("/skills",Ze({body:e,...t},this._client))}retrieve(e,t){return this._client.get(E`/skills/${e}`,t)}update(e,t,r){return this._client.post(E`/skills/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/skills",O,{query:e,...t})}delete(e,t){return this._client.delete(E`/skills/${e}`,t)}};it.Content=cs;it.Versions=ar});var us,pl=d(()=>{"use strict";A();we();L();us=class extends C{static{i(this,"Parts")}create(e,t,r){return this._client.post(E`/uploads/${e}/parts`,Oe({body:t,...r},this._client))}}});var Nt,dl=d(()=>{"use strict";A();pl();pl();L();Nt=class extends C{static{i(this,"Uploads")}constructor(){super(...arguments),this.parts=new us(this._client)}create(e,t){return this._client.post("/uploads",{body:e,...t})}cancel(e,t){return this._client.post(E`/uploads/${e}/cancel`,t)}complete(e,t,r){return this._client.post(E`/uploads/${e}/complete`,{body:t,...r})}};Nt.Parts=us});var gm,hm=d(()=>{"use strict";gm=i(async n=>{let e=await Promise.allSettled(n),t=e.filter(s=>s.status==="rejected");if(t.length){for(let s of t);throw new Error(`${t.length} promise(s) failed - see the above errors`)}let r=[];for(let s of e)s.status==="fulfilled"&&r.push(s.value);return r},"allSettledWithThrow")});var ps,fl=d(()=>{"use strict";A();F();V();xr();hm();L();ps=class extends C{static{i(this,"FileBatches")}create(e,t,r){return this._client.post(E`/vector_stores/${e}/file_batches`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{vector_store_id:s}=t;return this._client.get(E`/vector_stores/${s}/file_batches/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}cancel(e,t,r){let{vector_store_id:s}=t;return this._client.post(E`/vector_stores/${s}/file_batches/${e}/cancel`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}async createAndPoll(e,t,r){let s=await this.create(e,t);return await this.poll(e,s.id,r)}listFiles(e,t,r){let{vector_store_id:s,...o}=t;return this._client.getAPIList(E`/vector_stores/${s}/file_batches/${e}/files`,O,{query:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}async poll(e,t,r){let s=v([r?.headers,{"X-Stainless-Poll-Helper":"true","X-Stainless-Custom-Poll-Interval":r?.pollIntervalMs?.toString()??void 0}]);for(;;){let{data:o,response:a}=await this.retrieve(t,{vector_store_id:e},{...r,headers:s}).withResponse();switch(o.status){case"in_progress":let c=5e3;if(r?.pollIntervalMs)c=r.pollIntervalMs;else{let l=a.headers.get("openai-poll-after-ms");if(l){let p=parseInt(l);isNaN(p)||(c=p)}}await Be(c);break;case"failed":case"cancelled":case"completed":return o}}}async uploadAndPoll(e,{files:t,fileIds:r=[]},s){if(t==null||t.length==0)throw new Error("No `files` provided to process. If you've already uploaded files you should use `.createAndPoll()` instead");let o=s?.maxConcurrency??5,a=Math.min(o,t.length),c=this._client,l=t.values(),p=[...r];async function m(S){for(let g of S){let P=await c.files.create({file:g,purpose:"assistants"},s);p.push(P.id)}}i(m,"processFiles");let f=Array(a).fill(l).map(m);return await gm(f),await this.createAndPoll(e,{file_ids:p})}}});var ds,ml=d(()=>{"use strict";A();F();V();fn();L();ds=class extends C{static{i(this,"Files")}create(e,t,r){return this._client.post(E`/vector_stores/${e}/files`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{vector_store_id:s}=t;return this._client.get(E`/vector_stores/${s}/files/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{vector_store_id:s,...o}=t;return this._client.post(E`/vector_stores/${s}/files/${e}`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(E`/vector_stores/${e}/files`,O,{query:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t,r){let{vector_store_id:s}=t;return this._client.delete(E`/vector_stores/${s}/files/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}async createAndPoll(e,t,r){let s=await this.create(e,t,r);return await this.poll(e,s.id,r)}async poll(e,t,r){let s=v([r?.headers,{"X-Stainless-Poll-Helper":"true","X-Stainless-Custom-Poll-Interval":r?.pollIntervalMs?.toString()??void 0}]);for(;;){let o=await this.retrieve(t,{vector_store_id:e},{...r,headers:s}).withResponse(),a=o.data;switch(a.status){case"in_progress":let c=5e3;if(r?.pollIntervalMs)c=r.pollIntervalMs;else{let l=o.response.headers.get("openai-poll-after-ms");if(l){let p=parseInt(l);isNaN(p)||(c=p)}}await Be(c);break;case"failed":case"completed":return a}}}async upload(e,t,r){let s=await this._client.files.create({file:t,purpose:"assistants"},r);return this.create(e,{file_id:s.id},r)}async uploadAndPoll(e,t,r){let s=await this.upload(e,t,r);return await this.poll(e,s.id,r)}content(e,t,r){let{vector_store_id:s}=t;return this._client.getAPIList(E`/vector_stores/${s}/files/${e}/content`,qe,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}}});var at,gl=d(()=>{"use strict";A();fl();fl();ml();ml();F();V();L();at=class extends C{static{i(this,"VectorStores")}constructor(){super(...arguments),this.files=new ds(this._client),this.fileBatches=new ps(this._client)}create(e,t){return this._client.post("/vector_stores",{body:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(E`/vector_stores/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(E`/vector_stores/${e}`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e={},t){return this._client.getAPIList("/vector_stores",O,{query:e,...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}delete(e,t){return this._client.delete(E`/vector_stores/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}search(e,t,r){return this._client.getAPIList(E`/vector_stores/${e}/search`,qe,{body:t,method:"post",...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};at.Files=ds;at.FileBatches=ps});var cr,hl=d(()=>{"use strict";A();F();V();we();L();cr=class extends C{static{i(this,"Videos")}create(e,t){return this._client.post("/videos",Ze({body:e,...t},this._client))}retrieve(e,t){return this._client.get(E`/videos/${e}`,t)}list(e={},t){return this._client.getAPIList("/videos",Qe,{query:e,...t})}delete(e,t){return this._client.delete(E`/videos/${e}`,t)}downloadContent(e,t={},r){return this._client.get(E`/videos/${e}/content`,{query:t,...r,headers:v([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}remix(e,t,r){return this._client.post(E`/videos/${e}/remix`,Ze({body:t,...r},this._client))}}});var fs,Em,Jo,lr,El=d(()=>{"use strict";Ae();Ne();A();V();lr=class extends C{static{i(this,"Webhooks")}constructor(){super(...arguments),fs.add(this)}async unwrap(e,t,r=this._client.webhookSecret,s=300){return await this.verifySignature(e,t,r,s),JSON.parse(e)}async verifySignature(e,t,r=this._client.webhookSecret,s=300){if(typeof crypto>"u"||typeof crypto.subtle.importKey!="function"||typeof crypto.subtle.verify!="function")throw new Error("Webhook signature verification is only supported when the `crypto` global is defined");h(this,fs,"m",Em).call(this,r);let o=v([t]).values,a=h(this,fs,"m",Jo).call(this,o,"webhook-signature"),c=h(this,fs,"m",Jo).call(this,o,"webhook-timestamp"),l=h(this,fs,"m",Jo).call(this,o,"webhook-id"),p=parseInt(c,10);if(isNaN(p))throw new Ve("Invalid webhook timestamp format");let m=Math.floor(Date.now()/1e3);if(m-p>s)throw new Ve("Webhook timestamp is too old");if(p>m+s)throw new Ve("Webhook timestamp is too new");let f=a.split(" ").map(w=>w.startsWith("v1,")?w.substring(3):w),S=r.startsWith("whsec_")?Buffer.from(r.replace("whsec_",""),"base64"):Buffer.from(r,"utf-8"),g=l?`${l}.${c}.${e}`:`${c}.${e}`,P=await crypto.subtle.importKey("raw",S,{name:"HMAC",hash:"SHA-256"},!1,["verify"]);for(let w of f)try{let U=Buffer.from(w,"base64");if(await crypto.subtle.verify("HMAC",P,U,new TextEncoder().encode(g)))return}catch{continue}throw new Ve("The given webhook signature does not match the expected signature")}};fs=new WeakSet,Em=i(function(e){if(typeof e!="string"||e.length===0)throw new Error("The webhook secret must either be set using the env var, OPENAI_WEBHOOK_SECRET, on the client class, OpenAI({ webhookSecret: '123' }), or passed to this function")},"_Webhooks_validateSecret"),Jo=i(function(e,t){if(!e)throw new Error("Headers are required");let r=e.get(t);if(r==null)throw new Error(`Missing required header: ${t}`);return r},"_Webhooks_getRequiredHeader")});var Cm=d(()=>{"use strict";El()});var Sm=d(()=>{"use strict";Cm()});var vm=d(()=>{"use strict";Yf();Qf();dc();fc();wc();Ic();Oc();Lc();$c();Fc();Hc();Gc();Jc();Kc();Yc();Qc();tl();il();ul();dl();gl();hl();Sm()});var Cl,Sl,Ko,ym,M,Yo=d(()=>{"use strict";Ae();Ea();Ke();xr();go();ya();Gs();Ef();bf();va();je();F();Ua();vm();Po();fc();Ic();$c();Hc();Kc();Yc();Qc();hl();dc();wc();cc();Oc();Lc();Fc();Gc();Jc();tl();il();ul();dl();gl();El();ya();V();_c();Js();Ke();M=class{static{i(this,"OpenAI")}constructor({baseURL:e=bt("OPENAI_BASE_URL"),apiKey:t=bt("OPENAI_API_KEY"),organization:r=bt("OPENAI_ORG_ID")??null,project:s=bt("OPENAI_PROJECT_ID")??null,webhookSecret:o=bt("OPENAI_WEBHOOK_SECRET")??null,...a}={}){if(Cl.add(this),Ko.set(this,void 0),this.completions=new Kt(this),this.chat=new _t(this),this.embeddings=new Qt(this),this.files=new er(this),this.images=new nr(this),this.audio=new Ge(this),this.moderations=new ir(this),this.models=new or(this),this.fineTuning=new De(this),this.graders=new xt(this),this.vectorStores=new at(this),this.webhooks=new lr(this),this.beta=new $e(this),this.batches=new Wt(this),this.uploads=new Nt(this),this.responses=new ot(this),this.realtime=new nt(this),this.conversations=new It(this),this.evals=new Mt(this),this.containers=new wt(this),this.skills=new it(this),this.videos=new cr(this),t===void 0)throw new T("Missing credentials. Please pass an `apiKey`, or set the `OPENAI_API_KEY` environment variable.");let c={apiKey:t,organization:r,project:s,webhookSecret:o,...a,baseURL:e||"https://api.openai.com/v1"};if(!c.dangerouslyAllowBrowser&&df())throw new T(`It looks like you're running in a browser-like environment.
99
-
100
- This is disabled by default, as it risks exposing your secret API credentials to attackers.
101
- If you understand the risks and have appropriate mitigations in place,
102
- you can set the \`dangerouslyAllowBrowser\` option to \`true\`, e.g.,
103
-
104
- new OpenAI({ apiKey, dangerouslyAllowBrowser: true });
105
-
106
- https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
107
- `);this.baseURL=c.baseURL,this.timeout=c.timeout??Sl.DEFAULT_TIMEOUT,this.logger=c.logger??console;let l="warn";this.logLevel=l,this.logLevel=xa(c.logLevel,"ClientOptions.logLevel",this)??xa(bt("OPENAI_LOG"),"process.env['OPENAI_LOG']",this)??l,this.fetchOptions=c.fetchOptions,this.maxRetries=c.maxRetries??2,this.fetch=c.fetch??mf(),I(this,Ko,hf,"f"),this._options=c,this.apiKey=typeof t=="string"?t:"Missing Key",this.organization=r,this.project=s,this.webhookSecret=o}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,organization:this.organization,project:this.project,webhookSecret:this.webhookSecret,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){}async authHeaders(e){return v([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return Ia(e,{arrayFormat:"brackets"})}getUserAgent(){return`${this.constructor.name}/JS ${vt}`}defaultIdempotencyKey(){return`stainless-node-retry-${ha()}`}makeStatusError(e,t,r,s){return Q.generate(e,t,r,s)}async _callApiKey(){let e=this._options.apiKey;if(typeof e!="function")return!1;let t;try{t=await e()}catch(r){throw r instanceof T?r:new T(`Failed to get token from 'apiKey' function: ${r.message}`,{cause:r})}if(typeof t!="string"||!t)throw new T(`Expected 'apiKey' function argument to return a string but it returned ${t}`);return this.apiKey=t,!0}buildURL(e,t,r){let s=!h(this,Cl,"m",ym).call(this)&&r||this.baseURL,o=sf(e)?new URL(e):new URL(s+(s.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),a=this.defaultQuery();return nf(a)||(t={...a,...t}),typeof t=="object"&&t&&!Array.isArray(t)&&(o.search=this.stringifyQuery(t)),o.toString()}async prepareOptions(e){await this._callApiKey()}async prepareRequest(e,{url:t,options:r}){}get(e,t){return this.methodRequest("get",e,t)}post(e,t){return this.methodRequest("post",e,t)}patch(e,t){return this.methodRequest("patch",e,t)}put(e,t){return this.methodRequest("put",e,t)}delete(e,t){return this.methodRequest("delete",e,t)}methodRequest(e,t,r){return this.request(Promise.resolve(r).then(s=>({method:e,path:t,...s})))}request(e,t=null){return new Vt(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,r){let s=await e,o=s.maxRetries??this.maxRetries;t==null&&(t=o),await this.prepareOptions(s);let{req:a,url:c,timeout:l}=await this.buildRequest(s,{retryCount:o-t});await this.prepareRequest(a,{url:c,options:s});let p="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),m=r===void 0?"":`, retryOf: ${r}`,f=Date.now();if(q(this).debug(`[${p}] sending request`,Ye({retryOfRequestLogID:r,method:s.method,url:c,options:s,headers:a.headers})),s.signal?.aborted)throw new K;let S=new AbortController,g=await this.fetchWithTimeout(c,a,l,S).catch(Ws),P=Date.now();if(g instanceof globalThis.Error){let H=`retrying, ${t} attempts remaining`;if(s.signal?.aborted)throw new K;let b=zs(g)||/timed? ?out/i.test(String(g)+("cause"in g?String(g.cause):""));if(t)return q(this).info(`[${p}] connection ${b?"timed out":"failed"} - ${H}`),q(this).debug(`[${p}] connection ${b?"timed out":"failed"} (${H})`,Ye({retryOfRequestLogID:r,url:c,durationMs:P-f,message:g.message})),this.retryRequest(s,t,r??p);throw q(this).info(`[${p}] connection ${b?"timed out":"failed"} - error; no more retries left`),q(this).debug(`[${p}] connection ${b?"timed out":"failed"} (error; no more retries left)`,Ye({retryOfRequestLogID:r,url:c,durationMs:P-f,message:g.message})),b?new St:new Ct({cause:g})}let w=[...g.headers.entries()].filter(([H])=>H==="x-request-id").map(([H,b])=>", "+H+": "+JSON.stringify(b)).join(""),U=`[${p}${m}${w}] ${a.method} ${c} ${g.ok?"succeeded":"failed"} with status ${g.status} in ${P-f}ms`;if(!g.ok){let H=await this.shouldRetry(g);if(t&&H){let W=`retrying, ${t} attempts remaining`;return await gf(g.body),q(this).info(`${U} - ${W}`),q(this).debug(`[${p}] response error (${W})`,Ye({retryOfRequestLogID:r,url:g.url,status:g.status,headers:g.headers,durationMs:P-f})),this.retryRequest(s,t,r??p,g.headers)}let b=H?"error; no more retries left":"error; not retryable";q(this).info(`${U} - ${b}`);let G=await g.text().catch(W=>Ws(W).message),z=cf(G),Ee=z?void 0:G;throw q(this).debug(`[${p}] response error (${b})`,Ye({retryOfRequestLogID:r,url:g.url,status:g.status,headers:g.headers,message:Ee,durationMs:Date.now()-f})),this.makeStatusError(g.status,z,Ee,g.headers)}return q(this).info(U),q(this).debug(`[${p}] response start`,Ye({retryOfRequestLogID:r,url:g.url,status:g.status,headers:g.headers,durationMs:P-f})),{response:g,options:s,controller:S,requestLogID:p,retryOfRequestLogID:r,startTime:f}}getAPIList(e,t,r){return this.requestAPIList(t,r&&"then"in r?r.then(s=>({method:"get",path:e,...s})):{method:"get",path:e,...r})}requestAPIList(e,t){let r=this.makeRequest(t,null,void 0);return new Zs(this,r,e)}async fetchWithTimeout(e,t,r,s){let{signal:o,method:a,...c}=t||{},l=this._makeAbort(s);o&&o.addEventListener("abort",l,{once:!0});let p=setTimeout(l,r),m=globalThis.ReadableStream&&c.body instanceof globalThis.ReadableStream||typeof c.body=="object"&&c.body!==null&&Symbol.asyncIterator in c.body,f={signal:s.signal,...m?{duplex:"half"}:{},method:"GET",...c};a&&(f.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,f)}finally{clearTimeout(p)}}async shouldRetry(e){let t=e.headers.get("x-should-retry");return t==="true"?!0:t==="false"?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,t,r,s){let o,a=s?.get("retry-after-ms");if(a){let l=parseFloat(a);Number.isNaN(l)||(o=l)}let c=s?.get("retry-after");if(c&&!o){let l=parseFloat(c);Number.isNaN(l)?o=Date.parse(c)-Date.now():o=l*1e3}if(!(o&&0<=o&&o<60*1e3)){let l=e.maxRetries??this.maxRetries;o=this.calculateDefaultRetryTimeoutMillis(t,l)}return await Be(o),this.makeRequest(e,t-1,r)}calculateDefaultRetryTimeoutMillis(e,t){let o=t-e,a=Math.min(.5*Math.pow(2,o),8),c=1-Math.random()*.25;return a*c*1e3}async buildRequest(e,{retryCount:t=0}={}){let r={...e},{method:s,path:o,query:a,defaultBaseURL:c}=r,l=this.buildURL(o,a,c);"timeout"in r&&af("timeout",r.timeout),r.timeout=r.timeout??this.timeout;let{bodyHeaders:p,body:m}=this.buildBody({options:r}),f=await this.buildHeaders({options:e,method:s,bodyHeaders:p,retryCount:t});return{req:{method:s,headers:f,...r.signal&&{signal:r.signal},...globalThis.ReadableStream&&m instanceof globalThis.ReadableStream&&{duplex:"half"},...m&&{body:m},...this.fetchOptions??{},...r.fetchOptions??{}},url:l,timeout:r.timeout}}async buildHeaders({options:e,method:t,bodyHeaders:r,retryCount:s}){let o={};this.idempotencyHeader&&t!=="get"&&(e.idempotencyKey||(e.idempotencyKey=this.defaultIdempotencyKey()),o[this.idempotencyHeader]=e.idempotencyKey);let a=v([o,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(s),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...ff(),"OpenAI-Organization":this.organization,"OpenAI-Project":this.project},await this.authHeaders(e),this._options.defaultHeaders,r,e.headers]);return this.validateHeaders(a),a.values}_makeAbort(e){return()=>e.abort()}buildBody({options:{body:e,headers:t}}){if(!e)return{bodyHeaders:void 0,body:void 0};let r=v([t]);return ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof DataView||typeof e=="string"&&r.values.has("content-type")||globalThis.Blob&&e instanceof globalThis.Blob||e instanceof FormData||e instanceof URLSearchParams||globalThis.ReadableStream&&e instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:e}:typeof e=="object"&&(Symbol.asyncIterator in e||Symbol.iterator in e&&"next"in e&&typeof e.next=="function")?{bodyHeaders:void 0,body:ho(e)}:typeof e=="object"&&r.values.get("content-type")==="application/x-www-form-urlencoded"?{bodyHeaders:{"content-type":"application/x-www-form-urlencoded"},body:this.stringifyQuery(e)}:h(this,Ko,"f").call(this,{body:e,headers:r})}};Sl=M,Ko=new WeakMap,Cl=new WeakSet,ym=i(function(){return this.baseURL!=="https://api.openai.com/v1"},"_OpenAI_baseURLOverridden");M.OpenAI=Sl;M.DEFAULT_TIMEOUT=6e5;M.OpenAIError=T;M.APIError=Q;M.APIConnectionError=Ct;M.APIConnectionTimeoutError=St;M.APIUserAbortError=K;M.NotFoundError=Rr;M.ConflictError=Pr;M.RateLimitError=Ar;M.BadRequestError=yr;M.AuthenticationError=Tr;M.InternalServerError=wr;M.PermissionDeniedError=_r;M.UnprocessableEntityError=br;M.InvalidWebhookSignatureError=Ve;M.toFile=wo;M.Completions=Kt;M.Chat=_t;M.Embeddings=Qt;M.Files=er;M.Images=nr;M.Audio=Ge;M.Moderations=ir;M.Models=or;M.FineTuning=De;M.Graders=xt;M.VectorStores=at;M.Webhooks=lr;M.Beta=$e;M.Batches=Wt;M.Uploads=Nt;M.Responses=ot;M.Realtime=nt;M.Conversations=It;M.Evals=Mt;M.Containers=wt;M.Skills=it;M.Videos=cr});var Tm=d(()=>{"use strict";V();Ne();fn();Yo()});var _m=d(()=>{"use strict";Yo();Ua();Po();Yo();F();je();Tm()});import{configManager as Qo}from"@xiaozhi-client/config";function wv(n){return n.replace(/<think>[\s\S]*?<\/think>/g,"").trim()}var En,Rm=d(()=>{"use strict";D();di();_m();i(wv,"removeThinkTags");En=class{static{i(this,"LLMService")}client=null;model="";constructor(){this.initClient()}initClient(){let e=Qo.getLLMConfig();if(!e||!Qo.isLLMConfigValid()){u.warn("[LLMService] LLM \u914D\u7F6E\u672A\u627E\u5230\u6216\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 llm \u914D\u7F6E\u9879");return}this.model=e.model,this.client=new M({apiKey:e.apiKey,baseURL:e.baseURL}),u.info(`[LLMService] OpenAI \u5BA2\u6237\u7AEF\u5DF2\u521D\u59CB\u5316\uFF0C\u6A21\u578B: ${this.model}`)}reinitClient(){this.client===null&&Qo.isLLMConfigValid()&&(u.info("[LLMService] \u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316\u5BA2\u6237\u7AEF"),this.initClient())}isAvailable(){return this.client!==null}async chat(e){if(this.reinitClient(),!this.client)return u.error("[LLMService] LLM \u5BA2\u6237\u7AEF\u672A\u521D\u59CB\u5316"),"\u62B1\u6B49\uFF0C\u6211\u6682\u65F6\u65E0\u6CD5\u56DE\u7B54";try{let t=Qo.getLLMConfig(),r=ql(t?.prompt),o=(await this.client.chat.completions.create({model:this.model,messages:[{role:"system",content:r},{role:"user",content:e}]})).choices[0]?.message?.content||"";return o=wv(o),o?(u.debug(`[LLMService] LLM \u8C03\u7528\u6210\u529F\uFF0C\u8F93\u5165\u957F\u5EA6: ${e.length}\uFF0C\u8F93\u51FA\u957F\u5EA6: ${o.length}`),o):(u.warn("[LLMService] LLM \u8FD4\u56DE\u7A7A\u5185\u5BB9"),"\u62B1\u6B49\uFF0C\u6211\u6682\u65F6\u65E0\u6CD5\u56DE\u7B54")}catch(t){return u.error("[LLMService] LLM \u8C03\u7528\u5931\u8D25:",t),"\u62B1\u6B49\uFF0C\u6211\u6682\u65F6\u65E0\u6CD5\u56DE\u7B54"}}}});import{Readable as Iv}from"stream";import{configManager as Mv}from"@xiaozhi-client/config";import{TTS as xv}from"@xiaozhi-client/tts";import*as vl from"prism-media";var Zo,Pm=d(()=>{"use strict";D();Zo=class{static{i(this,"TTSService")}getConnection;onTTSComplete;ttsTriggered=new Map;audioDemuxers=new Map;cumulativeTimestamps=new Map;packetIndices=new Map;ttsStarted=new Map;ttsCompleted=new Map;opusPacketBuffer=new Map;isProcessingBuffer=new Map;deviceConnections=new Map;constructor(e={}){this.getConnection=e.getConnection,this.onTTSComplete=e.onTTSComplete}setGetConnection(e){this.getConnection=e}async speak(e,t){if(this.ttsTriggered.get(e)||this.ttsCompleted.get(e)){u.debug(`[TTSService] TTS \u6B63\u5728\u8FDB\u884C\u6216\u5DF2\u5B8C\u6210\uFF0C\u5FFD\u7565: deviceId=${e}`);return}if(!this.ttsTriggered.get(e)){let r=this.getConnection?.(e);if(!r){u.warn(`[TTSService] \u65E0\u6CD5\u83B7\u53D6\u8BBE\u5907\u8FDE\u63A5: deviceId=${e}`);return}let s=Mv.getTTSConfig();if(!s.appid||!s.accessToken||!s.voice_type){u.error("[TTSService] TTS \u914D\u7F6E\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6");return}this.ttsTriggered.set(e,!0),u.info(`[TTSService] \u89E6\u53D1\u6D41\u5F0F TTS: deviceId=${e}`),this.audioDemuxers.set(e,new vl.opus.OggDemuxer),this.cumulativeTimestamps.set(e,0),this.packetIndices.set(e,0),this.ttsStarted.set(e,!1),this.opusPacketBuffer.set(e,[]),this.isProcessingBuffer.set(e,!1),this.deviceConnections.set(e,r);let o=this.audioDemuxers.get(e);this.setupDemuxerEvents(e,o,r);let a=new xv({bytedance:{v1:{app:{appid:s.appid,accessToken:s.accessToken},audio:{voice_type:s.voice_type,encoding:"ogg_opus"},cluster:s.cluster,endpoint:s.endpoint}}});try{for await(let c of a.bytedance.v1.speak(t))if(o.write(Buffer.from(c.chunk)),c.isFinal){u.info(`[TTSService] TTS \u6570\u636E\u63A5\u6536\u5B8C\u6210: deviceId=${e}`),o.end();break}}catch(c){u.error(`[TTSService] TTS \u8C03\u7528\u5931\u8D25: deviceId=${e}`,c),this.cleanup(e)}}}setupDemuxerEvents(e,t,r){t.on("data",s=>{let o=this.opusPacketBuffer.get(e);o&&o.push(s),this.processBuffer(e).catch(a=>{u.error(`[TTSService] processBuffer \u6267\u884C\u5931\u8D25: deviceId=${e}`,a)})}),t.on("end",()=>{this.waitForBufferDrain(e)}),t.on("error",s=>{u.error(`[TTSService] Demuxer \u9519\u8BEF: deviceId=${e}`,s),this.sendStopAndCleanup(e).catch(o=>{u.error(`[TTSService] sendStopAndCleanup \u6267\u884C\u5931\u8D25: deviceId=${e}`,o)})})}waitForBufferDrain(e){let r=i(()=>{let o=this.opusPacketBuffer.get(e),a=this.isProcessingBuffer.get(e);return u.info(`[TTSService] \u7F13\u51B2\u533A\u6392\u7A7A\u68C0\u67E5: deviceId=${e}, buffer=${o?.length}, isProcessing=${a}`),(!o||o.length===0)&&!a?(this.sendStopAndCleanup(e),!0):!1},"check");if(!this.isProcessingBuffer.get(e)&&r())return;let s=setInterval(()=>{r()&&clearInterval(s)},50)}async processBuffer(e){if(this.isProcessingBuffer.get(e))return;let t=this.opusPacketBuffer.get(e),r=this.deviceConnections.get(e);if(!(!t||!r)){this.isProcessingBuffer.set(e,!0);try{for(;t.length>0;){this.ttsStarted.get(e)||(await r.send({type:"tts",session_id:r.getSessionId(),state:"start"}),this.ttsStarted.set(e,!0),u.info(`[TTSService] \u53D1\u9001 TTS start \u6D88\u606F: deviceId=${e}`));let s=t.shift(),o=this.cumulativeTimestamps.get(e)||0,a=this.getPacketDuration(s);await r.sendBinaryProtocol2(s,o);let c=(this.packetIndices.get(e)||0)+1;this.packetIndices.set(e,c),this.cumulativeTimestamps.set(e,o+a),await new Promise(l=>setTimeout(l,a*.8))}}finally{this.isProcessingBuffer.set(e,!1)}}}async sendStopAndCleanup(e){let t=this.deviceConnections.get(e);if(!t){this.cleanup(e);return}await new Promise(s=>setTimeout(s,200));let r=this.opusPacketBuffer.get(e);r&&r.length>0&&await this.processBuffer(e),this.opusPacketBuffer.get(e)?.length===0&&(await t.send({type:"tts",session_id:t.getSessionId(),state:"stop"}),this.ttsCompleted.set(e,!0),u.info(`[TTSService] TTS \u97F3\u9891\u6D41\u53D1\u9001\u5B8C\u6210: deviceId=${e}`)),this.cleanup(e),this.onTTSComplete&&this.onTTSComplete(e)}cleanup(e){this.audioDemuxers.delete(e),this.cumulativeTimestamps.delete(e),this.packetIndices.delete(e),this.ttsStarted.delete(e),this.ttsTriggered.delete(e),this.opusPacketBuffer.delete(e),this.isProcessingBuffer.delete(e),this.deviceConnections.delete(e)}getPacketDuration(e){if(!e||e.length===0)return 0;let t=e[0],r=t>>3&31,s=t&3,o;r<12?o=10:r<16?o=20:o=[2.5,5,10,20][r&3];let a;switch(s){case 0:a=1;break;case 1:case 2:a=2;break;case 3:a=e.length>1?e[1]&63:1;break;default:a=1}return o*a}async processAudioBuffer(e,t){return new Promise((r,s)=>{let o=new vl.opus.OggDemuxer,a=Iv.from(e),c=0,l=0,p=0;a.pause();let m=i(async P=>{let w=this.getPacketDuration(P);try{await t(P,{index:c,size:P.length,duration:w,timestamp:l}),c++,l+=w,p+=w}catch(U){u.error(`\u53D1\u9001\u5305 ${c} \u5931\u8D25:`,U)}},"processPacket"),f=!1,S=[],g=i(async()=>{if(!(f||S.length===0)){for(f=!0;S.length>0;){let P=S.shift();await m(P)}f=!1}},"processQueue");a.pipe(o).on("data",P=>{S.push(P),g()}).on("end",()=>{let P=i(()=>{S.length>0||f?setTimeout(P,10):(u.info(`\u5904\u7406\u5B8C\u6210\uFF0C\u5171 ${c} \u4E2A\u5305\uFF0C\u603B\u65F6\u957F ${(p/1e3).toFixed(2)}s`),r({packetCount:c,totalDuration:p}))},"checkEnd");P()}).on("error",s)})}destroy(){this.ttsTriggered.clear(),this.audioDemuxers.clear(),this.cumulativeTimestamps.clear(),this.packetIndices.clear(),this.ttsStarted.clear(),this.ttsCompleted.clear(),this.opusPacketBuffer.clear(),this.isProcessingBuffer.clear(),this.deviceConnections.clear(),u.debug("[TTSService] \u670D\u52A1\u5DF2\u9500\u6BC1")}}});var ei,bm=d(()=>{"use strict";D();tf();ga();rf();Rm();Pm();ei=class{static{i(this,"ESP32Service")}deviceRegistry;connections;clientIdToDeviceId;asrService;llmService;ttsService;constructor(e){this.deviceRegistry=e,this.connections=new Map,this.clientIdToDeviceId=new Map,this.llmService=new En,this.asrService=this.createASRService(),this.ttsService=this.createTTSService(),this.setupTTSGetConnection()}createASRService(){return new mo({events:{onResult:i(async(e,t,r)=>{if(r&&t){let s=this.connections.get(e);s&&s.send({session_id:s.getSessionId(),type:"stt",text:t}).catch(o=>{u.error(`[ESP32Service] \u53D1\u9001 STT \u6D88\u606F\u5931\u8D25: deviceId=${e}`,o)});try{this.recreateLLMService();let o=await this.llmService.chat(t);u.info(`[ESP32Service] LLM \u54CD\u5E94: deviceId=${e}, response=${o}`),await this.ttsService.speak(e,o)}catch(o){u.error(`[ESP32Service] LLM \u6216 TTS \u8C03\u7528\u5931\u8D25: deviceId=${e}`,o)}}r&&this.recreateASRService()},"onResult"),onError:i((e,t)=>{u.error(`[ESP32Service] ASR \u9519\u8BEF: deviceId=${e}`,t)},"onError")}})}recreateASRService(){u.info("[ESP32Service] \u91CD\u5EFA ASR \u670D\u52A1\u5B9E\u4F8B"),this.asrService&&this.asrService.destroy(),this.asrService=this.createASRService(),u.info("[ESP32Service] ASR \u670D\u52A1\u5B9E\u4F8B\u5DF2\u91CD\u5EFA")}createTTSService(){return new Zo({onTTSComplete:i(()=>{this.recreateTTSService()},"onTTSComplete")})}recreateTTSService(){u.info("[ESP32Service] \u91CD\u5EFA TTS \u670D\u52A1\u5B9E\u4F8B"),this.ttsService&&this.ttsService.destroy(),this.ttsService=this.createTTSService(),this.setupTTSGetConnection(),u.info("[ESP32Service] TTS \u670D\u52A1\u5B9E\u4F8B\u5DF2\u91CD\u5EFA")}recreateLLMService(){u.info("[ESP32Service] \u91CD\u5EFA LLM \u670D\u52A1\u5B9E\u4F8B"),this.llmService=new En,u.info("[ESP32Service] LLM \u670D\u52A1\u5B9E\u4F8B\u5DF2\u91CD\u5EFA")}getASRService(){return this.asrService}setupTTSGetConnection(){this.ttsService.setGetConnection(e=>this.getConnection(e))}async handleOTARequest(e,t,r,s,o){u.info(`\u6536\u5230OTA\u8BF7\u6C42: deviceId=${e}, clientId=${t}`);let{boardType:a,appVersion:c}=ef(r,s),l=this.deviceRegistry.getDevice(e);if(l||(l=this.deviceRegistry.createDevice(e,a,c),u.info(`\u65B0\u8BBE\u5907\u81EA\u52A8\u6FC0\u6D3B: deviceId=${e}`)),this.deviceRegistry.updateLastSeen(e),!o)throw new Error("\u65E0\u6CD5\u83B7\u53D6\u670D\u52A1\u5668\u5730\u5740\uFF1A\u7F3A\u5C11 Host \u5934",{cause:"MISSING_HOST_HEADER"});let m=`ws://${o.includes(":")?o:`${o}:9999`}/ws`;u.info(`\u8FD4\u56DEWebSocket\u914D\u7F6E: deviceId=${e}, clientId=${t}, wsUrl=${m}`);let f={websocket:{url:m,token:"",version:2},serverTime:{timestamp:Date.now(),timezoneOffset:new Date().getTimezoneOffset()*-60*1e3},firmware:{version:"2.2.2",url:"",force:!1}};return vr(f)}async handleWebSocketConnection(e,t,r,s){u.info(`[ESP32Service] \u6536\u5230WebSocket\u8FDE\u63A5\u8BF7\u6C42: deviceId=${t}, clientId=${r}, hasToken=${!!s}`);let o=this.deviceRegistry.getDevice(t);if(!o){u.warn(`[ESP32Service] \u8BBE\u5907\u672A\u6CE8\u518C\uFF0C\u62D2\u7EDD\u8FDE\u63A5: deviceId=${t}`),e.close(1008,"Device not registered");return}u.info(`[ESP32Service] \u8BBE\u5907\u5DF2\u6CE8\u518C: deviceId=${t}, status=${o.status}`),s&&u.debug(`[ESP32Service] \u6536\u5230Token\uFF08\u5DF2\u5FFD\u7565\uFF09\uFF0C\u8BBE\u5907\u5DF2\u901A\u8FC7\u6CE8\u518C\u9A8C\u8BC1: deviceId=${t}`);let a=this.connections.get(t);a&&(u.info(`[ESP32Service] \u8BBE\u5907\u5DF2\u6709\u8FDE\u63A5\uFF0C\u65AD\u5F00\u65E7\u8FDE\u63A5: deviceId=${t}`),await a.close(),this.connections.delete(t)),this.deviceRegistry.updateDeviceStatus(t,"active"),this.deviceRegistry.updateLastSeen(t);let c=new fo(t,r,e,{onMessage:i(async l=>{await this.handleDeviceMessage(t,l)},"onMessage"),onClose:i(()=>{this.handleDeviceDisconnect(t,r)},"onClose"),onError:i(l=>{u.error(`[ESP32Service] \u8BBE\u5907\u8FDE\u63A5\u9519\u8BEF: deviceId=${t}`,l)},"onError"),getASRService:i(()=>this.asrService,"getASRService")});this.connections.set(t,c),this.clientIdToDeviceId.set(r,t),u.info(`[ESP32Service] ESP32\u8BBE\u5907\u8FDE\u63A5\u5DF2\u5EFA\u7ACB: deviceId=${t}, clientId=${r}`)}async handleDeviceMessage(e,t){switch(u.debug(`\u6536\u5230\u8BBE\u5907\u6D88\u606F: deviceId=${e}, type=${t.type}`),this.deviceRegistry.updateLastSeen(e),t.type){case"hello":break;case"listen":await this.handleListenMessage(e,t);break;case"audio":await this.handleAudioMessage(e,t);break;case"text":case"stt":case"tts":case"llm":case"mcp":case"system":case"custom":u.debug(`\u6536\u5230\u6587\u672C\u6D88\u606F: deviceId=${e}, subtype=${t.type}`);break;default:u.warn(`\u672A\u77E5\u6D88\u606F\u7C7B\u578B: ${t.type}`)}}async handleListenMessage(e,t){let{state:r,mode:s,text:o}=t;switch(u.info(`[ESP32Service] \u6536\u5230Listen\u6D88\u606F: deviceId=${e}, state=${r}, mode=${s}, text="${o??""}"`),r){case"detect":o?(u.info(`[ESP32Service] \u5904\u7406\u5524\u9192\u8BCD\u68C0\u6D4B: deviceId=${e}, word="${o}"`),await this.asrService.init(e)):u.warn(`[ESP32Service] \u5524\u9192\u8BCD\u6D88\u606F\u7F3A\u5C11\u5FC5\u8981\u5B57\u6BB5: text="${o}", mode=${s}`);break;case"start":if(u.info(`[ESP32Service] \u6536\u5230start\u6D88\u606F: message=${JSON.stringify(t)}`),await this.asrService.connect(e),s==="manual"||s==="realtime"){u.info(`[ESP32Service] \u5F00\u59CB\u624B\u52A8/\u5B9E\u65F6\u76D1\u542C\u4F1A\u8BDD: deviceId=${e}, mode=${s}`);let a=`session_${e}_${Date.now()}`;u.info(`[ESP32Service] \u8BED\u97F3\u4F1A\u8BDD\u5DF2\u5F00\u59CB: deviceId=${e}, sessionId=${a}`)}else u.debug(`[ESP32Service] \u5FFD\u7565auto\u6A21\u5F0F\u7684start\u72B6\u6001: deviceId=${e}`);break;case"stop":u.info(`[ESP32Service] \u505C\u6B62\u76D1\u542C\uFF0C\u4E2D\u65AD\u4F1A\u8BDD: deviceId=${e}`),await this.asrService.end(e);break;default:u.warn(`[ESP32Service] \u672A\u77E5\u7684\u76D1\u542C\u72B6\u6001: ${r}`)}}async handleAudioMessage(e,t){if(t.type!=="audio"){u.warn(`handleAudioMessage \u6536\u5230\u975E\u97F3\u9891\u6D88\u606F: type=${t.type}`);return}let r=t.data;if(!r){u.warn(`\u97F3\u9891\u6D88\u606F\u65E0\u6570\u636E: deviceId=${e}`);return}let s=t._parsed;s?u.debug(`\u6536\u5230\u89E3\u6790\u540E\u7684\u97F3\u9891\u6D88\u606F: deviceId=${e}, protocolVersion=${s.protocolVersion}, dataType=${s.dataType}, timestamp=${s.timestamp}, size=${r.length}`):u.debug(`\u6536\u5230\u539F\u59CB\u97F3\u9891\u6D88\u606F: deviceId=${e}, size=${r.length}`),await this.asrService.handleAudioData(e,r)}handleDeviceDisconnect(e,t){u.info(`\u8BBE\u5907\u65AD\u5F00\u8FDE\u63A5: deviceId=${e}, clientId=${t}`),this.connections.delete(e),this.clientIdToDeviceId.delete(t),this.deviceRegistry.updateDeviceStatus(e,"offline")}getConnection(e){return this.connections.get(e)}async destroy(){let e=Array.from(this.connections.values(),t=>t.close());await Promise.all(e),this.connections.clear(),this.clientIdToDeviceId.clear(),this.asrService.destroy(),this.ttsService.destroy(),u.debug("ESP32\u670D\u52A1\u5DF2\u9500\u6BC1")}}});var Am=d(()=>{"use strict";Wd();qd();Ce();Gd();bm();On()});function Ov(n){return Array.isArray(n.routes)}function wm(n){if(Ov(n)){let{routes:e,middleware:t}=n;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return n}function j(n){return e=>t=>{let s=t.get("dependencies")[n];return e(s,t)}}var ge=d(()=>{"use strict";i(Ov,"isRouteGroup");i(wm,"normalizeRoutes");i(j,"createHandler")});var Cn,Im=d(()=>{"use strict";ge();Cn=class{constructor(e){this.logger=e}static{i(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=wm(t);this.routes.has(e)&&this.logger.warn(`\u8DEF\u7531\u7EC4 '${e}' \u5DF2\u5B58\u5728\uFF0C\u5C06\u88AB\u8986\u76D6`),this.routes.set(e,r),this.logger.info(`\u5DF2\u6CE8\u518C\u8DEF\u7531\u7EC4: ${e} (${r.length} \u4E2A\u8DEF\u7531)`)}registerRoutes(e){this.logger.info(`\u5F00\u59CB\u6279\u91CF\u6CE8\u518C ${Object.keys(e).length} \u4E2A\u8DEF\u7531\u7EC4...`);for(let[t,r]of Object.entries(e))this.registerRoute(t,r);this.logger.info(`\u6279\u91CF\u6CE8\u518C\u5B8C\u6210\uFF0C\u5171\u6CE8\u518C ${this.routes.size} \u4E2A\u8DEF\u7531\u7EC4`)}getAllRoutes(){return new Map(this.routes)}getRoute(e){return this.routes.get(e)}applyToApp(e){let t=Array.from(this.routes.entries());t.sort(([s],[o])=>s==="static"?1:o==="static"?-1:0);let r=0;for(let[s,o]of t)try{for(let a of o)this.applyRouteDefinition(e,a,s),r++}catch(a){this.logger.error(`\u2717 \u5E94\u7528\u8DEF\u7531\u7EC4\u5931\u8D25: ${s}`,a)}this.logger.info(`\u8DEF\u7531\u5E94\u7528\u5B8C\u6210\uFF0C\u5171 ${r} \u4E2A\u8DEF\u7531`)}applyRouteDefinition(e,t,r){let{method:s,path:o,handler:a,middleware:c=[]}=t,l=i(async(p,m)=>{try{return await a(p)}catch(f){return this.logger.error(`\u8DEF\u7531\u5904\u7406\u9519\u8BEF [${s} ${o}]:`,f),p.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",f instanceof Error?f.message:String(f),500)}},"wrappedHandler");switch(s){case"GET":c.length>0?e.get(o,...c,l):e.get(o,l);break;case"POST":c.length>0?e.post(o,...c,l):e.post(o,l);break;case"PUT":c.length>0?e.put(o,...c,l):e.put(o,l);break;case"DELETE":c.length>0?e.delete(o,...c,l):e.delete(o,l);break;case"PATCH":c.length>0?e.patch(o,...c,l):e.patch(o,l);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${s}`)}}clear(){this.routes.clear(),this.logger.info("\u5DF2\u6E05\u9664\u6240\u6709\u8DEF\u7531\u914D\u7F6E")}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}}});var he,yl,Mm=d(()=>{"use strict";ge();he=j("configApiHandler"),yl=[{method:"GET",path:"/api/config",handler:he((n,e)=>n.getConfig(e))},{method:"PUT",path:"/api/config",handler:he((n,e)=>n.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:he((n,e)=>n.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:he((n,e)=>n.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:he((n,e)=>n.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:he((n,e)=>n.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:he((n,e)=>n.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:he((n,e)=>n.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:he((n,e)=>n.checkConfigExists(e))},{method:"GET",path:"/api/config/prompts",handler:he((n,e)=>n.getPromptFiles(e))},{method:"GET",path:"/api/config/prompts/content",handler:he((n,e)=>n.getPromptFileContent(e))},{method:"PUT",path:"/api/config/prompts/content",handler:he((n,e)=>n.updatePromptFileContent(e))},{method:"POST",path:"/api/config/prompts/content",handler:he((n,e)=>n.createPromptFileContent(e))},{method:"DELETE",path:"/api/config/prompts/content",handler:he((n,e)=>n.deletePromptFileContent(e))}]});var ms,Tl,xm=d(()=>{"use strict";ge();ms=j("statusApiHandler"),Tl=[{method:"GET",path:"/api/status",handler:ms((n,e)=>n.getStatus(e))},{method:"GET",path:"/api/status/client",handler:ms((n,e)=>n.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:ms((n,e)=>n.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:ms((n,e)=>n.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:ms((n,e)=>n.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:ms((n,e)=>n.setActiveMCPServers(e))}]});var Lt,_l,Om=d(()=>{"use strict";ge();Lt=j("mcpToolHandler"),_l=[{method:"POST",path:"/api/tools/call",handler:Lt((n,e)=>n.callTool(e))},{method:"GET",path:"/api/tools/list",handler:Lt((n,e)=>n.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:Lt((n,e)=>n.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:Lt((n,e)=>n.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:Lt((n,e)=>n.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:Lt((n,e)=>n.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:Lt((n,e)=>n.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:Lt((n,e)=>n.listMCPTools(e))}]});var Nv,Rl,Nm=d(()=>{"use strict";ge();Nv=j("mcpRouteHandler"),Rl=[{method:"POST",path:"/mcp",handler:Nv((n,e)=>n.handlePost(e))}]});var ti,Pl,Lm=d(()=>{"use strict";ge();ti=j("versionApiHandler"),Pl=[{method:"GET",path:"/api/version",handler:ti((n,e)=>n.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:ti((n,e)=>n.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:ti((n,e)=>n.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:ti((n,e)=>n.checkLatestVersion(e))}]});var Sn,bl,$m=d(()=>{"use strict";ge();Sn=j("serviceApiHandler"),bl=[{method:"POST",path:"/api/services/restart",handler:Sn((n,e)=>n.restartService(e))},{method:"POST",path:"/api/services/stop",handler:Sn((n,e)=>n.stopService(e))},{method:"POST",path:"/api/services/start",handler:Sn((n,e)=>n.startService(e))},{method:"GET",path:"/api/services/status",handler:Sn((n,e)=>n.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:Sn((n,e)=>n.getServiceHealth(e))}]});var Lv,Al,Dm=d(()=>{"use strict";ge();Lv=j("updateApiHandler"),Al=[{method:"POST",path:"/api/update",handler:Lv((n,e)=>n.performUpdate(e))}]});var $v,wl,km=d(()=>{"use strict";ge();$v=j("staticFileHandler"),wl=[{method:"GET",path:"/*",handler:$v(async(n,e)=>e.req.path.startsWith("/api/")?e.notFound():await n.handleStaticFile(e))}]});var ri,Il,Fm=d(()=>{"use strict";ge();ri=j("cozeHandler"),Il=[{method:"GET",path:"/api/coze/workspaces",handler:ri((n,e)=>n.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:ri((n,e)=>n.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:ri((n,e)=>n.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:ri((n,e)=>n.getCacheStats(e))}]});var Dv,Ml,Hm=d(()=>{"use strict";ge();Dv=j("mcpToolLogHandler"),Ml=[{method:"GET",path:"/api/tool-calls/logs",handler:Dv((n,e)=>n.getToolCallLogs(e))}]});var si,xl,Um=d(()=>{"use strict";si=i(async(n,e)=>{let r=n.get("dependencies").mcpHandler;return r?await e(r):n.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),xl=[{method:"POST",path:"/api/mcp-servers",handler:i(n=>si(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:i(n=>si(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:i(n=>si(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:i(n=>si(n,e=>e.listMCPServers(n)),"handler")}]});var vn,Ol,Vm=d(()=>{"use strict";vn=i(async(n,e)=>{let t=n.get("endpointHandler");if(!t)return n.fail("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",void 0,503);try{return await t[e](n)}catch(r){return n.fail("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25",void 0,500)}},"withEndpointHandler"),Ol=[{method:"POST",path:"/api/endpoint/status",handler:i(n=>vn(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:i(n=>vn(n,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:i(n=>vn(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:i(n=>vn(n,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:i(n=>vn(n,"removeEndpoint"),"handler")}]});var kv,Nl,jm=d(()=>{"use strict";ge();kv=j("serviceApiHandler"),Nl=[{method:"POST",path:"/api/restart",handler:kv((n,e)=>n.restartService(e))}]});var Bm,Ll,zm=d(()=>{"use strict";ge();Bm=j("ttsApiHandler"),Ll=[{method:"POST",path:"/api/tts",handler:Bm((n,e)=>n.synthesize(e))},{method:"GET",path:"/api/tts/voices",handler:Bm((n,e)=>n.getVoices(e))}]});var LF,$l,Dl,Wm=d(()=>{"use strict";ge();LF=j("esp32Handler"),$l=i(n=>async e=>{let r=e.get("dependencies").esp32Handler;return r?n(r,e):e.json({error:"ESP32 service not available"},503)},"createESP32Handler"),Dl=[{method:"POST",path:"/",handler:$l((n,e)=>n.handleOTA(e))},{method:"POST",path:"/xiaozhi/ota/",handler:$l((n,e)=>n.handleOTA(e))},{method:"GET",path:"/ws",handler:$l(async(n,e)=>(e.get("logger").debug("ESP32 WebSocket\u7AEF\u70B9\u8BBF\u95EE"),e.text("WebSocket Upgrade Required",426)))}]});var qm=d(()=>{"use strict";Mm();xm();Om();Nm();Lm();$m();Dm();km();Fm();Hm();Um();Vm();jm();zm();Wm()});var Gm=d(()=>{"use strict";Im();qm()});var Xm={};ii(Xm,{WebServer:()=>kl});import{createServer as Fv}from"http";import{serve as Hv}from"@hono/node-server";import{normalizeServiceConfig as Uv}from"@xiaozhi-client/config";import{configManager as yn}from"@xiaozhi-client/config";import{EndpointManager as Vv}from"@xiaozhi-client/endpoint";import{WebSocketServer as jv}from"ws";var kl,Jm=d(()=>{"use strict";D();Dd();gt();hr();zd();Am();Oi();dt();pa();Gm();kl=class{static{i(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;deviceRegistryService;esp32Service;configApiHandler;statusApiHandler;serviceApiHandler;mcpToolHandler;mcpToolLogHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpHandler;updateApiHandler;cozeHandler;ttsApiHandler;esp32Handler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointManager=null;mcpServiceManager=null;eventListenerUnsubscribers=[];constructor(e){try{this.port=e??yn.getWebUIPort()??mr.DEFAULT_PORT}catch{this.port=e??mr.DEFAULT_PORT}this.logger=u,this.eventBus=k(),this.statusService=new lo,this.notificationService=new uo,this.deviceRegistryService=new po,this.esp32Service=new ei(this.deviceRegistryService),this.esp32Service.setupTTSGetConnection(),this.configApiHandler=new Rn,this.statusApiHandler=new Wn(this.statusService),this.serviceApiHandler=new Bn(this.statusService),this.mcpToolHandler=new Gn,this.mcpToolLogHandler=new Xn,this.versionApiHandler=new co,this.staticFileHandler=new Os,this.mcpRouteHandler=new Un,this.updateApiHandler=new ao,this.cozeHandler=new Ss,this.ttsApiHandler=new Vs,this.esp32Handler=new js(this.esp32Service),this.realtimeNotificationHandler=new jn(this.notificationService,this.statusService),this.heartbeatHandler=new Mn(this.statusService,this.notificationService),this.app=_u(),this.setupMiddleware(),this.app.notFound(la),this.setupEndpointStatusListener(),this.setupMCPServerAddedListener()}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 ws,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new Ms(this.mcpServiceManager,yn),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`);let r=t.map(s=>({name:s.name,description:s.description||"",inputSchema:xn(s.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint),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
85
+ `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&At(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var _t,Cn=m(()=>{"use strict";B();_t=class extends A{static{a(this,"StatusApiHandler")}statusService;constructor(e){super(),this.statusService=e}async getStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return e.get("logger").debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u72B6\u6001","STATUS_READ_ERROR")}}async getClientStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return e.get("logger").debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001","CLIENT_STATUS_READ_ERROR")}}async getRestartStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return e.get("logger").debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u91CD\u542F\u72B6\u6001","RESTART_STATUS_READ_ERROR")}}async checkClientConnected(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return e.get("logger").debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.success({connected:t})}catch(t){return this.handleError(e,t,"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5","CLIENT_CONNECTION_CHECK_ERROR")}}async getLastHeartbeat(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return e.get("logger").debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.success({lastHeartbeat:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4","HEARTBEAT_READ_ERROR")}}async getActiveMCPServers(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return e.get("logger").debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.success({servers:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668","ACTIVE_MCP_SERVERS_READ_ERROR")}}async updateClientStatus(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return!t||typeof t!="object"?e.fail("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61",void 0,400):(this.statusService.updateClientInfo(t,"http-api"),e.get("logger").info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){return this.handleError(e,t,"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001","CLIENT_STATUS_UPDATE_ERROR","\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25",400)}}async setActiveMCPServers(e){try{e.get("logger").debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF");return Array.isArray(t)?(this.statusService.setActiveMCPServers(t),e.get("logger").info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.success(void 0,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F")):e.fail("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4",void 0,400)}catch(t){return this.handleError(e,t,"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668","ACTIVE_MCP_SERVERS_UPDATE_ERROR","\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25",400)}}async resetStatus(e){try{return e.get("logger").info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),e.get("logger").info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.success(void 0,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F")}catch(t){return this.handleError(e,t,"\u91CD\u7F6E\u72B6\u6001","STATUS_RESET_ERROR")}}}});var _r,En=m(()=>{"use strict";_r=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(_r||{})});function vn(n,e){let t=qa[e.field];return t?[...n].sort(t):(g.warn(`[sortTools] \u672A\u77E5\u7684\u6392\u5E8F\u5B57\u6BB5: ${e.field}`),n)}var qa,Tn=m(()=>{"use strict";I();qa={name:a((n,e)=>n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN"),"name"),enabled:a((n,e)=>{let t=Number(e.enabled)-Number(n.enabled);return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"enabled"),usageCount:a((n,e)=>{let t=e.usageCount-n.usageCount;return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"usageCount"),lastUsedTime:a((n,e)=>{if(!n.lastUsedTime)return 1;if(!e.lastUsedTime)return-1;let t=new Date(e.lastUsedTime).getTime()-new Date(n.lastUsedTime).getTime();return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"lastUsedTime")};a(vn,"sortTools")});import{configManager as R}from"@xiaozhi-client/config";import Ba from"ajv";import Ot from"dayjs";var Nt,Sn=m(()=>{"use strict";I();dt();Ir();ie();En();Tn();Nt=class n{static{a(this,"MCPToolHandler")}static UNDERSCORE_TRIM_REGEX=/^_+|_+$/g;static LETTER_START_REGEX=/^[a-zA-Z]/;static CHINESE_CHAR_REGEX=/[\u4e00-\u9fa5]/;static DIGITS_ONLY_REGEX=/^\d+$/;static ALPHANUMERIC_UNDERSCORE_REGEX=/^[a-zA-Z0-9_-]+$/;static IDENTIFIER_REGEX=/^[a-zA-Z_][a-zA-Z0-9_]*$/;logger;ajv;static TOOL_TYPE_VALUES=Object.values(_r);constructor(){this.logger=g,this.ajv=new Ba({allErrors:!0,verbose:!0})}async callTool(e){try{e.get("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)return e.fail("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570",void 0,400);e.get("logger").info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${o}\uFF0C\u53C2\u6570:`,JSON.stringify(s));let i=e.get("mcpServiceManager");if(!i)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,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:jo.LONG_RUNNING});else{let l=`${r}__${o}`;c=await i.callTool(l,s||{})}return e.success(c,"\u5DE5\u5177\u8C03\u7528\u6210\u529F")}catch(t){e.get("logger").error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),o="TOOL_CALL_ERROR";return 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"),e.fail(o,r,void 0,500)}}async getCustomTools(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!R.configExists())return e.fail("CONFIG_NOT_FOUND","\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E",void 0,404);let t=[],r="";try{t=R.getCustomMCPTools(),r=R.getConfigPath()}catch(s){return e.get("logger").error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",s),e.fail("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF"}`,void 0,500)}return!t||t.length===0?(e.get("logger").info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.success({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")):R.validateCustomMCPTools(t)?(e.get("logger").info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.success({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F")):(e.get("logger").warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),e.fail("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",void 0,400))}catch(t){return e.get("logger").error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async listTools(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=e.req.query("sortBy"),o=["name","enabled","usageCount","lastUsedTime"],s=o.includes(r)?r:"name";if(r&&!o.includes(r))return e.fail("INVALID_SORT_FIELD",`\u65E0\u6548\u7684\u6392\u5E8F\u5B57\u6BB5: ${r}\u3002\u652F\u6301\u7684\u6392\u5E8F\u5B57\u6BB5: ${o.join(", ")}`,void 0,400);let i=e.get("mcpServiceManager");if(!i)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);let c=i.getAllTools(t);c=vn(c,{field:s});let l=c.map(p=>({name:p.name,description:p.description,inputSchema:p.inputSchema,handler:{type:"mcp",config:{serviceName:p.serviceName,toolName:p.originalName}},enabled:p.enabled,usageCount:p.usageCount,lastUsedTime:p.lastUsedTime})),u={list:l,total:l.length};return e.success(u,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`)}catch(t){return e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let o=e.getCustomMCPTools().map(s=>s.name);throw o.length===0?f.validationError("TOOL_NOT_FOUND",`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`):f.validationError("TOOL_NOT_FOUND",`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),f.validationError("TOOL_VALIDATION_FAILED",`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 f.validationError("TOOL_NOT_FOUND",`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 p=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(d=>{let v=d.instancePath||d.schemaPath||"",E=d.message||"\u672A\u77E5\u9519\u8BEF";if(d.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${d.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(d.keyword==="type"){let k=d.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${v} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${k}`}if(d.keyword==="enum"){let k=d.params?.allowedValues||[];return`\u53C2\u6570 ${v} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${k.join(", ")}`}return`\u53C2\u6570 ${v} ${E}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,p),f.validationError("TOOL_VALIDATION_FAILED",p)}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),f.validationError("TOOL_VALIDATION_FAILED",`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{e.get("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){e.get("logger").error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{code:r,message:o,status:s}=this.handleAddToolError(t);return e.fail(r,o,void 0,s)}}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(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!n.TOOL_TYPE_VALUES.includes(r))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${n.TOOL_TYPE_VALUES.join(", ")}`,void 0,400);switch(r){case"mcp":return await this.handleAddMCPTool(e,o);case"coze":return await this.handleAddCozeTool(e,o);case"http":case"function":return e.fail("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`,void 0,501);default:return e.fail("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`,void 0,400)}}async handleLegacyFormatAddTool(e,t){e.get("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 e.fail(c.code,c.message,void 0,c.status);let l=this.convertWorkflowToTool(r,o,s,i);return R.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.success({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(e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${o}`),!r||!o)return e.fail("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5",void 0,400);let c=e.get("mcpServiceManager");if(!c)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);try{await this.validateServiceAndTool(c,r,o)}catch(ge){let ra=ge instanceof Error?ge.message:String(ge);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",ra,void 0,404)}let u=await new se().getAllCachedTools(),p=`${r}__${o}`,d=u.find(ge=>ge.name===p);if(!d)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`,void 0,404);let v=s||p,E=R.getCustomMCPTools();if(new Set(E.map(ge=>ge.name)).has(v))return e.fail("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${v}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`,void 0,409);let nt={name:v,description:i||d.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:d.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:Ot().format("YYYY-MM-DD HH:mm:ss")}};R.addCustomMCPTool(nt),e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`);let Kt=R.getServerToolsConfig(r);Kt?.toolName&&(Kt[o].enable=!0,R.updateServerToolsConfig(r,Kt),e.get("logger").info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`)),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${v}`);let ta={tool:nt,toolName:v,toolType:"mcp",addedAt:Ot().format("YYYY-MM-DD HH:mm:ss")};return e.success(ta,`MCP \u5DE5\u5177 "${v}" \u6DFB\u52A0\u6210\u529F`)}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:s,parameterConfig:i}=t;e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let c=this.performPreChecks(r,o,s);if(c)return e.fail(c.code,c.message,void 0,c.status);let l=this.convertWorkflowToTool(r,o,s,i);R.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let u={tool:l,toolName:l.name,toolType:"coze",addedAt:Ot().format("YYYY-MM-DD HH:mm:ss")};return e.success(u,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`)}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t)return e.fail("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",void 0,400);e.get("logger").info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();return!r||typeof r!="object"?e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61",void 0,400):this.isNewFormatRequest(r)?await this.handleNewFormatUpdateTool(e,t,r):e.fail("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42",void 0,400)}catch(t){e.get("logger").error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{code:r,message:o,status:s}=this.handleUpdateToolError(t);return e.fail(r,o,void 0,s)}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:s}=r;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!n.TOOL_TYPE_VALUES.includes(o))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${n.TOOL_TYPE_VALUES.join(", ")}`,void 0,400);switch(o){case"coze":return await this.handleUpdateCozeTool(e,t,s);case"mcp":case"http":case"function":return e.fail("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`,void 0,501);default:return e.fail("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${o}`,void 0,400)}}async handleUpdateCozeTool(e,t,r){let{workflow:o,customName:s,customDescription:i,parameterConfig:c}=r;e.get("logger").info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let u=R.getCustomMCPTools().find(E=>E.name===t);if(!u)return e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`,void 0,404);if(u.handler.type!=="proxy"||u.handler.platform!=="coze")return e.fail("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`,void 0,400);!o.workflow_id&&u.handler?.config?.workflow_id&&(o.workflow_id=u.handler.config.workflow_id),!o.workflow_id&&o.app_id&&e.get("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 p=this.generateInputSchema(o,c),d={...u,description:i||u.description,inputSchema:p};R.updateCustomMCPTool(t,d),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let v={tool:d,toolName:t,toolType:"coze",updatedAt:Ot().format("YYYY-MM-DD HH:mm:ss")};return e.success(v,`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")?{code:"TOOL_NOT_FOUND",message:`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E`,status:404}:t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("INVALID_TOOL_TYPE")?{code:"INVALID_TOOL_TYPE",message:t,status:400}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{code:"INVALID_REQUEST",message:`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u914D\u7F6E\u6570\u636E`,status:400}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{code:"CONFIGURATION_ERROR",message:`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`,status:422}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{code:"TOOL_TYPE_NOT_IMPLEMENTED",message:t,status:501}:{code:"UPDATE_CUSTOM_TOOL_ERROR",message:`\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`,status:500}}async removeCustomTool(e){try{let t=e.req.param("toolName");if(!t)return e.fail("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",void 0,400);e.get("logger").info(`\u5904\u7406\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42: ${t}`);let o=R.getCustomMCPTools().find(s=>s.name===t);if(o&&o.handler.type==="mcp"){let s=o.handler.config;if(s.serviceName&&s.toolName){e.get("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=R.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,R.updateServerToolsConfig(s.serviceName,i),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return R.removeCustomMCPTool(t),e.get("logger").info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.success(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`)}catch(t){e.get("logger").error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{code:r,message:o,status:s}=this.handleRemoveToolError(t);return e.fail(r,o,void 0,s)}}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),u=this.createHttpHandler(e),p={name:i,description:c,inputSchema:l,handler:u};return this.validateGeneratedTool(p),p}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(n.UNDERSCORE_TRIM_REGEX,""),n.LETTER_START_REGEX.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 n.CHINESE_CHAR_REGEX.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!n.DIGITS_ONLY_REGEX.test(e.workflow_id))throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.app_id))throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED",`${o}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!n.DIGITS_ONLY_REGEX.test(e.workflow_id))throw f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.app_id))throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED",`${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 f.validationError("TOOL_VALIDATION_FAILED","\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${o}`)}resolveToolNameConflict(e){let t=R.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 f.operationError("OPERATION_FAILED",`\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=R.getCozePlatformConfig();if(!e||!e.token)throw f.configError("INVALID_CONFIG","\u672A\u914D\u7F6E\u6263\u5B50API Token\uFF0C\u8BF7\u5148\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E platforms.coze.token")}validateGeneratedTool(e){if(this.validateToolStructure(e),!R.validateCustomMCPTools([e]))throw f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED","\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 f.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw f.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw f.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw f.validationError("TOOL_VALIDATION_FAILED","HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw f.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw f.validationError("TOOL_VALIDATION_FAILED","Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw f.configError("INVALID_CONFIG","\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw f.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw f.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw f.validationError("TOOL_VALIDATION_FAILED",`\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 f.validationError("TOOL_VALIDATION_FAILED","Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.token))throw f.validationError("TOOL_VALIDATION_FAILED","Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw f.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw f.validationError("TOOL_VALIDATION_FAILED","\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||!n.IDENTIFIER_REGEX.test(o))throw f.validationError("TOOL_VALIDATION_FAILED",`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw f.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw f.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw f.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw f.validationError("TOOL_VALIDATION_FAILED","\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")?{code:"INVALID_TOOL_TYPE",message:t,status:400}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{code:"MISSING_REQUIRED_FIELD",message:t,status:400}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{code:"SERVICE_OR_TOOL_NOT_FOUND",message:t,status:404}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{code:"SERVICE_NOT_INITIALIZED",message:t,status:503}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{code:"TOOL_NAME_CONFLICT",message:`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`,status:409}:this.isValidationError(t)?{code:"VALIDATION_ERROR",message:this.formatValidationError(t),status:400}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{code:"CONFIGURATION_ERROR",message:`${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`,status:422}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{code:"RESOURCE_LIMIT_EXCEEDED",message:t,status:429}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{code:"TOOL_TYPE_NOT_IMPLEMENTED",message:t,status:501}:{code:"ADD_CUSTOM_TOOL_ERROR",message:`\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`,status:500}}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")?{code:"TOOL_NOT_FOUND",message:`${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`,status:404}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{code:"INVALID_REQUEST",message:`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`,status:400}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{code:"CONFIGURATION_ERROR",message:`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`,status:422}:{code:"REMOVE_CUSTOM_TOOL_ERROR",message:`\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`,status:500}}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{code:"INVALID_REQUEST",message:"\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570",status:400};if(typeof e!="object")return{code:"INVALID_REQUEST",message:"workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B",status:400};if(!Array.isArray(e)){let o=e;if(!o.workflow_id||typeof o.workflow_id!="string"||!o.workflow_id.trim())return{code:"INVALID_REQUEST",message:"workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32",status:400};if(!o.workflow_name||typeof o.workflow_name!="string"||!o.workflow_name.trim())return{code:"INVALID_REQUEST",message:"workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32",status:400}}if(t!==void 0){if(typeof t!="string")return{code:"INVALID_REQUEST",message:"customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B",status:400};if(t.trim()==="")return{code:"INVALID_REQUEST",message:"customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32",status:400};if(t.length>50)return{code:"INVALID_REQUEST",message:"customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26",status:400}}if(r!==void 0){if(typeof r!="string")return{code:"INVALID_REQUEST",message:"customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B",status:400};if(r.length>200)return{code:"INVALID_REQUEST",message:"customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26",status:400}}return null}checkSystemStatus(){try{let e=R.getCozePlatformConfig();if(!e||!e.token)return{code:"CONFIGURATION_ERROR",message:"\u672A\u914D\u7F6E\u6263\u5B50API Token\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u914D\u7F6E platforms.coze.token",status:422};if(typeof e.token!="string"||e.token.trim()==="")return{code:"CONFIGURATION_ERROR",message:"\u6263\u5B50API Token\u683C\u5F0F\u65E0\u6548\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u4E2D\u7684 platforms.coze.token",status:422}}catch{return{code:"SYSTEM_ERROR",message:"\u7CFB\u7EDF\u914D\u7F6E\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",status:500}}return null}checkResourceLimits(){try{let e=R.getCustomMCPTools(),t=100;if(e.length>=t)return{code:"RESOURCE_LIMIT_EXCEEDED",message:`\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`,status:429};let r=JSON.stringify(e).length,o=1024*1024;if(r>o)return{code:"PAYLOAD_TOO_LARGE",message:"\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4",status:413}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}async manageMCPTool(e){try{let t=await e.req.json(),{action:r,serverName:o,toolName:s,description:i}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","action \u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let c=["enable","disable","status","toggle"];if(!c.includes(r))return e.fail("INVALID_ACTION",`\u65E0\u6548\u7684 action: ${r}\u3002\u652F\u6301\u7684 action: ${c.join(", ")}`,void 0,400);switch(this.validateToolIdentifier(o,s),r){case"enable":return this.handleEnableTool(e,o,s,i);case"disable":return this.handleDisableTool(e,o,s);case"status":return this.handleGetToolStatus(e,o,s);case"toggle":return this.handleToggleTool(e,o,s);default:return e.fail("INVALID_ACTION",`\u672A\u5B9E\u73B0\u7684 action: ${r}`,void 0,400)}}catch(t){e.get("logger").error("\u7BA1\u7406 MCP \u5DE5\u5177\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u7BA1\u7406 MCP \u5DE5\u5177\u5931\u8D25";return e.fail("TOOL_MANAGE_ERROR",r,void 0,500)}}async listMCPTools(e){try{let t=await e.req.json(),{serverName:r,includeUsageStats:o}=t;return r?this.handleListServerTools(e,r,o):this.handleListAllTools(e,o)}catch(t){return e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_TOOL_LIST_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async handleEnableTool(e,t,r,o){await this.validateServiceAndToolExistence(t,r),R.setToolEnabled(t,r,!0,o);let i=R.getServerToolsConfig(t)[r];return e.get("logger").info(`\u5DE5\u5177\u5DF2\u542F\u7528: ${t}/${r}`),e.success({serverName:t,toolName:r,enabled:!0,description:i?.description||o||""},`\u5DE5\u5177 "${t}__${r}" \u542F\u7528\u6210\u529F`)}async handleDisableTool(e,t,r){return await this.validateServiceAndToolExistence(t,r),R.setToolEnabled(t,r,!1),e.get("logger").info(`\u5DE5\u5177\u5DF2\u7981\u7528: ${t}/${r}`),e.success({serverName:t,toolName:r,enabled:!1},`\u5DE5\u5177 "${t}__${r}" \u7981\u7528\u6210\u529F`)}async handleGetToolStatus(e,t,r){let s=R.getServerToolsConfig(t)[r];return s?e.success({serverName:t,toolName:r,enabled:s.enable!==!1,description:s.description||"",usageCount:s.usageCount,lastUsedTime:s.lastUsedTime},"\u5DE5\u5177\u72B6\u6001\u83B7\u53D6\u6210\u529F"):e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}__${r}" \u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`,void 0,404)}async handleToggleTool(e,t,r){await this.validateServiceAndToolExistence(t,r);let s=!R.isToolEnabled(t,r);return R.setToolEnabled(t,r,s),e.get("logger").info(`\u5DE5\u5177\u72B6\u6001\u5DF2\u5207\u6362: ${t}/${r} -> ${s}`),e.success({serverName:t,toolName:r,enabled:s},`\u5DE5\u5177 "${t}__${r}" \u5DF2${s?"\u542F\u7528":"\u7981\u7528"}`)}async handleListServerTools(e,t,r){if(!R.getMcpServers()[t])return e.fail("SERVICE_NOT_FOUND",`MCP \u670D\u52A1 "${t}" \u4E0D\u5B58\u5728`,void 0,404);let s=R.getServerToolsConfig(t),i=Object.entries(s).map(([u,p])=>{let d={toolName:u,enabled:p.enable!==!1,description:p.description||""};return r&&(d.usageCount=p.usageCount,d.lastUsedTime=p.lastUsedTime),d}),c=i.filter(u=>u.enabled).length,l=i.length-c;return e.success({serverName:t,tools:i,total:i.length,enabledCount:c,disabledCount:l},"\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F")}async handleListAllTools(e,t){let r=R.getMcpServerConfig(),o={servers:[],totalTools:0,totalEnabled:0,totalDisabled:0};for(let[s,i]of Object.entries(r)){let c=Object.entries(i.tools||{}).map(([u,p])=>{let d={toolName:u,enabled:p.enable!==!1,description:p.description||""};return t&&(d.usageCount=p.usageCount,d.lastUsedTime=p.lastUsedTime),d}),l=c.filter(u=>u.enabled).length;o.servers.push({serverName:s,tools:c,total:c.length,enabledCount:l,disabledCount:c.length-l}),o.totalTools+=c.length,o.totalEnabled+=l,o.totalDisabled+=c.length-l}return e.success(o,"\u83B7\u53D6\u6240\u6709\u5DE5\u5177\u5217\u8868\u6210\u529F")}validateToolIdentifier(e,t){if(!e||typeof e!="string"||e.trim()==="")throw f.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e))throw f.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(t))throw f.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26")}async validateServiceAndToolExistence(e,t){if(!R.getMcpServers()[e])throw f.validationError("SERVER_NOT_FOUND",`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!R.getServerToolsConfig(e)[t])throw f.validationError("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}}});import{z as ce}from"zod";var Xa,bt,Rn=m(()=>{"use strict";ar();vt();B();Xa=ce.object({limit:ce.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=ir.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${ir.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:ce.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:ce.string().optional(),serverName:ce.string().optional(),success:ce.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:ce.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:ce.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(n=>!n.startDate||!n.endDate?!0:new Date(n.startDate)<=new Date(n.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),bt=class extends A{static{a(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new Et}parseAndValidateQueryParams(e){let t=e.req.query(),r=Xa.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.issues.map(o=>({field:o.path.join("."),message:o.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return e.fail("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error,400);let r=await this.toolCallLogService.getToolCallLogs(t.data);return e.get("logger").debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),e.success(r)}catch(t){e.get("logger").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")?e.fail("LOG_FILE_NOT_FOUND",r,void 0,404):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?e.fail("LOG_FILE_READ_ERROR",r,void 0,500):e.fail("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r},500)}}}});var We=T((Tf,Mn)=>{"use strict";var Ya="2.0.0",Ja=Number.MAX_SAFE_INTEGER||9007199254740991,Ka=16,Qa=250,Za=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Mn.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Ka,MAX_SAFE_BUILD_LENGTH:Qa,MAX_SAFE_INTEGER:Ja,RELEASE_TYPES:Za,SEMVER_SPEC_VERSION:Ya,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Ge=T((Sf,Pn)=>{"use strict";var ec=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};Pn.exports=ec});var Pe=T((J,yn)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Or,MAX_SAFE_BUILD_LENGTH:tc,MAX_LENGTH:rc}=We(),oc=Ge();J=yn.exports={};var nc=J.re=[],sc=J.safeRe=[],h=J.src=[],ic=J.safeSrc=[],C=J.t={},ac=0,Nr="[a-zA-Z0-9-]",cc=[["\\s",1],["\\d",rc],[Nr,tc]],lc=a(n=>{for(let[e,t]of cc)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),S=a((n,e,t)=>{let r=lc(e),o=ac++;oc(n,o,e),C[n]=o,h[o]=e,ic[o]=r,nc[o]=new RegExp(e,t?"g":void 0),sc[o]=new RegExp(r,t?"g":void 0)},"createToken");S("NUMERICIDENTIFIER","0|[1-9]\\d*");S("NUMERICIDENTIFIERLOOSE","\\d+");S("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Nr}*`);S("MAINVERSION",`(${h[C.NUMERICIDENTIFIER]})\\.(${h[C.NUMERICIDENTIFIER]})\\.(${h[C.NUMERICIDENTIFIER]})`);S("MAINVERSIONLOOSE",`(${h[C.NUMERICIDENTIFIERLOOSE]})\\.(${h[C.NUMERICIDENTIFIERLOOSE]})\\.(${h[C.NUMERICIDENTIFIERLOOSE]})`);S("PRERELEASEIDENTIFIER",`(?:${h[C.NONNUMERICIDENTIFIER]}|${h[C.NUMERICIDENTIFIER]})`);S("PRERELEASEIDENTIFIERLOOSE",`(?:${h[C.NONNUMERICIDENTIFIER]}|${h[C.NUMERICIDENTIFIERLOOSE]})`);S("PRERELEASE",`(?:-(${h[C.PRERELEASEIDENTIFIER]}(?:\\.${h[C.PRERELEASEIDENTIFIER]})*))`);S("PRERELEASELOOSE",`(?:-?(${h[C.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${h[C.PRERELEASEIDENTIFIERLOOSE]})*))`);S("BUILDIDENTIFIER",`${Nr}+`);S("BUILD",`(?:\\+(${h[C.BUILDIDENTIFIER]}(?:\\.${h[C.BUILDIDENTIFIER]})*))`);S("FULLPLAIN",`v?${h[C.MAINVERSION]}${h[C.PRERELEASE]}?${h[C.BUILD]}?`);S("FULL",`^${h[C.FULLPLAIN]}$`);S("LOOSEPLAIN",`[v=\\s]*${h[C.MAINVERSIONLOOSE]}${h[C.PRERELEASELOOSE]}?${h[C.BUILD]}?`);S("LOOSE",`^${h[C.LOOSEPLAIN]}$`);S("GTLT","((?:<|>)?=?)");S("XRANGEIDENTIFIERLOOSE",`${h[C.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);S("XRANGEIDENTIFIER",`${h[C.NUMERICIDENTIFIER]}|x|X|\\*`);S("XRANGEPLAIN",`[v=\\s]*(${h[C.XRANGEIDENTIFIER]})(?:\\.(${h[C.XRANGEIDENTIFIER]})(?:\\.(${h[C.XRANGEIDENTIFIER]})(?:${h[C.PRERELEASE]})?${h[C.BUILD]}?)?)?`);S("XRANGEPLAINLOOSE",`[v=\\s]*(${h[C.XRANGEIDENTIFIERLOOSE]})(?:\\.(${h[C.XRANGEIDENTIFIERLOOSE]})(?:\\.(${h[C.XRANGEIDENTIFIERLOOSE]})(?:${h[C.PRERELEASELOOSE]})?${h[C.BUILD]}?)?)?`);S("XRANGE",`^${h[C.GTLT]}\\s*${h[C.XRANGEPLAIN]}$`);S("XRANGELOOSE",`^${h[C.GTLT]}\\s*${h[C.XRANGEPLAINLOOSE]}$`);S("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Or}})(?:\\.(\\d{1,${Or}}))?(?:\\.(\\d{1,${Or}}))?`);S("COERCE",`${h[C.COERCEPLAIN]}(?:$|[^\\d])`);S("COERCEFULL",h[C.COERCEPLAIN]+`(?:${h[C.PRERELEASE]})?(?:${h[C.BUILD]})?(?:$|[^\\d])`);S("COERCERTL",h[C.COERCE],!0);S("COERCERTLFULL",h[C.COERCEFULL],!0);S("LONETILDE","(?:~>?)");S("TILDETRIM",`(\\s*)${h[C.LONETILDE]}\\s+`,!0);J.tildeTrimReplace="$1~";S("TILDE",`^${h[C.LONETILDE]}${h[C.XRANGEPLAIN]}$`);S("TILDELOOSE",`^${h[C.LONETILDE]}${h[C.XRANGEPLAINLOOSE]}$`);S("LONECARET","(?:\\^)");S("CARETTRIM",`(\\s*)${h[C.LONECARET]}\\s+`,!0);J.caretTrimReplace="$1^";S("CARET",`^${h[C.LONECARET]}${h[C.XRANGEPLAIN]}$`);S("CARETLOOSE",`^${h[C.LONECARET]}${h[C.XRANGEPLAINLOOSE]}$`);S("COMPARATORLOOSE",`^${h[C.GTLT]}\\s*(${h[C.LOOSEPLAIN]})$|^$`);S("COMPARATOR",`^${h[C.GTLT]}\\s*(${h[C.FULLPLAIN]})$|^$`);S("COMPARATORTRIM",`(\\s*)${h[C.GTLT]}\\s*(${h[C.LOOSEPLAIN]}|${h[C.XRANGEPLAIN]})`,!0);J.comparatorTrimReplace="$1$2$3";S("HYPHENRANGE",`^\\s*(${h[C.XRANGEPLAIN]})\\s+-\\s+(${h[C.XRANGEPLAIN]})\\s*$`);S("HYPHENRANGELOOSE",`^\\s*(${h[C.XRANGEPLAINLOOSE]})\\s+-\\s+(${h[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=T((Mf,In)=>{"use strict";var gc=Object.freeze({loose:!0}),uc=Object.freeze({}),pc=a(n=>n?typeof n!="object"?gc:n:uc,"parseOptions");In.exports=pc});var br=T((yf,On)=>{"use strict";var An=/^[0-9]+$/,_n=a((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=An.test(n),r=An.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),dc=a((n,e)=>_n(e,n),"rcompareIdentifiers");On.exports={compareIdentifiers:_n,rcompareIdentifiers:dc}});var N=T((Af,bn)=>{"use strict";var Lt=Ge(),{MAX_LENGTH:Nn,MAX_SAFE_INTEGER:xt}=We(),{safeRe:Dt,t:$t}=Pe(),mc=wt(),{compareIdentifiers:wr}=br(),Lr=class n{static{a(this,"SemVer")}constructor(e,t){if(t=mc(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>Nn)throw new TypeError(`version is longer than ${Nn} characters`);Lt("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>xt||this.major<0)throw new TypeError("Invalid major version");if(this.minor>xt||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>xt||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<xt)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(Lt("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(Lt("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 wr(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(Lt("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 wr(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]),wr(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}};bn.exports=Lr});var de=T((Of,Ln)=>{"use strict";var wn=N(),fc=a((n,e,t=!1)=>{if(n instanceof wn)return n;try{return new wn(n,e)}catch(r){if(!t)return null;throw r}},"parse");Ln.exports=fc});var Dn=T((bf,xn)=>{"use strict";var hc=de(),Cc=a((n,e)=>{let t=hc(n,e);return t?t.version:null},"valid");xn.exports=Cc});var kn=T((Lf,$n)=>{"use strict";var Ec=de(),vc=a((n,e)=>{let t=Ec(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");$n.exports=vc});var Vn=T((Df,Fn)=>{"use strict";var Hn=N(),Tc=a((n,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new Hn(n instanceof Hn?n.version:n,t).inc(e,r,o).version}catch{return null}},"inc");Fn.exports=Tc});var jn=T((kf,zn)=>{"use strict";var Un=de(),Sc=a((n,e)=>{let t=Un(n,null,!0),r=Un(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 p=l?"pre":"";return t.major!==r.major?p+"major":t.minor!==r.minor?p+"minor":t.patch!==r.patch?p+"patch":"prerelease"},"diff");zn.exports=Sc});var Gn=T((Ff,Wn)=>{"use strict";var Rc=N(),Mc=a((n,e)=>new Rc(n,e).major,"major");Wn.exports=Mc});var Bn=T((Uf,qn)=>{"use strict";var Pc=N(),yc=a((n,e)=>new Pc(n,e).minor,"minor");qn.exports=yc});var Yn=T((jf,Xn)=>{"use strict";var Ic=N(),Ac=a((n,e)=>new Ic(n,e).patch,"patch");Xn.exports=Ac});var Kn=T((Gf,Jn)=>{"use strict";var _c=de(),Oc=a((n,e)=>{let t=_c(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Jn.exports=Oc});var z=T((Bf,Zn)=>{"use strict";var Qn=N(),Nc=a((n,e,t)=>new Qn(n,t).compare(new Qn(e,t)),"compare");Zn.exports=Nc});var ts=T((Yf,es)=>{"use strict";var bc=z(),wc=a((n,e,t)=>bc(e,n,t),"rcompare");es.exports=wc});var os=T((Kf,rs)=>{"use strict";var Lc=z(),xc=a((n,e)=>Lc(n,e,!0),"compareLoose");rs.exports=xc});var kt=T((Zf,ss)=>{"use strict";var ns=N(),Dc=a((n,e,t)=>{let r=new ns(n,t),o=new ns(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");ss.exports=Dc});var as=T((th,is)=>{"use strict";var $c=kt(),kc=a((n,e)=>n.sort((t,r)=>$c(t,r,e)),"sort");is.exports=kc});var ls=T((oh,cs)=>{"use strict";var Hc=kt(),Fc=a((n,e)=>n.sort((t,r)=>Hc(r,t,e)),"rsort");cs.exports=Fc});var qe=T((sh,gs)=>{"use strict";var Vc=z(),Uc=a((n,e,t)=>Vc(n,e,t)>0,"gt");gs.exports=Uc});var Ht=T((ah,us)=>{"use strict";var zc=z(),jc=a((n,e,t)=>zc(n,e,t)<0,"lt");us.exports=jc});var xr=T((lh,ps)=>{"use strict";var Wc=z(),Gc=a((n,e,t)=>Wc(n,e,t)===0,"eq");ps.exports=Gc});var Dr=T((uh,ds)=>{"use strict";var qc=z(),Bc=a((n,e,t)=>qc(n,e,t)!==0,"neq");ds.exports=Bc});var Ft=T((dh,ms)=>{"use strict";var Xc=z(),Yc=a((n,e,t)=>Xc(n,e,t)>=0,"gte");ms.exports=Yc});var Vt=T((fh,fs)=>{"use strict";var Jc=z(),Kc=a((n,e,t)=>Jc(n,e,t)<=0,"lte");fs.exports=Kc});var $r=T((Ch,hs)=>{"use strict";var Qc=xr(),Zc=Dr(),el=qe(),tl=Ft(),rl=Ht(),ol=Vt(),nl=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 Qc(n,t,r);case"!=":return Zc(n,t,r);case">":return el(n,t,r);case">=":return tl(n,t,r);case"<":return rl(n,t,r);case"<=":return ol(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");hs.exports=nl});var Es=T((vh,Cs)=>{"use strict";var sl=N(),il=de(),{safeRe:Ut,t:zt}=Pe(),al=a((n,e)=>{if(n instanceof sl)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[zt.COERCEFULL]:Ut[zt.COERCE]);else{let l=e.includePrerelease?Ut[zt.COERCERTLFULL]:Ut[zt.COERCERTL],u;for(;(u=l.exec(n))&&(!t||t.index+t[0].length!==n.length);)(!t||u.index+u[0].length!==t.index+t[0].length)&&(t=u),l.lastIndex=u.index+u[1].length+u[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 il(`${r}.${o}.${s}${i}${c}`,e)},"coerce");Cs.exports=al});var Ts=T((Sh,vs)=>{"use strict";var kr=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}};vs.exports=kr});var j=T((Mh,Ps)=>{"use strict";var cl=/\s+/g,Hr=class n{static{a(this,"Range")}constructor(e,t){if(t=gl(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof Fr)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(cl," "),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=>!Rs(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&&Cl(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&&fl)|(this.options.loose&&hl))+":"+e,o=Ss.get(r);if(o)return o;let s=this.options.loose,i=s?L[b.HYPHENRANGELOOSE]:L[b.HYPHENRANGE];e=e.replace(i,Al(this.options.includePrerelease)),y("hyphen replace",e),e=e.replace(L[b.COMPARATORTRIM],pl),y("comparator trim",e),e=e.replace(L[b.TILDETRIM],dl),y("tilde trim",e),e=e.replace(L[b.CARETTRIM],ml),y("caret trim",e);let c=e.split(" ").map(d=>El(d,this.options)).join(" ").split(/\s+/).map(d=>Il(d,this.options));s&&(c=c.filter(d=>(y("loose invalid filter",d,this.options),!!d.match(L[b.COMPARATORLOOSE])))),y("range list",c);let l=new Map,u=c.map(d=>new Fr(d,this.options));for(let d of u){if(Rs(d))return[d];l.set(d.value,d)}l.size>1&&l.has("")&&l.delete("");let p=[...l.values()];return Ss.set(r,p),p}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Ms(r,t)&&e.set.some(o=>Ms(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 ul(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(_l(this.set[t],e,this.options))return!0;return!1}};Ps.exports=Hr;var ll=Ts(),Ss=new ll,gl=wt(),Fr=Be(),y=Ge(),ul=N(),{safeRe:L,t:b,comparatorTrimReplace:pl,tildeTrimReplace:dl,caretTrimReplace:ml}=Pe(),{FLAG_INCLUDE_PRERELEASE:fl,FLAG_LOOSE:hl}=We(),Rs=a(n=>n.value==="<0.0.0-0","isNullSet"),Cl=a(n=>n.value==="","isAny"),Ms=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"),El=a((n,e)=>(n=n.replace(L[b.BUILD],""),y("comp",n,e),n=Sl(n,e),y("caret",n),n=vl(n,e),y("tildes",n),n=Ml(n,e),y("xrange",n),n=yl(n,e),y("stars",n),n),"parseComparator"),x=a(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),vl=a((n,e)=>n.trim().split(/\s+/).map(t=>Tl(t,e)).join(" "),"replaceTildes"),Tl=a((n,e)=>{let t=e.loose?L[b.TILDELOOSE]:L[b.TILDE];return n.replace(t,(r,o,s,i,c)=>{y("tilde",n,r,o,s,i,c);let l;return x(o)?l="":x(s)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:x(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"),Sl=a((n,e)=>n.trim().split(/\s+/).map(t=>Rl(t,e)).join(" "),"replaceCarets"),Rl=a((n,e)=>{y("caret",n,e);let t=e.loose?L[b.CARETLOOSE]:L[b.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(o,s,i,c,l)=>{y("caret",n,o,s,i,c,l);let u;return x(s)?u="":x(i)?u=`>=${s}.0.0${r} <${+s+1}.0.0-0`:x(c)?s==="0"?u=`>=${s}.${i}.0${r} <${s}.${+i+1}.0-0`:u=`>=${s}.${i}.0${r} <${+s+1}.0.0-0`:l?(y("replaceCaret pr",l),s==="0"?i==="0"?u=`>=${s}.${i}.${c}-${l} <${s}.${i}.${+c+1}-0`:u=`>=${s}.${i}.${c}-${l} <${s}.${+i+1}.0-0`:u=`>=${s}.${i}.${c}-${l} <${+s+1}.0.0-0`):(y("no pr"),s==="0"?i==="0"?u=`>=${s}.${i}.${c}${r} <${s}.${i}.${+c+1}-0`:u=`>=${s}.${i}.${c}${r} <${s}.${+i+1}.0-0`:u=`>=${s}.${i}.${c} <${+s+1}.0.0-0`),y("caret return",u),u})},"replaceCaret"),Ml=a((n,e)=>(y("replaceXRanges",n,e),n.split(/\s+/).map(t=>Pl(t,e)).join(" ")),"replaceXRanges"),Pl=a((n,e)=>{n=n.trim();let t=e.loose?L[b.XRANGELOOSE]:L[b.XRANGE];return n.replace(t,(r,o,s,i,c,l)=>{y("xRange",n,r,o,s,i,c,l);let u=x(s),p=u||x(i),d=p||x(c),v=d;return o==="="&&v&&(o=""),l=e.includePrerelease?"-0":"",u?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&v?(p&&(i=0),c=0,o===">"?(o=">=",p?(s=+s+1,i=0,c=0):(i=+i+1,c=0)):o==="<="&&(o="<",p?s=+s+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+s}.${i}.${c}${l}`):p?r=`>=${s}.0.0${l} <${+s+1}.0.0-0`:d&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),y("xRange return",r),r})},"replaceXRange"),yl=a((n,e)=>(y("replaceStars",n,e),n.trim().replace(L[b.STAR],"")),"replaceStars"),Il=a((n,e)=>(y("replaceGTE0",n,e),n.trim().replace(L[e.includePrerelease?b.GTE0PRE:b.GTE0],"")),"replaceGTE0"),Al=a(n=>(e,t,r,o,s,i,c,l,u,p,d,v)=>(x(r)?t="":x(o)?t=`>=${r}.0.0${n?"-0":""}`:x(s)?t=`>=${r}.${o}.0${n?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,x(u)?l="":x(p)?l=`<${+u+1}.0.0-0`:x(d)?l=`<${u}.${+p+1}.0-0`:v?l=`<=${u}.${p}.${d}-${v}`:n?l=`<${u}.${p}.${+d+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),_l=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!==Fr.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 Be=T((yh,Ns)=>{"use strict";var Xe=Symbol("SemVer ANY"),zr=class n{static{a(this,"Comparator")}static get ANY(){return Xe}constructor(e,t){if(t=ys(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Ur("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Xe?this.value="":this.value=this.operator+this.semver.version,Ur("comp",this)}parse(e){let t=this.options.loose?Is[As.COMPARATORLOOSE]:Is[As.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 _s(r[2],this.options.loose):this.semver=Xe}toString(){return this.value}test(e){if(Ur("Comparator.test",e,this.options.loose),this.semver===Xe||e===Xe)return!0;if(typeof e=="string")try{e=new _s(e,this.options)}catch{return!1}return Vr(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 Os(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new Os(this.value,t).test(e.semver):(t=ys(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("=")||Vr(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Vr(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Ns.exports=zr;var ys=wt(),{safeRe:Is,t:As}=Pe(),Vr=$r(),Ur=Ge(),_s=N(),Os=j()});var Ye=T((Ah,bs)=>{"use strict";var Ol=j(),Nl=a((n,e,t)=>{try{e=new Ol(e,t)}catch{return!1}return e.test(n)},"satisfies");bs.exports=Nl});var Ls=T((Oh,ws)=>{"use strict";var bl=j(),wl=a((n,e)=>new bl(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");ws.exports=wl});var Ds=T((bh,xs)=>{"use strict";var Ll=N(),xl=j(),Dl=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new xl(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new Ll(r,t))}),r},"maxSatisfying");xs.exports=Dl});var ks=T((Lh,$s)=>{"use strict";var $l=N(),kl=j(),Hl=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new kl(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");$s.exports=Hl});var Vs=T((Dh,Fs)=>{"use strict";var jr=N(),Fl=j(),Hs=qe(),Vl=a((n,e)=>{n=new Fl(n,e);let t=new jr("0.0.0");if(n.test(t)||(t=new jr("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 jr(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!s||Hs(c,s))&&(s=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Hs(t,s))&&(t=s)}return t&&n.test(t)?t:null},"minVersion");Fs.exports=Vl});var zs=T((kh,Us)=>{"use strict";var Ul=j(),zl=a((n,e)=>{try{return new Ul(n,e).range||"*"}catch{return null}},"validRange");Us.exports=zl});var jt=T((Fh,qs)=>{"use strict";var jl=N(),Gs=Be(),{ANY:Wl}=Gs,Gl=j(),ql=Ye(),js=qe(),Ws=Ht(),Bl=Vt(),Xl=Ft(),Yl=a((n,e,t,r)=>{n=new jl(n,r),e=new Gl(e,r);let o,s,i,c,l;switch(t){case">":o=js,s=Bl,i=Ws,c=">",l=">=";break;case"<":o=Ws,s=Xl,i=js,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ql(n,e,r))return!1;for(let u=0;u<e.set.length;++u){let p=e.set[u],d=null,v=null;if(p.forEach(E=>{E.semver===Wl&&(E=new Gs(">=0.0.0")),d=d||E,v=v||E,o(E.semver,d.semver,r)?d=E:i(E.semver,v.semver,r)&&(v=E)}),d.operator===c||d.operator===l||(!v.operator||v.operator===c)&&s(n,v.semver))return!1;if(v.operator===l&&i(n,v.semver))return!1}return!0},"outside");qs.exports=Yl});var Xs=T((Uh,Bs)=>{"use strict";var Jl=jt(),Kl=a((n,e,t)=>Jl(n,e,">",t),"gtr");Bs.exports=Kl});var Js=T((jh,Ys)=>{"use strict";var Ql=jt(),Zl=a((n,e,t)=>Ql(n,e,"<",t),"ltr");Ys.exports=Zl});var Zs=T((Gh,Qs)=>{"use strict";var Ks=j(),eg=a((n,e,t)=>(n=new Ks(n,t),e=new Ks(e,t),n.intersects(e,t)),"intersects");Qs.exports=eg});var ti=T((Bh,ei)=>{"use strict";var tg=Ye(),rg=z();ei.exports=(n,e,t)=>{let r=[],o=null,s=null,i=n.sort((p,d)=>rg(p,d,t));for(let p of i)tg(p,e,t)?(s=p,o||(o=p)):(s&&r.push([o,s]),s=null,o=null);o&&r.push([o,null]);let c=[];for(let[p,d]of r)p===d?c.push(p):!d&&p===i[0]?c.push("*"):d?p===i[0]?c.push(`<=${d}`):c.push(`${p} - ${d}`):c.push(`>=${p}`);let l=c.join(" || "),u=typeof e.raw=="string"?e.raw:String(e);return l.length<u.length?l:e}});var ai=T((Xh,ii)=>{"use strict";var ri=j(),Gr=Be(),{ANY:Wr}=Gr,Je=Ye(),qr=z(),og=a((n,e,t={})=>{if(n===e)return!0;n=new ri(n,t),e=new ri(e,t);let r=!1;e:for(let o of n.set){for(let s of e.set){let i=sg(o,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),ng=[new Gr(">=0.0.0-0")],oi=[new Gr(">=0.0.0")],sg=a((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Wr){if(e.length===1&&e[0].semver===Wr)return!0;t.includePrerelease?n=ng:n=oi}if(e.length===1&&e[0].semver===Wr){if(t.includePrerelease)return!0;e=oi}let r=new Set,o,s;for(let E of n)E.operator===">"||E.operator===">="?o=ni(o,E,t):E.operator==="<"||E.operator==="<="?s=si(s,E,t):r.add(E.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 E of r){if(o&&!Je(E,String(o),t)||s&&!Je(E,String(s),t))return null;for(let k of e)if(!Je(E,String(k),t))return!1;return!0}let c,l,u,p,d=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,v=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;d&&d.prerelease.length===1&&s.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let E of e){if(p=p||E.operator===">"||E.operator===">=",u=u||E.operator==="<"||E.operator==="<=",o){if(v&&E.semver.prerelease&&E.semver.prerelease.length&&E.semver.major===v.major&&E.semver.minor===v.minor&&E.semver.patch===v.patch&&(v=!1),E.operator===">"||E.operator===">="){if(c=ni(o,E,t),c===E&&c!==o)return!1}else if(o.operator===">="&&!Je(o.semver,String(E),t))return!1}if(s){if(d&&E.semver.prerelease&&E.semver.prerelease.length&&E.semver.major===d.major&&E.semver.minor===d.minor&&E.semver.patch===d.patch&&(d=!1),E.operator==="<"||E.operator==="<="){if(l=si(s,E,t),l===E&&l!==s)return!1}else if(s.operator==="<="&&!Je(s.semver,String(E),t))return!1}if(!E.operator&&(s||o)&&i!==0)return!1}return!(o&&u&&!s&&i!==0||s&&p&&!o&&i!==0||v||d)},"simpleSubset"),ni=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"),si=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");ii.exports=og});var ui=T((Jh,gi)=>{"use strict";var Br=Pe(),ci=We(),ig=N(),li=br(),ag=de(),cg=Dn(),lg=kn(),gg=Vn(),ug=jn(),pg=Gn(),dg=Bn(),mg=Yn(),fg=Kn(),hg=z(),Cg=ts(),Eg=os(),vg=kt(),Tg=as(),Sg=ls(),Rg=qe(),Mg=Ht(),Pg=xr(),yg=Dr(),Ig=Ft(),Ag=Vt(),_g=$r(),Og=Es(),Ng=Be(),bg=j(),wg=Ye(),Lg=Ls(),xg=Ds(),Dg=ks(),$g=Vs(),kg=zs(),Hg=jt(),Fg=Xs(),Vg=Js(),Ug=Zs(),zg=ti(),jg=ai();gi.exports={parse:ag,valid:cg,clean:lg,inc:gg,diff:ug,major:pg,minor:dg,patch:mg,prerelease:fg,compare:hg,rcompare:Cg,compareLoose:Eg,compareBuild:vg,sort:Tg,rsort:Sg,gt:Rg,lt:Mg,eq:Pg,neq:yg,gte:Ig,lte:Ag,cmp:_g,coerce:Og,Comparator:Ng,Range:bg,satisfies:wg,toComparators:Lg,maxSatisfying:xg,minSatisfying:Dg,minVersion:$g,validRange:kg,outside:Hg,gtr:Fg,ltr:Vg,intersects:Ug,simplifyRange:zg,subset:jg,SemVer:ig,re:Br.re,src:Br.src,tokens:Br.t,SEMVER_SPEC_VERSION:ci.SEMVER_SPEC_VERSION,RELEASE_TYPES:ci.RELEASE_TYPES,compareIdentifiers:li.compareIdentifiers,rcompareIdentifiers:li.rcompareIdentifiers}});import{exec as Wg,spawn as Gg}from"child_process";import{promisify as qg}from"util";var Ke,pi,me,di=m(()=>{"use strict";I();H();Ke=ca(ui(),1),pi=qg(Wg),me=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();g.info("\u5F00\u59CB\u5B89\u88C5",{version:e,installId:t}),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=Gg("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]),s=a(()=>{o.removeAllListeners("error"),o.removeAllListeners("close"),o.stdout?.removeAllListeners("data"),o.stderr?.removeAllListeners("data"),o.stdout?.destroy(),o.stderr?.destroy()},"cleanup");return new Promise((i,c)=>{o.on("error",l=>{let u=`\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${l.message}`;s(),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:u,duration:Date.now()-r,timestamp:Date.now()}),c(l)}),o.stdout.on("data",l=>{let u=l.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:u,timestamp:Date.now()})}),o.stderr.on("data",l=>{let u=l.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:u,timestamp:Date.now()})}),o.on("close",l=>{let u=Date.now()-r;if(s(),l===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:u,timestamp:Date.now()}),i();else{let p=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${l}`;g.error("\u5B89\u88C5\u5931\u8D25",{code:l}),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:p,duration:u,timestamp:Date.now()}),c(new Error(p))}})})}async getCurrentVersion(){let{stdout:e}=await pi("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 pi("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(s=>s&&typeof s=="string"&&Ke.default.valid(s));return e!=="all"&&(o=o.filter(s=>{let i=Ke.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)=>Ke.default.rcompare(s,i))}catch(t){return g.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25",{error:t}),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],o=!1;try{o=Ke.default.gt(r,e)}catch(s){g.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u5B57\u7B26\u4E32\u6BD4\u8F83",{error:s}),o=r!==e}return g.debug("\u7248\u672C\u68C0\u67E5\u5B8C\u6210",{currentVersion:e,latestVersion:r,hasUpdate:o}),{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return g.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25",{error:e}),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}}});var Xr=m(()=>{"use strict";di()});import{z as mi}from"zod";var Bg,Wt,fi=m(()=>{"use strict";Xr();H();B();Bg=mi.object({version:mi.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Wt=class extends A{static{a(this,"UpdateApiHandler")}npmManager;eventBus=M();activeInstalls=new Map;constructor(){super(),this.npmManager=new me(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=Bg.safeParse(t);if(!r.success)return e.fail("INVALID_VERSION","\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",r.error.issues.map(c=>({field:c.path.join("."),message:c.message})),400);let{version:o}=r.data;if(Array.from(this.activeInstalls.values()).some(c=>c))return e.fail("INSTALL_IN_PROGRESS","\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5",void 0,409);let i=e.get("logger");return this.npmManager.installVersion(o).catch(c=>{i.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",c)}),e.success({version:o,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7")}catch(t){return this.handleError(e,t,"\u5904\u7406\u5B89\u88C5\u8BF7\u6C42","REQUEST_FAILED")}}}});import{VersionUtils as Yr}from"@xiaozhi-client/version";var Gt,hi=m(()=>{"use strict";Xr();B();Gt=class extends A{static{a(this,"VersionApiHandler")}async getVersion(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=Yr.getVersionInfo();return e.get("logger").debug("\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u6210\u529F:",t),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u7248\u672C\u4FE1\u606F","VERSION_READ_ERROR")}}async getVersionSimple(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u53F7\u8BF7\u6C42");let t=Yr.getVersion();return e.get("logger").debug(`\u83B7\u53D6\u7248\u672C\u53F7\u6210\u529F: ${t}`),e.success({version:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u7248\u672C\u53F7","VERSION_READ_ERROR")}}async clearVersionCache(e){try{return e.get("logger").debug("\u5904\u7406\u6E05\u9664\u7248\u672C\u7F13\u5B58\u8BF7\u6C42"),Yr.clearCache(),e.get("logger").info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.success(void 0,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664")}catch(t){return this.handleError(e,t,"\u6E05\u9664\u7248\u672C\u7F13\u5B58","CACHE_CLEAR_ERROR")}}async getAvailableVersions(e){try{e.get("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))return e.fail("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`,void 0,400);let s=await new me().getAvailableVersions(t);return e.get("logger").debug(`\u83B7\u53D6\u5230 ${s.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.success({versions:s,type:t,total:s.length})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868","VERSIONS_FETCH_ERROR")}}async checkLatestVersion(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new me().checkForLatestVersion();return e.get("logger").debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.success({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error}):e.success({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate})}catch(t){return this.handleError(e,t,"\u68C0\u67E5\u6700\u65B0\u7248\u672C","LATEST_VERSION_CHECK_ERROR")}}}});import{configManager as Xg}from"@xiaozhi-client/config";import{mapClusterToResourceId as Yg}from"@xiaozhi-client/esp32";import{createTTS as Jg}from"univoice";var Ci,Kg,Qg,Qe,Ei=m(()=>{"use strict";mr();B();Ci=["mp3","wav","ogg","flac","pcm","opus","ogg_opus"],Kg={mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",flac:"audio/flac",pcm:"audio/pcm",opus:"audio/opus",ogg_opus:"audio/ogg"},Qg={mp3:"mp3",wav:"wav",ogg:"ogg",flac:"flac",pcm:"pcm",opus:"opus",ogg_opus:"ogg"},Qe=class extends A{static{a(this,"TTSApiHandler")}constructor(){super()}async synthesize(e){try{e.get("logger").info("\u5904\u7406\u8BED\u97F3\u5408\u6210\u8BF7\u6C42");let t=await this.parseJsonBody(e);if(!t.text)return e.get("logger").warn("\u7F3A\u5C11 text \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: text",void 0,400);let r=Xg.getTTSConfig(),o=t.appid||r.appid,s=t.accessToken||r.accessToken,i=t.voice_type||r.voice_type,c=t.cluster||r.cluster,l=t.endpoint||r.endpoint,u=t.encoding||r.encoding||"wav";if(!Ci.includes(u))return e.get("logger").warn(`\u4E0D\u652F\u6301\u7684 encoding \u53C2\u6570: ${u}`),e.fail("INVALID_PARAMETER",`\u4E0D\u652F\u6301\u7684 encoding \u53C2\u6570: ${u}\uFF0C\u5141\u8BB8\u503C: ${Ci.join(", ")}`,void 0,400);let p=u;if(!o)return e.get("logger").warn("\u7F3A\u5C11 appid \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 appid \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.appid",void 0,400);if(!s)return e.get("logger").warn("\u7F3A\u5C11 accessToken \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 accessToken \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.accessToken",void 0,400);if(!i)return e.get("logger").warn("\u7F3A\u5C11 voice_type \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 voice_type \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.voice_type",void 0,400);let d=Jg({provider:"doubao",appId:o,accessToken:s,voice:i,format:p,resourceId:Yg(c),sampleRate:24e3,...l&&{baseUrl:l}});e.get("logger").info(`\u5F00\u59CB\u8BED\u97F3\u5408\u6210: text=${t.text.substring(0,20)}..., voice_type=${i}`);let E=(await d.synthesize({text:t.text})).audio;return e.get("logger").info(`\u8BED\u97F3\u5408\u6210\u6210\u529F: audioSize=${E.length} bytes`),new Response(Buffer.from(E),{headers:{"Content-Type":Kg[p],"Content-Disposition":`attachment; filename="tts_${Date.now()}.${Qg[p]}"`}})}catch(t){return this.handleError(e,t,"\u8BED\u97F3\u5408\u6210")}}async getVoices(e){try{e.get("logger").info("\u83B7\u53D6\u97F3\u8272\u5217\u8868");let t=dr,r=Bo(),o={voices:t,total:t.length,scenes:r};return e.success(o)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u97F3\u8272\u5217\u8868")}}}});import{ESP32ErrorCode as vi}from"@xiaozhi-client/esp32";var Ze,Ti=m(()=>{"use strict";B();Ze=class extends A{static{a(this,"ESP32Handler")}esp32Manager;constructor(e){super(),this.esp32Manager=e}async handleOTA(e){let t=e.get("logger");try{let r=e.req.header("Device-Id")||e.req.header("device-id"),o=e.req.header("Client-Id")||e.req.header("client-id");if(!r)return e.fail(vi.MISSING_DEVICE_ID,"\u7F3A\u5C11 Device-Id \u8BF7\u6C42\u5934",void 0,400);if(!o)return e.fail(vi.MISSING_DEVICE_ID,"\u7F3A\u5C11 Client-Id \u8BF7\u6C42\u5934",void 0,400);let s=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF");t.debug(`\u6536\u5230OTA\u8BF7\u6C42: deviceId=${r}, clientId=${o}`);let i=await this.esp32Manager.handleOTARequest(r,o,s,{deviceModel:e.req.header("device-model")||e.req.header("Device-Model")||void 0,deviceVersion:e.req.header("device-version")||e.req.header("Device-Version")||void 0},e.req.header("host"));return t.debug("OTA\u54CD\u5E94",{response:i}),e.json(i)}catch(r){return this.handleError(e,r,"\u5904\u7406OTA\u8BF7\u6C42")}}}});var Si=m(()=>{"use strict";$o();Ho();Xo();Cr();un();dn();mn();fn();hn();Cn();Sn();Rn();fi();hi();Ei();Ti()});var Jr,Ri=m(()=>{"use strict";I();Jr=a(async(n,e)=>{n.set("logger",g),n.logger=g,await e()},"loggerMiddleware")});import{cors as Zg}from"hono/cors";var Kr,Mi=m(()=>{"use strict";Kr=Zg({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var Qr,Zr,Pi=m(()=>{"use strict";Qr=a((n,e)=>(e.logger.error("HTTP request error:",n),process.env.NODE_ENV,e.fail("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?n.stack:void 0,500)),"errorHandlerMiddleware"),Zr=a(n=>n.req.path.startsWith("/api/")?n.fail("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method},404):n.fail("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method},404),"notFoundHandlerMiddleware")});var eo,yi=m(()=>{"use strict";eo=a(async(n,e)=>{n.success=(t,r,o=200)=>{let s={success:!0,message:r};return t!==void 0&&(s.data=t),n.json(s,o)},n.fail=(t,r,o,s=400)=>{let i={success:!1,error:{code:t,message:r}};return o!==void 0&&(i.error.details=o),n.json(i,s)},n.paginate=(t,r,o)=>{let s={success:!0,data:t,pagination:r,message:o};return n.json(s,200)},await e()},"responseEnhancerMiddleware")});var ye,et,to=m(()=>{"use strict";ye=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},et=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}}});var ro,Ii=m(()=>{"use strict";to();ro=a(async(n,e)=>{if(!n.get("mcpServiceManager"))try{n.logger.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let t=n.get("webServer");if(!t)throw new et("WebServer \u672A\u6CE8\u5165\u5230 Context");let r=t.getMCPServiceManager();n.set("mcpServiceManager",r),n.logger.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){if(t instanceof ye)n.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof et?(n.logger.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(n.logger.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware")});var oo,Ai=m(()=>{"use strict";oo=a(()=>async(n,e)=>{let t=n.get("webServer");if(!t)throw new Error("WebServer \u5B9E\u4F8B\u672A\u6CE8\u5165\u5230\u4E0A\u4E0B\u6587\u4E2D\uFF0C\u8BF7\u786E\u4FDD webServerMiddleware \u5DF2\u6B63\u786E\u914D\u7F6E");if(!t.getEndpointManager)throw new Error("WebServer \u5B9E\u4F8B\u7F3A\u5C11 getEndpointManager \u65B9\u6CD5");try{let r=t.getEndpointManager();n.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))n.logger.warn("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u4F7F\u7528 null \u503C:",r.message),n.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware")});import{configManager as eu}from"@xiaozhi-client/config";var no,_i=m(()=>{"use strict";Cr();no=a(()=>{let n=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?n=new we(o,eu):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var Oi=m(()=>{"use strict";Ri();Mi();Pi();yi();Ii();Ai();_i();Rt()});var qt,Ni=m(()=>{"use strict";I();H();qt=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=g,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.debug("\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 tu}from"@xiaozhi-client/config";var Bt,bi=m(()=>{"use strict";I();H();Bt=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=g,this.eventBus=M(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=tu.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.debug(`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.debug(`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.debug(`\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.debug(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.debug("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}}});var wi=m(()=>{"use strict";Ni();bi();H();ht()});function ru(n){return Array.isArray(n.routes)}function Li(n){if(ru(n)){let{routes:e,middleware:t}=n;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return n}function P(n){return e=>t=>{let o=t.get("dependencies")[n];return e(o,t)}}var D=m(()=>{"use strict";a(ru,"isRouteGroup");a(Li,"normalizeRoutes");a(P,"createHandler")});var tt,xi=m(()=>{"use strict";D();tt=class{constructor(e){this.logger=e}static{a(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=Li(t);this.routes.has(e)&&this.logger.warn(`\u8DEF\u7531\u7EC4 '${e}' \u5DF2\u5B58\u5728\uFF0C\u5C06\u88AB\u8986\u76D6`),this.routes.set(e,r),this.logger.info(`\u5DF2\u6CE8\u518C\u8DEF\u7531\u7EC4: ${e} (${r.length} \u4E2A\u8DEF\u7531)`)}registerRoutes(e){this.logger.info(`\u5F00\u59CB\u6279\u91CF\u6CE8\u518C ${Object.keys(e).length} \u4E2A\u8DEF\u7531\u7EC4...`);for(let[t,r]of Object.entries(e))this.registerRoute(t,r);this.logger.info(`\u6279\u91CF\u6CE8\u518C\u5B8C\u6210\uFF0C\u5171\u6CE8\u518C ${this.routes.size} \u4E2A\u8DEF\u7531\u7EC4`)}getAllRoutes(){return new Map(this.routes)}getRoute(e){return this.routes.get(e)}applyToApp(e){let t=Array.from(this.routes.entries());t.sort(([o],[s])=>o==="static"?1:s==="static"?-1:0);let r=0;for(let[o,s]of t)try{for(let i of s)this.applyRouteDefinition(e,i,o),r++}catch(i){this.logger.error(`\u2717 \u5E94\u7528\u8DEF\u7531\u7EC4\u5931\u8D25: ${o}`,i)}this.logger.info(`\u8DEF\u7531\u5E94\u7528\u5B8C\u6210\uFF0C\u5171 ${r} \u4E2A\u8DEF\u7531`)}applyRouteDefinition(e,t,r){let{method:o,path:s,handler:i,middleware:c=[]}=t,l=a(async(u,p)=>{try{return await i(u)}catch(d){return this.logger.error(`\u8DEF\u7531\u5904\u7406\u9519\u8BEF [${o} ${s}]:`,d),u.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",d instanceof Error?d.message:String(d),500)}},"wrappedHandler");switch(o){case"GET":c.length>0?e.get(s,...c,l):e.get(s,l);break;case"POST":c.length>0?e.post(s,...c,l):e.post(s,l);break;case"PUT":c.length>0?e.put(s,...c,l):e.put(s,l);break;case"DELETE":c.length>0?e.delete(s,...c,l):e.delete(s,l);break;case"PATCH":c.length>0?e.patch(s,...c,l):e.patch(s,l);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${o}`)}}clear(){this.routes.clear(),this.logger.info("\u5DF2\u6E05\u9664\u6240\u6709\u8DEF\u7531\u914D\u7F6E")}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}}});var $,so,Di=m(()=>{"use strict";D();$=P("configApiHandler"),so=[{method:"GET",path:"/api/config",handler:$((n,e)=>n.getConfig(e))},{method:"PUT",path:"/api/config",handler:$((n,e)=>n.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:$((n,e)=>n.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:$((n,e)=>n.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:$((n,e)=>n.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:$((n,e)=>n.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:$((n,e)=>n.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:$((n,e)=>n.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:$((n,e)=>n.checkConfigExists(e))},{method:"GET",path:"/api/config/prompts",handler:$((n,e)=>n.getPromptFiles(e))},{method:"GET",path:"/api/config/prompts/content",handler:$((n,e)=>n.getPromptFileContent(e))},{method:"PUT",path:"/api/config/prompts/content",handler:$((n,e)=>n.updatePromptFileContent(e))},{method:"POST",path:"/api/config/prompts/content",handler:$((n,e)=>n.createPromptFileContent(e))},{method:"DELETE",path:"/api/config/prompts/content",handler:$((n,e)=>n.deletePromptFileContent(e))}]});var Ie,io,$i=m(()=>{"use strict";D();Ie=P("statusApiHandler"),io=[{method:"GET",path:"/api/status",handler:Ie((n,e)=>n.getStatus(e))},{method:"GET",path:"/api/status/client",handler:Ie((n,e)=>n.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:Ie((n,e)=>n.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:Ie((n,e)=>n.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:Ie((n,e)=>n.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:Ie((n,e)=>n.setActiveMCPServers(e))}]});var le,ao,ki=m(()=>{"use strict";D();le=P("mcpToolHandler"),ao=[{method:"POST",path:"/api/tools/call",handler:le((n,e)=>n.callTool(e))},{method:"GET",path:"/api/tools/list",handler:le((n,e)=>n.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:le((n,e)=>n.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:le((n,e)=>n.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:le((n,e)=>n.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:le((n,e)=>n.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:le((n,e)=>n.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:le((n,e)=>n.listMCPTools(e))}]});var ou,co,Hi=m(()=>{"use strict";D();ou=P("mcpRouteHandler"),co=[{method:"POST",path:"/mcp",handler:ou((n,e)=>n.handlePost(e))}]});var Xt,lo,Fi=m(()=>{"use strict";D();Xt=P("versionApiHandler"),lo=[{method:"GET",path:"/api/version",handler:Xt((n,e)=>n.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:Xt((n,e)=>n.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:Xt((n,e)=>n.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:Xt((n,e)=>n.checkLatestVersion(e))}]});var rt,go,Vi=m(()=>{"use strict";D();rt=P("serviceApiHandler"),go=[{method:"POST",path:"/api/services/restart",handler:rt((n,e)=>n.restartService(e))},{method:"POST",path:"/api/services/stop",handler:rt((n,e)=>n.stopService(e))},{method:"POST",path:"/api/services/start",handler:rt((n,e)=>n.startService(e))},{method:"GET",path:"/api/services/status",handler:rt((n,e)=>n.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:rt((n,e)=>n.getServiceHealth(e))}]});var nu,uo,Ui=m(()=>{"use strict";D();nu=P("updateApiHandler"),uo=[{method:"POST",path:"/api/update",handler:nu((n,e)=>n.performUpdate(e))}]});var su,po,zi=m(()=>{"use strict";D();su=P("staticFileHandler"),po=[{method:"GET",path:"/*",handler:su(async(n,e)=>e.req.path.startsWith("/api/")?e.notFound():await n.handleStaticFile(e))}]});var Yt,mo,ji=m(()=>{"use strict";D();Yt=P("cozeHandler"),mo=[{method:"GET",path:"/api/coze/workspaces",handler:Yt((n,e)=>n.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:Yt((n,e)=>n.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:Yt((n,e)=>n.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:Yt((n,e)=>n.getCacheStats(e))}]});var iu,fo,Wi=m(()=>{"use strict";D();iu=P("mcpToolLogHandler"),fo=[{method:"GET",path:"/api/tool-calls/logs",handler:iu((n,e)=>n.getToolCallLogs(e))}]});var Jt,ho,Gi=m(()=>{"use strict";Jt=a(async(n,e)=>{let r=n.get("dependencies").mcpHandler;return r?await e(r):n.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),ho=[{method:"POST",path:"/api/mcp-servers",handler:a(n=>Jt(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:a(n=>Jt(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:a(n=>Jt(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:a(n=>Jt(n,e=>e.listMCPServers(n)),"handler")}]});var ot,Co,qi=m(()=>{"use strict";ot=a(async(n,e)=>{let t=n.get("endpointHandler");if(!t)return n.fail("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",void 0,503);try{return await t[e](n)}catch(r){return n.fail("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25",void 0,500)}},"withEndpointHandler"),Co=[{method:"POST",path:"/api/endpoint/status",handler:a(n=>ot(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:a(n=>ot(n,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:a(n=>ot(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:a(n=>ot(n,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:a(n=>ot(n,"removeEndpoint"),"handler")}]});var au,Eo,Bi=m(()=>{"use strict";D();au=P("serviceApiHandler"),Eo=[{method:"POST",path:"/api/restart",handler:au((n,e)=>n.restartService(e))}]});var Xi,vo,Yi=m(()=>{"use strict";D();Xi=P("ttsApiHandler"),vo=[{method:"POST",path:"/api/tts",handler:Xi((n,e)=>n.synthesize(e))},{method:"GET",path:"/api/tts/voices",handler:Xi((n,e)=>n.getVoices(e))}]});var vv,To,So,Ji=m(()=>{"use strict";D();vv=P("esp32Handler"),To=a(n=>async e=>{let r=e.get("dependencies").esp32Handler;return r?n(r,e):e.json({error:"ESP32 service not available"},503)},"createESP32Handler"),So=[{method:"POST",path:"/",handler:To((n,e)=>n.handleOTA(e))},{method:"POST",path:"/xiaozhi/ota/",handler:To((n,e)=>n.handleOTA(e))},{method:"GET",path:"/ws",handler:To(async(n,e)=>(e.get("logger").debug("ESP32 WebSocket\u7AEF\u70B9\u8BBF\u95EE"),e.text("WebSocket Upgrade Required",426)))}]});var Ki=m(()=>{"use strict";Di();$i();ki();Hi();Fi();Vi();Ui();zi();ji();Wi();Gi();qi();Bi();Yi();Ji()});var Qi=m(()=>{"use strict";xi();Ki()});var Zi={};Zt(Zi,{WebServer:()=>Ro});import{createServer as cu}from"http";import{serve as lu}from"@hono/node-server";import{normalizeServiceConfig as gu}from"@xiaozhi-client/config";import{configManager as Q}from"@xiaozhi-client/config";import{EndpointManager as uu}from"@xiaozhi-client/endpoint";import{ESP32DeviceManager as pu}from"@xiaozhi-client/esp32";import{WebSocketServer as du}from"ws";var Ro,ea=m(()=>{"use strict";I();Si();ie();Re();Oi();wi();Rr();oe();to();Qi();Ro=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;esp32Manager;configApiHandler;statusApiHandler;serviceApiHandler;mcpToolHandler;mcpToolLogHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpHandler;updateApiHandler;cozeHandler;ttsApiHandler;esp32Handler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointManager=null;mcpServiceManager=null;eventListenerUnsubscribers=[];constructor(e){try{this.port=e??Q.getWebUIPort()??Te.DEFAULT_PORT}catch{this.port=e??Te.DEFAULT_PORT}this.logger=g,this.eventBus=M(),this.statusService=new qt,this.notificationService=new Bt;let t={getASRConfig:a(()=>Q.getASRConfig(),"getASRConfig"),getTTSConfig:a(()=>Q.getTTSConfig(),"getTTSConfig"),getLLMConfig:a(()=>Q.getLLMConfig(),"getLLMConfig"),isLLMConfigValid:a(()=>Q.isLLMConfigValid(),"isLLMConfigValid")};this.esp32Manager=new pu({logger:g,configProvider:t}),this.configApiHandler=new ct,this.statusApiHandler=new _t(this.statusService),this.serviceApiHandler=new It(this.statusService),this.mcpToolHandler=new Nt,this.mcpToolLogHandler=new bt,this.versionApiHandler=new Gt,this.staticFileHandler=new je,this.mcpRouteHandler=new Mt,this.updateApiHandler=new Wt,this.cozeHandler=new Ne,this.ttsApiHandler=new Qe,this.esp32Handler=new Ze(this.esp32Manager),this.realtimeNotificationHandler=new yt(this.notificationService,this.statusService),this.heartbeatHandler=new mt(this.statusService,this.notificationService),this.app=sn(),this.setupMiddleware(),this.app.notFound(Zr),this.setupEndpointStatusListener(),this.setupMCPServerAddedListener()}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 Fe,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new Ue(this.mcpServiceManager,Q),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:ft(o.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint),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
108
86
  1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
109
87
  2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
110
88
  3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
111
89
  4. \u7528\u6237\u9700\u8981\u901A\u8FC7 API \u91CD\u65B0\u914D\u7F6E\u7AEF\u70B9\u6216\u670D\u52A1\u5668
112
- 5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new ws,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(!yn.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");yn.cleanupInvalidServerToolsConfig();let e=yn.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??mr.DEFAULT_PORT}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let s=Uv(r);this.mcpServiceManager.addServiceConfig(t,s)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e){let r=(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: ${r.length}`);try{if(this.endpointManager||(this.endpointManager=new Vv({defaultReconnectDelay:2e3}),this.endpointManager.setMcpManager(this.mcpServiceManager),this.logger.debug("\u2705 \u65B0\u5EFA\u8FDE\u63A5\u7BA1\u7406\u5668\u5B9E\u4F8B")),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u8BBE\u7F6E\u5B8C\u6210"),r.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",r);for(let s of r)this.endpointManager.addEndpoint(s),this.logger.debug(`\u2705 \u5DF2\u6DFB\u52A0\u7AEF\u70B9: ${s}`);await this.endpointManager.connect(),this.endpointManager.on("endpointAdded",s=>{this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0: ${s.endpoint}`)}),this.endpointManager.on("endpointRemoved",s=>{this.logger.debug(`\u7AEF\u70B9\u5DF2\u79FB\u9664: ${s.endpoint}`)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${r.length} \u4E2A\u7AEF\u70B9`)}else 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 Sr("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(){if(this.endpointManager){let e=this.endpointManager.getConnectionStatus();return{type:"multi-endpoint",manager:{connectedConnections:e.filter(t=>t.connected).length,totalConnections:e.length,healthCheckStats:{}},connections:e}}return{type:"none",connected:!1}}async connectWithRetry(e,t,r=5,s=1e3,o=3e4,a=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 m=Math.min(s*a**(l-1),o);this.logger.info(`${t} - ${m}ms \u540E\u91CD\u8BD5...`),await this.sleep(m)}}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("*",ia),this.app?.use("*",ua),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",da),this.app?.use("*",fa()),this.app?.use("*",ma()),this.app?.use("*",aa),this.app?.onError(ca),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,mcpToolHandler:this.mcpToolHandler,mcpToolLogHandler:this.mcpToolLogHandler,versionApiHandler:this.versionApiHandler,staticFileHandler:this.staticFileHandler,mcpRouteHandler:this.mcpRouteHandler,mcpHandler:this.mcpHandler,updateApiHandler:this.updateApiHandler,cozeHandler:this.cozeHandler,ttsApiHandler:this.ttsApiHandler,esp32Handler:this.esp32Handler}}setupRouteSystem(){this.routeManager=new Cn(this.logger)}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:yl,status:Tl,tools:_l,mcp:Rl,version:Pl,services:bl,update:Al,coze:Il,"tool-logs":Ml,mcpserver:xl,endpoint:Ol,misc:Nl,tts:Ll,esp32:Dl,static:wl}),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,t)=>{if((t.url?new URL(t.url,`http://${t.headers.host}`):null)?.pathname==="/ws"){this.handleESP32DeviceConnection(e,t);return}this.handleWebClientConnection(e,t)})}handleESP32DeviceConnection(e,t){let r=t.headers["device-id"],s=t.headers["client-id"],a=t.headers.authorization?.replace("Bearer ","");if(this.logger.info(`[WS-ESP32] \u6536\u5230ESP32\u8BBE\u5907\u8FDE\u63A5\u8BF7\u6C42: deviceId=${r}, clientId=${s}, url=${t.url}`),!r||!s){this.logger.warn(`[WS-ESP32] \u8FDE\u63A5\u7F3A\u5C11\u5FC5\u8981\u7684\u8BF7\u6C42\u5934: device-id="${r}", client-id="${s}"`),e.close(1008,"Missing required headers");return}this.logger.info(`[WS-ESP32] ESP32\u8BBE\u5907WebSocket\u8FDE\u63A5: deviceId=${r}, clientId=${s}`),this.esp32Service.handleWebSocketConnection(e,r,s,a).then(()=>{this.logger.info(`[WS-ESP32] ESP32\u8BBE\u5907\u8FDE\u63A5\u5904\u7406\u6210\u529F: deviceId=${r}`)}).catch(c=>{this.logger.error(`[WS-ESP32] ESP32\u8BBE\u5907\u8FDE\u63A5\u5904\u7406\u5931\u8D25: deviceId=${r}`,c),(e.readyState===1||e.readyState===0)&&e.close(1011,"Connection handling failed")})}handleWebClientConnection(e,t){let r=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${r}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,r),this.heartbeatHandler.handleClientConnect(r),e.on("message",async s=>{try{let o=JSON.parse(s.toString());o.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,o,r):await this.realtimeNotificationHandler.handleMessage(e,o,r)}catch(o){this.logger.error("WebSocket message error:",o);let a={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(a))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${r}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(r),this.heartbeatHandler.handleClientDisconnect(r)}),e.on("error",s=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${r}):`,s)}),this.realtimeNotificationHandler.sendInitialData(e,r)}setupEndpointStatusListener(){let e=i(t=>{let r={type:"endpoint_status_changed",data:{endpoint:t.endpoint,connected:t.connected,operation:t.operation,success:t.success,message:t.message,timestamp:t.timestamp}};this.notificationService.broadcast("endpoint_status_changed",r),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${t.endpoint} - ${t.operation}`)},"listener");this.eventBus.onEvent("endpoint:status:changed",e),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("endpoint:status:changed",e)})}setupMCPServerAddedListener(){let e=i(async r=>{if(this.logger.info(`\u68C0\u6D4B\u5230 MCP \u670D\u52A1\u6DFB\u52A0: ${r.serverName}\uFF0C\u5DE5\u5177\u6570\u91CF: ${r.tools.length}`),!this.endpointManager){this.logger.warn("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}try{let o=this.endpointManager.getConnectionStatus().filter(a=>a.connected).length;if(o===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${o} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u65B0\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_added",serverName:r.serverName,endpointCount:o,timestamp:Date.now()})}catch(s){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",s),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_added",serverName:r.serverName,error:s instanceof Error?s.message:String(s),timestamp:Date.now()})}},"singleServerListener");this.eventBus.onEvent("mcp:server:added",e),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("mcp:server:added",e)});let t=i(async r=>{if(this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CF MCP \u670D\u52A1\u6DFB\u52A0: ${r.addedCount} \u4E2A\u6210\u529F\uFF0C${r.failedCount} \u4E2A\u5931\u8D25`),!(!this.endpointManager||r.addedCount===0))try{let o=this.endpointManager.getConnectionStatus().filter(a=>a.connected).length;if(o===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${o} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u6279\u91CF\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_batch_added",serverName:void 0,endpointCount:o,timestamp:Date.now()})}catch(s){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",s),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_batch_added",serverName:void 0,error:s instanceof Error?s.message:String(s),timestamp:Date.now()})}},"batchServerListener");this.eventBus.onEvent("mcp:server:batch_added",t),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("mcp:server:batch_added",t)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=Hv({fetch:this.app.fetch,port:this.port,hostname:mr.DEFAULT_BIND_ADDRESS,createServer:Fv});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new jv({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${mr.DEFAULT_BIND_ADDRESS}:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`)}stop(){return new Promise(e=>{let t=!1,r=i(()=>{t||(t=!0,e())},"doResolve");(async()=>{try{this.endpointManager&&(await this.endpointManager.cleanup(),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u6E05\u7406"))}catch(s){this.logger.error("\u8FDE\u63A5\u7BA1\u7406\u5668\u6E05\u7406\u5931\u8D25:",s)}try{this.mcpServiceManager&&(await this.mcpServiceManager.stopAllServices(),this.mcpServiceManager=null,this.logger.debug("MCPServiceManager \u5DF2\u6E05\u7406"))}catch(s){this.logger.error("MCPServiceManager \u6E05\u7406\u5931\u8D25:",s)}if(this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let s of this.wss.clients)s.terminate();this.wss.close(()=>{let s,o=i(()=>{s&&(clearTimeout(s),s=void 0),r()},"cleanupAndResolve");this.httpServer?(this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),o()}),s=setTimeout(()=>{s=void 0,this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),o())})}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);for(let e of this.eventListenerUnsubscribers)e();this.eventListenerUnsubscribers=[],this.logger.debug("\u5DF2\u79FB\u9664\u6240\u6709\u4E8B\u4EF6\u603B\u7EBF\u76D1\u542C\u5668"),this.statusService.destroy(),this.notificationService.destroy(),this.deviceRegistryService.destroy(),this.esp32Service.destroy(),fu(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function Bv(){let n=await Promise.resolve().then(()=>(Jm(),Xm)),e=await import("@xiaozhi-client/config"),t=await Promise.resolve().then(()=>(D(),Vl));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}i(Bv,"importModules");async function zv(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await Bv();process.env.XIAOZHI_CONFIG_DIR&&(r.initLogFile(process.env.XIAOZHI_CONFIG_DIR),r.enableFileLogging(!0));let s=new e;await s.start(),r.info("[WEBSERVER_STANDALONE] WebServer \u542F\u52A8\u6210\u529F");let o=i(async()=>{r.info("[WEBSERVER_STANDALONE] \u6B63\u5728\u505C\u6B62 WebServer..."),await s.stop(),process.exit(0)},"cleanup");process.once("SIGINT",o),process.once("SIGTERM",o)}catch{process.exit(1)}}i(zv,"main");import.meta.url===`file://${process.argv[1]}`&&zv();
90
+ 5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new Fe,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(!Q.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");Q.cleanupInvalidServerToolsConfig();let e=Q.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??Te.DEFAULT_PORT}}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=gu(r);this.mcpServiceManager.addServiceConfig(t,o)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e){let r=(Array.isArray(e)?e:[e]).filter(o=>o&&!o.includes("<\u8BF7\u586B\u5199"));this.logger.debug(`\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\uFF0C\u7AEF\u70B9\u6570\u91CF: ${r.length}`);try{if(this.endpointManager||(this.endpointManager=new uu({defaultReconnectDelay:2e3}),this.endpointManager.setMcpManager(this.mcpServiceManager),this.logger.debug("\u2705 \u65B0\u5EFA\u8FDE\u63A5\u7BA1\u7406\u5668\u5B9E\u4F8B")),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u8BBE\u7F6E\u5B8C\u6210"),r.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",r);for(let o of r)this.endpointManager.addEndpoint(o),this.logger.debug(`\u2705 \u5DF2\u6DFB\u52A0\u7AEF\u70B9: ${o}`);await this.endpointManager.connect(),this.endpointManager.on("endpointAdded",o=>{this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0: ${o.endpoint}`)}),this.endpointManager.on("endpointRemoved",o=>{this.logger.debug(`\u7AEF\u70B9\u5DF2\u79FB\u9664: ${o.endpoint}`)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${r.length} \u4E2A\u7AEF\u70B9`)}else this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF08\u65E0\u7AEF\u70B9\uFF09")}catch(o){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",o),o}}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 ye("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(){if(this.endpointManager){let e=this.endpointManager.getConnectionStatus();return{type:"multi-endpoint",manager:{connectedConnections:e.filter(t=>t.connected).length,totalConnections:e.length,healthCheckStats:{}},connections:e}}return{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(u){if(c=u,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,u),l<r){let p=Math.min(o*i**(l-1),s);this.logger.info(`${t} - ${p}ms \u540E\u91CD\u8BD5...`),await this.sleep(p)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${c?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",Jr),this.app?.use("*",eo),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",ro),this.app?.use("*",oo()),this.app?.use("*",no()),this.app?.use("*",Kr),this.app?.onError(Qr),this.app?.use("*",async(e,t)=>{let r=this.createHandlerDependencies();e.set("dependencies",r),await t()})}createHandlerDependencies(){return{configApiHandler:this.configApiHandler,statusApiHandler:this.statusApiHandler,serviceApiHandler:this.serviceApiHandler,mcpToolHandler:this.mcpToolHandler,mcpToolLogHandler:this.mcpToolLogHandler,versionApiHandler:this.versionApiHandler,staticFileHandler:this.staticFileHandler,mcpRouteHandler:this.mcpRouteHandler,mcpHandler:this.mcpHandler,updateApiHandler:this.updateApiHandler,cozeHandler:this.cozeHandler,ttsApiHandler:this.ttsApiHandler,esp32Handler:this.esp32Handler}}setupRouteSystem(){this.routeManager=new tt(this.logger)}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:so,status:io,tools:ao,mcp:co,version:lo,services:go,update:uo,coze:mo,"tool-logs":fo,mcpserver:ho,endpoint:Co,misc:Eo,tts:vo,esp32:So,static:po}),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,t)=>{if((t.url?new URL(t.url,`http://${t.headers.host}`):null)?.pathname==="/ws"){this.handleESP32DeviceConnection(e,t);return}this.handleWebClientConnection(e,t)})}handleESP32DeviceConnection(e,t){let r=t.headers["device-id"],o=t.headers["client-id"],i=t.headers.authorization?.replace("Bearer ","");if(this.logger.info(`[WS-ESP32] \u6536\u5230ESP32\u8BBE\u5907\u8FDE\u63A5\u8BF7\u6C42: deviceId=${r}, clientId=${o}, url=${t.url}`),!r||!o){this.logger.warn(`[WS-ESP32] \u8FDE\u63A5\u7F3A\u5C11\u5FC5\u8981\u7684\u8BF7\u6C42\u5934: device-id="${r}", client-id="${o}"`),e.close(1008,"Missing required headers");return}this.logger.info(`[WS-ESP32] ESP32\u8BBE\u5907WebSocket\u8FDE\u63A5: deviceId=${r}, clientId=${o}`),this.esp32Manager.handleWebSocketConnection(e,r,o,i).then(()=>{this.logger.info(`[WS-ESP32] ESP32\u8BBE\u5907\u8FDE\u63A5\u5904\u7406\u6210\u529F: deviceId=${r}`)}).catch(c=>{this.logger.error(`[WS-ESP32] ESP32\u8BBE\u5907\u8FDE\u63A5\u5904\u7406\u5931\u8D25: deviceId=${r}`,c),(e.readyState===1||e.readyState===0)&&e.close(1011,"Connection handling failed")})}handleWebClientConnection(e,t){let r=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${r}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,r),this.heartbeatHandler.handleClientConnect(r),e.on("message",async o=>{try{let s=JSON.parse(o.toString());s.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,s,r):await this.realtimeNotificationHandler.handleMessage(e,s,r)}catch(s){this.logger.error("WebSocket message error:",s);let i={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:s instanceof Error?s.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(i))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${r}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(r),this.heartbeatHandler.handleClientDisconnect(r)}),e.on("error",o=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${r}):`,o)}),this.realtimeNotificationHandler.sendInitialData(e,r)}setupEndpointStatusListener(){let e=a(t=>{let r={type:"endpoint_status_changed",data:{endpoint:t.endpoint,connected:t.connected,operation:t.operation,success:t.success,message:t.message,timestamp:t.timestamp}};this.notificationService.broadcast("endpoint_status_changed",r),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${t.endpoint} - ${t.operation}`)},"listener");this.eventBus.onEvent("endpoint:status:changed",e),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("endpoint:status:changed",e)})}setupMCPServerAddedListener(){let e=a(async r=>{if(this.logger.info(`\u68C0\u6D4B\u5230 MCP \u670D\u52A1\u6DFB\u52A0: ${r.serverName}\uFF0C\u5DE5\u5177\u6570\u91CF: ${r.tools.length}`),!this.endpointManager){this.logger.warn("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}try{let s=this.endpointManager.getConnectionStatus().filter(i=>i.connected).length;if(s===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${s} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u65B0\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_added",serverName:r.serverName,endpointCount:s,timestamp:Date.now()})}catch(o){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",o),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_added",serverName:r.serverName,error:o instanceof Error?o.message:String(o),timestamp:Date.now()})}},"singleServerListener");this.eventBus.onEvent("mcp:server:added",e),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("mcp:server:added",e)});let t=a(async r=>{if(this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CF MCP \u670D\u52A1\u6DFB\u52A0: ${r.addedCount} \u4E2A\u6210\u529F\uFF0C${r.failedCount} \u4E2A\u5931\u8D25`),!(!this.endpointManager||r.addedCount===0))try{let s=this.endpointManager.getConnectionStatus().filter(i=>i.connected).length;if(s===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${s} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u6279\u91CF\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_batch_added",serverName:void 0,endpointCount:s,timestamp:Date.now()})}catch(o){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",o),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_batch_added",serverName:void 0,error:o instanceof Error?o.message:String(o),timestamp:Date.now()})}},"batchServerListener");this.eventBus.onEvent("mcp:server:batch_added",t),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("mcp:server:batch_added",t)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=lu({fetch:this.app.fetch,port:this.port,hostname:Te.DEFAULT_BIND_ADDRESS,createServer:cu});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new du({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${Te.DEFAULT_BIND_ADDRESS}:${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");(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(()=>{let o,s=a(()=>{o&&(clearTimeout(o),o=void 0),r()},"cleanupAndResolve");this.httpServer?(this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),s()}),o=setTimeout(()=>{o=void 0,this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),s())})}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);for(let e of this.eventListenerUnsubscribers)e();this.eventListenerUnsubscribers=[],this.logger.debug("\u5DF2\u79FB\u9664\u6240\u6709\u4E8B\u4EF6\u603B\u7EBF\u76D1\u542C\u5668"),this.statusService.destroy(),this.notificationService.destroy(),this.esp32Manager.destroy(),Yo(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function mu(){let n=await Promise.resolve().then(()=>(ea(),Zi)),e=await import("@xiaozhi-client/config"),t=await Promise.resolve().then(()=>(I(),Po));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}a(mu,"importModules");async function fu(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await mu();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.once("SIGINT",s),process.once("SIGTERM",s)}catch{process.exit(1)}}a(fu,"main");import.meta.url===`file://${process.argv[1]}`&&fu();
113
91
  //# sourceMappingURL=WebServerLauncher.js.map