xiaozhi-client 2.0.0 → 2.1.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/dist/backend/Logger.js +2 -2
- package/dist/backend/Logger.js.map +1 -1
- package/dist/backend/WebServer.js +20 -20
- package/dist/backend/WebServer.js.map +1 -1
- package/dist/backend/WebServerLauncher.js +19 -19
- package/dist/backend/WebServerLauncher.js.map +1 -1
- package/dist/backend/package.json +12 -6
- package/dist/backend/templates/default/prompts/default.md +3 -0
- package/dist/backend/templates/default/xiaozhi.config.json +17 -6
- package/dist/backend/templates/hello-world/prompts/default.md +3 -0
- package/dist/backend/templates/hello-world/xiaozhi.config.json +17 -0
- package/dist/backend/templates/json5/prompts/default.md +3 -0
- package/dist/backend/templates/json5/xiaozhi.config.json5 +18 -0
- package/dist/backend/templates/jsonc/prompts/default.md +3 -0
- package/dist/backend/templates/jsonc/xiaozhi.config.jsonc +18 -0
- package/dist/backend/templates/modelscope/prompts/default.md +3 -0
- package/dist/backend/templates/modelscope/xiaozhi.config.json +17 -0
- package/dist/cli/index.js +18 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +5 -6
- package/dist/config/index.js +23 -32
- package/dist/config/index.js.map +1 -1
- package/dist/frontend/assets/index-BAV6nu4X.js +81 -0
- package/dist/frontend/assets/index-BAV6nu4X.js.map +1 -0
- package/dist/frontend/assets/index-HDlbxheg.css +1 -0
- package/dist/frontend/assets/{react-vendor-nhjYH1qO.js → react-vendor-BPQojLhf.js} +13 -13
- package/dist/frontend/assets/react-vendor-BPQojLhf.js.map +1 -0
- package/dist/frontend/assets/{utils-OFMjZRUK.js → utils-BWIWSmq9.js} +2 -2
- package/dist/frontend/assets/{utils-OFMjZRUK.js.map → utils-BWIWSmq9.js.map} +1 -1
- package/dist/frontend/index.html +4 -4
- package/package.json +11 -11
- package/templates/default/prompts/default.md +3 -0
- package/templates/default/xiaozhi.config.json +17 -6
- package/templates/hello-world/prompts/default.md +3 -0
- package/templates/hello-world/xiaozhi.config.json +17 -0
- package/templates/json5/prompts/default.md +3 -0
- package/templates/json5/xiaozhi.config.json5 +18 -0
- package/templates/jsonc/prompts/default.md +3 -0
- package/templates/jsonc/xiaozhi.config.jsonc +18 -0
- package/templates/modelscope/prompts/default.md +3 -0
- package/templates/modelscope/xiaozhi.config.json +17 -0
- package/dist/frontend/assets/index-DWj2UcGy.css +0 -1
- package/dist/frontend/assets/index-HnebiJM5.js +0 -81
- package/dist/frontend/assets/index-HnebiJM5.js.map +0 -1
- package/dist/frontend/assets/react-vendor-nhjYH1qO.js.map +0 -1
- package/dist/shared-types/api-B5HunvHc.d.ts +0 -97
- package/dist/shared-types/api.d.ts +0 -204
- package/dist/shared-types/api.js +0 -50
- package/dist/shared-types/api.js.map +0 -1
- package/dist/shared-types/app-Ceijcsur.d.ts +0 -95
- package/dist/shared-types/chunk-BMOKIX3Q.js +0 -51
- package/dist/shared-types/chunk-BMOKIX3Q.js.map +0 -1
- package/dist/shared-types/config.d.ts +0 -97
- package/dist/shared-types/config.js +0 -1
- package/dist/shared-types/config.js.map +0 -1
- package/dist/shared-types/coze.d.ts +0 -31
- package/dist/shared-types/coze.js +0 -1
- package/dist/shared-types/coze.js.map +0 -1
- package/dist/shared-types/index.d.ts +0 -188
- package/dist/shared-types/index.js +0 -23
- package/dist/shared-types/index.js.map +0 -1
- package/dist/shared-types/mcp.d.ts +0 -93
- package/dist/shared-types/mcp.js +0 -31
- package/dist/shared-types/mcp.js.map +0 -1
- package/dist/shared-types/message-BrlYWzXV.d.ts +0 -154
- package/dist/shared-types/schema-Bs4SCukS.d.ts +0 -25
- package/dist/shared-types/timeout-D1mc0P3r.d.ts +0 -39
- package/dist/shared-types/tool-definition-B6f-mWPy.d.ts +0 -93
- package/dist/shared-types/toolApi-D-G8Chst.d.ts +0 -200
- package/dist/shared-types/utils.d.ts +0 -115
- package/dist/shared-types/utils.js +0 -15
- package/dist/shared-types/utils.js.map +0 -1
- package/dist/shared-types/workflow-Dl-hsNZK.d.ts +0 -86
|
@@ -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=Hm(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=Te.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){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(s=>s instanceof Error?this.pinoInstance.level==="debug"?s.message:{message:s.message,stack:s.stack,name:s.name,cause:s.cause}:s);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}enhanceErrorObject(e){let t={...e};for(let[r,s]of Object.entries(t))s instanceof Error&&(t[r]={message:s.message,stack:s.stack,name:s.name,cause:s.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!pe.existsSync(this.logFilePath)))try{pe.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=Te.dirname(this.logFilePath),t=Te.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=Te.join(e,`${t}.${s}.log`),a=Te.join(e,`${t}.${s+1}.log`);pe.existsSync(o)&&(s===this.maxLogFiles-1?pe.unlinkSync(o):pe.renameSync(o,a))}let r=Te.join(e,`${t}.1.log`);pe.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=Te.dirname(this.logFilePath),t=Te.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=Te.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}},pr=null,yn="info";i(Um,"createLogger");i(Ml,"getLogger");i(Vm,"setGlobalLogger");i(Bm,"setGlobalLogLevel");i(jm,"getGlobalLogLevel");u=Ml()});var J,De=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 _e}from"@xiaozhi-client/config";var Tn,Ol=d(()=>{"use strict";De();Tn=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=_e.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(_e.validateConfig(t),_e.updateConfig(t),t.mcpServerConfig)for(let[r,s]of Object.entries(t.mcpServerConfig))for(let[o,a]of Object.entries(s.tools))_e.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=_e.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=_e.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=_e.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=_e.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"),_e.reloadConfig();let t=_e.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=_e.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=_e.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)}}}});var Cs,oi=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 _n(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 Xe.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var ii=d(()=>{"use strict";Rn();oi();i(_n,"createCozeClient")});import zm from"node-cache";var ct,Nl=d(()=>{"use strict";ii();ct=class{static{i(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=_n(this.token),this.cache=new zm({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 Xe={};ni(Xe,{CozeApiService:()=>ct,config:()=>Cs,createCozeClient:()=>_n});import*as Gv from"@coze/api";var Rn=d(()=>{"use strict";oi();lr(Xe,Gv);ii();Nl()});import{configManager as dr}from"@xiaozhi-client/config";function ai(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 Pn(){let n=dr.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 Es,Ll=d(()=>{"use strict";Rn();De();i(ai,"isErrorWithCode");i(Pn,"getCozeApiService");Es=class extends J{static{i(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),ai(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(ai(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(ai(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"),!dr.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=Pn();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"),!dr.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=Pn();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=dr.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"),!dr.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=Pn(),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"),!dr.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=Pn().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 ci,li=d(()=>{"use strict";ci={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var ne,be,lt,fr,$t,$l=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"},be={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},fr={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},$t={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,Ss,ui,pt,pi,Dl=d(()=>{"use strict";ut={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},Ss=[ut.V2024_11_05,ut.V2025_06_18],ui={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"},pi={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"}});var An,kl=d(()=>{"use strict";An={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"}});var Fl,Hl,di,fi,wn=d(()=>{"use strict";Fl={TTL:3e5,CLEANUP_INTERVAL:6e4},Hl={DEFAULT:3e4,LONG_RUNNING:6e4},di={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3},fi={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3}});var Ul,mi,Vl,Bl=d(()=>{"use strict";Ul={DEFAULT:1024*1024,MAX:10*1024*1024},mi={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},Vl={SERVICE_TOOL_SEPARATOR:"__"}});var dt=d(()=>{"use strict";li();$l();Dl();kl();wn();Bl()});function ke(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 gi=d(()=>{"use strict";i(ke,"sendWebSocketError")});import{configManager as Wm}from"@xiaozhi-client/config";var bn,jl=d(()=>{"use strict";D();dt();gi();bn=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),ke(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:Wm.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>di.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()},di.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 qm}from"events";function k(){return mr||(mr=new hi),mr}function zl(){mr&&(mr.destroy(),mr=null)}var hi,mr,Ce=d(()=>{"use strict";D();hi=class extends qm{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")}},mr=null;i(k,"getEventBus");i(zl,"destroyEventBus")});var vs,Ci=d(()=>{"use strict";D();Ce();vs=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 Gm(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function In(n){return Gm(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var ft,gr=d(()=>{"use strict";i(Gm,"isValidToolJSONSchema");i(In,"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 Xm}from"crypto";function Fe(n,e){let t=Xm("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function Ei(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function ys(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>Ts.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}var Ts,Si=d(()=>{"use strict";i(Fe,"generateCacheKey");i(Ei,"isCacheExpired");i(ys,"shouldCleanupCache");Ts={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function Wl(n,e){return{content:[{type:"text",text:e?Jm(e,n):ql(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 Jm(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 Ym=Object.create;var Tn=Object.defineProperty;var Qm=Object.getOwnPropertyDescriptor;var Zm=Object.getOwnPropertyNames;var eg=Object.getPrototypeOf,tg=Object.prototype.hasOwnProperty;var i=(n,e)=>Tn(n,"name",{value:e,configurable:!0});var d=(n,e)=>()=>(n&&(e=n(n=0)),e);var x=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ii=(n,e)=>{for(var t in e)Tn(n,t,{get:e[t],enumerable:!0})},oi=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Zm(e))!tg.call(n,s)&&s!==t&&Tn(n,s,{get:()=>e[s],enumerable:!(r=Qm(e,s))||r.enumerable});return n},ur=(n,e,t)=>(oi(n,e,"default"),t&&oi(t,e,"default")),rg=(n,e,t)=>(t=n!=null?Ym(eg(n)):{},oi(e||!n||!n.__esModule?Tn(t,"default",{value:n,enumerable:!0}):t,n));var Vl={};ii(Vl,{Logger:()=>hs,createLogger:()=>ig,getGlobalLogLevel:()=>lg,getLogger:()=>Ul,logger:()=>u,setGlobalLogLevel:()=>cg,setGlobalLogger:()=>ag});import*as pe from"fs";import*as _e from"path";import gs from"chalk";import pr from"pino";import{z as sg}from"zod";function og(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),s=String(n.getHours()).padStart(2,"0"),o=String(n.getMinutes()).padStart(2,"0"),a=String(n.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${s}:${o}:${a}`}function ig(n){return new hs(n||_n)}function Ul(){return dr||(dr=new hs(_n)),dr}function ag(n){dr=n}function cg(n){_n=n,dr&&dr.setLevel(n)}function lg(){return _n}var ng,hs,dr,_n,u,D=d(()=>{"use strict";ng=sg.enum(["fatal","error","warn","info","debug","trace"]);i(og,"formatDateTime");hs=class{static{i(this,"Logger")}logFilePath=null;pinoInstance;isDaemonMode;logLevel;maxLogFileSize=10*1024*1024;maxLogFiles=5;constructor(e="info"){this.isDaemonMode=process.env.XIAOZHI_DAEMON==="true",this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}validateLogLevel(e){let t=e.toLowerCase(),r=ng.safeParse(t);return r.success?r.data:"info"}createPinoInstance(){let e=[];if(!this.isDaemonMode){let t=this.createOptimizedConsoleStream();e.push({level:this.logLevel,stream:t})}return this.logFilePath&&e.push({level:this.logLevel,stream:pr.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:pr.destination({dest:"/dev/null"})}),pr({level:this.logLevel,timestamp:pr.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((t,r)=>({level:r}),"level")},base:null,serializers:{err:pr.stdSerializers?.err||(t=>t)}},pr.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:gs.gray}],[30,{name:"INFO",color:gs.blue}],[40,{name:"WARN",color:gs.yellow}],[50,{name:"ERROR",color:gs.red}],[60,{name:"FATAL",color:gs.red}]]);return{write:i(t=>{try{let r=JSON.parse(t),s=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${s}
|
|
3
|
+
`)}catch{this.safeWrite(t)}},"write")}}safeWrite(e){try{process.stderr&&typeof process.stderr.write=="function"&&process.stderr.write(e)}catch{}}formatConsoleMessageOptimized(e,t){let r=og(new Date),s=t.get(e.level)||{name:"UNKNOWN",color:i(c=>c,"color")},o=s.color(`[${s.name}]`),a=e.msg;if(e.args&&Array.isArray(e.args)){let c=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");a=`${a} ${c}`}return`[${r}] ${o} ${a}`}initLogFile(e){this.logFilePath=_e.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded();try{pe.existsSync(this.logFilePath)||pe.writeFileSync(this.logFilePath,"")}catch{this.logFilePath=null}this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){this.logInfo(e,...t)}logInfo(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){this.logInfo(e,...t)}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(s=>s instanceof Error?this.pinoInstance.level==="debug"?s.message:{message:s.message,stack:s.stack,name:s.name,cause:s.cause}:s);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){this.logInfo(e,...t)}enhanceErrorObject(e){let t={...e};for(let[r,s]of Object.entries(t))s instanceof Error&&(t[r]={message:s.message,stack:s.stack,name:s.name,cause:s.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!pe.existsSync(this.logFilePath)))try{pe.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=_e.dirname(this.logFilePath),t=_e.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=_e.join(e,`${t}.${s}.log`),a=_e.join(e,`${t}.${s+1}.log`);pe.existsSync(o)&&(s===this.maxLogFiles-1?pe.unlinkSync(o):pe.renameSync(o,a))}let r=_e.join(e,`${t}.1.log`);pe.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=_e.dirname(this.logFilePath),t=_e.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=_e.join(e,`${t}.${r}.log`);pe.existsSync(s)&&pe.unlinkSync(s)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},dr=null,_n="info";i(ig,"createLogger");i(Ul,"getLogger");i(ag,"setGlobalLogger");i(cg,"setGlobalLogLevel");i(lg,"getGlobalLogLevel");u=Ul()});import{existsSync as $t,mkdirSync as ug,readFileSync as Bl,readdirSync as pg,rmSync as dg,statSync as fg,writeFileSync as zl}from"fs";import{dirname as ai,isAbsolute as Wl,resolve as Es}from"path";import{configManager as ci}from"@xiaozhi-client/config";function mg(n){let e=n.replace(/\\/g,"/");return!!(e.startsWith("./")||e.startsWith("../")||Wl(n))}function gg(n){try{let e=n.replace(/\\/g,"/"),t;if(Wl(e))t=e;else{let s=ci.getConfigPath(),o=ai(s);t=Es(o,e)}if(!$t(t))return null;let r=Bl(t,"utf-8").trim();return r||null}catch{return null}}function ql(n){return!n||n.trim()===""?jl:mg(n)?gg(n)||jl:n}function Gl(){try{let n=ci.getConfigPath(),e=ai(n),t=Es(e,"prompts");return $t(t)?pg(t).filter(o=>o.endsWith(".md")).map(o=>({fileName:o,relativePath:`./prompts/${o}`})):[]}catch{return[]}}function ui(n){let e=n.replace(/\\/g,"/");if(!e.startsWith("./prompts/"))return{valid:!1,error:"\u8DEF\u5F84\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4EE5 ./prompts/ \u5F00\u5934"};if(e.includes(".."))return{valid:!1,error:"\u8DEF\u5F84\u4E0D\u80FD\u5305\u542B .."};let t=e.replace("./prompts/","");return Xl.test(t)?{valid:!0}:{valid:!1,error:"\u6587\u4EF6\u540D\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u4E2D\u5212\u7EBF\u3001\u4E2D\u6587\uFF0C\u4E14\u5FC5\u987B\u4EE5 .md \u7ED3\u5C3E"}}function hg(n){return Xl.test(n)?{valid:!0}:{valid:!1,error:"\u6587\u4EF6\u540D\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u4E2D\u5212\u7EBF\u3001\u4E2D\u6587\uFF0C\u4E14\u5FC5\u987B\u4EE5 .md \u7ED3\u5C3E"}}function Jl(){let n=ci.getConfigPath(),e=ai(n);return Es(e,"prompts")}function pi(n){let e=Jl(),t=n.replace("./prompts/","");return Es(e,t)}function Kl(n){let e=ui(n);if(!e.valid)throw new Error(e.error);let t=pi(n);if(!$t(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);if(fg(t).size>li)throw new Error("\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let s=Bl(t,"utf-8");return{fileName:n.replace("./prompts/",""),relativePath:n,content:s}}function Yl(n,e){let t=ui(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>li)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let r=pi(n);if(!$t(r))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);return zl(r,e,"utf-8"),{fileName:n.replace("./prompts/",""),relativePath:n,content:e}}function Ql(n,e){let t=hg(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>li)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let s=Jl();$t(s)||ug(s,{recursive:!0});let o=Es(s,n),a=`./prompts/${n}`;if($t(o))throw new Error(`\u6587\u4EF6\u5DF2\u5B58\u5728: ${n}`);return zl(o,e,"utf-8"),{fileName:n,relativePath:a,content:e}}function Zl(n){let e=ui(n);if(!e.valid)throw new Error(e.error);let t=pi(n);if(!$t(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);dg(t)}var jl,li,Xl,di=d(()=>{"use strict";jl="\u4F60\u662F\u4E00\u4E2A\u53CB\u597D\u7684\u8BED\u97F3\u52A9\u624B\uFF0C\u8BF7\u7528\u7B80\u6D01\u7684\u4E2D\u6587\u56DE\u7B54\u7528\u6237\u7684\u95EE\u9898\u3002";i(mg,"isPromptPath");i(gg,"resolvePromptFromPath");i(ql,"resolvePrompt");i(Gl,"listPromptFiles");li=100*1024,Xl=/^[\u4e00-\u9fa5a-zA-Z0-9_-]+\.md$/;i(ui,"validatePromptPath");i(hg,"validatePromptFileName");i(Jl,"getPromptsDir");i(pi,"resolvePromptPath");i(Kl,"readPromptFile");i(Yl,"updatePromptFile");i(Ql,"createPromptFile");i(Zl,"deletePromptFile")});var J,ke=d(()=>{"use strict";J=class{static{i(this,"BaseHandler")}handleError(e,t,r,s="OPERATION_FAILED",o="\u64CD\u4F5C\u5931\u8D25",a=500){let c=t instanceof Error?t.message:String(t),l=t instanceof Error&&"code"in t?String(t.code):s;return e.get("logger").error(`${r}\u5931\u8D25:`,t),e.fail(l,c||o,void 0,a)}async parseJsonBody(e,t="\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"){try{return await e.req.json()}catch(r){let s=r instanceof Error?`${t}: ${r.message}`:t;throw new Error(s)}}}});import{configManager as Re}from"@xiaozhi-client/config";var Rn,eu=d(()=>{"use strict";di();ke();Rn=class extends J{static{i(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=e.get("logger");try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=Re.getConfig();return t.debug("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.success(r)}catch(r){return t.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",r),e.fail("CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25",void 0,500)}}async updateConfig(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u914D\u7F6E\u8BF7\u6C42");let t=await e.req.json();if(Re.validateConfig(t),Re.updateConfig(t),t.mcpServerConfig)for(let[r,s]of Object.entries(t.mcpServerConfig))for(let[o,a]of Object.entries(s.tools))Re.setToolEnabled(r,o,a.enable);return e.get("logger").info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t),e.fail("CONFIG_UPDATE_ERROR",t instanceof Error?t.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async getMcpEndpoint(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let t=Re.getMcpEndpoint();return e.get("logger").debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u6210\u529F"),e.success({endpoint:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25:",t),e.fail("MCP_ENDPOINT_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5931\u8D25",void 0,500)}}async getMcpEndpoints(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u8BF7\u6C42");let t=Re.getMcpEndpoints();return e.get("logger").debug("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u6210\u529F"),e.success({endpoints:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25:",t),e.fail("MCP_ENDPOINTS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u7AEF\u70B9\u5217\u8868\u5931\u8D25",void 0,500)}}async getMcpServers(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u8BF7\u6C42");let t=Re.getMcpServers();return e.get("logger").debug("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u6210\u529F"),e.success({servers:t})}catch(t){return e.get("logger").error("\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25:",t),e.fail("MCP_SERVERS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6 MCP \u670D\u52A1\u914D\u7F6E\u5931\u8D25",void 0,500)}}async getConnectionConfig(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u8BF7\u6C42");let t=Re.getConnectionConfig();return e.get("logger").debug("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u6210\u529F"),e.success({connection:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONNECTION_CONFIG_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25",void 0,500)}}async reloadConfig(e){try{e.get("logger").info("\u5904\u7406\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u8BF7\u6C42"),Re.reloadConfig();let t=Re.getConfig();return e.get("logger").info("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u6210\u529F"),e.success(t,"\u914D\u7F6E\u91CD\u65B0\u52A0\u8F7D\u6210\u529F")}catch(t){return e.get("logger").error("\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONFIG_RELOAD_ERROR",t instanceof Error?t.message:"\u91CD\u65B0\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25",void 0,500)}}async getConfigPath(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u8BF7\u6C42");let t=Re.getConfigPath();return e.get("logger").debug("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u6210\u529F"),e.success({path:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",t),e.fail("CONFIG_PATH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25",void 0,500)}}async checkConfigExists(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u8BF7\u6C42");let t=Re.configExists();return e.get("logger").debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.success({exists:t})}catch(t){return e.get("logger").error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t),e.fail("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25",void 0,500)}}async getPromptFiles(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u8BF7\u6C42");let t=Gl();return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u6587\u4EF6`),e.success({prompts:t})}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u5931\u8D25:",t),e.fail("PROMPT_FILES_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5217\u8868\u5931\u8D25",void 0,500)}}async getPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=e.req.query("path");if(!t)return e.fail("INVALID_REQUEST","\u7F3A\u5C11 path \u53C2\u6570",void 0,400);let r=Kl(t);return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u6210\u529F: ${t}`),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async updatePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{path:r,content:s}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","path \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(s===void 0||typeof s!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let o=Yl(r,s);return e.get("logger").info(`\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(o,"\u63D0\u793A\u8BCD\u6587\u4EF6\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async createPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{fileName:r,content:s}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","fileName \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(s===void 0||typeof s!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let o=Ql(r,s);return e.get("logger").info(`\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(o,"\u63D0\u793A\u8BCD\u6587\u4EF6\u521B\u5EFA\u6210\u529F")}catch(t){return e.get("logger").error("\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_CREATE_ERROR",t instanceof Error?t.message:"\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}async deletePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=e.req.query("path");return t?(Zl(t),e.get("logger").info(`\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${t}`),e.success(void 0,"\u63D0\u793A\u8BCD\u6587\u4EF6\u5220\u9664\u6210\u529F")):e.fail("INVALID_REQUEST","\u7F3A\u5C11 path \u53C2\u6570",void 0,400)}catch(t){return e.get("logger").error("\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_DELETE_ERROR",t instanceof Error?t.message:"\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}}});var Cs,fi=d(()=>{"use strict";Cs={zh:{COZE_BASE_URL:"https://api.coze.cn",COZE_BASE_WS_URL:"wss://ws.coze.cn"},en:{COZE_BASE_URL:"https://api.coze.com",COZE_BASE_WS_URL:"wss://ws.coze.com"}}});function Pn(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Cs[e]||Cs.zh;return new Je.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}var mi=d(()=>{"use strict";bn();fi();i(Pn,"createCozeClient")});import Eg from"node-cache";var ct,tu=d(()=>{"use strict";mi();ct=class{static{i(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Pn(this.token),this.cache=new Eg({stdTTL:300})}async getWorkspaces(){try{let e="workspaces",t=this.cache.get(e);if(t)return t;let{workspaces:r=[]}=await this.client.workspaces.list();return this.cache.set(e,r,1800),r}catch(e){let t=e instanceof Error?e.message:String(e);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25: ${t}`)}}async getWorkflows(e){try{let{workspace_id:t,page_num:r=1,page_size:s=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let o=`workflows:${t}:${r}:${s}`,a=this.cache.get(o);if(a)return a;let l=(await this.client.get("/v1/workflows",{workspace_id:t,page_num:r,page_size:s,workflow_mode:"workflow"})).data;return this.cache.set(o,l),l}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25: ${r}`)}}async callWorkflow(e,t){try{return await this.client.workflows.runs.create({workflow_id:e,parameters:t})}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`\u8FD0\u884C\u5DE5\u4F5C\u6D41\u5931\u8D25: ${s}`)}}clearCache(e){if(!e){this.cache.flushAll();return}let r=this.cache.keys().filter(s=>s.startsWith(e));this.cache.del(r)}getCacheStats(){let e=this.cache.getStats(),t=this.cache.keys(),r=e.hits+e.misses,s=r>0?e.hits/r:0;return{size:e.keys,keys:t,hits:e.hits,misses:e.misses,hitRate:s,ksize:e.ksize,vsize:e.vsize}}}});var Je={};ii(Je,{CozeApiService:()=>ct,config:()=>Cs,createCozeClient:()=>Pn});import*as Cy from"@coze/api";var bn=d(()=>{"use strict";fi();ur(Je,Cy);mi();tu()});import{configManager as fr}from"@xiaozhi-client/config";function gi(n){if(!(n instanceof Error&&"code"in n))return!1;let e=n.code;return typeof e=="string"&&["AUTH_FAILED","RATE_LIMITED","TIMEOUT","API_ERROR","NETWORK_ERROR"].includes(e)}function An(){let n=fr.getCozeToken();if(!n)throw new Error("\u6263\u5B50 API Token \u672A\u914D\u7F6E\uFF0C\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E platforms.coze.token");return new ct(n)}var Ss,ru=d(()=>{"use strict";bn();ke();i(gi,"isErrorWithCode");i(An,"getCozeApiService");Ss=class extends J{static{i(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),gi(t)&&t.code==="AUTH_FAILED")return e.fail("AUTH_FAILED","\u6263\u5B50 API \u8BA4\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u914D\u7F6E",void 0,401);if(gi(t)&&t.code==="RATE_LIMITED")return e.fail("RATE_LIMITED","\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,429);if(gi(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);let s=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:`${r}\u5931\u8D25`,s,500)}async getWorkspaces(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=An();e.get("logger").info("\u8C03\u7528 Coze API \u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868");let r=await t.getWorkspaces();return e.get("logger").info(`\u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A\u5DE5\u4F5C\u7A7A\u95F4`),e.success({workspaces:r})}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868")}}async getWorkflows(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),s=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return e.get("logger").warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id",void 0,400);if(r<1||r>1e3)return e.fail("INVALID_PARAMETER","page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4",void 0,400);if(s<1||s>100)return e.fail("INVALID_PARAMETER","page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4",void 0,400);let o={workspace_id:t,page_num:r,page_size:s},a=An();e.get("logger").info(`\u5F00\u59CB\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868\uFF0C\u9875\u7801: ${r}\uFF0C\u6BCF\u9875: ${s}`);let c=await a.getWorkflows(o);e.get("logger").info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=fr.getCustomMCPTools(),p=c.items.map(m=>{let f=l.find(S=>S.handler.type==="proxy"&&S.handler.platform==="coze"&&S.handler.config.workflow_id===m.workflow_id);return{...m,isAddedAsTool:!!f,toolName:f?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${p.filter(m=>m.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.success({items:p,has_more:c.has_more,page_num:r,page_size:s,total_count:c.items.length},`\u6210\u529F\u83B7\u53D6 ${p.length} \u4E2A\u5DE5\u4F5C\u6D41`)}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868")}}async clearCache(e){try{if(e.get("logger").info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=e.req.query("pattern"),r=An(),s=r.getCacheStats();e.get("logger").info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let o=r.getCacheStats();return e.get("logger").info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${s.size} \u9879\uFF0C\u6E05\u9664\u540E: ${o.size} \u9879`),e.success({cleared:s.size-o.size,remaining:o.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F")}catch(t){e.get("logger").error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25",r,500)}}async getCacheStats(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!fr.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let r=An().getCacheStats();return e.success(r)}catch(t){e.get("logger").error("\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",r,500)}}}});var hi,Ei=d(()=>{"use strict";hi={DEFAULT_LIMIT:50,MAX_LIMIT:200}});var ne,Ie,lt,mr,Dt,su=d(()=>{"use strict";ne={APPLICATION_JSON:"application/json",TEXT_HTML:"text/html",TEXT_PLAIN:"text/plain",TEXT_CSS:"text/css",APPLICATION_JAVASCRIPT:"application/javascript",APPLICATION_XML:"application/xml",APPLICATION_PDF:"application/pdf",APPLICATION_ZIP:"application/zip",APPLICATION_OCTET_STREAM:"application/octet-stream"},Ie={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},lt={OK:200,CREATED:201,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,REQUEST_TIMEOUT:408,INTERNAL_SERVER_ERROR:500,SERVICE_UNAVAILABLE:503},mr={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},Dt={REQUEST_TOO_LARGE:"Request too large",MESSAGE_TOO_LARGE:"Message too large",INVALID_REQUEST:"Invalid Request",INVALID_CONTENT_TYPE:"Content-Type must be application/json",PARSE_ERROR:"Parse error",INVALID_JSON:"Invalid JSON",INTERNAL_ERROR:"Internal error"}});var ut,vs,Ci,pt,Si,nu=d(()=>{"use strict";ut={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},vs=[ut.V2024_11_05,ut.V2025_06_18],Ci={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},pt={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"},Si={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"}});var wn,ou=d(()=>{"use strict";wn={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"}});var iu,au,vi,yi,In=d(()=>{"use strict";iu={TTL:3e5,CLEANUP_INTERVAL:6e4},au={DEFAULT:3e4,LONG_RUNNING:6e4},vi={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3},yi={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3}});var cu,Ti,lu,uu=d(()=>{"use strict";cu={DEFAULT:1024*1024,MAX:10*1024*1024},Ti={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},lu={SERVICE_TOOL_SEPARATOR:"__"}});function pu(){let n=new Set;for(let e of _i)n.add(e.scene);return Array.from(n)}var _i,Ri=d(()=>{"use strict";_i=[{name:"Vivi 2.0",voiceType:"zh_female_vv_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587\u3001\u65E5\u6587\u3001\u5370\u5C3C\u3001\u58A8\u897F\u54E5\u897F\u73ED\u7259\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C0F\u4F55 2.0",voiceType:"zh_female_xiaohe_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u4E91\u821F 2.0",voiceType:"zh_male_m191_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C0F\u5929 2.0",voiceType:"zh_male_taocheng_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5218\u98DE 2.0",voiceType:"zh_male_liufei_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9B45\u529B\u82CF\u83F2 2.0",voiceType:"zh_male_sophie_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6E05\u65B0\u5973\u58F0 2.0",voiceType:"zh_female_qingxinnvsheng_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u751C\u7F8E\u5C0F\u6E90 2.0",voiceType:"zh_female_tianmeixiaoyuan_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u751C\u7F8E\u6843\u5B50 2.0",voiceType:"zh_female_tianmeitaozi_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u723D\u5FEB\u601D\u601D 2.0",voiceType:"zh_female_shuangkuaisisi_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u90BB\u5BB6\u5973\u5B69 2.0",voiceType:"zh_female_linjianvhai_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5C11\u5E74\u6893\u8F9B/Brayan 2.0",voiceType:"zh_male_shaonianzixin_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9B45\u529B\u5973\u53CB 2.0",voiceType:"zh_female_meilinvyou_uranus_bigtts",scene:"\u901A\u7528\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u77E5\u6027\u707F\u707F 2.0",voiceType:"zh_female_cancan_uranus_bigtts",scene:"\u89D2\u8272\u626E\u6F14",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6492\u5A07\u5B66\u59B9 2.0",voiceType:"zh_female_sajiaoxuemei_uranus_bigtts",scene:"\u89D2\u8272\u626E\u6F14",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u4F69\u5947\u732A 2.0",voiceType:"zh_female_peiqi_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u7334\u54E5 2.0",voiceType:"zh_male_sunwukong_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5927\u58F9 2.0",voiceType:"zh_male_dayi_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9ED1\u732B\u4FA6\u63A2\u793E\u54AA\u4ED4 2.0",voiceType:"zh_female_mizai_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u9E21\u6C64\u5973 2.0",voiceType:"zh_female_jitangnv_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6D41\u7545\u5973\u58F0 2.0",voiceType:"zh_female_liuchangnv_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u5112\u96C5\u9038\u8FB0 2.0",voiceType:"zh_male_ruyayichen_uranus_bigtts",scene:"\u89C6\u9891\u914D\u97F3",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Tina\u8001\u5E08 2.0",voiceType:"zh_female_yingyujiaoxue_uranus_bigtts",scene:"\u6559\u80B2\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u6696\u9633\u5973\u58F0 2.0",voiceType:"zh_female_kefunvsheng_uranus_bigtts",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"\u8F7B\u76C8\u6735\u6735 2.0",voiceType:"saturn_zh_female_qingyingduoduo_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u6E29\u5A49\u73CA\u73CA 2.0",voiceType:"saturn_zh_female_wenwanshanshan_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u70ED\u60C5\u827E\u5A1C 2.0",voiceType:"saturn_zh_female_reqingaina_cs_tob",scene:"\u5BA2\u670D\u573A\u666F",language:"\u4E2D\u6587",capabilities:["\u6307\u4EE4\u9075\u5FAA"],modelVersion:"2.0"},{name:"\u513F\u7AE5\u7ED8\u672C 2.0",voiceType:"zh_female_xiaoxue_uranus_bigtts",scene:"\u6709\u58F0\u9605\u8BFB",language:"\u4E2D\u6587",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Tim",voiceType:"en_male_tim_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Dacey",voiceType:"en_female_dacey_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"},{name:"Stokie",voiceType:"en_female_stokie_uranus_bigtts",scene:"\u591A\u8BED\u79CD",language:"\u7F8E\u5F0F\u82F1\u8BED",capabilities:["\u60C5\u611F\u53D8\u5316","\u6307\u4EE4\u9075\u5FAA","ASMR"],modelVersion:"2.0"}];i(pu,"getVoiceScenes")});var dt=d(()=>{"use strict";Ei();su();nu();ou();In();uu();Ri()});function Fe(n,e,t,r){try{let s={type:"error",error:{code:e,message:t,timestamp:Date.now()}};n.send(JSON.stringify(s))}catch(s){r.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",s)}}var Pi=d(()=>{"use strict";i(Fe,"sendWebSocketError")});import{configManager as Cg}from"@xiaozhi-client/config";var Mn,du=d(()=>{"use strict";D();dt();Pi();Mn=class{static{i(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=u,this.statusService=e,this.notificationService=t}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let s={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(s,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(s){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,s),Fe(e,"CLIENT_STATUS_ERROR",s instanceof Error?s.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25",this.logger)}}async sendLatestConfig(e,t){try{let s={type:"configUpdate",data:Cg.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(s)),this.logger.debug(`\u6700\u65B0\u914D\u7F6E\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u6700\u65B0\u914D\u7F6E\u5931\u8D25: ${t}`,r)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>vi.TIMEOUT_THRESHOLD&&(this.logger.debug("\u5BA2\u6237\u7AEF\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u6807\u8BB0\u4E3A\u65AD\u5F00\u8FDE\u63A5"),this.statusService.updateClientInfo({status:"disconnected"},"heartbeat-timeout"))}startHeartbeatMonitoring(){return this.logger.debug("\u542F\u52A8\u5FC3\u8DF3\u76D1\u63A7"),setInterval(()=>{this.checkHeartbeatTimeout(),this.cleanupDisconnectedClients()},vi.MONITOR_INTERVAL)}cleanupDisconnectedClients(){try{this.notificationService.cleanupDisconnectedClients()}catch(e){this.logger.error("\u6E05\u7406\u65AD\u5F00\u8FDE\u63A5\u7684\u5BA2\u6237\u7AEF\u5931\u8D25:",e)}}stopHeartbeatMonitoring(e){this.logger.debug("\u505C\u6B62\u5FC3\u8DF3\u76D1\u63A7"),clearInterval(e)}getHeartbeatStats(){return{lastHeartbeat:this.statusService.getLastHeartbeat(),isConnected:this.statusService.isClientConnected(),clientStats:this.notificationService.getClientStats()}}handleClientConnect(e){this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u65AD\u5F00: ${e}`),this.statusService.updateClientInfo({status:"disconnected"},`websocket-disconnect-${e}`)}sendHeartbeatResponse(e,t){try{let r={type:"heartbeatResponse",data:{timestamp:Date.now(),status:"ok"}};e.send(JSON.stringify(r)),this.logger.debug(`\u5FC3\u8DF3\u54CD\u5E94\u5DF2\u53D1\u9001: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u5FC3\u8DF3\u54CD\u5E94\u5931\u8D25: ${t}`,r)}}validateHeartbeatMessage(e){return e&&typeof e=="object"&&e.type==="clientStatus"&&e.data&&typeof e.data=="object"}}});import{EventEmitter as Sg}from"events";function k(){return gr||(gr=new bi),gr}function fu(){gr&&(gr.destroy(),gr=null)}var bi,gr,Ce=d(()=>{"use strict";D();bi=class extends Sg{static{i(this,"EventBus")}logger;eventStats=new Map;maxListeners;constructor(){super(),this.logger=u;let e=process.env.NODE_ENV==="test"||process.env.VITEST==="true";this.maxListeners=e?200:50,this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=i(s=>{try{t(s)}catch(o){throw this.emit("error",o),o}finally{this.offEvent(e,r)}},"onceListener");return this.on(e,r)}offEvent(e,t){return this.logger.debug(`\u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.off(e,t)}updateEventStats(e){let t=this.eventStats.get(e)||{count:0,lastEmitted:new Date};t.count++,t.lastEmitted=new Date,this.eventStats.set(e,t)}getEventStats(){let e={};for(let[t,r]of this.eventStats)e[t]={...r};return e}getListenerStats(){let e={};for(let t of this.eventNames())e[t]=this.listenerCount(t);return e}clearEventStats(){this.eventStats.clear(),this.logger.info("\u4E8B\u4EF6\u7EDF\u8BA1\u5DF2\u6E05\u7406")}getStatus(){return{totalEvents:this.eventStats.size,totalListeners:Object.values(this.getListenerStats()).reduce((e,t)=>e+t,0),eventStats:this.getEventStats(),listenerStats:this.getListenerStats()}}destroy(){this.removeAllListeners(),this.eventStats.clear(),this.logger.info("EventBus \u5DF2\u9500\u6BC1")}},gr=null;i(k,"getEventBus");i(fu,"destroyEventBus")});var ys,Ai=d(()=>{"use strict";D();Ce();ys=class{static{i(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=u,this.endpointManager=e,this.configManager=t,this.eventBus=k()}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(o){return this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",o),{ok:!1,response:e.fail(t,"JSON\u89E3\u6790\u5931\u8D25",o instanceof Error?o.message:void 0,500)}}let s=r.endpoint;return!s||typeof s!="string"?{ok:!1,response:e.fail("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",void 0,500)}:{ok:!0,endpoint:s}}validateEndpoint(e){let t=[];if(!e||typeof e!="string")return t.push("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:t};try{new URL(e)}catch{t.push("\u7AEF\u70B9 URL \u683C\u5F0F\u65E0\u6548")}return{isValid:t.length===0,errors:t}}async getEndpointStatus(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_STATUS_READ_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.debug(`\u5904\u7406\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u8BF7\u6C42: ${r}`);try{let o=this.endpointManager.getConnectionStatus().find(a=>a.endpoint===r);return o?(this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.success(o)):e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500)}catch(s){return this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",s),e.fail("ENDPOINT_STATUS_READ_ERROR",s instanceof Error?s.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",void 0,500)}}async connectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_CONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u8FDE\u63A5\u8BF7\u6C42: ${r}`);try{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",void 0,500);await this.endpointManager.connect(r);let a=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);return a?(this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!0,operation:"connect",success:!0,message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${r}`),e.success(a)):e.fail("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",void 0,500)}catch(s){return this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",s),e.fail("ENDPOINT_CONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",void 0,500)}}async disconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_DISCONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u65AD\u5F00\u8BF7\u6C42: ${r}`);try{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);await this.endpointManager.disconnect(r);let a=this.endpointManager.getConnectionStatus().find(l=>l.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"disconnect",success:!0,message:"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F: ${r}`);let c={endpoint:r,connected:!1,initialized:!0};return e.success(a||c)}catch(s){return this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",s),e.fail("ENDPOINT_DISCONNECT_ERROR",s instanceof Error?s.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",void 0,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u6DFB\u52A0\u8BF7\u6C42: ${r}`);try{let s=this.validateEndpoint(r);if(!s.isValid)return e.fail("INVALID_ENDPOINT_FORMAT",s.errors.join(", "),void 0,500);if(this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_ALREADY_EXISTS","\u7AEF\u70B9\u5DF2\u5B58\u5728",void 0,500);this.endpointManager.addEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`);let a=this.endpointManager.getEndpoint(r);if(!a)return e.fail("ENDPOINT_NOT_FOUND_AFTER_ADD","\u7AEF\u70B9\u6DFB\u52A0\u540E\u672A\u627E\u5230",void 0,500);try{await this.endpointManager.connect(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u8FDE\u63A5: ${r}`)}catch(m){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,m)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(m){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,m);try{await a.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(f){this.logger.warn(`\u56DE\u6EDA\u65F6\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u5C06\u7EE7\u7EED\u4ECE\u7BA1\u7406\u5668\u79FB\u9664\u7AEF\u70B9: ${r}`,f)}throw await this.endpointManager.removeEndpoint(a),m}let l=this.endpointManager.getConnectionStatus().find(m=>m.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:l?.connected??!1,operation:"add",success:!0,message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F: ${r}`);let p={endpoint:r,connected:!1,initialized:!0};return e.success(l||p,"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F")}catch(s){return this.logger.error("\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25:",s),e.fail("ENDPOINT_ADD_ERROR",s instanceof Error?s.message:"\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}async removeEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_REMOVE_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u79FB\u9664\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getEndpoint(r);if(!s)return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);let o=s.isConnected();try{this.configManager.removeMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u4E2D\u79FB\u9664: ${r}`)}catch(a){throw this.logger.error(`\u4ECE\u914D\u7F6E\u6587\u4EF6\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r}`,a),a}return await this.endpointManager.removeEndpoint(s),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u7BA1\u7406\u5668\u4E2D\u79FB\u9664: ${r}`),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F: ${r}`),e.success({endpoint:r,operation:"removed",wasConnected:o},"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F")}catch(s){return this.logger.error("\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25:",s),e.fail("ENDPOINT_REMOVE_ERROR",s instanceof Error?s.message:"\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}}});function vg(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}function xn(n){return vg(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}var ft,hr=d(()=>{"use strict";i(vg,"isValidToolJSONSchema");i(xn,"ensureToolJSONSchema");ft=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{i(this,"ToolCallError")}}});import{createHash as yg}from"crypto";function He(n,e){let t=yg("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}function wi(n,e){let t=new Date(n).getTime();return Date.now()-t>e}function Ts(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>_s.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}var _s,Ii=d(()=>{"use strict";i(He,"generateCacheKey");i(wi,"isCacheExpired");i(Ts,"shouldCleanupCache");_s={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0}});function mu(n,e){return{content:[{type:"text",text:e?Tg(e,n):gu(n)}],isError:!1,taskId:n,status:"timeout",message:"\u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D",nextAction:"\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210"}}function Tg(n,e){let t={coze_workflow:`\u23F1\uFE0F \u6263\u5B50\u5DE5\u4F5C\u6D41\u6267\u884C\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
|
|
4
4
|
|
|
5
5
|
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
6
6
|
- \u4EFB\u52A1ID: ${e}
|
|
@@ -11,7 +11,7 @@ var xm=Object.create;var vn=Object.defineProperty;var Om=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:gu(e)};return t[n]||t.default}function gu(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
|
|
15
15
|
|
|
16
16
|
\u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
|
|
17
17
|
- \u4EFB\u52A1ID: ${n}
|
|
@@ -21,11 +21,11 @@ var xm=Object.create;var vn=Object.defineProperty;var Om=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
|
|
24
|
+
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}var Rs,Mi=d(()=>{"use strict";Rs=class n extends Error{static{i(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};i(mu,"createTimeoutResponse");i(Tg,"getToolSpecificTimeoutMessage");i(gu,"getDefaultTimeoutMessage")});import{configManager as hu}from"@xiaozhi-client/config";function _g(n){return n.type==="proxy"}var Ps,On=d(()=>{"use strict";D();bn();gt();hr();Ce();Ii();Mi();i(_g,"isProxyHandler");Ps=class{static{i(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=_s.TIMEOUT;CACHE_TTL=_s.CACHE_TTL;configUpdateListener=null;constructor(e,t){this.logger=u,this.cacheManager=e||new mt,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=hu.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new ct(e)}setupEventListeners(){let e=k();this.configUpdateListener=async t=>{if(t&&typeof t=="object"&&"type"in t&&t.type==="customMCP"){this.logger.info("[CustomMCP] \u68C0\u6D4B\u5230\u914D\u7F6E\u66F4\u65B0\uFF0C\u91CD\u65B0\u521D\u59CB\u5316...");try{this.reinitialize()}catch(r){this.logger.error("[CustomMCP] \u914D\u7F6E\u66F4\u65B0\u5904\u7406\u5931\u8D25:",r)}}},e.onEvent("config:updated",this.configUpdateListener)}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||hu.getCustomMCPTools();this.tools.clear();for(let r of t)_g(r.handler)&&r.handler.platform==="coze"&&(this.tools.set(r.name,r),this.logger.debug(`[CustomMCP] \u5DF2\u52A0\u8F7D Coze \u5DE5\u5177: ${r.name} (workflow_id: ${r.handler.config.workflow_id})`));this.logger.debug(`[CustomMCP] \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u5171\u52A0\u8F7D ${this.tools.size} \u4E2A Coze \u5DE5\u5177`)}catch(t){throw this.logger.error("[CustomMCP] \u521D\u59CB\u5316\u5931\u8D25:",t),t}}getTools(){return Array.from(this.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:xn(e.inputSchema)}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}getToolInfo(e){return this.tools.get(e)}reinitialize(){this.logger.debug("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668..."),this.initialize()}async callTool(e,t,r){let s=this.tools.get(e);if(!s)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let o=await this.getCompletedResult(e,t);if(o)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),o;try{let a=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(s,t),this.createTimeoutPromise(e,a)]);return await this.cacheResult(e,t,c),c}catch(a){if(a instanceof Rs){let c=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${c}`),mu(c,e)}throw a}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new Rs(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(!s.customMCPResults||!s.customMCPResults[r])return null;let o=s.customMCPResults[r];return o.status==="completed"&&!o.consumed&&!wi(o.timestamp,o.ttl)?o.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}processWorkflowResponse(e,t){try{let r=t.data||t;return typeof r=="string"?{content:[{type:"text",text:r}],isError:!1}:{content:[{type:"text",text:JSON.stringify(r,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406\u5DE5\u4F5C\u6D41\u54CD\u5E94\u5931\u8D25: ${e}`,r),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async callCozeWorkflow(e,t){let s=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:s.workflow_id});try{let o=this.getCozeApiService();if(!s.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let a=await o.callWorkflow(s.workflow_id,t);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`),this.processWorkflowResponse(e.name,a)}catch(o){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,o),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`}],isError:!0}}}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),s=await this.loadExtendedCache();if(s.customMCPResults?.[r]){s.customMCPResults[r].consumed=!0;let o=s.customMCPResults[r];Ts(o)&&delete s.customMCPResults[r],await this.saveCache(s),this.logger.debug(`[CustomMCP] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}`)}}catch(r){this.logger.warn(`[CustomMCP] \u6E05\u7406\u7F13\u5B58\u5931\u8D25: ${r}`)}}async generateTaskId(e,t){return He(e,t)}generateCacheKey(e,t){return He(e,t)}async loadExtendedCache(){try{return await this.cacheManager.loadExistingCache()}catch{return{version:"1.0.0",mcpServers:{},metadata:{lastGlobalUpdate:new Date().toISOString(),totalWrites:0,createdAt:new Date().toISOString()},customMCPResults:{}}}}async updateCacheWithResult(e,t){try{let r=await this.loadExtendedCache();r.customMCPResults||(r.customMCPResults={}),r.customMCPResults[e]=t,await this.saveCache(r)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u7F13\u5B58\u5931\u8D25: ${r}`)}}async cacheResult(e,t,r){try{let s=this.generateCacheKey(e,t),o={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(s,o),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(s){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${s}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.configUpdateListener&&(k().offEvent("config:updated",this.configUpdateListener),this.configUpdateListener=null),this.tools.clear(),this.cacheManager.cleanup()}}});import{tmpdir as Rg}from"os";var bs,Eu=d(()=>{"use strict";bs=class{static{i(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||Rg()}}});import*as ht from"fs";import*as kt from"path";import Nn from"pino";var As,Ln,$n=d(()=>{"use strict";D();Eu();As=class{static{i(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=kt.resolve(kt.normalize(e.logFilePath));else{let r=t||bs.getTempDir();this.logFilePath=kt.join(kt.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),u.info("ToolCallLogger \u521D\u59CB\u5316",{maxRecords:this.maxRecords,path:this.logFilePath})}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:i(r=>{try{let s=JSON.parse(r),o=this.formatConsoleMessage(s)}catch{}},"write")}});try{t.push({level:"info",stream:Nn.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){u.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6",{error:r})}return Nn({level:"info",timestamp:Nn.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((r,s)=>({level:s}),"level")},base:null},Nn.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,s=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${s}`}async cleanupOldRecords(){try{if(!ht.existsSync(this.logFilePath))return;let t=ht.readFileSync(this.logFilePath,"utf8").trim().split(`
|
|
25
25
|
`).filter(a=>a.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,s=t.slice(r),o=s.join(`
|
|
26
26
|
`)+(s.length>0?`
|
|
27
|
-
`:"");ht.writeFileSync(this.logFilePath,o,"utf8"),u.info("\u5DF2\u6E05\u7406\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55",{recordsToRemove:r,maxRecords:this.maxRecords})}catch(e){u.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25",{error:e})}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){u.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{error:t})}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},
|
|
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 hr,yi=d(()=>{"use strict";D();dt();gt();hr=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=Ss.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:ui.NAME,version:ui.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=Jl(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 Qm}from"events";import{isModelScopeURL as Zm}from"@xiaozhi-client/config";import{configManager as Ee}from"@xiaozhi-client/config";var ws,Kl=d(()=>{"use strict";D();gt();gt();gr();Ce();Mn();Nn();yi();ws=class extends Qm{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 Rs(this.cacheManager,this);let s=Ee.getToolCallLogConfig(),o=Ee.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 hr(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 Ln(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=Ee.isToolEnabled(s,c.name),p=Ee.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 Ee.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 Ee.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 Ee.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 Ee.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{Ee.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=Ee.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?Zm(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=Ee.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=Ee.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)){Ee.updateServerToolsConfig(t,a);let f=Object.keys(a).filter(g=>!o[g]),S=Object.keys(a).filter(g=>{let P=o[g],b=a[g];return P&&P.description!==b.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 eg}from"@xiaozhi-client/mcp-core";var Ln,Yl=d(()=>{"use strict";dt();Ce();Ln=class{static{i(this,"MCPService")}connection;eventBus=k();constructor(e){let{name:t,...r}=e,s={onConnected:i(o=>{this.eventBus.emitEvent(An.CONNECTED,o)},"onConnected"),onDisconnected:i(o=>{this.eventBus.emitEvent(An.DISCONNECTED,o)},"onDisconnected"),onConnectionFailed:i(o=>{this.eventBus.emitEvent(An.CONNECTION_FAILED,o)},"onConnectionFailed")};this.connection=new eg(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 bT}from"@xiaozhi-client/mcp-core";function Jl(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 Ql=d(()=>{"use strict";gr();i(Jl,"validateToolCallParams")});var Zl=d(()=>{"use strict"});import{Hono as tg}from"hono";var eu,$n,Dn=d(()=>{"use strict";eu=i(()=>new tg,"createApp"),$n=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 kn=d(()=>{"use strict"});var Ti=d(()=>{"use strict";Si();Zl();vi();Dn();kn()});import{createHash as rg}from"crypto";import{existsSync as bs,mkdirSync as sg,readFileSync as tu,renameSync as ng,writeFileSync as ru}from"fs";import{dirname as og,resolve as su}from"path";import ig from"dayjs";var mt,nu=d(()=>{"use strict";D();dt();Ti();mt=class{static{i(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=pi.CACHE_VERSION;CACHE_ENTRY_VERSION=pi.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=Fl.CLEANUP_INTERVAL;constructor(e){this.logger=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return ig().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return su(e,mi.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return su(t,mi.FILENAME)}}async ensureCacheFile(){try{if(!bs(this.cachePath)){let e=og(this.cachePath);bs(e)||(sg(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(!bs(this.cachePath))return await this.createInitialCache();let e=tu(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{ru(r,t,"utf8"),ng(r,e)}catch(s){try{bs(r)&&ru(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return rg("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:bs(this.cachePath)?tu(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}${Vl.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=Fe(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=Fe(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=Fe(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=Fe(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=Fe(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)ys(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";Kl();Yl();gr();Ql();yi();nu();Mn();Nn()});var Fn,ou=d(()=>{"use strict";D();dt();gt();Fn=class{static{i(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=u,this.config={maxMessageSize:e.maxMessageSize??Ul.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 hr(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(be.CONTENT_LENGTH);if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${$t.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(be.CONTENT_TYPE)?.includes(ne.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${$t.INVALID_REQUEST}: ${$t.INVALID_CONTENT_TYPE}`);let a=e.req.header("mcp-protocol-version")||e.req.header(be.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");a&&!Ss.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${Ss.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,$t.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${$t.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:{[be.MCP_PROTOCOL_VERSION]:ut.DEFAULT,[be.X_RESPONSE_TIME]:p.toString()}}):e.json(l,lt.OK,{[be.CONTENT_TYPE]:ne.APPLICATION_JSON,[be.MCP_PROTOCOL_VERSION]:ut.DEFAULT,[be.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,`${$t.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:{[be.CONTENT_TYPE]:ne.APPLICATION_JSON,[be.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,Hn,_i,Ri,Pi,S_,Ai=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}})}},Hn=class{static{i(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof y)}handle(e,t){return y.fromError(e,"INTERNAL_ERROR","system")}},_i=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})}},Ri=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})}},Pi=class{static{i(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new _i),this.registerHandler(new Ri),this.registerHandler(new Hn)}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 Hn().handle(e,t)}},S_=new Pi});import{normalizeServiceConfig as lg}from"@xiaozhi-client/config";import{TypeFieldNormalizer as wi}from"@xiaozhi-client/mcp-core";var Is,Me,au=d(()=>{"use strict";D();Ai();Ce();Is=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=wi.normalizeTypeField(t);try{let s=Me.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(Me.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=Me.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=lg(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"),r=Me.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!Me.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"),r=Me.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!Me.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=wi.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=Me.validateServiceName(s);if(!a.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${a.errors.join(", ")}`);continue}if(Me.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let c=wi.normalizeTypeField(o),l=Me.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")})(Me||={})});import{configManager as Ms}from"@xiaozhi-client/config";var Un,cu=d(()=>{"use strict";D();Ce();gi();Un=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}),ke(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),ke(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=Ms.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),ke(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(Ms.validateConfig(t),Ms.updateConfig(t),t.mcpServerConfig)for(let[s,o]of Object.entries(t.mcpServerConfig))for(let[a,c]of Object.entries(o.tools))Ms.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),ke(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),ke(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),ke(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=Ms.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),ke(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 ug}from"child_process";var Vn,lu=d(()=>{"use strict";D();wn();Ce();Dn();Vn=class{static{i(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u,this.statusService=e,this.eventBus=k()}spawnXiaozhiProcess(e){let t=ug("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=$n(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},fi.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")}},fi.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=$n(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 Bn}from"fs";import{readFile as pg}from"fs/promises";import{dirname as dg,join as oe}from"path";import{fileURLToPath as fg}from"url";var xs,uu=d(()=>{"use strict";D();dt();De();xs=class extends J{static{i(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=u,this.initializeWebPath()}initializeWebPath(){try{let e=dg(fg(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=Bn(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(!Bn(s)){let a=oe(this.webPath,"index.html");return Bn(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 pg(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=`
|
|
27
|
+
`:"");ht.writeFileSync(this.logFilePath,o,"utf8"),u.info("\u5DF2\u6E05\u7406\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55",{recordsToRemove:r,maxRecords:this.maxRecords})}catch(e){u.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25",{error:e})}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){u.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{error:t})}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},Ln=class{static{i(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||bs.getConfigDir()}getLogFilePath(){return new As({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!ht.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=ht.readFileSync(e,"utf8").trim().split(`
|
|
28
|
+
`).filter(o=>o.trim()!==""),s=[];for(let o of r)try{let a=JSON.parse(o);a.time&&(a.timestamp=new Date(a.time).getTime()),a.timestamp||u.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233",{line:o}),s.push(a)}catch{u.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C",{line:o})}return s.sort((o,a)=>(a.timestamp||0)-(o.timestamp||0)),s}catch(t){throw u.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25",{error:t}),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(s=>s.toolName.toLowerCase().includes(t.toolName?.toLowerCase()??""))),t.serverName&&(r=r.filter(s=>s.serverName?.toLowerCase().includes(t.serverName?.toLowerCase()??""))),t.success!==void 0&&(r=r.filter(s=>s.success===t.success)),t.startDate||t.endDate){let s=t.startDate?new Date(t.startDate).getTime():0,o=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(a=>{let c=a.timestamp||0;return c>=s&&c<=o})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),s=r.length,o=Math.min(e.limit||50,1e3),a=e.offset||0,c=r.slice(a,a+o),l=a+o<s;return u.info("\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7",{count:c.length,total:s}),{records:c,total:s,hasMore:l}}}});var Er,xi=d(()=>{"use strict";D();dt();gt();Er=class{static{i(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=u}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case pt.INITIALIZE:return await this.handleInitialize(e.params,e.id);case pt.INITIALIZED:return await this.handleInitializedNotification(e.params);case pt.TOOLS_LIST:return await this.handleToolsList(e.id);case pt.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case pt.RESOURCES_LIST:return await this.handleResourcesList(e.id);case pt.PROMPTS_LIST:return await this.handlePromptsList(e.id);case pt.PING:return await this.handlePing(e.id);default:if(t)return this.logger.warn(`\u6536\u5230\u672A\u77E5\u7684\u901A\u77E5\u6D88\u606F: ${e.method}`,e),null;throw new Error(`\u672A\u77E5\u7684\u65B9\u6CD5: ${e.method}`)}}catch(t){return this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t),e.id===void 0?null:this.createErrorResponse(t,e.id)}}async handleInitialize(e,t){this.logger.debug("\u5904\u7406 initialize \u8BF7\u6C42",e);let r=e.protocolVersion,s=vs.includes(r)?r:ut.DEFAULT;return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${r}, \u670D\u52A1\u5668\u54CD\u5E94=${s}`),{jsonrpc:"2.0",result:{serverInfo:{name:Ci.NAME,version:Ci.VERSION},capabilities:{tools:{},logging:{}},protocolVersion:s},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.debug("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.debug("\u5904\u7406 tools/list \u8BF7\u6C42");try{let r=this.serviceManager.getAllTools().map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}));return{jsonrpc:"2.0",result:{tools:r},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=Cu(e),s=await this.serviceManager.callTool(r.name,r.arguments||{});return{jsonrpc:"2.0",result:{content:s.content,isError:s.isError||!1},id:t!==void 0?t:1}}catch(r){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,r),r}}async handlePing(e){return this.logger.debug("\u5904\u7406 ping \u8BF7\u6C42"),{jsonrpc:"2.0",result:{status:"ok",timestamp:new Date().toISOString()},id:e!==void 0?e:1}}async handleResourcesList(e){this.logger.debug("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.debug("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u63D0\u793A\u6A21\u677F`),{jsonrpc:"2.0",result:{prompts:t},id:e!==void 0?e:1}}createErrorResponse(e,t){let r=-32603;return e.message.includes("\u672A\u627E\u5230\u5DE5\u5177")||e.message.includes("\u672A\u77E5\u7684\u65B9\u6CD5")?r=-32601:(e.message.includes("\u53C2\u6570")||e.message.includes("\u4E0D\u80FD\u4E3A\u7A7A"))&&(r=-32602),{jsonrpc:"2.0",error:{code:r,message:e.message,data:{stack:e.stack}},id:t!==void 0?t:1}}getServiceManager(){return this.serviceManager}}});import{EventEmitter as Pg}from"events";import{isModelScopeURL as bg}from"@xiaozhi-client/config";import{configManager as Se}from"@xiaozhi-client/config";var ws,Su=d(()=>{"use strict";D();gt();gt();hr();Ce();On();$n();xi();ws=class extends Pg{static{i(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=k();toolCallLogger;retryTimers=new Map;failedServices=new Set;messageHandler;eventListeners;isRunning=!1;config;constructor(e){super(),e&&this.isUnifiedServerConfig(e)?(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info",...e},this.configs=e.configs||{}):(this.config={name:"MCPServiceManager",enableLogging:!0,logLevel:"info"},this.configs=e||{});let r=process.env.NODE_ENV==="test"||process.env.VITEST==="true"?`/tmp/xiaozhi-test-${Date.now()}-${Math.random().toString(36).substring(2,11)}/xiaozhi.cache.json`:void 0;this.cacheManager=new mt(r),this.customMCPHandler=new Ps(this.cacheManager,this);let s=Se.getToolCallLogConfig(),o=Se.getConfigDir();this.toolCallLogger=new As(s,o),this.eventListeners={serviceConnected:i(async a=>{await this.handleServiceConnected(a)},"serviceConnected"),serviceDisconnected:i(async a=>{await this.handleServiceDisconnected(a)},"serviceDisconnected"),serviceConnectionFailed:i(async a=>{await this.handleServiceConnectionFailed(a)},"serviceConnectionFailed")},this.setupEventListeners(),this.messageHandler=new Er(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.onEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.onEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}async handleServiceConnected(e){u.debug(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u6210\u529F\uFF0C\u5F00\u59CB\u5237\u65B0\u5DE5\u5177\u7F13\u5B58`);try{this.services.get(e.serviceName)&&(await this.refreshCustomMCPHandlerPublic(),u.info(`\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5237\u65B0\u5B8C\u6210`))}catch(t){u.error(`\u5237\u65B0\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5931\u8D25`,{error:t})}}async handleServiceDisconnected(e){u.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\uFF0C\u539F\u56E0: ${e.reason||"\u672A\u77E5"}`);try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic(),u.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5B8C\u6210`)}catch(t){u.error(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5931\u8D25`,{error:t})}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch(t){u.error("\u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}async startAllServices(){u.debug("[MCPManager] \u6B63\u5728\u542F\u52A8\u6240\u6709 MCP \u670D\u52A1...");try{this.customMCPHandler.initialize(),u.debug("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(c){u.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25",{error:c})}let e=Object.entries(this.configs);if(e.length===0){u.warn("[MCPManager] \u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\uFF0C\u8BF7\u4F7F\u7528 addServiceConfig() \u6DFB\u52A0\u670D\u52A1\u914D\u7F6E");return}u.info(`[MCPManager] \u5F00\u59CB\u5E76\u884C\u542F\u52A8 ${e.length} \u4E2A MCP \u670D\u52A1`);let t=e.map(async([c])=>{try{return await this.startService(c),{serviceName:c,success:!0,error:null}}catch(l){return{serviceName:c,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),s=0,o=0,a=[];for(let c of r)c.status==="fulfilled"?c.value.success?s++:(o++,a.push(c.value.serviceName)):o++;u.info(`[MCPManager] \u670D\u52A1\u542F\u52A8\u5B8C\u6210 - \u6210\u529F: ${s}, \u5931\u8D25: ${o}`),a.length>0&&(u.warn(`[MCPManager] \u4EE5\u4E0B\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${a.join(", ")}`),o===e.length&&u.warn("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25\uFF0C\u4F46\u7CFB\u7EDF\u5C06\u7EE7\u7EED\u8FD0\u884C\u4EE5\u4FBF\u91CD\u8BD5")),a.length>0&&this.scheduleFailedServicesRetry(a)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r={name:e,...t},s=new Dn(r);await s.connect(),this.services.set(e,s),await this.refreshToolsCache();let o=s.getTools();u.debug(`[MCPManager] ${e} \u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u52A0\u8F7D\u4E86 ${o.length} \u4E2A\u5DE5\u5177:`,o.map(a=>a.name).join(", "))}catch(r){throw u.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),this.services.delete(e),r}}async stopService(e){u.info(`[MCPManager] \u505C\u6B62 MCP \u670D\u52A1: ${e}`);let t=this.services.get(e);if(!t){u.warn(`[MCPManager] \u670D\u52A1 ${e} \u4E0D\u5B58\u5728\u6216\u672A\u542F\u52A8`);return}try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache(),u.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){throw u.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),s=this.configs[e];s&&this.cacheManager.writeCacheEntry(e,r,s).then(()=>{u.debug(`[MCPManager] \u5DF2\u5C06 ${e} \u5DE5\u5177\u5217\u8868\u5199\u5165\u7F13\u5B58`)}).catch(o=>{u.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)});for(let o of r){let a=`${e}__${o.name}`;this.tools.set(a,{serviceName:e,originalName:o.name,tool:o})}}await this.syncToolsConfigToFile()}getAllTools(e="all"){let t=[];for(let[s,o]of this.services)try{if(o.isConnected()){let a=o.getTools();for(let c of a)try{let l=Se.isToolEnabled(s,c.name),p=Se.getMcpServerConfig()[s].tools[c.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let m=`${s}__${c.name}`;t.push({name:m,description:c.description||"",inputSchema:c.inputSchema,serviceName:s,originalName:c.name,enabled:l,usageCount:p.usageCount??0,lastUsedTime:p.lastUsedTime??""})}catch(l){u.warn(`[MCPManager] \u68C0\u67E5\u5DE5\u5177 ${s}.${c.name} \u542F\u7528\u72B6\u6001\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:l})}}}catch(a){u.warn(`[MCPManager] \u83B7\u53D6\u670D\u52A1 ${s} \u7684\u5DE5\u5177\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u670D\u52A1`,{error:a})}let r=[];try{r=this.customMCPHandler.getTools(),u.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A customMCP \u5DE5\u5177`)}catch(s){u.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5931\u8D25\uFF0C\u5C06\u53EA\u8FD4\u56DE\u6807\u51C6 MCP \u5DE5\u5177",{error:s}),r=[]}if(e!=="disabled")for(let s of r)try{t.push({name:s.name,description:s.description||"",inputSchema:s.inputSchema,serviceName:this.getServiceNameForTool(s),originalName:s.name,enabled:!0,usageCount:0,lastUsedTime:""})}catch(o){u.warn(`[MCPManager] \u5904\u7406 CustomMCP \u5DE5\u5177 ${s.name} \u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:o})}return u.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${t.length} \u4E2A\u53EF\u7528\u5DE5\u5177\uFF08status=${e}\uFF09`),t}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t,r){let s=Date.now(),o="unknown",a=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(o=this.getLogServerName(l),a=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(c=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(c=await this.customMCPHandler.callTool(e,t,r),u.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);o=l.serviceName,a=l.originalName;let p=this.services.get(l.serviceName);if(!p)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!p.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await p.callTool(l.originalName,t||{}),u.debug("[MCPManager] \u5DE5\u5177\u8C03\u7528\u6210\u529F",{toolName:e,result:c}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:a,serverName:o,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-s}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:a,serverName:o,arguments:t,result:null,success:!1,duration:Date.now()-s,error:c instanceof Error?c.message:String(c)}),this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l?.handler?.type==="mcp"?this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!1):(this.updateToolStatsSafe(e,"customMCP",e,!1),u.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}else{let l=this.tools.get(e);l&&(this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1),u.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}throw c}}async updateToolStats(e,t,r,s){try{let o=new Date().toISOString();s?(await this.updateCustomMCPToolStats(e,o),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,o),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)):(await this.updateCustomMCPToolLastUsedTime(e,o),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,o),u.debug("[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177\u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F",{toolName:e}))}catch(o){throw u.error("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,error:o}),o}}async updateToolStatsSafe(e,t,r,s){try{await this.updateToolStats(e,t,r,s)}catch(o){let a=s?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F";u.warn("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,action:a,error:o})}}async updateCustomMCPToolStats(e,t){try{await Se.updateToolUsageStatsWithLock(e,!0),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u7EDF\u8BA1`)}catch(r){throw u.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u5931\u8D25`,{error:r}),r}}async updateCustomMCPToolLastUsedTime(e,t){try{await Se.updateToolUsageStatsWithLock(e,!1),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(r){throw u.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:r}),r}}async updateMCPServerToolStats(e,t,r){try{await Se.updateMCPServerToolStatsWithLock(e,t,r,!0),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1`)}catch(s){throw u.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u5931\u8D25`,{error:s}),s}}async updateMCPServerToolLastUsedTime(e,t,r){try{await Se.updateMCPServerToolStatsWithLock(e,t,r,!1),u.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(s){throw u.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:s}),s}}async callMCPTool(e,t,r){let{serviceName:s,toolName:o}=t;u.debug(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${s}.${o}`);let a=this.services.get(s);if(!a)throw new Error(`\u670D\u52A1 ${s} \u4E0D\u53EF\u7528`);if(!a.isConnected())throw new Error(`\u670D\u52A1 ${s} \u672A\u8FDE\u63A5`);try{let c=await a.callTool(o,r||{});return u.debug(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),c}catch(c){throw u.error(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}),c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){u.info("[MCPManager] \u6B63\u5728\u505C\u6B62\u6240\u6709 MCP \u670D\u52A1..."),this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect(),u.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){u.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message})}try{this.customMCPHandler.cleanup(),u.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){u.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u6E05\u7406\u5931\u8D25",{error:e})}try{Se.clearAllStatsUpdateLocks(),u.info("[MCPManager] \u7EDF\u8BA1\u66F4\u65B0\u9501\u5DF2\u6E05\u7406")}catch(e){u.error("[MCPManager] \u6E05\u7406\u7EDF\u8BA1\u66F4\u65B0\u9501\u5931\u8D25",{error:e})}this.services.clear(),this.tools.clear(),u.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u5DF2\u505C\u6B62")}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=Se.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch(e){return u.warn("[MCPManager] \u83B7\u53D6\u7EDF\u8BA1\u66F4\u65B0\u76D1\u63A7\u4FE1\u606F\u5931\u8D25",{error:e}),{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{u.debug("\u91CD\u65B0\u521D\u59CB\u5316CustomMCPHandler"),this.customMCPHandler.initialize(),u.debug("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw u.error("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25",{error:e}),e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch(t){return u.warn(`[MCPManager] \u68C0\u67E5 CustomMCP \u5DE5\u5177 ${e} \u662F\u5426\u5B58\u5728\u5931\u8D25`,{error:t}),!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch(e){return u.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5217\u8868\u5931\u8D25\uFF0C\u8FD4\u56DE\u7A7A\u6570\u7EC4",{error:e}),[]}}isModelScopeService(e){return e.url?bg(e.url):!1}handleModelScopeAuth(e,t,r){if(t.headers?.Authorization){u.info(`[MCPManager] \u670D\u52A1 ${e} \u4F7F\u7528\u5DF2\u6709\u7684 Authorization header`);return}let o=Se.getModelScopeApiKey();if(o){r.apiKey=o,u.info(`[MCPManager] \u4E3A ${e} \u670D\u52A1\u6DFB\u52A0 ModelScope API Key`);return}let a=t.url||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${e}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${a}\u8BF7\u9009\u62E9\u4EE5\u4E0B\u4EFB\u4E00\u65B9\u5F0F\u914D\u7F6E\u8BA4\u8BC1\uFF1A1. \u5728\u670D\u52A1\u914D\u7F6E\u4E2D\u6DFB\u52A0 headers.Authorization2. \u6216\u8005\u5728\u5168\u5C40\u914D\u7F6E\u4E2D\u8BBE\u7F6E modelscope.apiKey3. \u6216\u8005\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF MODELSCOPE_API_TOKEN\u83B7\u53D6 ModelScope API Key: https://modelscope.cn/my?myInfo=true`)}enhanceServiceConfig(e,t){let r={...t};try{return this.isModelScopeService(t)&&this.handleModelScopeAuth(e,t,r),r}catch(s){throw u.error(`[MCPManager] \u914D\u7F6E\u589E\u5F3A\u5931\u8D25: ${e}`,{error:s}),s}}addServiceConfig(e,t){let r,s;if(typeof e=="string"&&t)s=e,r=t;else if(typeof e=="object"){let a=e;s=a.name,r=a}else throw new Error("Invalid arguments for addServiceConfig");let o=this.enhanceServiceConfig(s,r);this.configs[s]=o,u.debug(`[MCPManager] \u5DF2\u6DFB\u52A0\u670D\u52A1\u914D\u7F6E: ${s}`)}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(e,t);this.configs[e]=r,u.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5E76\u589E\u5F3A\u670D\u52A1\u914D\u7F6E: ${e}`)}removeServiceConfig(e){delete this.configs[e],u.debug(`[MCPManager] \u5DF2\u79FB\u9664\u670D\u52A1\u914D\u7F6E: ${e}`)}async syncToolsConfigToFile(){try{u.debug("[MCPManager] \u5F00\u59CB\u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6");let e=Se.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let s=r.getTools();if(s.length===0)continue;let o=e[t]?.tools||{},a={};for(let f of s){let S=o[f.name];S?a[f.name]={...S,description:f.description||S.description||""}:a[f.name]={description:f.description||"",enable:!0}}let c=s.map(f=>f.name),p=Object.keys(o).filter(f=>!c.includes(f));if(p.length>0&&u.info(`[MCPManager] \u68C0\u6D4B\u5230\u670D\u52A1 ${t} \u79FB\u9664\u4E86 ${p.length} \u4E2A\u5DE5\u5177: ${p.join(", ")}`),this.hasToolsConfigChanged(o,a)){Se.updateServerToolsConfig(t,a);let f=Object.keys(a).filter(g=>!o[g]),S=Object.keys(a).filter(g=>{let P=o[g],w=a[g];return P&&P.description!==w.description});u.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),f.length>0&&u.debug(` - \u65B0\u589E\u5DE5\u5177: ${f.join(", ")}`),S.length>0&&u.debug(` - \u66F4\u65B0\u5DE5\u5177: ${S.join(", ")}`),p.length>0&&u.debug(` - \u79FB\u9664\u5DE5\u5177: ${p.join(", ")}`)}}u.debug("[MCPManager] \u5DE5\u5177\u914D\u7F6E\u540C\u6B65\u5B8C\u6210")}catch(e){u.error("[MCPManager] \u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25",{error:e})}}hasToolsConfigChanged(e,t){let r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!0;let o=s.filter(c=>!r.includes(c)),a=r.filter(c=>!s.includes(c));if(o.length>0||a.length>0)return!0;for(let c of r){let l=e[c],p=t[c];if(l.description!==p.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;u.info(`[MCPManager] \u5B89\u6392 ${e.length} \u4E2A\u5931\u8D25\u670D\u52A1\u7684\u91CD\u8BD5`);let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e)),u.debug(`[MCPManager] \u5B89\u6392\u670D\u52A1 ${e} \u5728 ${t}ms \u540E\u91CD\u8BD5`);let s=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,s)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e),u.info(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u6210\u529F`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){u.error("[MCPManager] \u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}catch(t){u.error(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u5931\u8D25`,{error:t.message});let r=this.getRetryDelay(e),s=Math.min(r*2,3e5);u.debug(`[MCPManager] \u670D\u52A1 ${e} \u4E0B\u6B21\u91CD\u8BD5\u5C06\u5728 ${s}ms \u540E\u8FDB\u884C`),this.scheduleServiceRetry(e,s)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,s)=>r+s.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e),u.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`)),this.failedServices.delete(e)}stopAllServiceRetries(){u.info("[MCPManager] \u505C\u6B62\u6240\u6709\u670D\u52A1\u91CD\u8BD5");for(let[e,t]of this.retryTimers)clearTimeout(t),u.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");u.info("\u542F\u52A8 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.startAllServices(),this.isRunning=!0,u.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw u.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u5931\u8D25",{error:e}),e}}async stop(){if(this.isRunning){u.info("\u505C\u6B62 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.stopAllServices(),this.isRunning=!1,u.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw u.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u5931\u8D25",{error:e}),e}}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames(),u.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 customMCP \u72B6\u6001: ${e} \u4E2A\u5DE5\u5177`)}catch(c){u.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u72B6\u6001\u5931\u8D25\uFF0C\u5C06\u53EA\u5305\u542B\u6807\u51C6 MCP \u5DE5\u5177",{error:c}),e=0,t=[]}let r=this.tools.size+e,o=[...Array.from(this.tools.keys()),...t],a={services:{},totalTools:r,availableTools:o};for(let[c,l]of this.services){let p=l.getStatus();a.services[c]={connected:p.connected,clientName:`xiaozhi-${c}-client`}}return e>0&&(a.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),a}isServerRunning(){return this.isRunning}isUnifiedServerConfig(e){return e!==null&&typeof e=="object"&&"configs"in e}async routeMessage(e){let t=await this.messageHandler.handleMessage(e);return t===null?null:{jsonrpc:"2.0",method:"response",params:t,id:t.id}}async initialize(){await this.start()}getToolRegistry(){return this}getConnectionManager(){return this}async cleanup(){await this.stopAllServices(),this.eventBus.offEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.offEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.offEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}}});import{MCPConnection as Ag}from"@xiaozhi-client/mcp-core";var Dn,vu=d(()=>{"use strict";dt();Ce();Dn=class{static{i(this,"MCPService")}connection;eventBus=k();constructor(e){let{name:t,...r}=e,s={onConnected:i(o=>{this.eventBus.emitEvent(wn.CONNECTED,o)},"onConnected"),onDisconnected:i(o=>{this.eventBus.emitEvent(wn.DISCONNECTED,o)},"onDisconnected"),onConnectionFailed:i(o=>{this.eventBus.emitEvent(wn.CONNECTION_FAILED,o)},"onConnectionFailed")};this.connection=new Ag(t,r,s)}async connect(){return this.connection.connect()}async disconnect(){return this.connection.disconnect()}async callTool(e,t){return this.connection.callTool(e,t)}getTools(){return this.connection.getTools()}getConfig(){return this.connection.getConfig()}getStatus(){return this.connection.getStatus()}isConnected(){return this.connection.isConnected()}}});import{TypeFieldNormalizer as r_}from"@xiaozhi-client/mcp-core";function Cu(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new ft(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new ft(-32602,"\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(t.validateArguments&&r.arguments!==void 0&&r.arguments!==null&&(typeof r.arguments!="object"||Array.isArray(r.arguments)))throw new ft(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!t.allowEmptyArguments&&r.arguments!==void 0&&r.arguments!==null){let s=r.arguments;if(Object.keys(s).length===0)throw new ft(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let s=t.customValidator(r);if(s)throw new ft(-32602,s)}return{name:r.name,arguments:r.arguments}}var yu=d(()=>{"use strict";hr();i(Cu,"validateToolCallParams")});var Tu=d(()=>{"use strict"});import{Hono as wg}from"hono";var _u,kn,Fn=d(()=>{"use strict";_u=i(()=>new wg,"createApp"),kn=i(n=>{let e=n.get("mcpServiceManager");if(!e)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u68C0\u67E5 mcpServiceManagerMiddleware \u662F\u5426\u6B63\u786E\u914D\u7F6E");return e},"requireMCPServiceManager")});var Hn=d(()=>{"use strict"});var Oi=d(()=>{"use strict";Ii();Tu();Mi();Fn();Hn()});import{createHash as Ig}from"crypto";import{existsSync as Is,mkdirSync as Mg,readFileSync as Ru,renameSync as xg,writeFileSync as Pu}from"fs";import{dirname as Og,resolve as bu}from"path";import Ng from"dayjs";var mt,Au=d(()=>{"use strict";D();dt();Oi();mt=class{static{i(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=Si.CACHE_VERSION;CACHE_ENTRY_VERSION=Si.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=iu.CLEANUP_INTERVAL;constructor(e){this.logger=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Ng().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return bu(e,Ti.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return bu(t,Ti.FILENAME)}}async ensureCacheFile(){try{if(!Is(this.cachePath)){let e=Og(this.cachePath);Is(e)||(Mg(e,{recursive:!0}),this.logger.debug(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55: ${e}`)),this.logger.debug("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u521D\u59CB\u7F13\u5B58\u6587\u4EF6");let t=await this.createInitialCache();await this.saveCache(t),this.logger.info(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u6587\u4EF6: ${this.cachePath}`)}}catch(e){this.logger.warn(`[CacheManager] \u521B\u5EFA\u7F13\u5B58\u6587\u4EF6\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async createInitialCache(){let e=this.formatTimestamp();return{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:e,totalWrites:0,createdAt:e}}}async writeCacheEntry(e,t,r){try{this.logger.debug(`[CacheManager] \u5F00\u59CB\u5199\u5165\u7F13\u5B58: ${e}`),await this.ensureCacheFile();let s=await this.loadExistingCache(),o=this.generateConfigHash(r),a={tools:t.map(c=>({name:c.name,description:c.description||"",inputSchema:c.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:o,version:this.CACHE_ENTRY_VERSION};s.mcpServers[e]=a,s.metadata.lastGlobalUpdate=this.formatTimestamp(),s.metadata.totalWrites+=1,await this.saveCache(s),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(s){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)}}async loadExistingCache(){try{if(!Is(this.cachePath))return await this.createInitialCache();let e=Ru(this.cachePath,"utf8"),t=JSON.parse(e);return this.validateCacheStructure(t)?t:(this.logger.warn("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u7ED3\u6784\u65E0\u6548\uFF0C\u91CD\u65B0\u521B\u5EFA"),await this.createInitialCache())}catch(e){return this.logger.warn(`[CacheManager] \u52A0\u8F7D\u7F13\u5B58\u5931\u8D25\uFF0C\u521B\u5EFA\u65B0\u7F13\u5B58: ${e instanceof Error?e.message:String(e)}`),await this.createInitialCache()}}async saveCache(e){let t=JSON.stringify(e,null,2);await this.atomicWrite(this.cachePath,t)}async atomicWrite(e,t){let r=`${e}.tmp`;try{Pu(r,t,"utf8"),xg(r,e)}catch(s){try{Is(r)&&Pu(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return Ig("sha256").update(JSON.stringify(e)).digest("hex")}catch(t){return this.logger.warn(`[CacheManager] \u751F\u6210\u914D\u7F6E\u54C8\u5E0C\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`),""}}validateCacheStructure(e){try{if(!e||typeof e!="object")return!1;let t=e,r=t.metadata;return typeof t.version=="string"&&typeof t.mcpServers=="object"&&t.mcpServers!==null&&t.metadata!==null&&t.metadata!==void 0&&typeof r=="object"&&r!==null&&typeof r.lastGlobalUpdate=="string"&&typeof r.totalWrites=="number"&&typeof r.createdAt=="string"}catch{return!1}}async getStats(){try{let e=await this.loadExistingCache();return{totalWrites:e.metadata.totalWrites,lastUpdate:e.metadata.lastGlobalUpdate,serverCount:Object.keys(e.mcpServers).length,cacheFileSize:Is(this.cachePath)?Ru(this.cachePath,"utf8").length:0}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),null}}getFilePath(){return this.cachePath}async getAllCachedTools(){try{let e=await this.loadExistingCache(),t=[];for(let[r,s]of Object.entries(e.mcpServers))for(let o of s.tools)t.push({...o,name:`${r}${lu.SERVICE_TOOL_SEPARATOR}${o.name}`});return this.logger.debug(`[CacheManager] \u83B7\u53D6\u5230\u6240\u6709\u7F13\u5B58\u5DE5\u5177\uFF0C\u5171 ${t.length} \u4E2A`),t}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),[]}}async writeCustomMCPResult(e,t,r,s="completed",o,a=3e5){try{let c=await this.loadExtendedCache(),l=He(e,t),p={result:r,timestamp:new Date().toISOString(),ttl:a,status:s,consumed:!1,taskId:o,retryCount:0};c.customMCPResults||(c.customMCPResults={}),c.customMCPResults[l]=p,await this.saveExtendedCache(c),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${s}`)}catch(c){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),s=He(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return null;let o=r.customMCPResults[s],a=Date.now(),c=new Date(o.timestamp).getTime();return a-c>o.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):o}catch(r){return this.logger.warn(`[CacheManager] \u8BFB\u53D6CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),null}}async updateCustomMCPStatus(e,t,r,s,o){try{let a=await this.loadExtendedCache(),c=He(e,t);if(!a.customMCPResults||!a.customMCPResults[c])return!1;let l=a.customMCPResults[c],p=l.status;return l.status=r,l.timestamp=new Date().toISOString(),s&&(l.result=s),o&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${o}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(a),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${p} -> ${r}`),!0}catch(a){return this.logger.warn(`[CacheManager] \u66F4\u65B0CustomMCP\u7F13\u5B58\u72B6\u6001\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`),!1}}async markCustomMCPAsConsumed(e,t){try{let r=await this.loadExtendedCache(),s=He(e,t);if(!r.customMCPResults||!r.customMCPResults[s])return!1;let o=r.customMCPResults[s];return o.consumed||(o.consumed=!0,o.timestamp=new Date().toISOString(),await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${e}`)),!0}catch(r){return this.logger.warn(`[CacheManager] \u6807\u8BB0CustomMCP\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async deleteCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),s=He(e,t);return!r.customMCPResults||!r.customMCPResults[s]?!1:(delete r.customMCPResults[s],await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u5220\u9664\u7F13\u5B58\u6761\u76EE: ${e}`),!0)}catch(r){return this.logger.warn(`[CacheManager] \u5220\u9664CustomMCP\u7F13\u5B58\u6761\u76EE\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async cleanupCustomMCPResults(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[s,o]of t)Ts(o)&&(delete e.customMCPResults[s],r++);return r>0&&(await this.saveExtendedCache(e),this.logger.info(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58: ${r}/${t.length}`)),{cleaned:r,total:t.length}}catch(e){return this.logger.warn(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{cleaned:0,total:0}}}async getCustomMCPStatistics(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0};let t=Object.values(e.customMCPResults),r=t.length,s=t.filter(m=>m.status==="pending").length,o=t.filter(m=>m.status==="completed").length,a=t.filter(m=>m.status==="failed").length,c=t.filter(m=>m.consumed).length,l=o>0?c/o*100:0,p=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:s,completedTasks:o,failedTasks:a,consumedEntries:c,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:p}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6CustomMCP\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0}}}async loadExtendedCache(){try{return await this.loadExistingCache()}catch(e){return this.logger.warn(`[CacheManager] \u52A0\u8F7D\u6269\u5C55\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:this.formatTimestamp(),totalWrites:0,createdAt:this.formatTimestamp()},customMCPResults:{}}}}async saveExtendedCache(e){await this.saveCache(e)}startCleanupTimer(){this.cleanupInterval=setInterval(()=>{this.cleanupCustomMCPResults().catch(e=>{this.logger.warn(`[CacheManager] \u81EA\u52A8\u6E05\u7406\u5931\u8D25: ${e}`)})},this.CLEANUP_INTERVAL),this.logger.debug(`[CacheManager] \u542F\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${this.CLEANUP_INTERVAL}ms`)}stopCleanupTimer(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=void 0,this.logger.debug("[CacheManager] \u505C\u6B62\u6E05\u7406\u5B9A\u65F6\u5668"))}cleanup(){this.stopCleanupTimer(),this.logger.debug("[CacheManager] \u6E05\u7406\u8D44\u6E90\u5B8C\u6210")}}});var gt=d(()=>{"use strict";Su();vu();hr();yu();xi();Au();On();$n()});var Un,wu=d(()=>{"use strict";D();dt();gt();Un=class{static{i(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=u,this.config={maxMessageSize:e.maxMessageSize??cu.DEFAULT,enableMetrics:e.enableMetrics??!0},this.metrics={totalMessages:0,errorCount:0,averageResponseTime:0},this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxMessageSize:this.config.maxMessageSize,enableMetrics:this.config.enableMetrics})}getMCPServiceManager(e){let t=e.get("mcpServiceManager");if(t)return t;let r=e.get("webServer");if(!r)throw new Error("WebServer \u672A\u5728 Context \u4E2D\u627E\u5230\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u95F4\u4EF6\u914D\u7F6E");let s=r.getMCPServiceManager();return this.logger.debug("MCPServiceManager \u4ECE WebServer \u83B7\u53D6\uFF08Context \u4E2D\u672A\u627E\u5230\uFF09"),s}async initializeMessageHandler(e){if(!this.mcpMessageHandler)try{let t=this.getMCPServiceManager(e);this.mcpMessageHandler=new Er(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let s=e.req.header(Ie.CONTENT_LENGTH);if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${Dt.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(Ie.CONTENT_TYPE)?.includes(ne.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${Dt.INVALID_REQUEST}: ${Dt.INVALID_CONTENT_TYPE}`);let a=e.req.header("mcp-protocol-version")||e.req.header(Ie.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");a&&!vs.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${vs.join(", ")}`);let c;try{let m=await e.req.text();if(m.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);c=JSON.parse(m),r=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,Dt.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${Dt.INVALID_REQUEST}: Message does not conform to JSON-RPC ${"2.0"}`,r);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let l=await this.mcpMessageHandler.handleMessage(c);this.metrics.totalMessages++;let p=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+p)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:c.method,messageId:r,responseTime:p,isNotification:l===null}),l===null?new Response(null,{status:lt.NO_CONTENT,headers:{[Ie.MCP_PROTOCOL_VERSION]:ut.DEFAULT,[Ie.X_RESPONSE_TIME]:p.toString()}}):e.json(l,lt.OK,{[Ie.CONTENT_TYPE]:ne.APPLICATION_JSON,[Ie.MCP_PROTOCOL_VERSION]:ut.DEFAULT,[Ie.X_RESPONSE_TIME]:p.toString()})}catch(s){this.metrics.errorCount++;let o=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:s instanceof Error?s.message:String(s),messageId:r,responseTime:o,stack:s instanceof Error?s.stack:void 0});let a=s instanceof Error?s.message:String(s);return this.createErrorResponse(-32603,`${Dt.INTERNAL_ERROR}: ${a}`,r)}}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let s=r??`error-${Date.now()}`,o={jsonrpc:"2.0",error:{code:e,message:t},id:s};return new Response(JSON.stringify(o),{status:lt.BAD_REQUEST,headers:{[Ie.CONTENT_TYPE]:ne.APPLICATION_JSON,[Ie.MCP_PROTOCOL_VERSION]:ut.DEFAULT}})}getStatus(){return{isInitialized:this.mcpMessageHandler!==null,metrics:this.config.enableMetrics?this.metrics:void 0,config:{maxMessageSize:this.config.maxMessageSize}}}destroy(){this.logger.info("\u6B63\u5728\u9500\u6BC1 MCPRouteHandler"),this.mcpMessageHandler=null,this.logger.info("MCPRouteHandler \u9500\u6BC1\u5B8C\u6210")}}});var Iu=d(()=>{"use strict";D()});var y,Vn,Ni,Li,$i,G_,Di=d(()=>{"use strict";Iu();y=class n extends Error{static{i(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",s="system",o={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=s,this.timestamp=new Date().toISOString(),this.details={...o,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,code:this.code,message:this.message,severity:this.severity,category:this.category,details:this.details,timestamp:this.timestamp}}static configError(e,t,r={}){return new n(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new n(e,t,"high","connection",r)}static operationError(e,t,r={}){return new n(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new n(e,t,"high","system",r)}static validationError(e,t,r={}){return new n(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new n(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},Vn=class{static{i(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof y)}handle(e,t){return y.fromError(e,"INTERNAL_ERROR","system")}},Ni=class{static{i(this,"ConfigErrorHandler")}canHandle(e){return e.message.includes("\u914D\u7F6E")||e.message.includes("config")||e.message.includes("JSON")||e.message.includes("\u89E3\u6790")}handle(e,t){return y.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Li=class{static{i(this,"ConnectionErrorHandler")}canHandle(e){return e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")||e.message.includes("timeout")||e.message.includes("ECONNREFUSED")||e.message.includes("ENOTFOUND")}handle(e,t){return y.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},$i=class{static{i(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Ni),this.registerHandler(new Li),this.registerHandler(new Vn)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof y)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new Vn().handle(e,t)}},G_=new $i});import{normalizeServiceConfig as Dg}from"@xiaozhi-client/config";import{TypeFieldNormalizer as ki}from"@xiaozhi-client/mcp-core";var Ms,xe,Mu=d(()=>{"use strict";D();Di();Ce();Ms=class{static{i(this,"MCPHandler")}logger;mcpServiceManager;configManager;statusCache;constructor(e,t){this.logger=u,this.mcpServiceManager=e,this.configManager=t,this.statusCache=new Map}handleError(e,t,r){if(e instanceof y)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let o;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?o=y.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?o=y.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?o=y.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?o=y.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):o=y.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:o,operation:t,context:r}),o}let s=y.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:s,operation:t,context:r}),s}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let p=r,m=await this.addMCPServersBatch(p),f=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:m.addedCount,failedCount:m.failedCount,duration:f}),e.success(m,m.message,201)}let s=r,{name:o,config:a}=s,c=await this.addMCPServerSingle(o,a),l=Date.now()-t;return this.logger.info("addMCPServer",{serverName:o,toolsCount:c.tools?.length||0,duration:l,status:c.status}),e.success(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F",201)}catch(s){let o=this.handleError(s,"addMCPServer",{requestData:r}),a=500;return o.category==="validation"?a=400:o.category==="configuration"?o.code==="SERVER_ALREADY_EXISTS"?a=409:a=400:o.category==="connection"&&(a=500),e.fail(o.code,o.message,{error:o.details},a)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=ki.normalizeTypeField(t);try{let s=xe.validateServiceName(e);if(!s.isValid){let m=y.validationError("INVALID_SERVICE_NAME",s.errors.join(", "),{serverName:e,errors:s.errors});throw this.logger.error("addMCPServerSingle",{validationError:m,serverName:e,phase:"name_validation"}),m}if(xe.checkServiceExists(e,this.configManager)){let m=y.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:m,serverName:e,phase:"existence_check"}),m}let o=xe.validateConfig(r);if(!o.isValid){let m=y.configError("INVALID_CONFIG",o.errors.join(", "),{serverName:e,config:r,errors:o.errors});throw this.logger.error("addMCPServerSingle",{configError:m,serverName:e,phase:"config_validation"}),m}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let a=Dg(r);this.mcpServiceManager.addServiceConfig(e,a),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),p=this.getServiceTools(e).map(m=>m.name);return k().emitEvent("mcp:server:added",{serverName:e,config:r,tools:p,timestamp:new Date}),{...c,tools:p}}catch(s){let o=this.handleError(s,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:o,serverName:e}),o}}getServiceStatus(e){let r=this.configManager.getConfig().mcpServers[e];if(!r)return{name:e,status:"disconnected",connected:!1,tools:[],config:{}};try{let a=this.mcpServiceManager.services.get(e);if(a?.isConnected?.()){let c=a.getTools().map(p=>p.name),l={name:e,status:"connected",connected:!0,tools:c,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(o){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,o)}let s={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,s),s}checkAndEmitStatusChange(e,t){let r=this.getPreviousStatus(e);if(r&&r.status!==t.status&&(this.logger.info(`\u670D\u52A1 ${e} \u72B6\u6001\u53D8\u5316: ${r.status} -> ${t.status}`),k().emitEvent("mcp:server:status_changed",{serverName:e,oldStatus:r.status,newStatus:t.status,timestamp:new Date,reason:t.status==="connected"?"connection_established":"connection_lost"}),r.tools!==t.tools)){let s=t.tools.filter(a=>!r.tools.includes(a)),o=r.tools.filter(a=>!t.tools.includes(a));(s.length>0||o.length>0)&&k().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:s,removedTools:o,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){return this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=xe.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!xe.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let s=this.getServiceTools(t).map(o=>o.name);try{await this.mcpServiceManager.stopService(t)}catch(o){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,o)}return this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),k().emitEvent("mcp:server:removed",{serverName:t,affectedTools:s,timestamp:new Date}),e.success({name:t,operation:"removed",affectedTools:s},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F")}catch(t){if(this.logger.error("\u79FB\u9664 MCP \u670D\u52A1\u5931\u8D25:",t),t instanceof Error){if(t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728"))return e.fail("SERVER_NOT_FOUND",t.message,void 0,404);if(t.message.includes("\u914D\u7F6E\u66F4\u65B0"))return e.fail("CONFIG_UPDATE_FAILED",t.message,void 0,500)}return e.fail("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=xe.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!xe.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let s=this.getServiceStatus(t);return e.success(s,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")?e.fail("SERVER_NOT_FOUND",t.message,void 0,404):e.fail("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},s=[];for(let[a,c]of Object.entries(r)){let l=this.getServiceStatus(a);s.push(l)}let o={servers:s,total:s.length};return e.success(o,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t),e.fail("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async addMCPServersBatch(e){let{mcpServers:t}=e,r=Object.keys(t);if(this.logger.info("addMCPServersBatch",{serverCount:r.length,serverNames:r}),r.length===0)throw y.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let s=[],o=[],a=this.validateBatchServers(t);if(!a.isValid)throw y.validationError("INVALID_CONFIG",a.errors.join(", "));try{for(let[m,f]of Object.entries(t)){let S=ki.normalizeTypeField(f);try{let g=await this.addMCPServerSingle(m,S);s.push({name:m,success:!0,config:S,tools:g.tools,status:g.status}),o.push(m),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:m,toolsCount:g.tools?.length||0})}catch(g){let P=this.handleError(g,"addMCPServersBatch",{serverName:m,serverConfig:S});s.push({name:m,success:!1,error:P.message,config:S}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:m,error:P.message})}}let c=o.length,l=r.length-c;if(c===0)throw y.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");k().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:c,failedCount:l,successfullyAddedServers:o,results:s,timestamp:new Date});let p={success:c>0,message:c===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:s,addedCount:c,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:c,failedCount:l}),p}catch(c){throw o.length>0&&await this.rollbackBatchAdd(o),c instanceof y?c:y.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`)}}validateBatchServers(e){let t=[];if(!e||typeof e!="object")return t.push("mcpServers \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};let r=Object.keys(e);if(r.length===0)return t.push("mcpServers \u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A"),{isValid:!1,errors:t};if(r.length>50)return t.push("\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7 50 \u4E2A"),{isValid:!1,errors:t};for(let[s,o]of Object.entries(e)){let a=xe.validateServiceName(s);if(!a.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${a.errors.join(", ")}`);continue}if(xe.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let c=ki.normalizeTypeField(o),l=xe.validateConfig(c);l.isValid||t.push(`\u670D\u52A1 "${s}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let s of e)try{try{await this.mcpServiceManager.stopService(s)}catch(o){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${s} \u5931\u8D25:`,o)}this.mcpServiceManager.removeServiceConfig(s),this.configManager.removeMcpServer(s),t.push(s),k().emitEvent("mcp:server:rollback",{serverName:s,timestamp:new Date})}catch(o){let a=this.handleError(o,"rollbackBatchAdd",{serverName:s});r.push(s),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${s} \u5931\u8D25:`,a.message)}r.length>0?this.logger.warn("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u90E8\u5206\u5931\u8D25",{totalServers:e.length,rollbackedCount:t.length,failedCount:r.length,failedServers:r}):this.logger.info("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u6210\u529F",{totalServers:e.length,rollbackedCount:t.length})}};(r=>{function n(s){let o=[];if(!s||typeof s!="object")return o.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:o};if("command"in s)(!s.command||typeof s.command!="string")&&o.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),s.args&&!Array.isArray(s.args)&&o.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),s.env&&typeof s.env!="object"&&o.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in s){(!s.url||typeof s.url!="string")&&o.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(s.url)}catch{o.push("URL \u683C\u5F0F\u65E0\u6548")}}else o.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:o.length===0,errors:o}}r.validateConfig=n,i(n,"validateConfig");function e(s){let o=[];return!s||typeof s!="string"?(o.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:o}):((s.length<1||s.length>50)&&o.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(s)||o.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:o.length===0,errors:o})}r.validateServiceName=e,i(e,"validateServiceName");function t(s,o){let a=o.getConfig();return a.mcpServers&&s in a.mcpServers}r.checkServiceExists=t,i(t,"checkServiceExists")})(xe||={})});import{configManager as xs}from"@xiaozhi-client/config";var jn,xu=d(()=>{"use strict";D();Ce();Pi();jn=class{static{i(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=u,this.notificationService=e,this.statusService=t,this.eventBus=k()}async handleMessage(e,t,r){try{switch(this.logger.debug(`\u5904\u7406 WebSocket \u6D88\u606F: ${t.type}`,{clientId:r}),this.eventBus.emitEvent("websocket:message:received",{type:t.type,data:t.data,clientId:r}),t.type){case"getConfig":await this.handleGetConfig(e,r);break;case"updateConfig":await this.handleUpdateConfig(e,t.data,r);break;case"getStatus":await this.handleGetStatus(e,r);break;case"restartService":await this.handleRestartService(e,r);break;default:this.logger.warn(`\u672A\u77E5\u7684 WebSocket \u6D88\u606F\u7C7B\u578B: ${t.type}`,{clientId:r}),Fe(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`,this.logger)}}catch(s){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,s),Fe(e,"MESSAGE_PROCESSING_ERROR",s instanceof Error?s.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25",this.logger)}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=xs.getConfig();this.logger.debug("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t}),e.send(JSON.stringify({type:"config",data:r}))}catch(r){this.logger.error("WebSocket: getConfig \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),Fe(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25",this.logger)}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{if(xs.validateConfig(t),xs.updateConfig(t),t.mcpServerConfig)for(let[s,o]of Object.entries(t.mcpServerConfig))for(let[a,c]of Object.entries(o.tools))xs.setToolEnabled(s,a,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(s){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",s),Fe(e,"CONFIG_UPDATE_ERROR",s instanceof Error?s.message:String(s),this.logger)}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),Fe(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25",this.logger)}}async handleRestartService(e,t){this.logDeprecationWarning("WebSocket restartService","POST /api/services/restart");try{this.logger.info("WebSocket: \u6536\u5230\u670D\u52A1\u91CD\u542F\u8BF7\u6C42",{clientId:t}),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:`websocket-${t}`,delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting")}catch(r){this.logger.error("WebSocket: \u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",r),Fe(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",this.logger)}}logDeprecationWarning(e,t){this.logger.warn(`[DEPRECATED] ${e} \u529F\u80FD\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 ${t} \u66FF\u4EE3`)}async sendInitialData(e,t){try{this.logger.debug("\u53D1\u9001\u521D\u59CB\u6570\u636E\u7ED9\u5BA2\u6237\u7AEF",{clientId:t});let r=xs.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let s=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:s.client})),s.restart&&e.send(JSON.stringify({type:"restartStatus",data:s.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),Fe(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25",this.logger)}}handleClientDisconnect(e){this.logger.debug(`\u5BA2\u6237\u7AEF\u65AD\u5F00\u8FDE\u63A5: ${e}`),this.notificationService.unregisterClient(e)}handleClientConnect(e,t){this.logger.debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5: ${t}`),this.notificationService.registerClient(t,e)}}});import{spawn as kg}from"child_process";var Bn,Ou=d(()=>{"use strict";D();In();Ce();Fn();Bn=class{static{i(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u,this.statusService=e,this.eventBus=k()}spawnXiaozhiProcess(e){let t=kg("xiaozhi",e,{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}});return t.unref(),this.logger.info(`MCP \u670D\u52A1\u547D\u4EE4\u5DF2\u53D1\u9001: xiaozhi ${e.join(" ")}`),t}async restartService(e){try{e.get("logger").info("\u5904\u7406\u670D\u52A1\u91CD\u542F\u8BF7\u6C42"),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:"http-api",delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting");let t=kn(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},yi.SUCCESS_NOTIFICATION_DELAY)}catch(r){e.get("logger").error("\u670D\u52A1\u91CD\u542F\u5931\u8D25:",r),this.statusService.updateRestartStatus("failed",r instanceof Error?r.message:"\u672A\u77E5\u9519\u8BEF")}},yi.EXECUTION_DELAY),e.success(null,"\u91CD\u542F\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25:",t),e.fail("RESTART_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async executeRestart(e){this.logger.info("\u6B63\u5728\u91CD\u542F MCP \u670D\u52A1...");try{if(!e.getStatus().isRunning){this.logger.warn("MCP \u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u5C1D\u8BD5\u542F\u52A8\u670D\u52A1"),this.spawnXiaozhiProcess(["start","--daemon"]);return}this.spawnXiaozhiProcess(["restart","--daemon"])}catch(t){throw this.logger.error("\u91CD\u542F\u670D\u52A1\u5931\u8D25:",t),t}}async stopService(e){try{return e.get("logger").info("\u5904\u7406\u670D\u52A1\u505C\u6B62\u8BF7\u6C42"),this.spawnXiaozhiProcess(["stop"]),e.success(null,"\u505C\u6B62\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25:",t),e.fail("STOP_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u505C\u6B62\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async startService(e){try{return e.get("logger").info("\u5904\u7406\u670D\u52A1\u542F\u52A8\u8BF7\u6C42"),this.spawnXiaozhiProcess(["start","--daemon"]),e.success(null,"\u542F\u52A8\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25:",t),e.fail("START_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async getServiceStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u8BF7\u6C42");let r=kn(e).getStatus();return e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25",void 0,500)}}async getServiceHealth(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u8BF7\u6C42");let t={status:"healthy",timestamp:Date.now(),uptime:process.uptime(),memory:process.memoryUsage(),version:process.version};return e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_HEALTH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25",void 0,500)}}}});import{existsSync as zn}from"fs";import{readFile as Fg}from"fs/promises";import{dirname as Hg,join as oe}from"path";import{fileURLToPath as Ug}from"url";var Os,Nu=d(()=>{"use strict";D();dt();ke();Os=class extends J{static{i(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=u,this.initializeWebPath()}initializeWebPath(){try{let e=Hg(Ug(import.meta.url));u.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[oe(e,"..","..","..","frontend"),oe(e,"..","..","frontend"),oe(e,"..","frontend"),oe(e,"..","..","apps","frontend","dist"),oe(e,"..","apps","frontend","dist"),oe(e,"..","..","apps","frontend"),oe(e,"..","apps","frontend"),oe(e,"..","..","web","dist"),oe(e,"..","web","dist"),oe(e,"..","..","web"),oe(e,"..","web"),oe(e,"..","..","..","apps","frontend","dist"),oe(e,"..","..","..","apps","frontend"),oe(e,"..","..","..","web","dist"),oe(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=zn(r);return u.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${s?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),s})||null,this.webPath?u.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(u.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),u.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){u.error("\u521D\u59CB\u5316\u9759\u6001\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",e)}}async handleStaticFile(e){let t=new URL(e.req.url).pathname;try{if(e.logger.debug(`\u5904\u7406\u9759\u6001\u6587\u4EF6\u8BF7\u6C42: ${t}`),!this.webPath)return this.createErrorPage(e,"\u627E\u4E0D\u5230\u524D\u7AEF\u8D44\u6E90\u6587\u4EF6");let r=t;if(r==="/"&&(r="/index.html"),r.includes(".."))return e.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",lt.FORBIDDEN);let s=oe(this.webPath,r);if(!zn(s)){let a=oe(this.webPath,"index.html");return zn(a)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,a,ne.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${s}`),e.text("Not Found",lt.NOT_FOUND))}let o=this.getContentType(s);return e.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${s}, Content-Type: ${o}`),this.serveFile(e,s,o)}catch(r){return e.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",lt.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let s=await Fg(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(s.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(s),200,{"Content-Type":r})}catch(s){throw u.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,s),s}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:ne.TEXT_HTML,htm:ne.TEXT_HTML,js:ne.APPLICATION_JAVASCRIPT,mjs:ne.APPLICATION_JAVASCRIPT,css:ne.TEXT_CSS,json:ne.APPLICATION_JSON,png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",ico:"image/x-icon",woff:"font/woff",woff2:"font/woff2",ttf:"font/ttf",eot:"application/vnd.ms-fontobject",pdf:ne.APPLICATION_PDF,txt:ne.TEXT_PLAIN,xml:ne.APPLICATION_XML,zip:ne.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||ne.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
|
|
29
29
|
<!DOCTYPE html>
|
|
30
30
|
<html>
|
|
31
31
|
<head>
|
|
@@ -82,20 +82,20 @@ var xm=Object.create;var vn=Object.defineProperty;var Om=Object.getOwnPropertyDe
|
|
|
82
82
|
</div>
|
|
83
83
|
</body>
|
|
84
84
|
</html>
|
|
85
|
-
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&Bn(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}}});var jn,pu=d(()=>{"use strict";De();jn=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 Cr,du=d(()=>{"use strict";Cr=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(Cr||{})});function fu(n,e){let t=mg[e.field];return t?[...n].sort(t):(u.warn(`[sortTools] \u672A\u77E5\u7684\u6392\u5E8F\u5B57\u6BB5: ${e.field}`),n)}var mg,mu=d(()=>{"use strict";D();mg={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(fu,"sortTools")});import{configManager as $}from"@xiaozhi-client/config";import gg from"ajv";import zn from"dayjs";var Wn,gu=d(()=>{"use strict";D();wn();Ai();gt();du();mu();Wn=class{static{i(this,"MCPToolHandler")}logger;ajv;constructor(){this.logger=u,this.ajv=new gg({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:Hl.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=fu(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}`),!Object.values(Cr).includes(r))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(Cr).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(A){let G=A instanceof Error?A.message:String(A);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",G,void 0,404)}let p=await new mt().getAllCachedTools(),m=`${r}__${s}`,f=p.find(A=>A.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(A=>A.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 b={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:zn().format("YYYY-MM-DD HH:mm:ss")}};$.addCustomMCPTool(b),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:b,toolName:S,toolType:"mcp",addedAt:zn().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:zn().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}`),!Object.values(Cr).includes(s))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${s}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(Cr).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:zn().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(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[s,o]of Object.entries(t))r=r.replace(new RegExp(s,"g"),o);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw 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(!/^\d+$/.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(!/^[a-zA-Z0-9_-]+$/.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(!/^\d+$/.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(!/^[a-zA-Z0-9_-]+$/.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("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))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||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.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(!/^[a-zA-Z0-9_-]+$/.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(!/^[a-zA-Z0-9_-]+$/.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 Ct}from"zod";var hg,qn,hu=d(()=>{"use strict";li();Nn();De();hg=Ct.object({limit:Ct.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=ci.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${ci.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Ct.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:Ct.string().optional(),serverName:Ct.string().optional(),success:Ct.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:Ct.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:Ct.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"]}),qn=class extends J{static{i(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new On}parseAndValidateQueryParams(e){let t=e.req.query(),r=hg.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 Os=x((yR,Cu)=>{"use strict";var Cg="2.0.0",Eg=Number.MAX_SAFE_INTEGER||9007199254740991,Sg=16,vg=250,yg=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Cu.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Sg,MAX_SAFE_BUILD_LENGTH:vg,MAX_SAFE_INTEGER:Eg,RELEASE_TYPES:yg,SEMVER_SPEC_VERSION:Cg,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Ns=x((TR,Eu)=>{"use strict";var Tg=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};Eu.exports=Tg});var Er=x((He,Su)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:bi,MAX_SAFE_BUILD_LENGTH:_g,MAX_LENGTH:Rg}=Os(),Pg=Ns();He=Su.exports={};var Ag=He.re=[],wg=He.safeRe=[],_=He.src=[],bg=He.safeSrc=[],R=He.t={},Ig=0,Ii="[a-zA-Z0-9-]",Mg=[["\\s",1],["\\d",Rg],[Ii,_g]],xg=i(n=>{for(let[e,t]of Mg)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),N=i((n,e,t)=>{let r=xg(e),s=Ig++;Pg(n,s,e),R[n]=s,_[s]=e,bg[s]=r,Ag[s]=new RegExp(e,t?"g":void 0),wg[s]=new RegExp(r,t?"g":void 0)},"createToken");N("NUMERICIDENTIFIER","0|[1-9]\\d*");N("NUMERICIDENTIFIERLOOSE","\\d+");N("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Ii}*`);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",`${Ii}+`);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,${bi}})(?:\\.(\\d{1,${bi}}))?(?:\\.(\\d{1,${bi}}))?`);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);He.tildeTrimReplace="$1~";N("TILDE",`^${_[R.LONETILDE]}${_[R.XRANGEPLAIN]}$`);N("TILDELOOSE",`^${_[R.LONETILDE]}${_[R.XRANGEPLAINLOOSE]}$`);N("LONECARET","(?:\\^)");N("CARETTRIM",`(\\s*)${_[R.LONECARET]}\\s+`,!0);He.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);He.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 Gn=x((RR,vu)=>{"use strict";var Og=Object.freeze({loose:!0}),Ng=Object.freeze({}),Lg=i(n=>n?typeof n!="object"?Og:n:Ng,"parseOptions");vu.exports=Lg});var Mi=x((AR,_u)=>{"use strict";var yu=/^[0-9]+$/,Tu=i((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=yu.test(n),r=yu.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),$g=i((n,e)=>Tu(e,n),"rcompareIdentifiers");_u.exports={compareIdentifiers:Tu,rcompareIdentifiers:$g}});var ae=x((bR,Pu)=>{"use strict";var Xn=Ns(),{MAX_LENGTH:Ru,MAX_SAFE_INTEGER:Jn}=Os(),{safeRe:Kn,t:Yn}=Er(),Dg=Gn(),{compareIdentifiers:xi}=Mi(),Oi=class n{static{i(this,"SemVer")}constructor(e,t){if(t=Dg(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>Ru)throw new TypeError(`version is longer than ${Ru} characters`);Xn("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Kn[Yn.LOOSE]:Kn[Yn.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>Jn||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Jn||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Jn||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<Jn)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(Xn("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(Xn("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 xi(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(Xn("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 xi(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?Kn[Yn.PRERELEASELOOSE]:Kn[Yn.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]),xi(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}};Pu.exports=Oi});var kt=x((MR,wu)=>{"use strict";var Au=ae(),kg=i((n,e,t=!1)=>{if(n instanceof Au)return n;try{return new Au(n,e)}catch(r){if(!t)return null;throw r}},"parse");wu.exports=kg});var Iu=x((OR,bu)=>{"use strict";var Fg=kt(),Hg=i((n,e)=>{let t=Fg(n,e);return t?t.version:null},"valid");bu.exports=Hg});var xu=x((LR,Mu)=>{"use strict";var Ug=kt(),Vg=i((n,e)=>{let t=Ug(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Mu.exports=Vg});var Lu=x((DR,Nu)=>{"use strict";var Ou=ae(),Bg=i((n,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new Ou(n instanceof Ou?n.version:n,t).inc(e,r,s).version}catch{return null}},"inc");Nu.exports=Bg});var ku=x((FR,Du)=>{"use strict";var $u=kt(),jg=i((n,e)=>{let t=$u(n,null,!0),r=$u(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");Du.exports=jg});var Hu=x((UR,Fu)=>{"use strict";var zg=ae(),Wg=i((n,e)=>new zg(n,e).major,"major");Fu.exports=Wg});var Vu=x((BR,Uu)=>{"use strict";var qg=ae(),Gg=i((n,e)=>new qg(n,e).minor,"minor");Uu.exports=Gg});var ju=x((zR,Bu)=>{"use strict";var Xg=ae(),Jg=i((n,e)=>new Xg(n,e).patch,"patch");Bu.exports=Jg});var Wu=x((qR,zu)=>{"use strict";var Kg=kt(),Yg=i((n,e)=>{let t=Kg(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");zu.exports=Yg});var Re=x((XR,Gu)=>{"use strict";var qu=ae(),Qg=i((n,e,t)=>new qu(n,t).compare(new qu(e,t)),"compare");Gu.exports=Qg});var Ju=x((KR,Xu)=>{"use strict";var Zg=Re(),eh=i((n,e,t)=>Zg(e,n,t),"rcompare");Xu.exports=eh});var Yu=x((QR,Ku)=>{"use strict";var th=Re(),rh=i((n,e)=>th(n,e,!0),"compareLoose");Ku.exports=rh});var Qn=x((eP,Zu)=>{"use strict";var Qu=ae(),sh=i((n,e,t)=>{let r=new Qu(n,t),s=new Qu(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");Zu.exports=sh});var tp=x((rP,ep)=>{"use strict";var nh=Qn(),oh=i((n,e)=>n.sort((t,r)=>nh(t,r,e)),"sort");ep.exports=oh});var sp=x((nP,rp)=>{"use strict";var ih=Qn(),ah=i((n,e)=>n.sort((t,r)=>ih(r,t,e)),"rsort");rp.exports=ah});var Ls=x((iP,np)=>{"use strict";var ch=Re(),lh=i((n,e,t)=>ch(n,e,t)>0,"gt");np.exports=lh});var Zn=x((cP,op)=>{"use strict";var uh=Re(),ph=i((n,e,t)=>uh(n,e,t)<0,"lt");op.exports=ph});var Ni=x((uP,ip)=>{"use strict";var dh=Re(),fh=i((n,e,t)=>dh(n,e,t)===0,"eq");ip.exports=fh});var Li=x((dP,ap)=>{"use strict";var mh=Re(),gh=i((n,e,t)=>mh(n,e,t)!==0,"neq");ap.exports=gh});var eo=x((mP,cp)=>{"use strict";var hh=Re(),Ch=i((n,e,t)=>hh(n,e,t)>=0,"gte");cp.exports=Ch});var to=x((hP,lp)=>{"use strict";var Eh=Re(),Sh=i((n,e,t)=>Eh(n,e,t)<=0,"lte");lp.exports=Sh});var $i=x((EP,up)=>{"use strict";var vh=Ni(),yh=Li(),Th=Ls(),_h=eo(),Rh=Zn(),Ph=to(),Ah=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 vh(n,t,r);case"!=":return yh(n,t,r);case">":return Th(n,t,r);case">=":return _h(n,t,r);case"<":return Rh(n,t,r);case"<=":return Ph(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");up.exports=Ah});var dp=x((vP,pp)=>{"use strict";var wh=ae(),bh=kt(),{safeRe:ro,t:so}=Er(),Ih=i((n,e)=>{if(n instanceof wh)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?ro[so.COERCEFULL]:ro[so.COERCE]);else{let l=e.includePrerelease?ro[so.COERCERTLFULL]:ro[so.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 bh(`${r}.${s}.${o}${a}${c}`,e)},"coerce");pp.exports=Ih});var mp=x((TP,fp)=>{"use strict";var Di=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}};fp.exports=Di});var Pe=x((RP,Ep)=>{"use strict";var Mh=/\s+/g,ki=class n{static{i(this,"Range")}constructor(e,t){if(t=Oh(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof Fi)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(Mh," "),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&&Hh(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&&kh)|(this.options.loose&&Fh))+":"+e,s=gp.get(r);if(s)return s;let o=this.options.loose,a=o?de[ce.HYPHENRANGELOOSE]:de[ce.HYPHENRANGE];e=e.replace(a,Jh(this.options.includePrerelease)),j("hyphen replace",e),e=e.replace(de[ce.COMPARATORTRIM],Lh),j("comparator trim",e),e=e.replace(de[ce.TILDETRIM],$h),j("tilde trim",e),e=e.replace(de[ce.CARETTRIM],Dh),j("caret trim",e);let c=e.split(" ").map(f=>Uh(f,this.options)).join(" ").split(/\s+/).map(f=>Xh(f,this.options));o&&(c=c.filter(f=>(j("loose invalid filter",f,this.options),!!f.match(de[ce.COMPARATORLOOSE])))),j("range list",c);let l=new Map,p=c.map(f=>new Fi(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 gp.set(r,m),m}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Cp(r,t)&&e.set.some(s=>Cp(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 Nh(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Kh(this.set[t],e,this.options))return!0;return!1}};Ep.exports=ki;var xh=mp(),gp=new xh,Oh=Gn(),Fi=$s(),j=Ns(),Nh=ae(),{safeRe:de,t:ce,comparatorTrimReplace:Lh,tildeTrimReplace:$h,caretTrimReplace:Dh}=Er(),{FLAG_INCLUDE_PRERELEASE:kh,FLAG_LOOSE:Fh}=Os(),hp=i(n=>n.value==="<0.0.0-0","isNullSet"),Hh=i(n=>n.value==="","isAny"),Cp=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"),Uh=i((n,e)=>(n=n.replace(de[ce.BUILD],""),j("comp",n,e),n=jh(n,e),j("caret",n),n=Vh(n,e),j("tildes",n),n=Wh(n,e),j("xrange",n),n=Gh(n,e),j("stars",n),n),"parseComparator"),fe=i(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),Vh=i((n,e)=>n.trim().split(/\s+/).map(t=>Bh(t,e)).join(" "),"replaceTildes"),Bh=i((n,e)=>{let t=e.loose?de[ce.TILDELOOSE]:de[ce.TILDE];return n.replace(t,(r,s,o,a,c)=>{j("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?(j("replaceTilde pr",c),l=`>=${s}.${o}.${a}-${c} <${s}.${+o+1}.0-0`):l=`>=${s}.${o}.${a} <${s}.${+o+1}.0-0`,j("tilde return",l),l})},"replaceTilde"),jh=i((n,e)=>n.trim().split(/\s+/).map(t=>zh(t,e)).join(" "),"replaceCarets"),zh=i((n,e)=>{j("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)=>{j("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?(j("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`):(j("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`),j("caret return",p),p})},"replaceCaret"),Wh=i((n,e)=>(j("replaceXRanges",n,e),n.split(/\s+/).map(t=>qh(t,e)).join(" ")),"replaceXRanges"),qh=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)=>{j("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`),j("xRange return",r),r})},"replaceXRange"),Gh=i((n,e)=>(j("replaceStars",n,e),n.trim().replace(de[ce.STAR],"")),"replaceStars"),Xh=i((n,e)=>(j("replaceGTE0",n,e),n.trim().replace(de[e.includePrerelease?ce.GTE0PRE:ce.GTE0],"")),"replaceGTE0"),Jh=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"),Kh=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(j(n[r].semver),n[r].semver!==Fi.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 $s=x((AP,Rp)=>{"use strict";var Ds=Symbol("SemVer ANY"),Vi=class n{static{i(this,"Comparator")}static get ANY(){return Ds}constructor(e,t){if(t=Sp(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Ui("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Ds?this.value="":this.value=this.operator+this.semver.version,Ui("comp",this)}parse(e){let t=this.options.loose?vp[yp.COMPARATORLOOSE]:vp[yp.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 Tp(r[2],this.options.loose):this.semver=Ds}toString(){return this.value}test(e){if(Ui("Comparator.test",e,this.options.loose),this.semver===Ds||e===Ds)return!0;if(typeof e=="string")try{e=new Tp(e,this.options)}catch{return!1}return Hi(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 _p(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new _p(this.value,t).test(e.semver):(t=Sp(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("=")||Hi(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Hi(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Rp.exports=Vi;var Sp=Gn(),{safeRe:vp,t:yp}=Er(),Hi=$i(),Ui=Ns(),Tp=ae(),_p=Pe()});var ks=x((bP,Pp)=>{"use strict";var Yh=Pe(),Qh=i((n,e,t)=>{try{e=new Yh(e,t)}catch{return!1}return e.test(n)},"satisfies");Pp.exports=Qh});var wp=x((MP,Ap)=>{"use strict";var Zh=Pe(),eC=i((n,e)=>new Zh(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");Ap.exports=eC});var Ip=x((OP,bp)=>{"use strict";var tC=ae(),rC=Pe(),sC=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new rC(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===-1)&&(r=a,s=new tC(r,t))}),r},"maxSatisfying");bp.exports=sC});var xp=x((LP,Mp)=>{"use strict";var nC=ae(),oC=Pe(),iC=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new oC(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===1)&&(r=a,s=new nC(r,t))}),r},"minSatisfying");Mp.exports=iC});var Lp=x((DP,Np)=>{"use strict";var Bi=ae(),aC=Pe(),Op=Ls(),cC=i((n,e)=>{n=new aC(n,e);let t=new Bi("0.0.0");if(n.test(t)||(t=new Bi("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 Bi(a.semver.version);switch(a.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!o||Op(c,o))&&(o=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${a.operator}`)}}),o&&(!t||Op(t,o))&&(t=o)}return t&&n.test(t)?t:null},"minVersion");Np.exports=cC});var Dp=x((FP,$p)=>{"use strict";var lC=Pe(),uC=i((n,e)=>{try{return new lC(n,e).range||"*"}catch{return null}},"validRange");$p.exports=uC});var no=x((UP,Up)=>{"use strict";var pC=ae(),Hp=$s(),{ANY:dC}=Hp,fC=Pe(),mC=ks(),kp=Ls(),Fp=Zn(),gC=to(),hC=eo(),CC=i((n,e,t,r)=>{n=new pC(n,r),e=new fC(e,r);let s,o,a,c,l;switch(t){case">":s=kp,o=gC,a=Fp,c=">",l=">=";break;case"<":s=Fp,o=hC,a=kp,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(mC(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===dC&&(g=new Hp(">=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");Up.exports=CC});var Bp=x((BP,Vp)=>{"use strict";var EC=no(),SC=i((n,e,t)=>EC(n,e,">",t),"gtr");Vp.exports=SC});var zp=x((zP,jp)=>{"use strict";var vC=no(),yC=i((n,e,t)=>vC(n,e,"<",t),"ltr");jp.exports=yC});var Gp=x((qP,qp)=>{"use strict";var Wp=Pe(),TC=i((n,e,t)=>(n=new Wp(n,t),e=new Wp(e,t),n.intersects(e,t)),"intersects");qp.exports=TC});var Jp=x((XP,Xp)=>{"use strict";var _C=ks(),RC=Re();Xp.exports=(n,e,t)=>{let r=[],s=null,o=null,a=n.sort((m,f)=>RC(m,f,t));for(let m of a)_C(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 td=x((JP,ed)=>{"use strict";var Kp=Pe(),zi=$s(),{ANY:ji}=zi,Fs=ks(),Wi=Re(),PC=i((n,e,t={})=>{if(n===e)return!0;n=new Kp(n,t),e=new Kp(e,t);let r=!1;e:for(let s of n.set){for(let o of e.set){let a=wC(s,o,t);if(r=r||a!==null,a)continue e}if(r)return!1}return!0},"subset"),AC=[new zi(">=0.0.0-0")],Yp=[new zi(">=0.0.0")],wC=i((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===ji){if(e.length===1&&e[0].semver===ji)return!0;t.includePrerelease?n=AC:n=Yp}if(e.length===1&&e[0].semver===ji){if(t.includePrerelease)return!0;e=Yp}let r=new Set,s,o;for(let g of n)g.operator===">"||g.operator===">="?s=Qp(s,g,t):g.operator==="<"||g.operator==="<="?o=Zp(o,g,t):r.add(g.semver);if(r.size>1)return null;let a;if(s&&o){if(a=Wi(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&&!Fs(g,String(s),t)||o&&!Fs(g,String(o),t))return null;for(let P of e)if(!Fs(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=Qp(s,g,t),c===g&&c!==s)return!1}else if(s.operator===">="&&!Fs(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=Zp(o,g,t),l===g&&l!==o)return!1}else if(o.operator==="<="&&!Fs(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"),Qp=i((n,e,t)=>{if(!n)return e;let r=Wi(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),Zp=i((n,e,t)=>{if(!n)return e;let r=Wi(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");ed.exports=PC});var od=x((YP,nd)=>{"use strict";var qi=Er(),rd=Os(),bC=ae(),sd=Mi(),IC=kt(),MC=Iu(),xC=xu(),OC=Lu(),NC=ku(),LC=Hu(),$C=Vu(),DC=ju(),kC=Wu(),FC=Re(),HC=Ju(),UC=Yu(),VC=Qn(),BC=tp(),jC=sp(),zC=Ls(),WC=Zn(),qC=Ni(),GC=Li(),XC=eo(),JC=to(),KC=$i(),YC=dp(),QC=$s(),ZC=Pe(),eE=ks(),tE=wp(),rE=Ip(),sE=xp(),nE=Lp(),oE=Dp(),iE=no(),aE=Bp(),cE=zp(),lE=Gp(),uE=Jp(),pE=td();nd.exports={parse:IC,valid:MC,clean:xC,inc:OC,diff:NC,major:LC,minor:$C,patch:DC,prerelease:kC,compare:FC,rcompare:HC,compareLoose:UC,compareBuild:VC,sort:BC,rsort:jC,gt:zC,lt:WC,eq:qC,neq:GC,gte:XC,lte:JC,cmp:KC,coerce:YC,Comparator:QC,Range:ZC,satisfies:eE,toComparators:tE,maxSatisfying:rE,minSatisfying:sE,minVersion:nE,validRange:oE,outside:iE,gtr:aE,ltr:cE,intersects:lE,simplifyRange:uE,subset:pE,SemVer:bC,re:qi.re,src:qi.src,tokens:qi.t,SEMVER_SPEC_VERSION:rd.SEMVER_SPEC_VERSION,RELEASE_TYPES:rd.RELEASE_TYPES,compareIdentifiers:sd.compareIdentifiers,rcompareIdentifiers:sd.rcompareIdentifiers}});import{exec as dE,spawn as fE}from"child_process";import{promisify as mE}from"util";var Hs,id,Ft,ad=d(()=>{"use strict";D();Ce();Hs=Dm(od(),1),id=mE(dE),Ft=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=fE("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"&&Hs.default.valid(o));return e!=="all"&&(s=s.filter(o=>{let a=Hs.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)=>Hs.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=Hs.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 Gi=d(()=>{"use strict";ad()});import{z as cd}from"zod";var gE,oo,ld=d(()=>{"use strict";Gi();Ce();De();gE=cd.object({version:cd.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),oo=class extends J{static{i(this,"UpdateApiHandler")}npmManager;eventBus=k();activeInstalls=new Map;constructor(){super(),this.npmManager=new Ft(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=gE.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 Xi}from"@xiaozhi-client/version";var io,ud=d(()=>{"use strict";Gi();De();io=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=Xi.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=Xi.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"),Xi.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 Ft().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 Ft().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 hE from"fs";import{configManager as CE}from"@xiaozhi-client/config";import{TTS as EE}from"@xiaozhi-client/tts";var Us,pd=d(()=>{"use strict";De();Us=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=CE.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 EE({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 hE.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")}}}});var Vs,dd=d(()=>{"use strict";kn();De();Vs=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 fd=d(()=>{"use strict";Ol();Ll();jl();Ci();ou();au();cu();lu();uu();pu();gu();hu();ld();ud();pd();dd()});var Ji,md=d(()=>{"use strict";D();Ji=i(async(n,e)=>{n.set("logger",u),n.logger=u,await e()},"loggerMiddleware")});import{cors as vE}from"hono/cors";var Ki,gd=d(()=>{"use strict";Ki=vE({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]})});var Yi,Qi,hd=d(()=>{"use strict";Yi=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"),Qi=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 Zi,Cd=d(()=>{"use strict";Zi=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,ea=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 ta,Ed=d(()=>{"use strict";ea();ta=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 ra,Sd=d(()=>{"use strict";ra=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 yE}from"@xiaozhi-client/config";var sa,vd=d(()=>{"use strict";Ci();sa=i(()=>{let n=null,e;return async(t,r)=>{let s=t.get("endpointManager");s!==e&&(e=s,s?n=new vs(s,yE):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware")});var yd=d(()=>{"use strict";md();gd();hd();Cd();Ed();Sd();vd();Dn()});var ao,Td=d(()=>{"use strict";D();Ce();ao=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 TE}from"@xiaozhi-client/config";var co,_d=d(()=>{"use strict";D();Ce();co=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=TE.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 lo,Rd=d(()=>{"use strict";D();lo=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 Pd(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 Ad(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 wd(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 bd(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 Id(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 Md=d(()=>{"use strict";i(Pd,"encodeBinaryProtocol2");i(Ad,"parseBinaryProtocol2");i(wd,"isBinaryProtocol2");i(bd,"isBinaryProtocol3");i(Id,"parseBinaryProtocol3")});function xd(n,e){let t=_E(n,e),r=RE(n,e);return{boardType:t,appVersion:r}}function _E(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 RE(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 na=d(()=>{"use strict";D();i(xd,"extractDeviceInfo");i(_E,"extractBoardType");i(RE,"extractAppVersion");i(vr,"camelToSnakeCase")});import{randomBytes as PE}from"crypto";function AE(n){try{let e=n.toString("utf-8");return Buffer.from(e,"utf-8").equals(n)?!e.includes("\uFFFD"):!1}catch{return!1}}var uo,Od=d(()=>{"use strict";D();Md();kn();na();uo=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=PE(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&&!AE(e)){if(wd(e)){let s=Ad(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(bd(e)){let s=Id(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=Pd(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(AE,"isValidUTF8")});import{ASR as wE,AudioFormat as bE,AuthMethod as IE,OpusDecoder as ME}from"@xiaozhi-client/asr";import{configManager as xE}from"@xiaozhi-client/config";var po,Nd=d(()=>{"use strict";D();po=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=xE.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 wE({bytedance:{v2:{app:{appid:t.appid,token:t.accessToken,cluster:t.cluster||"volcengine_streaming_common"},user:{uid:`device_${e}`},audio:{format:bE.RAW,language:"zh-CN"},request:{reqid:`req_${e}_${Date.now()}`,sequence:1}}},authMethod:IE.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 ME.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")}}});import{existsSync as OE,readFileSync as NE}from"fs";import{dirname as LE,isAbsolute as $d,resolve as $E}from"path";import{configManager as DE}from"@xiaozhi-client/config";function kE(n){let e=n.replace(/\\/g,"/");return!!(e.startsWith("./")||e.startsWith("../")||$d(n))}function FE(n){try{let e=n.replace(/\\/g,"/"),t;if($d(e))t=e;else{let s=DE.getConfigPath(),o=LE(s);t=$E(o,e)}if(!OE(t))return null;let r=NE(t,"utf-8").trim();return r||null}catch{return null}}function Dd(n){return!n||n.trim()===""?Ld:kE(n)?FE(n)||Ld:n}var Ld,kd=d(()=>{"use strict";Ld="\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(kE,"isPromptPath");i(FE,"resolvePromptFromPath");i(Dd,"resolvePrompt")});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 oa,ia=d(()=>{"use strict";oa=i(function(){let{crypto:n}=globalThis;if(n?.randomUUID)return oa=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 js(n){return typeof n=="object"&&n!==null&&("name"in n&&n.name==="AbortError"||"message"in n&&String(n.message).includes("FetchRequestCanceledException"))}var zs,fo=d(()=>{"use strict";i(js,"isAbortError");zs=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,Et,St,yr,Tr,_r,Rr,Pr,Ar,wr,br,Ir,Mr,Ue,Ve=d(()=>{"use strict";fo();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 Et({message:r,cause:zs(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 Ar(e,o,r,s):e===429?new wr(e,o,r,s):e>=500?new br(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)}},Et=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 Et{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")}},Ar=class extends Q{static{i(this,"UnprocessableEntityError")}},wr=class extends Q{static{i(this,"RateLimitError")}},br=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")}},Ue=class extends Error{static{i(this,"InvalidWebhookSignatureError")}constructor(e){super(e)}}});function ca(n){return typeof n!="object"?{}:n??{}}function Hd(n){if(!n)return!0;for(let e in n)return!1;return!0}function Ud(n,e){return Object.prototype.hasOwnProperty.call(n,e)}function Ws(n){return n!=null&&typeof n=="object"&&!Array.isArray(n)}var UE,Fd,le,aa,Vd,Bd,Je=d(()=>{"use strict";Ve();UE=/^[a-z][a-z0-9+.-]*:/i,Fd=i(n=>UE.test(n),"isAbsoluteURL"),le=i(n=>(le=Array.isArray,le(n)),"isArray"),aa=le;i(ca,"maybeObj");i(Hd,"isEmptyObj");i(Ud,"hasOwn");i(Ws,"isObj");Vd=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"),Bd=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,la=d(()=>{"use strict";vt="6.24.0"});function VE(){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 jE(){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 qd,BE,jd,zd,Wd,Gd,ua=d(()=>{"use strict";la();qd=i(()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u","isRunningInBrowser");i(VE,"getDetectedPlatform");BE=i(()=>{let n=VE();if(n==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":vt,"X-Stainless-OS":zd(Deno.build.os),"X-Stainless-Arch":jd(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":zd(globalThis.process.platform??"unknown"),"X-Stainless-Arch":jd(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=jE();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(jE,"getBrowserInfo");jd=i(n=>n==="x32"?"x32":n==="x86_64"||n==="x64"?"x64":n==="arm"?"arm":n==="aarch64"||n==="arm64"?"arm64":n?`other:${n}`:"unknown","normalizeArch"),zd=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"),Gd=i(()=>Wd??(Wd=BE()),"getPlatformHeaders")});function Xd(){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 pa(...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 mo(n){let e=Symbol.asyncIterator in n?n[Symbol.asyncIterator]():n[Symbol.iterator]();return pa({start(){},async pull(t){let{done:r,value:s}=await e.next();r?t.close():t.enqueue(s)},async cancel(){await e.return?.()}})}function da(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 Jd(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 qs=d(()=>{"use strict";i(Xd,"getDefaultFetch");i(pa,"makeReadableStream");i(mo,"ReadableStreamFrom");i(da,"ReadableStreamToAsyncIterable");i(Jd,"CancelReadableStream")});var Kd,Yd=d(()=>{"use strict";Kd=i(({headers:n,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)}),"FallbackEncoder")});var go,fa,ho,ma,Co=d(()=>{"use strict";go="RFC3986",fa=i(n=>String(n),"default_formatter"),ho={RFC1738:i(n=>String(n).replace(/%20/g,"+"),"RFC1738"),RFC3986:fa},ma="RFC1738"});function Zd(n){return!n||typeof n!="object"?!1:!!(n.constructor&&n.constructor.isBuffer&&n.constructor.isBuffer(n))}function ha(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 Eo,je,ga,Qd,ef=d(()=>{"use strict";Co();Je();Eo=i((n,e)=>(Eo=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),Eo(n,e)),"has"),je=(()=>{let n=[];for(let e=0;e<256;++e)n.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return n})(),ga=1024,Qd=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+=ga){let l=o.length>=ga?o.slice(c,c+ga):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===ma&&(f===40||f===41)){p[p.length]=l.charAt(m);continue}if(f<128){p[p.length]=je[f];continue}if(f<2048){p[p.length]=je[192|f>>6]+je[128|f&63];continue}if(f<55296||f>=57344){p[p.length]=je[224|f>>12]+je[128|f>>6&63]+je[128|f&63];continue}m+=1,f=65536+((f&1023)<<10|l.charCodeAt(m)&1023),p[p.length]=je[240|f>>18]+je[128|f>>12&63]+je[128|f>>6&63]+je[128|f&63]}a+=p.join("")}return a},"encode");i(Zd,"is_buffer");i(ha,"maybe_map")});function qE(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"||typeof n=="symbol"||typeof n=="bigint"}function nf(n,e,t,r,s,o,a,c,l,p,m,f,S,g,P,b,U,H){let A=n,G=H,z=0,he=!1;for(;(G=G.get(Ca))!==void 0&&!he;){let X=G.get(n);if(z+=1,typeof X<"u"){if(X===z)throw new RangeError("Cyclic object value");he=!0}typeof G.get(Ca)>"u"&&(z=0)}if(typeof p=="function"?A=p(e,A):A instanceof Date?A=S?.(A):t==="comma"&&le(A)&&(A=ha(A,function(X){return X instanceof Date?S?.(X):X})),A===null){if(o)return l&&!b?l(e,Z.encoder,U,"key",g):e;A=""}if(qE(A)||Zd(A)){if(l){let X=b?e:l(e,Z.encoder,U,"key",g);return[P?.(X)+"="+P?.(l(A,Z.encoder,U,"value",g))]}return[P?.(e)+"="+P?.(String(A))]}let ue=[];if(typeof A>"u")return ue;let W;if(t==="comma"&&le(A))b&&l&&(A=ha(A,l)),W=[{value:A.length>0?A.join(",")||null:void 0}];else if(le(p))W=p;else{let X=Object.keys(A);W=m?X.sort(m):X}let te=c?String(e).replace(/\./g,"%2E"):String(e),re=r&&le(A)&&A.length===1?te+"[]":te;if(s&&le(A)&&A.length===0)return re+"[]";for(let X=0;X<W.length;++X){let Y=W[X],bl=typeof Y=="object"&&typeof Y.value<"u"?Y.value:A[Y];if(a&&bl===null)continue;let ri=f&&c?Y.replace(/\./g,"%2E"):Y,Mm=le(A)?typeof t=="function"?t(re,ri):re:re+(f?"."+ri:"["+ri+"]");H.set(n,z);let Il=new WeakMap;Il.set(Ca,H),sf(ue,nf(bl,Mm,t,r,s,o,a,c,t==="comma"&&b&&le(A)?null:l,p,m,f,S,g,P,b,U,Il))}return ue}function GE(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=go;if(typeof n.format<"u"){if(!Eo(ho,n.format))throw new TypeError("Unknown format option provided.");t=n.format}let r=ho[t],s=Z.filter;(typeof n.filter=="function"||le(n.filter))&&(s=n.filter);let o;if(n.arrayFormat&&n.arrayFormat in rf?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 Ea(n,e={}){let t=n,r=GE(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=rf[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||sf(a,nf(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 rf,sf,tf,Z,Ca,of=d(()=>{"use strict";ef();Co();Je();rf={brackets(n){return String(n)+"[]"},comma:"comma",indices(n,e){return String(n)+"["+e+"]"},repeat(n){return String(n)}},sf=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:Qd,encodeValuesOnly:!1,format:go,formatter:fa,indices:!1,serializeDate(n){return(tf??(tf=Function.prototype.call.bind(Date.prototype.toISOString)))(n)},skipNulls:!1,strictNullHandling:!1};i(qE,"is_non_nullish_primitive");Ca={};i(nf,"inner_stringify");i(GE,"normalize_stringify_options");i(Ea,"stringify")});var af=d(()=>{"use strict";Co();of()});function uf(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(cf??(e=new globalThis.TextEncoder,cf=e.encode.bind(e)))(n)}function Sa(n){let e;return(lf??(e=new globalThis.TextDecoder,lf=e.decode.bind(e)))(n)}var cf,lf,So=d(()=>{"use strict";i(uf,"concatBytes");i(Or,"encodeUTF8");i(Sa,"decodeUTF8")});function JE(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 pf(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 Se,ve,Ht,df=d(()=>{"use strict";Ae();So();Ht=class{static{i(this,"LineDecoder")}constructor(){Se.set(this,void 0),ve.set(this,void 0),I(this,Se,new Uint8Array,"f"),I(this,ve,null,"f")}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?Or(e):e;I(this,Se,uf([h(this,Se,"f"),t]),"f");let r=[],s;for(;(s=JE(h(this,Se,"f"),h(this,ve,"f")))!=null;){if(s.carriage&&h(this,ve,"f")==null){I(this,ve,s.index,"f");continue}if(h(this,ve,"f")!=null&&(s.index!==h(this,ve,"f")+1||s.carriage)){r.push(Sa(h(this,Se,"f").subarray(0,h(this,ve,"f")-1))),I(this,Se,h(this,Se,"f").subarray(h(this,ve,"f")),"f"),I(this,ve,null,"f");continue}let o=h(this,ve,"f")!==null?s.preceding-1:s.preceding,a=Sa(h(this,Se,"f").subarray(0,o));r.push(a),I(this,Se,h(this,Se,"f").subarray(s.index),"f"),I(this,ve,null,"f")}return r}flush(){return h(this,Se,"f").length?this.decode(`
|
|
86
|
-
`):[]}};
|
|
87
|
-
`,"\r"]);
|
|
88
|
-
`);r.enqueue(a)}catch(s){r.error(s)}},async cancel(){await t.return?.()}})}};i(
|
|
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]=
|
|
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
90
|
${o.map(S=>S.error).join(`
|
|
91
91
|
`)}
|
|
92
92
|
${a}
|
|
93
|
-
${f}`)}return a},"path"),"createPathTagFunction"),C=aS(vf)});var Vt,wo=d(()=>{"use strict";w();F();L();Vt=class extends E{static{i(this,"Messages")}list(e,t={},r){return this._client.getAPIList(C`/chat/completions/${e}/messages`,O,{query:t,...r})}}});var Oe=d(()=>{"use strict";Ve()});function en(n){return n!==void 0&&"function"in n&&n.function!==void 0}function tn(n){return n?.$brand==="auto-parseable-response-format"}function Bt(n){return n?.$brand==="auto-parseable-tool"}function yf(n,e){return!e||!Ma(e)?{...n,choices:n.choices.map(t=>(_f(t.message.tool_calls),{...t,message:{...t.message,parsed:null,...t.message.tool_calls?{tool_calls:t.message.tool_calls}:void 0}}))}:rn(n,e)}function rn(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 _f(r.message.tool_calls),{...r,message:{...r.message,...r.message.tool_calls?{tool_calls:r.message.tool_calls?.map(s=>pS(e,s))??void 0}:void 0,parsed:r.message.content&&!r.message.refusal?uS(e,r.message.content):null}}});return{...n,choices:t}}function uS(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 pS(n,e){let t=n.tools?.find(r=>en(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 Tf(n,e){if(!n||!("tools"in n)||!n.tools)return!1;let t=n.tools?.find(r=>en(r)&&r.function?.name===e.function.name);return en(t)&&(Bt(t)||t?.function.strict||!1)}function Ma(n){return tn(n.response_format)?!0:n.tools?.some(e=>Bt(e)||e.type==="function"&&e.function.strict===!0)??!1}function _f(n){for(let e of n||[])if(e.type!=="function")throw new T(`Currently only \`function\` tool calls are supported; Received \`${e.type}\``)}function Rf(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 sn=d(()=>{"use strict";Oe();i(en,"isChatCompletionFunctionTool");i(tn,"isAutoParsableResponseFormat");i(Bt,"isAutoParsableTool");i(yf,"maybeParseChatCompletion");i(rn,"parseChatCompletion");i(uS,"parseResponseFormat");i(pS,"parseToolCall");i(Tf,"shouldParseToolCall");i(Ma,"hasAutoParseableInput");i(_f,"assertToolCallsAreChatCompletionFunctionToolCalls");i(Rf,"validateInputTools")});var Lr,xa,Oa=d(()=>{"use strict";Lr=i(n=>n?.role==="assistant","isAssistantMessage"),xa=i(n=>n?.role==="tool","isToolMessage")});var Na,bo,Io,nn,on,Mo,an,Ze,cn,xo,Oo,$r,Pf,yt,No=d(()=>{"use strict";Ae();Oe();yt=class{static{i(this,"EventStream")}constructor(){Na.add(this),this.controller=new AbortController,bo.set(this,void 0),Io.set(this,()=>{}),nn.set(this,()=>{}),on.set(this,void 0),Mo.set(this,()=>{}),an.set(this,()=>{}),Ze.set(this,{}),cn.set(this,!1),xo.set(this,!1),Oo.set(this,!1),$r.set(this,!1),I(this,bo,new Promise((e,t)=>{I(this,Io,e,"f"),I(this,nn,t,"f")}),"f"),I(this,on,new Promise((e,t)=>{I(this,Mo,e,"f"),I(this,an,t,"f")}),"f"),h(this,bo,"f").catch(()=>{}),h(this,on,"f").catch(()=>{})}_run(e){setTimeout(()=>{e().then(()=>{this._emitFinal(),this._emit("end")},h(this,Na,"m",Pf).bind(this))},0)}_connected(){this.ended||(h(this,Io,"f").call(this),this._emit("connect"))}get ended(){return h(this,cn,"f")}get errored(){return h(this,xo,"f")}get aborted(){return h(this,Oo,"f")}abort(){this.controller.abort()}on(e,t){return(h(this,Ze,"f")[e]||(h(this,Ze,"f")[e]=[])).push({listener:t}),this}off(e,t){let r=h(this,Ze,"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,Ze,"f")[e]||(h(this,Ze,"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,on,"f")}_emit(e,...t){if(h(this,cn,"f"))return;e==="end"&&(I(this,cn,!0,"f"),h(this,Mo,"f").call(this));let r=h(this,Ze,"f")[e];if(r&&(h(this,Ze,"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,nn,"f").call(this,s),h(this,an,"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,nn,"f").call(this,s),h(this,an,"f").call(this,s),this._emit("end")}}_emitFinal(){}};bo=new WeakMap,Io=new WeakMap,nn=new WeakMap,on=new WeakMap,Mo=new WeakMap,an=new WeakMap,Ze=new WeakMap,cn=new WeakMap,xo=new WeakMap,Oo=new WeakMap,$r=new WeakMap,Na=new WeakSet,Pf=i(function(e){if(I(this,xo,!0,"f"),e instanceof Error&&e.name==="AbortError"&&(e=new K),e instanceof K)return I(this,Oo,!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 Af(n){return typeof n.parse=="function"}var La=d(()=>{"use strict";i(Af,"isRunnableFunctionWithParse")});var me,$a,Lo,Da,ka,Fa,wf,bf,dS,Dr,Ha=d(()=>{"use strict";Ae();Oe();sn();Oa();No();La();dS=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),xa(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",$a).call(this)}async finalMessage(){return await this.done(),h(this,me,"m",Lo).call(this)}async finalFunctionToolCall(){return await this.done(),h(this,me,"m",Da).call(this)}async finalFunctionToolCallResult(){return await this.done(),h(this,me,"m",ka).call(this)}async totalUsage(){return await this.done(),h(this,me,"m",Fa).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",Lo).call(this);t&&this._emit("finalMessage",t);let r=h(this,me,"m",$a).call(this);r&&this._emit("finalContent",r);let s=h(this,me,"m",Da).call(this);s&&this._emit("finalFunctionToolCall",s);let o=h(this,me,"m",ka).call(this);o!=null&&this._emit("finalFunctionToolCallResult",o),this._chatCompletions.some(a=>a.usage)&&this._emit("totalUsage",h(this,me,"m",Fa).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",wf).call(this,t);let o=await e.chat.completions.create({...t,stream:!1},{...r,signal:this.controller.signal});return this._connected(),this._addChatCompletion(rn(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=dS}=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 b=(await this._createChatCompletion(e,{...c,tool_choice:o,tools:S,messages:[...this.messages]},r)).choices[0]?.message;if(!b)throw new T("missing message in ChatCompletion response");if(!b.tool_calls?.length)return;for(let U of b.tool_calls){if(U.type!=="function")continue;let H=U.id,{name:A,arguments:G}=U.function,z=f[A];if(z){if(l&&l!==A){let te=`Invalid tool_call: ${JSON.stringify(A)}. ${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(A)}. 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 he;try{he=Af(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(he,this),W=h(this,me,"m",bf).call(this,ue);if(this._addMessage({role:s,tool_call_id:H,content:W}),l)return}}}};me=new WeakSet,$a=i(function(){return h(this,me,"m",Lo).call(this).content??null},"_AbstractChatCompletionRunner_getFinalContent"),Lo=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"),Da=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"),ka=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(xa(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"),Fa=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"),wf=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"),bf=i(function(e){return typeof e=="string"?e:e===void 0?"undefined":JSON.stringify(e)},"_AbstractChatCompletionRunner_stringifyFunctionCallResult")});var ln,Ua=d(()=>{"use strict";Ha();Oa();ln=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 fS(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 mS(n.trim(),e)}var se,Va,Ba,mS,ja,If=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},Va=class extends Error{static{i(this,"PartialJSON")}},Ba=class extends Error{static{i(this,"MalformedJSON")}};i(fS,"parseJSON");mS=i((n,e)=>{let t=n.length,r=0,s=i(S=>{throw new Va(`${S} at position ${r}`)},"markPartialJSON"),o=i(S=>{throw new Ba(`${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"),
|
|
95
|
-
${
|
|
96
|
-
${
|
|
97
|
-
${
|
|
98
|
-
${ko(n)}`);return{...te,id:W,type:ue,function:{...Y,name:X,arguments:re}}})}}:{...g,message:{...H,content:P,role:A,refusal:p.refusal??null},finish_reason:m,index:f,logprobs:S}}),created:s,model:o,object:"chat.completion",...a?{system_fingerprint:a}:{}};return yf(l,e)}function ko(n){return JSON.stringify(n)}var ee,et,kr,Tt,Wa,$o,qa,Ga,Xa,Do,Ja,Mf,jt,Fo=d(()=>{"use strict";Ae();If();Oe();sn();za();Ha();jt=class n extends Dr{static{i(this,"ChatCompletionStream")}constructor(e){super(),ee.add(this),et.set(this,void 0),kr.set(this,void 0),Tt.set(this,void 0),I(this,et,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",Wa).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",qa).call(this,a);if(o.controller.signal?.aborted)throw new K;return this._addChatCompletion(h(this,ee,"m",Do).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",Wa).call(this),this._connected();let s=ze.fromReadableStream(e,this.controller),o;for await(let a of s)o&&o!==a.id&&this._addChatCompletion(h(this,ee,"m",Do).call(this)),h(this,ee,"m",qa).call(this,a),o=a.id;if(s.controller.signal?.aborted)throw new K;return this._addChatCompletion(h(this,ee,"m",Do).call(this))}[(et=new WeakMap,kr=new WeakMap,Tt=new WeakMap,ee=new WeakSet,Wa=i(function(){this.ended||I(this,Tt,void 0,"f")},"_ChatCompletionStream_beginRequest"),$o=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"),qa=i(function(t){if(this.ended)return;let r=h(this,ee,"m",Mf).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",$o).call(this,o);o.finish_reason&&(h(this,ee,"m",Xa).call(this,o),a.current_tool_call_index!=null&&h(this,ee,"m",Ga).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",Xa).call(this,o),a.current_tool_call_index!=null&&h(this,ee,"m",Ga).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"),Ga=i(function(t,r){if(h(this,ee,"m",$o).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,et,"f")?.tools?.find(c=>en(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"),Xa=i(function(t){let r=h(this,ee,"m",$o).call(this,t);if(t.message.content&&!r.content_done){r.content_done=!0;let s=h(this,ee,"m",Ja).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"),Do=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"),gS(t,h(this,et,"f"))},"_ChatCompletionStream_endRequest"),Ja=i(function(){let t=h(this,et,"f")?.response_format;return tn(t)?t:null},"_ChatCompletionStream_getAutoParseableResponseFormat"),Mf=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 b=c.choices[S];if(b||(b=c.choices[S]={finish_reason:f,index:S,message:{},logprobs:g,...P}),g)if(!b.logprobs)b.logprobs=Object.assign({},g);else{let{content:ue,refusal:W,...te}=g;Object.assign(b.logprobs,te),ue&&((r=b.logprobs).content??(r.content=[]),b.logprobs.content.push(...ue)),W&&((s=b.logprobs).refusal??(s.refusal=[]),b.logprobs.refusal.push(...W))}if(f&&(b.finish_reason=f,h(this,et,"f")&&Ma(h(this,et,"f")))){if(f==="length")throw new Ir;if(f==="content_filter")throw new Mr}if(Object.assign(b,P),!m)continue;let{content:U,refusal:H,function_call:A,role:G,tool_calls:z,...he}=m;if(Object.assign(b.message,he),H&&(b.message.refusal=(b.message.refusal||"")+H),G&&(b.message.role=G),A&&(b.message.function_call?(A.name&&(b.message.function_call.name=A.name),A.arguments&&((o=b.message.function_call).arguments??(o.arguments=""),b.message.function_call.arguments+=A.arguments)):b.message.function_call=A),U&&(b.message.content=(b.message.content||"")+U,!b.message.refusal&&h(this,ee,"m",Ja).call(this)&&(b.message.parsed=ja(b.message.content))),z){b.message.tool_calls||(b.message.tool_calls=[]);for(let{index:ue,id:W,type:te,function:re,...X}of z){let Y=(a=b.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,Tf(h(this,et,"f"),Y)&&(Y.function.parsed_arguments=ja(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 ze(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}};i(gS,"finalizeChatCompletion");i(ko,"str")});var un,Ka=d(()=>{"use strict";Fo();un=class n extends jt{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 tt,pn=d(()=>{"use strict";w();wo();wo();F();L();Ua();Ka();Fo();sn();Ka();La();Fo();Ua();tt=class extends E{static{i(this,"Completions")}constructor(){super(...arguments),this.messages=new Vt(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(C`/chat/completions/${e}`,t)}update(e,t,r){return this._client.post(C`/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(C`/chat/completions/${e}`,t)}parse(e,t){return Rf(e.tools),this._client.chat.completions.create(e,{...t,headers:{...t?.headers,"X-Stainless-Helper-Method":"chat.completions.parse"}})._thenUnwrap(r=>rn(r,e))}runTools(e,t){return e.stream?un.runTools(this._client,e,t):ln.runTools(this._client,e,t)}stream(e,t){return jt.createChatCompletion(this._client,e,t)}};tt.Messages=Vt});var _t,Ya=d(()=>{"use strict";w();pn();pn();_t=class extends E{static{i(this,"Chat")}constructor(){super(...arguments),this.completions=new tt(this._client)}};_t.Completions=tt});var xf=d(()=>{"use strict";pn();pn();wo()});var Of=d(()=>{"use strict";Ya();xf()});var Nf=d(()=>{"use strict"});function*CS(n){if(!n)return;if(Lf 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():aa(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=aa(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 Lf,v,V=d(()=>{"use strict";Je();Lf=Symbol("brand.privateNullableHeaders");i(CS,"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 CS(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{[Lf]:!0,values:e,nulls:t}},"buildHeaders")});var Fr,Qa=d(()=>{"use strict";w();V();Fr=class extends E{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,Za=d(()=>{"use strict";w();we();Hr=class extends E{static{i(this,"Transcriptions")}create(e,t){return this._client.post("/audio/transcriptions",xe({body:e,...t,stream:e.stream??!1,__metadata:{model:e.model}},this._client))}}});var Ur,ec=d(()=>{"use strict";w();we();Ur=class extends E{static{i(this,"Translations")}create(e,t){return this._client.post("/audio/translations",xe({body:e,...t,__metadata:{model:e.model}},this._client))}}});var qe,tc=d(()=>{"use strict";w();Qa();Qa();Za();Za();ec();ec();qe=class extends E{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)}};qe.Transcriptions=Hr;qe.Translations=Ur;qe.Speech=Fr});var zt,rc=d(()=>{"use strict";w();F();L();zt=class extends E{static{i(this,"Batches")}create(e,t){return this._client.post("/batches",{body:e,...t})}retrieve(e,t){return this._client.get(C`/batches/${e}`,t)}list(e={},t){return this._client.getAPIList("/batches",O,{query:e,...t})}cancel(e,t){return this._client.post(C`/batches/${e}/cancel`,t)}}});var Vr,sc=d(()=>{"use strict";w();F();V();L();Vr=class extends E{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(C`/assistants/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(C`/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(C`/assistants/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}}});var Br,nc=d(()=>{"use strict";w();V();Br=class extends E{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 jr,oc=d(()=>{"use strict";w();V();jr=class extends E{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,ic=d(()=>{"use strict";w();nc();nc();oc();oc();Rt=class extends E{static{i(this,"Realtime")}constructor(){super(...arguments),this.sessions=new Br(this._client),this.transcriptionSessions=new jr(this._client)}};Rt.Sessions=Br;Rt.TranscriptionSessions=jr});var zr,ac=d(()=>{"use strict";w();V();L();zr=class extends E{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(C`/chatkit/sessions/${e}/cancel`,{...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}}});var Wr,cc=d(()=>{"use strict";w();F();V();L();Wr=class extends E{static{i(this,"Threads")}retrieve(e,t){return this._client.get(C`/chatkit/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}list(e={},t){return this._client.getAPIList("/chatkit/threads",Ye,{query:e,...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}delete(e,t){return this._client.delete(C`/chatkit/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}listItems(e,t={},r){return this._client.getAPIList(C`/chatkit/threads/${e}/items`,Ye,{query:t,...r,headers:v([{"OpenAI-Beta":"chatkit_beta=v1"},r?.headers])})}}});var Pt,lc=d(()=>{"use strict";w();ac();ac();cc();cc();Pt=class extends E{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,uc=d(()=>{"use strict";w();F();V();L();qr=class extends E{static{i(this,"Messages")}create(e,t,r){return this._client.post(C`/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(C`/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(C`/threads/${s}/messages/${e}`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(C`/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(C`/threads/${s}/messages/${e}`,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}}});var Gr,pc=d(()=>{"use strict";w();F();V();L();Gr=class extends E{static{i(this,"Steps")}retrieve(e,t,r){let{thread_id:s,run_id:o,...a}=t;return this._client.get(C`/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(C`/threads/${s}/runs/${e}/steps`,O,{query:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}}});var $f,Df=d(()=>{"use strict";Ve();So();$f=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 At,dc=d(()=>{"use strict";At=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 dn=d(()=>{"use strict";Je();Df();dc();Xs();ia();xr()});var ie,qt,fc,Ge,Ho,Ne,Gt,Xr,Wt,Bo,ye,Uo,Vo,gn,fn,mn,kf,Ff,Hf,Uf,Vf,Bf,jf,rt,mc=d(()=>{"use strict";Ae();za();Oe();No();dn();rt=class extends yt{static{i(this,"AssistantStream")}constructor(){super(...arguments),ie.add(this),fc.set(this,[]),Ge.set(this,{}),Ho.set(this,{}),Ne.set(this,void 0),Gt.set(this,void 0),Xr.set(this,void 0),Wt.set(this,void 0),Bo.set(this,void 0),ye.set(this,void 0),Uo.set(this,void 0),Vo.set(this,void 0),gn.set(this,void 0)}[(fc=new WeakMap,Ge=new WeakMap,Ho=new WeakMap,Ne=new WeakMap,Gt=new WeakMap,Xr=new WeakMap,Wt=new WeakMap,Bo=new WeakMap,ye=new WeakMap,Uo=new WeakMap,Vo=new WeakMap,gn=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 qt;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=ze.fromReadableStream(e,this.controller);for await(let o of s)h(this,ie,"m",fn).call(this,o);if(s.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",mn).call(this))}toReadableStream(){return new ze(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}static createToolAssistantStream(e,t,r,s){let o=new qt;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",fn).call(this,l);if(c.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",mn).call(this))}static createThreadAssistantStream(e,t,r){let s=new qt;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 qt;return o._run(()=>o._runAssistantStream(e,t,r,{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),o}currentEvent(){return h(this,Uo,"f")}currentRun(){return h(this,Vo,"f")}currentMessageSnapshot(){return h(this,Ne,"f")}currentRunStepSnapshot(){return h(this,gn,"f")}async finalRunSteps(){return await this.done(),Object.values(h(this,Ge,"f"))}async finalMessages(){return await this.done(),Object.values(h(this,Ho,"f"))}async finalRun(){if(await this.done(),!h(this,Gt,"f"))throw Error("Final run was not received.");return h(this,Gt,"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",fn).call(this,c);if(a.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",mn).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",fn).call(this,l);if(c.controller.signal?.aborted)throw new K;return this._addRun(h(this,ie,"m",mn).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(Ws(o)&&Ws(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(!Ws(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)}};qt=rt,fn=i(function(e){if(!this.ended)switch(I(this,Uo,e,"f"),h(this,ie,"m",Hf).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",jf).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",Ff).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",kf).call(this,e);break;case"error":throw new Error("Encountered an error event in event processing - errors should be processed earlier");default:}},"_AssistantStream_addEvent"),mn=i(function(){if(this.ended)throw new T("stream has ended, this shouldn't happen");if(!h(this,Gt,"f"))throw Error("Final run has not been received");return h(this,Gt,"f")},"_AssistantStream_endRequest"),kf=i(function(e){let[t,r]=h(this,ie,"m",Vf).call(this,e,h(this,Ne,"f"));I(this,Ne,t,"f"),h(this,Ho,"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,Wt,"f"))switch(h(this,Wt,"f").type){case"text":this._emit("textDone",h(this,Wt,"f").text,h(this,Ne,"f"));break;case"image_file":this._emit("imageFileDone",h(this,Wt,"f").image_file,h(this,Ne,"f"));break}I(this,Xr,s.index,"f")}I(this,Wt,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,Ne,"f"));break;case"text":this._emit("textDone",s.text,h(this,Ne,"f"));break}}h(this,Ne,"f")&&this._emit("messageDone",e.data),I(this,Ne,void 0,"f")}},"_AssistantStream_handleMessage"),Ff=i(function(e){let t=h(this,ie,"m",Uf).call(this,e);switch(I(this,gn,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,Bo,"f")?this._emit("toolCallDelta",o,t.step_details.tool_calls[o.index]):(h(this,ye,"f")&&this._emit("toolCallDone",h(this,ye,"f")),I(this,Bo,o.index,"f"),I(this,ye,t.step_details.tool_calls[o.index],"f"),h(this,ye,"f")&&this._emit("toolCallCreated",h(this,ye,"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,gn,void 0,"f"),e.data.step_details.type=="tool_calls"&&h(this,ye,"f")&&(this._emit("toolCallDone",h(this,ye,"f")),I(this,ye,void 0,"f")),this._emit("runStepDone",e.data,t);break;case"thread.run.step.in_progress":break}},"_AssistantStream_handleRunStep"),Hf=i(function(e){h(this,fc,"f").push(e),this._emit("event",e)},"_AssistantStream_handleEvent"),Uf=i(function(e){switch(e.event){case"thread.run.step.created":return h(this,Ge,"f")[e.data.id]=e.data,e.data;case"thread.run.step.delta":let t=h(this,Ge,"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=qt.accumulateDelta(t,r.delta);h(this,Ge,"f")[e.data.id]=s}return h(this,Ge,"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,Ge,"f")[e.data.id]=e.data;break}if(h(this,Ge,"f")[e.data.id])return h(this,Ge,"f")[e.data.id];throw new Error("No snapshot available")},"_AssistantStream_accumulateRunStep"),Vf=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",Bf).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"),Bf=i(function(e,t){return qt.accumulateDelta(t,e)},"_AssistantStream_accumulateContent"),jf=i(function(e){switch(I(this,Vo,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,Gt,e.data,"f"),h(this,ye,"f")&&(this._emit("toolCallDone",h(this,ye,"f")),I(this,ye,void 0,"f"));break;case"thread.run.cancelling":break}},"_AssistantStream_handleRun")});var Xt,gc=d(()=>{"use strict";w();pc();pc();F();V();mc();xr();L();Xt=class extends E{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(C`/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(C`/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(C`/threads/${s}/runs/${e}`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(C`/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(C`/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 rt.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 rt.createAssistantStream(e,this._client.beta.threads.runs,t,r)}submitToolOutputs(e,t,r){let{thread_id:s,...o}=t;return this._client.post(C`/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 rt.createToolAssistantStream(e,this._client.beta.threads.runs,t,r)}};Xt.Steps=Gr});var wt,hc=d(()=>{"use strict";w();uc();uc();gc();gc();V();mc();L();wt=class extends E{static{i(this,"Threads")}constructor(){super(...arguments),this.runs=new Xt(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(C`/threads/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(C`/threads/${e}`,{body:t,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t){return this._client.delete(C`/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 rt.createThreadAssistantStream(e,this._client.beta.threads,t)}};wt.Runs=Xt;wt.Messages=qr});var Le,Cc=d(()=>{"use strict";w();sc();sc();ic();ic();lc();lc();hc();hc();Le=class extends E{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 wt(this._client)}};Le.Realtime=Rt;Le.ChatKit=Pt;Le.Assistants=Vr;Le.Threads=wt});var Jt,Ec=d(()=>{"use strict";w();Jt=class extends E{static{i(this,"Completions")}create(e,t){return this._client.post("/completions",{body:e,...t,stream:e.stream??!1})}}});var Jr,Sc=d(()=>{"use strict";w();V();L();Jr=class extends E{static{i(this,"Content")}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(C`/containers/${s}/files/${e}/content`,{...r,headers:v([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}}});var Kt,vc=d(()=>{"use strict";w();Sc();Sc();F();V();we();L();Kt=class extends E{static{i(this,"Files")}constructor(){super(...arguments),this.content=new Jr(this._client)}create(e,t,r){return this._client.post(C`/containers/${e}/files`,Qe({body:t,...r},this._client))}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(C`/containers/${s}/files/${e}`,r)}list(e,t={},r){return this._client.getAPIList(C`/containers/${e}/files`,O,{query:t,...r})}delete(e,t,r){let{container_id:s}=t;return this._client.delete(C`/containers/${s}/files/${e}`,{...r,headers:v([{Accept:"*/*"},r?.headers])})}};Kt.Content=Jr});var bt,yc=d(()=>{"use strict";w();vc();vc();F();V();L();bt=class extends E{static{i(this,"Containers")}constructor(){super(...arguments),this.files=new Kt(this._client)}create(e,t){return this._client.post("/containers",{body:e,...t})}retrieve(e,t){return this._client.get(C`/containers/${e}`,t)}list(e={},t){return this._client.getAPIList("/containers",O,{query:e,...t})}delete(e,t){return this._client.delete(C`/containers/${e}`,{...t,headers:v([{Accept:"*/*"},t?.headers])})}};bt.Files=Kt});var Kr,Tc=d(()=>{"use strict";w();F();L();Kr=class extends E{static{i(this,"Items")}create(e,t,r){let{include:s,...o}=t;return this._client.post(C`/conversations/${e}/items`,{query:{include:s},body:o,...r})}retrieve(e,t,r){let{conversation_id:s,...o}=t;return this._client.get(C`/conversations/${s}/items/${e}`,{query:o,...r})}list(e,t={},r){return this._client.getAPIList(C`/conversations/${e}/items`,Ye,{query:t,...r})}delete(e,t,r){let{conversation_id:s}=t;return this._client.delete(C`/conversations/${s}/items/${e}`,r)}}});var It,_c=d(()=>{"use strict";w();Tc();Tc();L();It=class extends E{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(C`/conversations/${e}`,t)}update(e,t,r){return this._client.post(C`/conversations/${e}`,{body:t,...r})}delete(e,t){return this._client.delete(C`/conversations/${e}`,t)}};It.Items=Kr});var Yt,Rc=d(()=>{"use strict";w();dn();Yt=class extends E{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=$f(l)}),a)))}}});var Yr,Pc=d(()=>{"use strict";w();F();L();Yr=class extends E{static{i(this,"OutputItems")}retrieve(e,t,r){let{eval_id:s,run_id:o}=t;return this._client.get(C`/evals/${s}/runs/${o}/output_items/${e}`,r)}list(e,t,r){let{eval_id:s,...o}=t;return this._client.getAPIList(C`/evals/${s}/runs/${e}/output_items`,O,{query:o,...r})}}});var Qt,Ac=d(()=>{"use strict";w();Pc();Pc();F();L();Qt=class extends E{static{i(this,"Runs")}constructor(){super(...arguments),this.outputItems=new Yr(this._client)}create(e,t,r){return this._client.post(C`/evals/${e}/runs`,{body:t,...r})}retrieve(e,t,r){let{eval_id:s}=t;return this._client.get(C`/evals/${s}/runs/${e}`,r)}list(e,t={},r){return this._client.getAPIList(C`/evals/${e}/runs`,O,{query:t,...r})}delete(e,t,r){let{eval_id:s}=t;return this._client.delete(C`/evals/${s}/runs/${e}`,r)}cancel(e,t,r){let{eval_id:s}=t;return this._client.post(C`/evals/${s}/runs/${e}`,r)}};Qt.OutputItems=Yr});var Mt,wc=d(()=>{"use strict";w();Ac();Ac();F();L();Mt=class extends E{static{i(this,"Evals")}constructor(){super(...arguments),this.runs=new Qt(this._client)}create(e,t){return this._client.post("/evals",{body:e,...t})}retrieve(e,t){return this._client.get(C`/evals/${e}`,t)}update(e,t,r){return this._client.post(C`/evals/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/evals",O,{query:e,...t})}delete(e,t){return this._client.delete(C`/evals/${e}`,t)}};Mt.Runs=Qt});var Zt,bc=d(()=>{"use strict";w();F();V();xr();Oe();we();L();Zt=class extends E{static{i(this,"Files")}create(e,t){return this._client.post("/files",xe({body:e,...t},this._client))}retrieve(e,t){return this._client.get(C`/files/${e}`,t)}list(e={},t){return this._client.getAPIList("/files",O,{query:e,...t})}delete(e,t){return this._client.delete(C`/files/${e}`,t)}content(e,t){return this._client.get(C`/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,Ic=d(()=>{"use strict";w();Qr=class extends E{static{i(this,"Methods")}}});var Zr,Mc=d(()=>{"use strict";w();Zr=class extends E{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 er,xc=d(()=>{"use strict";w();Mc();Mc();er=class extends E{static{i(this,"Alpha")}constructor(){super(...arguments),this.graders=new Zr(this._client)}};er.Graders=Zr});var es,Oc=d(()=>{"use strict";w();F();L();es=class extends E{static{i(this,"Permissions")}create(e,t,r){return this._client.getAPIList(C`/fine_tuning/checkpoints/${e}/permissions`,We,{body:t,method:"post",...r})}retrieve(e,t={},r){return this._client.get(C`/fine_tuning/checkpoints/${e}/permissions`,{query:t,...r})}delete(e,t,r){let{fine_tuned_model_checkpoint:s}=t;return this._client.delete(C`/fine_tuning/checkpoints/${s}/permissions/${e}`,r)}}});var tr,Nc=d(()=>{"use strict";w();Oc();Oc();tr=class extends E{static{i(this,"Checkpoints")}constructor(){super(...arguments),this.permissions=new es(this._client)}};tr.Permissions=es});var ts,Lc=d(()=>{"use strict";w();F();L();ts=class extends E{static{i(this,"Checkpoints")}list(e,t={},r){return this._client.getAPIList(C`/fine_tuning/jobs/${e}/checkpoints`,O,{query:t,...r})}}});var rr,$c=d(()=>{"use strict";w();Lc();Lc();F();L();rr=class extends E{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(C`/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(C`/fine_tuning/jobs/${e}/cancel`,t)}listEvents(e,t={},r){return this._client.getAPIList(C`/fine_tuning/jobs/${e}/events`,O,{query:t,...r})}pause(e,t){return this._client.post(C`/fine_tuning/jobs/${e}/pause`,t)}resume(e,t){return this._client.post(C`/fine_tuning/jobs/${e}/resume`,t)}};rr.Checkpoints=ts});var $e,Dc=d(()=>{"use strict";w();Ic();Ic();xc();xc();Nc();Nc();$c();$c();$e=class extends E{static{i(this,"FineTuning")}constructor(){super(...arguments),this.methods=new Qr(this._client),this.jobs=new rr(this._client),this.checkpoints=new tr(this._client),this.alpha=new er(this._client)}};$e.Methods=Qr;$e.Jobs=rr;$e.Checkpoints=tr;$e.Alpha=er});var rs,kc=d(()=>{"use strict";w();rs=class extends E{static{i(this,"GraderModels")}}});var xt,Fc=d(()=>{"use strict";w();kc();kc();xt=class extends E{static{i(this,"Graders")}constructor(){super(...arguments),this.graderModels=new rs(this._client)}};xt.GraderModels=rs});var sr,Hc=d(()=>{"use strict";w();we();sr=class extends E{static{i(this,"Images")}createVariation(e,t){return this._client.post("/images/variations",xe({body:e,...t},this._client))}edit(e,t){return this._client.post("/images/edits",xe({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 nr,Uc=d(()=>{"use strict";w();F();L();nr=class extends E{static{i(this,"Models")}retrieve(e,t){return this._client.get(C`/models/${e}`,t)}list(e){return this._client.getAPIList("/models",We,e)}delete(e,t){return this._client.delete(C`/models/${e}`,t)}}});var or,Vc=d(()=>{"use strict";w();or=class extends E{static{i(this,"Moderations")}create(e,t){return this._client.post("/moderations",{body:e,...t})}}});var ss,Bc=d(()=>{"use strict";w();V();L();ss=class extends E{static{i(this,"Calls")}accept(e,t,r){return this._client.post(C`/realtime/calls/${e}/accept`,{body:t,...r,headers:v([{Accept:"*/*"},r?.headers])})}hangup(e,t){return this._client.post(C`/realtime/calls/${e}/hangup`,{...t,headers:v([{Accept:"*/*"},t?.headers])})}refer(e,t,r){return this._client.post(C`/realtime/calls/${e}/refer`,{body:t,...r,headers:v([{Accept:"*/*"},r?.headers])})}reject(e,t={},r){return this._client.post(C`/realtime/calls/${e}/reject`,{body:t,...r,headers:v([{Accept:"*/*"},r?.headers])})}}});var ns,jc=d(()=>{"use strict";w();ns=class extends E{static{i(this,"ClientSecrets")}create(e,t){return this._client.post("/realtime/client_secrets",{body:e,...t})}}});var st,zc=d(()=>{"use strict";w();Bc();Bc();jc();jc();st=class extends E{static{i(this,"Realtime")}constructor(){super(...arguments),this.clientSecrets=new ns(this._client),this.calls=new ss(this._client)}};st.ClientSecrets=ns;st.Calls=ss});function zf(n,e){return!e||!XS(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)}:Wc(n,e)}function Wc(n,e){let t=n.output.map(s=>{if(s.type==="function_call")return{...s,parsed_arguments:YS(e,s)};if(s.type==="message"){let o=s.content.map(a=>a.type==="output_text"?{...a,parsed:GS(e,a.text)}:a);return{...s,content:o}}return s}),r=Object.assign({},n,{output:t});return Object.getOwnPropertyDescriptor(n,"output_text")||jo(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 GS(n,e){return n.text?.format?.type!=="json_schema"?null:"$parseRaw"in n.text?.format?(n.text?.format).$parseRaw(e):JSON.parse(e)}function XS(n){return!!tn(n.text?.format)}function JS(n){return n?.$brand==="auto-parseable-tool"}function KS(n,e){return n.find(t=>t.type==="function"&&t.name===e)}function YS(n,e){let t=KS(n.tools??[],e.name);return{...e,...e,parsed_arguments:JS(t)?t.$parseRaw(e.arguments):t?.strict?JSON.parse(e.arguments):null}}function jo(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 qc=d(()=>{"use strict";Oe();sn();i(zf,"maybeParseResponse");i(Wc,"parseResponse");i(GS,"parseTextFormat");i(XS,"hasAutoParseableInput");i(JS,"isAutoParsableTool");i(KS,"getInputToolByName");i(YS,"parseToolCall");i(jo,"addOutputText")});function QS(n,e){return zf(n,e)}var os,zo,Ot,Wo,Wf,qf,Gf,Xf,qo,Jf=d(()=>{"use strict";Ae();Oe();No();qc();qo=class n extends yt{static{i(this,"ResponseStream")}constructor(e){super(),os.add(this),zo.set(this,void 0),Ot.set(this,void 0),Wo.set(this,void 0),I(this,zo,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",Wf).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",qf).call(this,c,a);if(o.controller.signal?.aborted)throw new K;return h(this,os,"m",Gf).call(this)}[(zo=new WeakMap,Ot=new WeakMap,Wo=new WeakMap,os=new WeakSet,Wf=i(function(){this.ended||I(this,Ot,void 0,"f")},"_ResponseStream_beginRequest"),qf=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",Xf).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"),Gf=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=QS(t,h(this,zo,"f"));return I(this,Wo,r,"f"),r},"_ResponseStream_endRequest"),Xf=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,Wo,"f");if(!e)throw new T("stream ended without producing a ChatCompletion");return e}};i(QS,"finalizeResponse")});var is,Gc=d(()=>{"use strict";w();F();L();is=class extends E{static{i(this,"InputItems")}list(e,t={},r){return this._client.getAPIList(C`/responses/${e}/input_items`,O,{query:t,...r})}}});var as,Xc=d(()=>{"use strict";w();as=class extends E{static{i(this,"InputTokens")}count(e={},t){return this._client.post("/responses/input_tokens",{body:e,...t})}}});var nt,Jc=d(()=>{"use strict";qc();Jf();w();Gc();Gc();Xc();Xc();V();L();nt=class extends E{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"&&jo(r),r))}retrieve(e,t={},r){return this._client.get(C`/responses/${e}`,{query:t,...r,stream:t?.stream??!1})._thenUnwrap(s=>("object"in s&&s.object==="response"&&jo(s),s))}delete(e,t){return this._client.delete(C`/responses/${e}`,{...t,headers:v([{Accept:"*/*"},t?.headers])})}parse(e,t){return this._client.responses.create(e,t)._thenUnwrap(r=>Wc(r,e))}stream(e,t){return qo.createResponse(this._client,e,t)}cancel(e,t){return this._client.post(C`/responses/${e}/cancel`,t)}compact(e,t){return this._client.post("/responses/compact",{body:e,...t})}};nt.InputItems=is;nt.InputTokens=as});var cs,Kc=d(()=>{"use strict";w();V();L();cs=class extends E{static{i(this,"Content")}retrieve(e,t){return this._client.get(C`/skills/${e}/content`,{...t,headers:v([{Accept:"application/binary"},t?.headers]),__binaryResponse:!0})}}});var ls,Yc=d(()=>{"use strict";w();V();L();ls=class extends E{static{i(this,"Content")}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(C`/skills/${s}/versions/${e}/content`,{...r,headers:v([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}}});var ir,Qc=d(()=>{"use strict";w();Yc();Yc();F();we();L();ir=class extends E{static{i(this,"Versions")}constructor(){super(...arguments),this.content=new ls(this._client)}create(e,t={},r){return this._client.post(C`/skills/${e}/versions`,Qe({body:t,...r},this._client))}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(C`/skills/${s}/versions/${e}`,r)}list(e,t={},r){return this._client.getAPIList(C`/skills/${e}/versions`,O,{query:t,...r})}delete(e,t,r){let{skill_id:s}=t;return this._client.delete(C`/skills/${s}/versions/${e}`,r)}};ir.Content=ls});var ot,Zc=d(()=>{"use strict";w();Kc();Kc();Qc();Qc();F();we();L();ot=class extends E{static{i(this,"Skills")}constructor(){super(...arguments),this.content=new cs(this._client),this.versions=new ir(this._client)}create(e={},t){return this._client.post("/skills",Qe({body:e,...t},this._client))}retrieve(e,t){return this._client.get(C`/skills/${e}`,t)}update(e,t,r){return this._client.post(C`/skills/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/skills",O,{query:e,...t})}delete(e,t){return this._client.delete(C`/skills/${e}`,t)}};ot.Content=cs;ot.Versions=ir});var us,el=d(()=>{"use strict";w();we();L();us=class extends E{static{i(this,"Parts")}create(e,t,r){return this._client.post(C`/uploads/${e}/parts`,xe({body:t,...r},this._client))}}});var Nt,tl=d(()=>{"use strict";w();el();el();L();Nt=class extends E{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(C`/uploads/${e}/cancel`,t)}complete(e,t,r){return this._client.post(C`/uploads/${e}/complete`,{body:t,...r})}};Nt.Parts=us});var Kf,Yf=d(()=>{"use strict";Kf=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,rl=d(()=>{"use strict";w();F();V();xr();Yf();L();ps=class extends E{static{i(this,"FileBatches")}create(e,t,r){return this._client.post(C`/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(C`/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(C`/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(C`/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 Kf(f),await this.createAndPoll(e,{file_ids:p})}}});var ds,sl=d(()=>{"use strict";w();F();V();dn();L();ds=class extends E{static{i(this,"Files")}create(e,t,r){return this._client.post(C`/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(C`/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(C`/vector_stores/${s}/files/${e}`,{body:o,...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(C`/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(C`/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(C`/vector_stores/${s}/files/${e}/content`,We,{...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}}});var it,nl=d(()=>{"use strict";w();rl();rl();sl();sl();F();V();L();it=class extends E{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(C`/vector_stores/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(C`/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(C`/vector_stores/${e}`,{...t,headers:v([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}search(e,t,r){return this._client.getAPIList(C`/vector_stores/${e}/search`,We,{body:t,method:"post",...r,headers:v([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};it.Files=ds;it.FileBatches=ps});var ar,ol=d(()=>{"use strict";w();F();V();we();L();ar=class extends E{static{i(this,"Videos")}create(e,t){return this._client.post("/videos",Qe({body:e,...t},this._client))}retrieve(e,t){return this._client.get(C`/videos/${e}`,t)}list(e={},t){return this._client.getAPIList("/videos",Ye,{query:e,...t})}delete(e,t){return this._client.delete(C`/videos/${e}`,t)}downloadContent(e,t={},r){return this._client.get(C`/videos/${e}/content`,{query:t,...r,headers:v([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}remix(e,t,r){return this._client.post(C`/videos/${e}/remix`,Qe({body:t,...r},this._client))}}});var fs,Qf,Go,cr,il=d(()=>{"use strict";Ae();Oe();w();V();cr=class extends E{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",Qf).call(this,r);let o=v([t]).values,a=h(this,fs,"m",Go).call(this,o,"webhook-signature"),c=h(this,fs,"m",Go).call(this,o,"webhook-timestamp"),l=h(this,fs,"m",Go).call(this,o,"webhook-id"),p=parseInt(c,10);if(isNaN(p))throw new Ue("Invalid webhook timestamp format");let m=Math.floor(Date.now()/1e3);if(m-p>s)throw new Ue("Webhook timestamp is too old");if(p>m+s)throw new Ue("Webhook timestamp is too new");let f=a.split(" ").map(b=>b.startsWith("v1,")?b.substring(3):b),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 b of f)try{let U=Buffer.from(b,"base64");if(await crypto.subtle.verify("HMAC",P,U,new TextEncoder().encode(g)))return}catch{continue}throw new Ue("The given webhook signature does not match the expected signature")}};fs=new WeakSet,Qf=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"),Go=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 Zf=d(()=>{"use strict";il()});var em=d(()=>{"use strict";Zf()});var tm=d(()=>{"use strict";Of();Nf();tc();rc();Cc();Ec();yc();_c();Rc();wc();bc();Dc();Fc();Hc();Uc();Vc();zc();Jc();Zc();tl();nl();ol();em()});var al,cl,Xo,rm,M,Jo=d(()=>{"use strict";Ae();ia();Je();xr();fo();ua();qs();Yd();af();la();Ve();F();Ia();tm();_o();rc();Ec();Rc();bc();Hc();Uc();Vc();ol();tc();Cc();Ya();yc();_c();wc();Dc();Fc();zc();Jc();Zc();tl();nl();il();ua();V();dc();Xs();Je();M=class{static{i(this,"OpenAI")}constructor({baseURL:e=At("OPENAI_BASE_URL"),apiKey:t=At("OPENAI_API_KEY"),organization:r=At("OPENAI_ORG_ID")??null,project:s=At("OPENAI_PROJECT_ID")??null,webhookSecret:o=At("OPENAI_WEBHOOK_SECRET")??null,...a}={}){if(al.add(this),Xo.set(this,void 0),this.completions=new Jt(this),this.chat=new _t(this),this.embeddings=new Yt(this),this.files=new Zt(this),this.images=new sr(this),this.audio=new qe(this),this.moderations=new or(this),this.models=new nr(this),this.fineTuning=new $e(this),this.graders=new xt(this),this.vectorStores=new it(this),this.webhooks=new cr(this),this.beta=new Le(this),this.batches=new zt(this),this.uploads=new Nt(this),this.responses=new nt(this),this.realtime=new st(this),this.conversations=new It(this),this.evals=new Mt(this),this.containers=new bt(this),this.skills=new ot(this),this.videos=new ar(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&&qd())throw new T(`It looks like you're running in a browser-like environment.
|
|
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
99
|
|
|
100
100
|
This is disabled by default, as it risks exposing your secret API credentials to attackers.
|
|
101
101
|
If you understand the risks and have appropriate mitigations in place,
|
|
@@ -104,10 +104,10 @@ you can set the \`dangerouslyAllowBrowser\` option to \`true\`, e.g.,
|
|
|
104
104
|
new OpenAI({ apiKey, dangerouslyAllowBrowser: true });
|
|
105
105
|
|
|
106
106
|
https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
|
|
107
|
-
`);this.baseURL=c.baseURL,this.timeout=c.timeout??cl.DEFAULT_TIMEOUT,this.logger=c.logger??console;let l="warn";this.logLevel=l,this.logLevel=va(c.logLevel,"ClientOptions.logLevel",this)??va(At("OPENAI_LOG"),"process.env['OPENAI_LOG']",this)??l,this.fetchOptions=c.fetchOptions,this.maxRetries=c.maxRetries??2,this.fetch=c.fetch??Xd(),I(this,Xo,Kd,"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 Ea(e,{arrayFormat:"brackets"})}getUserAgent(){return`${this.constructor.name}/JS ${vt}`}defaultIdempotencyKey(){return`stainless-node-retry-${oa()}`}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,al,"m",rm).call(this)&&r||this.baseURL,o=Fd(e)?new URL(e):new URL(s+(s.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),a=this.defaultQuery();return Hd(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 Ut(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`,Ke({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(zs),P=Date.now();if(g instanceof globalThis.Error){let H=`retrying, ${t} attempts remaining`;if(s.signal?.aborted)throw new K;let A=js(g)||/timed? ?out/i.test(String(g)+("cause"in g?String(g.cause):""));if(t)return q(this).info(`[${p}] connection ${A?"timed out":"failed"} - ${H}`),q(this).debug(`[${p}] connection ${A?"timed out":"failed"} (${H})`,Ke({retryOfRequestLogID:r,url:c,durationMs:P-f,message:g.message})),this.retryRequest(s,t,r??p);throw q(this).info(`[${p}] connection ${A?"timed out":"failed"} - error; no more retries left`),q(this).debug(`[${p}] connection ${A?"timed out":"failed"} (error; no more retries left)`,Ke({retryOfRequestLogID:r,url:c,durationMs:P-f,message:g.message})),A?new St:new Et({cause:g})}let b=[...g.headers.entries()].filter(([H])=>H==="x-request-id").map(([H,A])=>", "+H+": "+JSON.stringify(A)).join(""),U=`[${p}${m}${b}] ${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 Jd(g.body),q(this).info(`${U} - ${W}`),q(this).debug(`[${p}] response error (${W})`,Ke({retryOfRequestLogID:r,url:g.url,status:g.status,headers:g.headers,durationMs:P-f})),this.retryRequest(s,t,r??p,g.headers)}let A=H?"error; no more retries left":"error; not retryable";q(this).info(`${U} - ${A}`);let G=await g.text().catch(W=>zs(W).message),z=Bd(G),he=z?void 0:G;throw q(this).debug(`[${p}] response error (${A})`,Ke({retryOfRequestLogID:r,url:g.url,status:g.status,headers:g.headers,message:he,durationMs:Date.now()-f})),this.makeStatusError(g.status,z,he,g.headers)}return q(this).info(U),q(this).debug(`[${p}] response start`,Ke({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 Qs(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&&Vd("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))}:{},...Gd(),"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:mo(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,Xo,"f").call(this,{body:e,headers:r})}};cl=M,Xo=new WeakMap,al=new WeakSet,rm=i(function(){return this.baseURL!=="https://api.openai.com/v1"},"_OpenAI_baseURLOverridden");M.OpenAI=cl;M.DEFAULT_TIMEOUT=6e5;M.OpenAIError=T;M.APIError=Q;M.APIConnectionError=Et;M.APIConnectionTimeoutError=St;M.APIUserAbortError=K;M.NotFoundError=Rr;M.ConflictError=Pr;M.RateLimitError=wr;M.BadRequestError=yr;M.AuthenticationError=Tr;M.InternalServerError=br;M.PermissionDeniedError=_r;M.UnprocessableEntityError=Ar;M.InvalidWebhookSignatureError=Ue;M.toFile=Ao;M.Completions=Jt;M.Chat=_t;M.Embeddings=Yt;M.Files=Zt;M.Images=sr;M.Audio=qe;M.Moderations=or;M.Models=nr;M.FineTuning=$e;M.Graders=xt;M.VectorStores=it;M.Webhooks=cr;M.Beta=Le;M.Batches=zt;M.Uploads=Nt;M.Responses=nt;M.Realtime=st;M.Conversations=It;M.Evals=Mt;M.Containers=bt;M.Skills=ot;M.Videos=ar});var sm=d(()=>{"use strict";V();Oe();dn();Jo()});var nm=d(()=>{"use strict";Jo();Ia();_o();Jo();F();Ve();sm()});import{configManager as ll}from"@xiaozhi-client/config";function cv(n){return n.replace(/<think>[\s\S]*?<\/think>/g,"").trim()}var Ko,om=d(()=>{"use strict";D();kd();nm();i(cv,"removeThinkTags");Ko=class{static{i(this,"LLMService")}client=null;model="";constructor(){this.initClient()}initClient(){let e=ll.getLLMConfig();if(!e||!ll.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}`)}isAvailable(){return this.client!==null}async chat(e){if(!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=ll.getLLMConfig(),r=Dd(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=cv(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 lv}from"stream";import{configManager as uv}from"@xiaozhi-client/config";import{TTS as pv}from"@xiaozhi-client/tts";import*as ul from"prism-media";var Yo,im=d(()=>{"use strict";D();Yo=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=uv.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 ul.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 pv({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 ul.opus.OggDemuxer,a=lv.from(e),c=0,l=0,p=0;a.pause();let m=i(async P=>{let b=this.getPacketDuration(P);try{await t(P,{index:c,size:P.length,duration:b,timestamp:l}),c++,l+=b,p+=b}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 Qo,am=d(()=>{"use strict";D();Od();na();Nd();om();im();Qo=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 Ko,this.asrService=this.createASRService(),this.ttsService=this.createTTSService(),this.setupTTSGetConnection()}createASRService(){return new po({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{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 Yo({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")}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}=xd(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 uo(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 cm=d(()=>{"use strict";Td();_d();Ce();Rd();am();Mn()});function dv(n){return Array.isArray(n.routes)}function lm(n){if(dv(n)){let{routes:e,middleware:t}=n;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return n}function B(n){return e=>t=>{let s=t.get("dependencies")[n];return e(s,t)}}var ge=d(()=>{"use strict";i(dv,"isRouteGroup");i(lm,"normalizeRoutes");i(B,"createHandler")});var hn,um=d(()=>{"use strict";ge();hn=class{constructor(e){this.logger=e}static{i(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=lm(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 at,pl,pm=d(()=>{"use strict";ge();at=B("configApiHandler"),pl=[{method:"GET",path:"/api/config",handler:at((n,e)=>n.getConfig(e))},{method:"PUT",path:"/api/config",handler:at((n,e)=>n.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:at((n,e)=>n.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:at((n,e)=>n.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:at((n,e)=>n.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:at((n,e)=>n.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:at((n,e)=>n.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:at((n,e)=>n.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:at((n,e)=>n.checkConfigExists(e))}]});var ms,dl,dm=d(()=>{"use strict";ge();ms=B("statusApiHandler"),dl=[{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,fl,fm=d(()=>{"use strict";ge();Lt=B("mcpToolHandler"),fl=[{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 fv,ml,mm=d(()=>{"use strict";ge();fv=B("mcpRouteHandler"),ml=[{method:"POST",path:"/mcp",handler:fv((n,e)=>n.handlePost(e))}]});var Zo,gl,gm=d(()=>{"use strict";ge();Zo=B("versionApiHandler"),gl=[{method:"GET",path:"/api/version",handler:Zo((n,e)=>n.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:Zo((n,e)=>n.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:Zo((n,e)=>n.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:Zo((n,e)=>n.checkLatestVersion(e))}]});var Cn,hl,hm=d(()=>{"use strict";ge();Cn=B("serviceApiHandler"),hl=[{method:"POST",path:"/api/services/restart",handler:Cn((n,e)=>n.restartService(e))},{method:"POST",path:"/api/services/stop",handler:Cn((n,e)=>n.stopService(e))},{method:"POST",path:"/api/services/start",handler:Cn((n,e)=>n.startService(e))},{method:"GET",path:"/api/services/status",handler:Cn((n,e)=>n.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:Cn((n,e)=>n.getServiceHealth(e))}]});var mv,Cl,Cm=d(()=>{"use strict";ge();mv=B("updateApiHandler"),Cl=[{method:"POST",path:"/api/update",handler:mv((n,e)=>n.performUpdate(e))}]});var gv,El,Em=d(()=>{"use strict";ge();gv=B("staticFileHandler"),El=[{method:"GET",path:"/*",handler:gv(async(n,e)=>e.req.path.startsWith("/api/")?e.notFound():await n.handleStaticFile(e))}]});var ei,Sl,Sm=d(()=>{"use strict";ge();ei=B("cozeHandler"),Sl=[{method:"GET",path:"/api/coze/workspaces",handler:ei((n,e)=>n.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:ei((n,e)=>n.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:ei((n,e)=>n.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:ei((n,e)=>n.getCacheStats(e))}]});var hv,vl,vm=d(()=>{"use strict";ge();hv=B("mcpToolLogHandler"),vl=[{method:"GET",path:"/api/tool-calls/logs",handler:hv((n,e)=>n.getToolCallLogs(e))}]});var ti,yl,ym=d(()=>{"use strict";ti=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"),yl=[{method:"POST",path:"/api/mcp-servers",handler:i(n=>ti(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:i(n=>ti(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:i(n=>ti(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:i(n=>ti(n,e=>e.listMCPServers(n)),"handler")}]});var En,Tl,Tm=d(()=>{"use strict";En=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"),Tl=[{method:"POST",path:"/api/endpoint/status",handler:i(n=>En(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:i(n=>En(n,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:i(n=>En(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:i(n=>En(n,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:i(n=>En(n,"removeEndpoint"),"handler")}]});var Cv,_l,_m=d(()=>{"use strict";ge();Cv=B("serviceApiHandler"),_l=[{method:"POST",path:"/api/restart",handler:Cv((n,e)=>n.restartService(e))}]});var Ev,Rl,Rm=d(()=>{"use strict";ge();Ev=B("ttsApiHandler"),Rl=[{method:"POST",path:"/api/tts",handler:Ev((n,e)=>n.synthesize(e))}]});var uF,Pl,Al,Pm=d(()=>{"use strict";ge();uF=B("esp32Handler"),Pl=i(n=>async e=>{let r=e.get("dependencies").esp32Handler;return r?n(r,e):e.json({error:"ESP32 service not available"},503)},"createESP32Handler"),Al=[{method:"POST",path:"/",handler:Pl((n,e)=>n.handleOTA(e))},{method:"POST",path:"/xiaozhi/ota/",handler:Pl((n,e)=>n.handleOTA(e))},{method:"GET",path:"/ws",handler:Pl(async(n,e)=>(e.get("logger").debug("ESP32 WebSocket\u7AEF\u70B9\u8BBF\u95EE"),e.text("WebSocket Upgrade Required",426)))}]});var Am=d(()=>{"use strict";pm();dm();fm();mm();gm();hm();Cm();Em();Sm();vm();ym();Tm();_m();Rm();Pm()});var wm=d(()=>{"use strict";um();Am()});var bm={};ni(bm,{WebServer:()=>wl});import{createServer as Sv}from"http";import{serve as vv}from"@hono/node-server";import{normalizeServiceConfig as yv}from"@xiaozhi-client/config";import{configManager as Sn}from"@xiaozhi-client/config";import{EndpointManager as Tv}from"@xiaozhi-client/endpoint";import{WebSocketServer as _v}from"ws";var wl,Im=d(()=>{"use strict";D();fd();gt();gr();yd();cm();Ti();dt();ea();wm();wl=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;constructor(e){try{this.port=e??Sn.getWebUIPort()??fr.DEFAULT_PORT}catch{this.port=e??fr.DEFAULT_PORT}this.logger=u,this.eventBus=k(),this.statusService=new ao,this.notificationService=new co,this.deviceRegistryService=new lo,this.esp32Service=new Qo(this.deviceRegistryService),this.esp32Service.setupTTSGetConnection(),this.configApiHandler=new Tn,this.statusApiHandler=new jn(this.statusService),this.serviceApiHandler=new Vn(this.statusService),this.mcpToolHandler=new Wn,this.mcpToolLogHandler=new qn,this.versionApiHandler=new io,this.staticFileHandler=new xs,this.mcpRouteHandler=new Fn,this.updateApiHandler=new oo,this.cozeHandler=new Es,this.ttsApiHandler=new Us,this.esp32Handler=new Vs(this.esp32Service),this.realtimeNotificationHandler=new Un(this.notificationService,this.statusService),this.heartbeatHandler=new bn(this.statusService,this.notificationService),this.app=eu(),this.setupMiddleware(),this.app.notFound(Qi),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 Is(this.mcpServiceManager,Sn),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:In(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
|
|
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
|
|
108
108
|
1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
|
|
109
109
|
2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
|
|
110
110
|
3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
|
|
111
111
|
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(!Sn.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");Sn.cleanupInvalidServerToolsConfig();let e=Sn.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??fr.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=yv(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 Tv({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("*",Ji),this.app?.use("*",Zi),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",ta),this.app?.use("*",ra()),this.app?.use("*",sa()),this.app?.use("*",Ki),this.app?.onError(Yi),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 hn(this.logger)}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:pl,status:dl,tools:fl,mcp:ml,version:gl,services:hl,update:Cl,coze:Sl,"tool-logs":vl,mcpserver:yl,endpoint:Tl,misc:_l,tts:Rl,esp32:Al,static:El}),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(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}setupMCPServerAddedListener(){this.eventBus.onEvent("mcp:server:added",async e=>{if(this.logger.info(`\u68C0\u6D4B\u5230 MCP \u670D\u52A1\u6DFB\u52A0: ${e.serverName}\uFF0C\u5DE5\u5177\u6570\u91CF: ${e.tools.length}`),!this.endpointManager){this.logger.warn("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}try{let r=this.endpointManager.getConnectionStatus().filter(s=>s.connected).length;if(r===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 ${r} \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:e.serverName,endpointCount:r,timestamp:Date.now()})}catch(t){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",t),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_added",serverName:e.serverName,error:t instanceof Error?t.message:String(t),timestamp:Date.now()})}}),this.eventBus.onEvent("mcp:server:batch_added",async e=>{if(this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CF MCP \u670D\u52A1\u6DFB\u52A0: ${e.addedCount} \u4E2A\u6210\u529F\uFF0C${e.failedCount} \u4E2A\u5931\u8D25`),!(!this.endpointManager||e.addedCount===0))try{let r=this.endpointManager.getConnectionStatus().filter(s=>s.connected).length;if(r===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 ${r} \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:r,timestamp:Date.now()})}catch(t){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",t),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_batch_added",serverName:void 0,error:t instanceof Error?t.message:String(t),timestamp:Date.now()})}})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=vv({fetch:this.app.fetch,port:this.port,hostname:fr.DEFAULT_BIND_ADDRESS,createServer:Sv});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new _v({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${fr.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),this.statusService.destroy(),this.notificationService.destroy(),this.deviceRegistryService.destroy(),this.esp32Service.destroy(),zl(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}}});async function Rv(){let n=await Promise.resolve().then(()=>(Im(),bm)),e=await import("@xiaozhi-client/config"),t=await Promise.resolve().then(()=>(D(),xl));return{WebServer:n.WebServer,configManager:e.configManager,logger:t.logger}}i(Rv,"importModules");async function Pv(){let n=process.argv.slice(2);try{let{WebServer:e,configManager:t,logger:r}=await Rv();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(Pv,"main");import.meta.url===`file://${process.argv[1]}`&&Pv();
|
|
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();
|
|
113
113
|
//# sourceMappingURL=WebServerLauncher.js.map
|