xiaozhi-client 2.2.0 → 2.3.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/backend/WebServer.js +10 -32
- package/dist/backend/WebServer.js.map +1 -1
- package/dist/backend/WebServerLauncher.js +10 -32
- package/dist/backend/WebServerLauncher.js.map +1 -1
- package/dist/backend/package.json +52 -8
- package/dist/frontend/assets/form-utils-n2_wJnKb.js +41 -0
- package/dist/frontend/assets/form-utils-n2_wJnKb.js.map +1 -0
- package/dist/frontend/assets/index-C3xvW3AQ.js +81 -0
- package/dist/frontend/assets/index-C3xvW3AQ.js.map +1 -0
- package/dist/frontend/assets/index-CLIN00a1.css +1 -0
- package/dist/frontend/assets/radix-ui-B9D1KdKb.js +2 -0
- package/dist/frontend/assets/radix-ui-B9D1KdKb.js.map +1 -0
- package/dist/frontend/assets/react-vendor-CmWLnLSk.js +67 -0
- package/dist/frontend/assets/react-vendor-CmWLnLSk.js.map +1 -0
- package/dist/frontend/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/dist/frontend/assets/utils-UasCLNM3.js +2 -0
- package/dist/frontend/assets/utils-UasCLNM3.js.map +1 -0
- package/dist/frontend/index.html +7 -6
- package/package.json +25 -11
- package/dist/frontend/assets/form-utils-Bskf0D3l.js +0 -41
- package/dist/frontend/assets/form-utils-Bskf0D3l.js.map +0 -1
- package/dist/frontend/assets/index-BAV6nu4X.js +0 -81
- package/dist/frontend/assets/index-BAV6nu4X.js.map +0 -1
- package/dist/frontend/assets/index-HDlbxheg.css +0 -1
- package/dist/frontend/assets/radix-ui-BQCqNqg0.js +0 -2
- package/dist/frontend/assets/radix-ui-BQCqNqg0.js.map +0 -1
- package/dist/frontend/assets/react-vendor-BPQojLhf.js +0 -67
- package/dist/frontend/assets/react-vendor-BPQojLhf.js.map +0 -1
- package/dist/frontend/assets/utils-BWIWSmq9.js +0 -2
- package/dist/frontend/assets/utils-BWIWSmq9.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
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:
|
|
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
|
|
25
|
-
`).filter(
|
|
26
|
-
`)+(
|
|
27
|
-
`:"");
|
|
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
|