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.
Files changed (73) hide show
  1. package/dist/backend/Logger.js +2 -2
  2. package/dist/backend/Logger.js.map +1 -1
  3. package/dist/backend/WebServer.js +20 -20
  4. package/dist/backend/WebServer.js.map +1 -1
  5. package/dist/backend/WebServerLauncher.js +19 -19
  6. package/dist/backend/WebServerLauncher.js.map +1 -1
  7. package/dist/backend/package.json +12 -6
  8. package/dist/backend/templates/default/prompts/default.md +3 -0
  9. package/dist/backend/templates/default/xiaozhi.config.json +17 -6
  10. package/dist/backend/templates/hello-world/prompts/default.md +3 -0
  11. package/dist/backend/templates/hello-world/xiaozhi.config.json +17 -0
  12. package/dist/backend/templates/json5/prompts/default.md +3 -0
  13. package/dist/backend/templates/json5/xiaozhi.config.json5 +18 -0
  14. package/dist/backend/templates/jsonc/prompts/default.md +3 -0
  15. package/dist/backend/templates/jsonc/xiaozhi.config.jsonc +18 -0
  16. package/dist/backend/templates/modelscope/prompts/default.md +3 -0
  17. package/dist/backend/templates/modelscope/xiaozhi.config.json +17 -0
  18. package/dist/cli/index.js +18 -12
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/config/index.d.ts +5 -6
  21. package/dist/config/index.js +23 -32
  22. package/dist/config/index.js.map +1 -1
  23. package/dist/frontend/assets/index-BAV6nu4X.js +81 -0
  24. package/dist/frontend/assets/index-BAV6nu4X.js.map +1 -0
  25. package/dist/frontend/assets/index-HDlbxheg.css +1 -0
  26. package/dist/frontend/assets/{react-vendor-nhjYH1qO.js → react-vendor-BPQojLhf.js} +13 -13
  27. package/dist/frontend/assets/react-vendor-BPQojLhf.js.map +1 -0
  28. package/dist/frontend/assets/{utils-OFMjZRUK.js → utils-BWIWSmq9.js} +2 -2
  29. package/dist/frontend/assets/{utils-OFMjZRUK.js.map → utils-BWIWSmq9.js.map} +1 -1
  30. package/dist/frontend/index.html +4 -4
  31. package/package.json +11 -11
  32. package/templates/default/prompts/default.md +3 -0
  33. package/templates/default/xiaozhi.config.json +17 -6
  34. package/templates/hello-world/prompts/default.md +3 -0
  35. package/templates/hello-world/xiaozhi.config.json +17 -0
  36. package/templates/json5/prompts/default.md +3 -0
  37. package/templates/json5/xiaozhi.config.json5 +18 -0
  38. package/templates/jsonc/prompts/default.md +3 -0
  39. package/templates/jsonc/xiaozhi.config.jsonc +18 -0
  40. package/templates/modelscope/prompts/default.md +3 -0
  41. package/templates/modelscope/xiaozhi.config.json +17 -0
  42. package/dist/frontend/assets/index-DWj2UcGy.css +0 -1
  43. package/dist/frontend/assets/index-HnebiJM5.js +0 -81
  44. package/dist/frontend/assets/index-HnebiJM5.js.map +0 -1
  45. package/dist/frontend/assets/react-vendor-nhjYH1qO.js.map +0 -1
  46. package/dist/shared-types/api-B5HunvHc.d.ts +0 -97
  47. package/dist/shared-types/api.d.ts +0 -204
  48. package/dist/shared-types/api.js +0 -50
  49. package/dist/shared-types/api.js.map +0 -1
  50. package/dist/shared-types/app-Ceijcsur.d.ts +0 -95
  51. package/dist/shared-types/chunk-BMOKIX3Q.js +0 -51
  52. package/dist/shared-types/chunk-BMOKIX3Q.js.map +0 -1
  53. package/dist/shared-types/config.d.ts +0 -97
  54. package/dist/shared-types/config.js +0 -1
  55. package/dist/shared-types/config.js.map +0 -1
  56. package/dist/shared-types/coze.d.ts +0 -31
  57. package/dist/shared-types/coze.js +0 -1
  58. package/dist/shared-types/coze.js.map +0 -1
  59. package/dist/shared-types/index.d.ts +0 -188
  60. package/dist/shared-types/index.js +0 -23
  61. package/dist/shared-types/index.js.map +0 -1
  62. package/dist/shared-types/mcp.d.ts +0 -93
  63. package/dist/shared-types/mcp.js +0 -31
  64. package/dist/shared-types/mcp.js.map +0 -1
  65. package/dist/shared-types/message-BrlYWzXV.d.ts +0 -154
  66. package/dist/shared-types/schema-Bs4SCukS.d.ts +0 -25
  67. package/dist/shared-types/timeout-D1mc0P3r.d.ts +0 -39
  68. package/dist/shared-types/tool-definition-B6f-mWPy.d.ts +0 -93
  69. package/dist/shared-types/toolApi-D-G8Chst.d.ts +0 -200
  70. package/dist/shared-types/utils.d.ts +0 -115
  71. package/dist/shared-types/utils.js +0 -15
  72. package/dist/shared-types/utils.js.map +0 -1
  73. package/dist/shared-types/workflow-Dl-hsNZK.d.ts +0 -86
@@ -1,5 +1,5 @@
1
- var Mu=Object.create;var Xs=Object.defineProperty;var xu=Object.getOwnPropertyDescriptor;var Ou=Object.getOwnPropertyNames;var Nu=Object.getPrototypeOf,Lu=Object.prototype.hasOwnProperty;var i=(n,e)=>Xs(n,"name",{value:e,configurable:!0});var I=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),$u=(n,e)=>{for(var t in e)Xs(n,t,{get:e[t],enumerable:!0})},Co=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ou(e))!Lu.call(n,s)&&s!==t&&Xs(n,s,{get:()=>e[s],enumerable:!(r=xu(e,s))||r.enumerable});return n},Jr=(n,e,t)=>(Co(n,e,"default"),t&&Co(t,e,"default")),Du=(n,e,t)=>(t=n!=null?Mu(Nu(n)):{},Co(e||!n||!n.__esModule?Xs(t,"default",{value:n,enumerable:!0}):t,n));var ds=I((Sv,Pa)=>{"use strict";var hp="2.0.0",gp=Number.MAX_SAFE_INTEGER||9007199254740991,Cp=16,Ep=250,Sp=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Pa.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Cp,MAX_SAFE_BUILD_LENGTH:Ep,MAX_SAFE_INTEGER:gp,RELEASE_TYPES:Sp,SEMVER_SPEC_VERSION:hp,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var fs=I((vv,Aa)=>{"use strict";var vp=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};Aa.exports=vp});var Zt=I((be,wa)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:No,MAX_SAFE_BUILD_LENGTH:yp,MAX_LENGTH:Tp}=ds(),_p=fs();be=wa.exports={};var Rp=be.re=[],Pp=be.safeRe=[],T=be.src=[],Ap=be.safeSrc=[],_=be.t={},wp=0,Lo="[a-zA-Z0-9-]",bp=[["\\s",1],["\\d",Tp],[Lo,yp]],Ip=i(n=>{for(let[e,t]of bp)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),x=i((n,e,t)=>{let r=Ip(e),s=wp++;_p(n,s,e),_[n]=s,T[s]=e,Ap[s]=r,Rp[s]=new RegExp(e,t?"g":void 0),Pp[s]=new RegExp(r,t?"g":void 0)},"createToken");x("NUMERICIDENTIFIER","0|[1-9]\\d*");x("NUMERICIDENTIFIERLOOSE","\\d+");x("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Lo}*`);x("MAINVERSION",`(${T[_.NUMERICIDENTIFIER]})\\.(${T[_.NUMERICIDENTIFIER]})\\.(${T[_.NUMERICIDENTIFIER]})`);x("MAINVERSIONLOOSE",`(${T[_.NUMERICIDENTIFIERLOOSE]})\\.(${T[_.NUMERICIDENTIFIERLOOSE]})\\.(${T[_.NUMERICIDENTIFIERLOOSE]})`);x("PRERELEASEIDENTIFIER",`(?:${T[_.NONNUMERICIDENTIFIER]}|${T[_.NUMERICIDENTIFIER]})`);x("PRERELEASEIDENTIFIERLOOSE",`(?:${T[_.NONNUMERICIDENTIFIER]}|${T[_.NUMERICIDENTIFIERLOOSE]})`);x("PRERELEASE",`(?:-(${T[_.PRERELEASEIDENTIFIER]}(?:\\.${T[_.PRERELEASEIDENTIFIER]})*))`);x("PRERELEASELOOSE",`(?:-?(${T[_.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${T[_.PRERELEASEIDENTIFIERLOOSE]})*))`);x("BUILDIDENTIFIER",`${Lo}+`);x("BUILD",`(?:\\+(${T[_.BUILDIDENTIFIER]}(?:\\.${T[_.BUILDIDENTIFIER]})*))`);x("FULLPLAIN",`v?${T[_.MAINVERSION]}${T[_.PRERELEASE]}?${T[_.BUILD]}?`);x("FULL",`^${T[_.FULLPLAIN]}$`);x("LOOSEPLAIN",`[v=\\s]*${T[_.MAINVERSIONLOOSE]}${T[_.PRERELEASELOOSE]}?${T[_.BUILD]}?`);x("LOOSE",`^${T[_.LOOSEPLAIN]}$`);x("GTLT","((?:<|>)?=?)");x("XRANGEIDENTIFIERLOOSE",`${T[_.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);x("XRANGEIDENTIFIER",`${T[_.NUMERICIDENTIFIER]}|x|X|\\*`);x("XRANGEPLAIN",`[v=\\s]*(${T[_.XRANGEIDENTIFIER]})(?:\\.(${T[_.XRANGEIDENTIFIER]})(?:\\.(${T[_.XRANGEIDENTIFIER]})(?:${T[_.PRERELEASE]})?${T[_.BUILD]}?)?)?`);x("XRANGEPLAINLOOSE",`[v=\\s]*(${T[_.XRANGEIDENTIFIERLOOSE]})(?:\\.(${T[_.XRANGEIDENTIFIERLOOSE]})(?:\\.(${T[_.XRANGEIDENTIFIERLOOSE]})(?:${T[_.PRERELEASELOOSE]})?${T[_.BUILD]}?)?)?`);x("XRANGE",`^${T[_.GTLT]}\\s*${T[_.XRANGEPLAIN]}$`);x("XRANGELOOSE",`^${T[_.GTLT]}\\s*${T[_.XRANGEPLAINLOOSE]}$`);x("COERCEPLAIN",`(^|[^\\d])(\\d{1,${No}})(?:\\.(\\d{1,${No}}))?(?:\\.(\\d{1,${No}}))?`);x("COERCE",`${T[_.COERCEPLAIN]}(?:$|[^\\d])`);x("COERCEFULL",T[_.COERCEPLAIN]+`(?:${T[_.PRERELEASE]})?(?:${T[_.BUILD]})?(?:$|[^\\d])`);x("COERCERTL",T[_.COERCE],!0);x("COERCERTLFULL",T[_.COERCEFULL],!0);x("LONETILDE","(?:~>?)");x("TILDETRIM",`(\\s*)${T[_.LONETILDE]}\\s+`,!0);be.tildeTrimReplace="$1~";x("TILDE",`^${T[_.LONETILDE]}${T[_.XRANGEPLAIN]}$`);x("TILDELOOSE",`^${T[_.LONETILDE]}${T[_.XRANGEPLAINLOOSE]}$`);x("LONECARET","(?:\\^)");x("CARETTRIM",`(\\s*)${T[_.LONECARET]}\\s+`,!0);be.caretTrimReplace="$1^";x("CARET",`^${T[_.LONECARET]}${T[_.XRANGEPLAIN]}$`);x("CARETLOOSE",`^${T[_.LONECARET]}${T[_.XRANGEPLAINLOOSE]}$`);x("COMPARATORLOOSE",`^${T[_.GTLT]}\\s*(${T[_.LOOSEPLAIN]})$|^$`);x("COMPARATOR",`^${T[_.GTLT]}\\s*(${T[_.FULLPLAIN]})$|^$`);x("COMPARATORTRIM",`(\\s*)${T[_.GTLT]}\\s*(${T[_.LOOSEPLAIN]}|${T[_.XRANGEPLAIN]})`,!0);be.comparatorTrimReplace="$1$2$3";x("HYPHENRANGE",`^\\s*(${T[_.XRANGEPLAIN]})\\s+-\\s+(${T[_.XRANGEPLAIN]})\\s*$`);x("HYPHENRANGELOOSE",`^\\s*(${T[_.XRANGEPLAINLOOSE]})\\s+-\\s+(${T[_.XRANGEPLAINLOOSE]})\\s*$`);x("STAR","(<|>)?=?\\s*\\*");x("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");x("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var hn=I((Tv,ba)=>{"use strict";var Mp=Object.freeze({loose:!0}),xp=Object.freeze({}),Op=i(n=>n?typeof n!="object"?Mp:n:xp,"parseOptions");ba.exports=Op});var $o=I((Rv,xa)=>{"use strict";var Ia=/^[0-9]+$/,Ma=i((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=Ia.test(n),r=Ia.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),Np=i((n,e)=>Ma(e,n),"rcompareIdentifiers");xa.exports={compareIdentifiers:Ma,rcompareIdentifiers:Np}});var te=I((Av,Na)=>{"use strict";var gn=fs(),{MAX_LENGTH:Oa,MAX_SAFE_INTEGER:Cn}=ds(),{safeRe:En,t:Sn}=Zt(),Lp=hn(),{compareIdentifiers:Do}=$o(),ko=class n{static{i(this,"SemVer")}constructor(e,t){if(t=Lp(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>Oa)throw new TypeError(`version is longer than ${Oa} characters`);gn("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?En[Sn.LOOSE]:En[Sn.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>Cn||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Cn||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Cn||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<Cn)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(gn("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(gn("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 Do(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(gn("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 Do(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?En[Sn.PRERELEASELOOSE]:En[Sn.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]),Do(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}};Na.exports=ko});var yt=I((bv,$a)=>{"use strict";var La=te(),$p=i((n,e,t=!1)=>{if(n instanceof La)return n;try{return new La(n,e)}catch(r){if(!t)return null;throw r}},"parse");$a.exports=$p});var ka=I((Mv,Da)=>{"use strict";var Dp=yt(),kp=i((n,e)=>{let t=Dp(n,e);return t?t.version:null},"valid");Da.exports=kp});var Ha=I((Ov,Fa)=>{"use strict";var Fp=yt(),Hp=i((n,e)=>{let t=Fp(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");Fa.exports=Hp});var Ba=I((Lv,Va)=>{"use strict";var Ua=te(),Up=i((n,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new Ua(n instanceof Ua?n.version:n,t).inc(e,r,s).version}catch{return null}},"inc");Va.exports=Up});var Wa=I((Dv,za)=>{"use strict";var ja=yt(),Vp=i((n,e)=>{let t=ja(n,null,!0),r=ja(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 f=l?"pre":"";return t.major!==r.major?f+"major":t.minor!==r.minor?f+"minor":t.patch!==r.patch?f+"patch":"prerelease"},"diff");za.exports=Vp});var Ga=I((Fv,qa)=>{"use strict";var Bp=te(),jp=i((n,e)=>new Bp(n,e).major,"major");qa.exports=jp});var Ja=I((Uv,Xa)=>{"use strict";var zp=te(),Wp=i((n,e)=>new zp(n,e).minor,"minor");Xa.exports=Wp});var Ya=I((Bv,Ka)=>{"use strict";var qp=te(),Gp=i((n,e)=>new qp(n,e).patch,"patch");Ka.exports=Gp});var Za=I((zv,Qa)=>{"use strict";var Xp=yt(),Jp=i((n,e)=>{let t=Xp(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Qa.exports=Jp});var ge=I((qv,tc)=>{"use strict";var ec=te(),Kp=i((n,e,t)=>new ec(n,t).compare(new ec(e,t)),"compare");tc.exports=Kp});var sc=I((Xv,rc)=>{"use strict";var Yp=ge(),Qp=i((n,e,t)=>Yp(e,n,t),"rcompare");rc.exports=Qp});var oc=I((Kv,nc)=>{"use strict";var Zp=ge(),ed=i((n,e)=>Zp(n,e,!0),"compareLoose");nc.exports=ed});var vn=I((Qv,ac)=>{"use strict";var ic=te(),td=i((n,e,t)=>{let r=new ic(n,t),s=new ic(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");ac.exports=td});var lc=I((ey,cc)=>{"use strict";var rd=vn(),sd=i((n,e)=>n.sort((t,r)=>rd(t,r,e)),"sort");cc.exports=sd});var pc=I((ry,uc)=>{"use strict";var nd=vn(),od=i((n,e)=>n.sort((t,r)=>nd(r,t,e)),"rsort");uc.exports=od});var ms=I((ny,dc)=>{"use strict";var id=ge(),ad=i((n,e,t)=>id(n,e,t)>0,"gt");dc.exports=ad});var yn=I((iy,fc)=>{"use strict";var cd=ge(),ld=i((n,e,t)=>cd(n,e,t)<0,"lt");fc.exports=ld});var Fo=I((cy,mc)=>{"use strict";var ud=ge(),pd=i((n,e,t)=>ud(n,e,t)===0,"eq");mc.exports=pd});var Ho=I((uy,hc)=>{"use strict";var dd=ge(),fd=i((n,e,t)=>dd(n,e,t)!==0,"neq");hc.exports=fd});var Tn=I((dy,gc)=>{"use strict";var md=ge(),hd=i((n,e,t)=>md(n,e,t)>=0,"gte");gc.exports=hd});var _n=I((my,Cc)=>{"use strict";var gd=ge(),Cd=i((n,e,t)=>gd(n,e,t)<=0,"lte");Cc.exports=Cd});var Uo=I((gy,Ec)=>{"use strict";var Ed=Fo(),Sd=Ho(),vd=ms(),yd=Tn(),Td=yn(),_d=_n(),Rd=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 Ed(n,t,r);case"!=":return Sd(n,t,r);case">":return vd(n,t,r);case">=":return yd(n,t,r);case"<":return Td(n,t,r);case"<=":return _d(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Ec.exports=Rd});var vc=I((Ey,Sc)=>{"use strict";var Pd=te(),Ad=yt(),{safeRe:Rn,t:Pn}=Zt(),wd=i((n,e)=>{if(n instanceof Pd)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?Rn[Pn.COERCEFULL]:Rn[Pn.COERCE]);else{let l=e.includePrerelease?Rn[Pn.COERCERTLFULL]:Rn[Pn.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 Ad(`${r}.${s}.${o}${a}${c}`,e)},"coerce");Sc.exports=wd});var Tc=I((vy,yc)=>{"use strict";var Vo=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}};yc.exports=Vo});var Ce=I((Ty,Ac)=>{"use strict";var bd=/\s+/g,Bo=class n{static{i(this,"Range")}constructor(e,t){if(t=Md(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof jo)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(bd," "),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=>!Rc(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&&kd(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&&$d)|(this.options.loose&&Dd))+":"+e,s=_c.get(r);if(s)return s;let o=this.options.loose,a=o?ie[re.HYPHENRANGELOOSE]:ie[re.HYPHENRANGE];e=e.replace(a,Gd(this.options.includePrerelease)),k("hyphen replace",e),e=e.replace(ie[re.COMPARATORTRIM],Od),k("comparator trim",e),e=e.replace(ie[re.TILDETRIM],Nd),k("tilde trim",e),e=e.replace(ie[re.CARETTRIM],Ld),k("caret trim",e);let c=e.split(" ").map(d=>Fd(d,this.options)).join(" ").split(/\s+/).map(d=>qd(d,this.options));o&&(c=c.filter(d=>(k("loose invalid filter",d,this.options),!!d.match(ie[re.COMPARATORLOOSE])))),k("range list",c);let l=new Map,p=c.map(d=>new jo(d,this.options));for(let d of p){if(Rc(d))return[d];l.set(d.value,d)}l.size>1&&l.has("")&&l.delete("");let f=[...l.values()];return _c.set(r,f),f}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Pc(r,t)&&e.set.some(s=>Pc(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 xd(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Xd(this.set[t],e,this.options))return!0;return!1}};Ac.exports=Bo;var Id=Tc(),_c=new Id,Md=hn(),jo=hs(),k=fs(),xd=te(),{safeRe:ie,t:re,comparatorTrimReplace:Od,tildeTrimReplace:Nd,caretTrimReplace:Ld}=Zt(),{FLAG_INCLUDE_PRERELEASE:$d,FLAG_LOOSE:Dd}=ds(),Rc=i(n=>n.value==="<0.0.0-0","isNullSet"),kd=i(n=>n.value==="","isAny"),Pc=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"),Fd=i((n,e)=>(n=n.replace(ie[re.BUILD],""),k("comp",n,e),n=Vd(n,e),k("caret",n),n=Hd(n,e),k("tildes",n),n=jd(n,e),k("xrange",n),n=Wd(n,e),k("stars",n),n),"parseComparator"),ae=i(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),Hd=i((n,e)=>n.trim().split(/\s+/).map(t=>Ud(t,e)).join(" "),"replaceTildes"),Ud=i((n,e)=>{let t=e.loose?ie[re.TILDELOOSE]:ie[re.TILDE];return n.replace(t,(r,s,o,a,c)=>{k("tilde",n,r,s,o,a,c);let l;return ae(s)?l="":ae(o)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:ae(a)?l=`>=${s}.${o}.0 <${s}.${+o+1}.0-0`:c?(k("replaceTilde pr",c),l=`>=${s}.${o}.${a}-${c} <${s}.${+o+1}.0-0`):l=`>=${s}.${o}.${a} <${s}.${+o+1}.0-0`,k("tilde return",l),l})},"replaceTilde"),Vd=i((n,e)=>n.trim().split(/\s+/).map(t=>Bd(t,e)).join(" "),"replaceCarets"),Bd=i((n,e)=>{k("caret",n,e);let t=e.loose?ie[re.CARETLOOSE]:ie[re.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(s,o,a,c,l)=>{k("caret",n,s,o,a,c,l);let p;return ae(o)?p="":ae(a)?p=`>=${o}.0.0${r} <${+o+1}.0.0-0`:ae(c)?o==="0"?p=`>=${o}.${a}.0${r} <${o}.${+a+1}.0-0`:p=`>=${o}.${a}.0${r} <${+o+1}.0.0-0`:l?(k("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`):(k("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`),k("caret return",p),p})},"replaceCaret"),jd=i((n,e)=>(k("replaceXRanges",n,e),n.split(/\s+/).map(t=>zd(t,e)).join(" ")),"replaceXRanges"),zd=i((n,e)=>{n=n.trim();let t=e.loose?ie[re.XRANGELOOSE]:ie[re.XRANGE];return n.replace(t,(r,s,o,a,c,l)=>{k("xRange",n,r,s,o,a,c,l);let p=ae(o),f=p||ae(a),d=f||ae(c),E=d;return s==="="&&E&&(s=""),l=e.includePrerelease?"-0":"",p?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&E?(f&&(a=0),c=0,s===">"?(s=">=",f?(o=+o+1,a=0,c=0):(a=+a+1,c=0)):s==="<="&&(s="<",f?o=+o+1:a=+a+1),s==="<"&&(l="-0"),r=`${s+o}.${a}.${c}${l}`):f?r=`>=${o}.0.0${l} <${+o+1}.0.0-0`:d&&(r=`>=${o}.${a}.0${l} <${o}.${+a+1}.0-0`),k("xRange return",r),r})},"replaceXRange"),Wd=i((n,e)=>(k("replaceStars",n,e),n.trim().replace(ie[re.STAR],"")),"replaceStars"),qd=i((n,e)=>(k("replaceGTE0",n,e),n.trim().replace(ie[e.includePrerelease?re.GTE0PRE:re.GTE0],"")),"replaceGTE0"),Gd=i(n=>(e,t,r,s,o,a,c,l,p,f,d,E)=>(ae(r)?t="":ae(s)?t=`>=${r}.0.0${n?"-0":""}`:ae(o)?t=`>=${r}.${s}.0${n?"-0":""}`:a?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,ae(p)?l="":ae(f)?l=`<${+p+1}.0.0-0`:ae(d)?l=`<${p}.${+f+1}.0-0`:E?l=`<=${p}.${f}.${d}-${E}`:n?l=`<${p}.${f}.${+d+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),Xd=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(k(n[r].semver),n[r].semver!==jo.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 hs=I((Ry,Oc)=>{"use strict";var gs=Symbol("SemVer ANY"),qo=class n{static{i(this,"Comparator")}static get ANY(){return gs}constructor(e,t){if(t=wc(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Wo("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===gs?this.value="":this.value=this.operator+this.semver.version,Wo("comp",this)}parse(e){let t=this.options.loose?bc[Ic.COMPARATORLOOSE]:bc[Ic.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 Mc(r[2],this.options.loose):this.semver=gs}toString(){return this.value}test(e){if(Wo("Comparator.test",e,this.options.loose),this.semver===gs||e===gs)return!0;if(typeof e=="string")try{e=new Mc(e,this.options)}catch{return!1}return zo(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 xc(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new xc(this.value,t).test(e.semver):(t=wc(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("=")||zo(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||zo(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Oc.exports=qo;var wc=hn(),{safeRe:bc,t:Ic}=Zt(),zo=Uo(),Wo=fs(),Mc=te(),xc=Ce()});var Cs=I((Ay,Nc)=>{"use strict";var Jd=Ce(),Kd=i((n,e,t)=>{try{e=new Jd(e,t)}catch{return!1}return e.test(n)},"satisfies");Nc.exports=Kd});var $c=I((by,Lc)=>{"use strict";var Yd=Ce(),Qd=i((n,e)=>new Yd(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");Lc.exports=Qd});var kc=I((My,Dc)=>{"use strict";var Zd=te(),ef=Ce(),tf=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new ef(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===-1)&&(r=a,s=new Zd(r,t))}),r},"maxSatisfying");Dc.exports=tf});var Hc=I((Oy,Fc)=>{"use strict";var rf=te(),sf=Ce(),nf=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new sf(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===1)&&(r=a,s=new rf(r,t))}),r},"minSatisfying");Fc.exports=nf});var Bc=I((Ly,Vc)=>{"use strict";var Go=te(),of=Ce(),Uc=ms(),af=i((n,e)=>{n=new of(n,e);let t=new Go("0.0.0");if(n.test(t)||(t=new Go("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 Go(a.semver.version);switch(a.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!o||Uc(c,o))&&(o=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${a.operator}`)}}),o&&(!t||Uc(t,o))&&(t=o)}return t&&n.test(t)?t:null},"minVersion");Vc.exports=af});var zc=I((Dy,jc)=>{"use strict";var cf=Ce(),lf=i((n,e)=>{try{return new cf(n,e).range||"*"}catch{return null}},"validRange");jc.exports=lf});var An=I((Fy,Xc)=>{"use strict";var uf=te(),Gc=hs(),{ANY:pf}=Gc,df=Ce(),ff=Cs(),Wc=ms(),qc=yn(),mf=_n(),hf=Tn(),gf=i((n,e,t,r)=>{n=new uf(n,r),e=new df(e,r);let s,o,a,c,l;switch(t){case">":s=Wc,o=mf,a=qc,c=">",l=">=";break;case"<":s=qc,o=hf,a=Wc,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ff(n,e,r))return!1;for(let p=0;p<e.set.length;++p){let f=e.set[p],d=null,E=null;if(f.forEach(m=>{m.semver===pf&&(m=new Gc(">=0.0.0")),d=d||m,E=E||m,s(m.semver,d.semver,r)?d=m:a(m.semver,E.semver,r)&&(E=m)}),d.operator===c||d.operator===l||(!E.operator||E.operator===c)&&o(n,E.semver))return!1;if(E.operator===l&&a(n,E.semver))return!1}return!0},"outside");Xc.exports=gf});var Kc=I((Uy,Jc)=>{"use strict";var Cf=An(),Ef=i((n,e,t)=>Cf(n,e,">",t),"gtr");Jc.exports=Ef});var Qc=I((By,Yc)=>{"use strict";var Sf=An(),vf=i((n,e,t)=>Sf(n,e,"<",t),"ltr");Yc.exports=vf});var tl=I((zy,el)=>{"use strict";var Zc=Ce(),yf=i((n,e,t)=>(n=new Zc(n,t),e=new Zc(e,t),n.intersects(e,t)),"intersects");el.exports=yf});var sl=I((qy,rl)=>{"use strict";var Tf=Cs(),_f=ge();rl.exports=(n,e,t)=>{let r=[],s=null,o=null,a=n.sort((f,d)=>_f(f,d,t));for(let f of a)Tf(f,e,t)?(o=f,s||(s=f)):(o&&r.push([s,o]),o=null,s=null);s&&r.push([s,null]);let c=[];for(let[f,d]of r)f===d?c.push(f):!d&&f===a[0]?c.push("*"):d?f===a[0]?c.push(`<=${d}`):c.push(`${f} - ${d}`):c.push(`>=${f}`);let l=c.join(" || "),p=typeof e.raw=="string"?e.raw:String(e);return l.length<p.length?l:e}});var ll=I((Gy,cl)=>{"use strict";var nl=Ce(),Jo=hs(),{ANY:Xo}=Jo,Es=Cs(),Ko=ge(),Rf=i((n,e,t={})=>{if(n===e)return!0;n=new nl(n,t),e=new nl(e,t);let r=!1;e:for(let s of n.set){for(let o of e.set){let a=Af(s,o,t);if(r=r||a!==null,a)continue e}if(r)return!1}return!0},"subset"),Pf=[new Jo(">=0.0.0-0")],ol=[new Jo(">=0.0.0")],Af=i((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Xo){if(e.length===1&&e[0].semver===Xo)return!0;t.includePrerelease?n=Pf:n=ol}if(e.length===1&&e[0].semver===Xo){if(t.includePrerelease)return!0;e=ol}let r=new Set,s,o;for(let m of n)m.operator===">"||m.operator===">="?s=il(s,m,t):m.operator==="<"||m.operator==="<="?o=al(o,m,t):r.add(m.semver);if(r.size>1)return null;let a;if(s&&o){if(a=Ko(s.semver,o.semver,t),a>0)return null;if(a===0&&(s.operator!==">="||o.operator!=="<="))return null}for(let m of r){if(s&&!Es(m,String(s),t)||o&&!Es(m,String(o),t))return null;for(let R of e)if(!Es(m,String(R),t))return!1;return!0}let c,l,p,f,d=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1,E=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1;d&&d.prerelease.length===1&&o.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let m of e){if(f=f||m.operator===">"||m.operator===">=",p=p||m.operator==="<"||m.operator==="<=",s){if(E&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===E.major&&m.semver.minor===E.minor&&m.semver.patch===E.patch&&(E=!1),m.operator===">"||m.operator===">="){if(c=il(s,m,t),c===m&&c!==s)return!1}else if(s.operator===">="&&!Es(s.semver,String(m),t))return!1}if(o){if(d&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===d.major&&m.semver.minor===d.minor&&m.semver.patch===d.patch&&(d=!1),m.operator==="<"||m.operator==="<="){if(l=al(o,m,t),l===m&&l!==o)return!1}else if(o.operator==="<="&&!Es(o.semver,String(m),t))return!1}if(!m.operator&&(o||s)&&a!==0)return!1}return!(s&&p&&!o&&a!==0||o&&f&&!s&&a!==0||E||d)},"simpleSubset"),il=i((n,e,t)=>{if(!n)return e;let r=Ko(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),al=i((n,e,t)=>{if(!n)return e;let r=Ko(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");cl.exports=Rf});var fl=I((Jy,dl)=>{"use strict";var Yo=Zt(),ul=ds(),wf=te(),pl=$o(),bf=yt(),If=ka(),Mf=Ha(),xf=Ba(),Of=Wa(),Nf=Ga(),Lf=Ja(),$f=Ya(),Df=Za(),kf=ge(),Ff=sc(),Hf=oc(),Uf=vn(),Vf=lc(),Bf=pc(),jf=ms(),zf=yn(),Wf=Fo(),qf=Ho(),Gf=Tn(),Xf=_n(),Jf=Uo(),Kf=vc(),Yf=hs(),Qf=Ce(),Zf=Cs(),em=$c(),tm=kc(),rm=Hc(),sm=Bc(),nm=zc(),om=An(),im=Kc(),am=Qc(),cm=tl(),lm=sl(),um=ll();dl.exports={parse:bf,valid:If,clean:Mf,inc:xf,diff:Of,major:Nf,minor:Lf,patch:$f,prerelease:Df,compare:kf,rcompare:Ff,compareLoose:Hf,compareBuild:Uf,sort:Vf,rsort:Bf,gt:jf,lt:zf,eq:Wf,neq:qf,gte:Gf,lte:Xf,cmp:Jf,coerce:Kf,Comparator:Yf,Range:Qf,satisfies:Zf,toComparators:em,maxSatisfying:tm,minSatisfying:rm,minVersion:sm,validRange:nm,outside:om,gtr:im,ltr:am,intersects:cm,simplifyRange:lm,subset:um,SemVer:wf,re:Yo.re,src:Yo.src,tokens:Yo.t,SEMVER_SPEC_VERSION:ul.SEMVER_SPEC_VERSION,RELEASE_TYPES:ul.RELEASE_TYPES,compareIdentifiers:pl.compareIdentifiers,rcompareIdentifiers:pl.rcompareIdentifiers}});import{createServer as Eg}from"http";import*as oe from"fs";import*as me from"path";import Kr from"chalk";import Gt from"pino";import{z as ku}from"zod";var Fu=ku.enum(["fatal","error","warn","info","debug","trace"]);function Hu(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}`}i(Hu,"formatDateTime");var So=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=Fu.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:Gt.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Gt.destination({dest:"/dev/null"})}),Gt({level:this.logLevel,timestamp:Gt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((t,r)=>({level:r}),"level")},base:null,serializers:{err:Gt.stdSerializers?.err||(t=>t)}},Gt.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Kr.gray}],[30,{name:"INFO",color:Kr.blue}],[40,{name:"WARN",color:Kr.yellow}],[50,{name:"ERROR",color:Kr.red}],[60,{name:"FATAL",color:Kr.red}]]);return{write:i(t=>{try{let r=JSON.parse(t),s=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${s}
2
- `)}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=Hu(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=me.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded();try{oe.existsSync(this.logFilePath)||oe.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||!oe.existsSync(this.logFilePath)))try{oe.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=me.dirname(this.logFilePath),t=me.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=me.join(e,`${t}.${s}.log`),a=me.join(e,`${t}.${s+1}.log`);oe.existsSync(o)&&(s===this.maxLogFiles-1?oe.unlinkSync(o):oe.renameSync(o,a))}let r=me.join(e,`${t}.1.log`);oe.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=me.dirname(this.logFilePath),t=me.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=me.join(e,`${t}.${r}.log`);oe.existsSync(s)&&oe.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}},Eo=null,Uu="info";function Vu(){return Eo||(Eo=new So(Uu)),Eo}i(Vu,"getLogger");var u=Vu();import{configManager as he}from"@xiaozhi-client/config";var 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)}}};var Js=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=he.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(he.validateConfig(t),he.updateConfig(t),t.mcpServerConfig)for(let[r,s]of Object.entries(t.mcpServerConfig))for(let[o,a]of Object.entries(s.tools))he.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=he.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=he.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=he.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=he.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"),he.reloadConfig();let t=he.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=he.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=he.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 Ee={};$u(Ee,{CozeApiService:()=>Xe,config:()=>Yr,createCozeClient:()=>Ks});var Yr={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"}};Jr(Ee,Wg);import*as Wg from"@coze/api";function Ks(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Yr[e]||Yr.zh;return new Ee.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}i(Ks,"createCozeClient");import Bu from"node-cache";var Xe=class{static{i(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Ks(this.token),this.cache=new Bu({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}}};import{configManager as Xt}from"@xiaozhi-client/config";function vo(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)}i(vo,"isErrorWithCode");function Ys(){let n=Xt.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 Xe(n)}i(Ys,"getCozeApiService");var Qr=class extends j{static{i(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),vo(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(vo(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(vo(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"),!Xt.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=Ys();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"),!Xt.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=Ys();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=Xt.getCustomMCPTools(),p=c.items.map(f=>{let d=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===f.workflow_id);return{...f,isAddedAsTool:!!d,toolName:d?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${p.filter(f=>f.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"),!Xt.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=Ys(),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"),!Xt.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=Ys().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 yo={DEFAULT_LIMIT:50,MAX_LIMIT:200};var Q={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"},Se={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},Je={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},Jt={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},St={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 Ke={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},Zr=[Ke.V2024_11_05,Ke.V2025_06_18],To={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},Ye={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"};var _o={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"};var Qs={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"};var pa={TTL:3e5,CLEANUP_INTERVAL:6e4},da={DEFAULT:3e4,LONG_RUNNING:6e4};var Ro={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3};var Po={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3};var fa={DEFAULT:1024*1024,MAX:10*1024*1024};var Ao={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},ma={SERVICE_TOOL_SEPARATOR:"__"};function Ae(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)}}i(Ae,"sendWebSocketError");import{configManager as ju}from"@xiaozhi-client/config";var Zs=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),Ae(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:ju.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>Ro.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()},Ro.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 zu}from"events";var wo=class extends zu{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")}},Kt=null;function N(){return Kt||(Kt=new wo),Kt}i(N,"getEventBus");function ha(){Kt&&(Kt.destroy(),Kt=null)}i(ha,"destroyEventBus");var es=class{static{i(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=u,this.endpointManager=e,this.configManager=t,this.eventBus=N()}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(f){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,f)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(f){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,f);try{await a.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(d){this.logger.warn(`\u56DE\u6EDA\u65F6\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u5C06\u7EE7\u7EED\u4ECE\u7BA1\u7406\u5668\u79FB\u9664\u7AEF\u70B9: ${r}`,d)}throw await this.endpointManager.removeEndpoint(a),f}let l=this.endpointManager.getConnectionStatus().find(f=>f.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)}}};import{EventEmitter as Ku}from"events";function Wu(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}i(Wu,"isValidToolJSONSchema");function en(n){return Wu(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}i(en,"ensureToolJSONSchema");var Qe=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{i(this,"ToolCallError")}};import{isModelScopeURL as Yu}from"@xiaozhi-client/config";import{configManager as ue}from"@xiaozhi-client/config";import{createHash as qu}from"crypto";function we(n,e){let t=qu("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}i(we,"generateCacheKey");function bo(n,e){let t=new Date(n).getTime();return Date.now()-t>e}i(bo,"isCacheExpired");function ts(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>rs.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}i(ts,"shouldCleanupCache");var rs={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0};var ss=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}}};function ga(n,e){return{content:[{type:"text",text:e?Gu(e,n):Ca(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"}}i(ga,"createTimeoutResponse");function Gu(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...
1
+ var Ju=Object.create;var Ks=Object.defineProperty;var Ku=Object.getOwnPropertyDescriptor;var Yu=Object.getOwnPropertyNames;var Qu=Object.getPrototypeOf,Zu=Object.prototype.hasOwnProperty;var i=(n,e)=>Ks(n,"name",{value:e,configurable:!0});var I=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ep=(n,e)=>{for(var t in e)Ks(n,t,{get:e[t],enumerable:!0})},So=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Yu(e))!Zu.call(n,s)&&s!==t&&Ks(n,s,{get:()=>e[s],enumerable:!(r=Ku(e,s))||r.enumerable});return n},Jr=(n,e,t)=>(So(n,e,"default"),t&&So(t,e,"default")),tp=(n,e,t)=>(t=n!=null?Ju(Qu(n)):{},So(e||!n||!n.__esModule?Ks(t,"default",{value:n,enumerable:!0}):t,n));var fs=I((qv,qa)=>{"use strict";var Vp="2.0.0",jp=Number.MAX_SAFE_INTEGER||9007199254740991,Bp=16,zp=250,Wp=["major","premajor","minor","preminor","patch","prepatch","prerelease"];qa.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Bp,MAX_SAFE_BUILD_LENGTH:zp,MAX_SAFE_INTEGER:jp,RELEASE_TYPES:Wp,SEMVER_SPEC_VERSION:Vp,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var ms=I((Gv,Ga)=>{"use strict";var qp=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};Ga.exports=qp});var Zt=I((Ie,Xa)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:jo,MAX_SAFE_BUILD_LENGTH:Gp,MAX_LENGTH:Xp}=fs(),Jp=ms();Ie=Xa.exports={};var Kp=Ie.re=[],Yp=Ie.safeRe=[],T=Ie.src=[],Qp=Ie.safeSrc=[],_=Ie.t={},Zp=0,Bo="[a-zA-Z0-9-]",ed=[["\\s",1],["\\d",Xp],[Bo,Gp]],td=i(n=>{for(let[e,t]of ed)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),x=i((n,e,t)=>{let r=td(e),s=Zp++;Jp(n,s,e),_[n]=s,T[s]=e,Qp[s]=r,Kp[s]=new RegExp(e,t?"g":void 0),Yp[s]=new RegExp(r,t?"g":void 0)},"createToken");x("NUMERICIDENTIFIER","0|[1-9]\\d*");x("NUMERICIDENTIFIERLOOSE","\\d+");x("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Bo}*`);x("MAINVERSION",`(${T[_.NUMERICIDENTIFIER]})\\.(${T[_.NUMERICIDENTIFIER]})\\.(${T[_.NUMERICIDENTIFIER]})`);x("MAINVERSIONLOOSE",`(${T[_.NUMERICIDENTIFIERLOOSE]})\\.(${T[_.NUMERICIDENTIFIERLOOSE]})\\.(${T[_.NUMERICIDENTIFIERLOOSE]})`);x("PRERELEASEIDENTIFIER",`(?:${T[_.NONNUMERICIDENTIFIER]}|${T[_.NUMERICIDENTIFIER]})`);x("PRERELEASEIDENTIFIERLOOSE",`(?:${T[_.NONNUMERICIDENTIFIER]}|${T[_.NUMERICIDENTIFIERLOOSE]})`);x("PRERELEASE",`(?:-(${T[_.PRERELEASEIDENTIFIER]}(?:\\.${T[_.PRERELEASEIDENTIFIER]})*))`);x("PRERELEASELOOSE",`(?:-?(${T[_.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${T[_.PRERELEASEIDENTIFIERLOOSE]})*))`);x("BUILDIDENTIFIER",`${Bo}+`);x("BUILD",`(?:\\+(${T[_.BUILDIDENTIFIER]}(?:\\.${T[_.BUILDIDENTIFIER]})*))`);x("FULLPLAIN",`v?${T[_.MAINVERSION]}${T[_.PRERELEASE]}?${T[_.BUILD]}?`);x("FULL",`^${T[_.FULLPLAIN]}$`);x("LOOSEPLAIN",`[v=\\s]*${T[_.MAINVERSIONLOOSE]}${T[_.PRERELEASELOOSE]}?${T[_.BUILD]}?`);x("LOOSE",`^${T[_.LOOSEPLAIN]}$`);x("GTLT","((?:<|>)?=?)");x("XRANGEIDENTIFIERLOOSE",`${T[_.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);x("XRANGEIDENTIFIER",`${T[_.NUMERICIDENTIFIER]}|x|X|\\*`);x("XRANGEPLAIN",`[v=\\s]*(${T[_.XRANGEIDENTIFIER]})(?:\\.(${T[_.XRANGEIDENTIFIER]})(?:\\.(${T[_.XRANGEIDENTIFIER]})(?:${T[_.PRERELEASE]})?${T[_.BUILD]}?)?)?`);x("XRANGEPLAINLOOSE",`[v=\\s]*(${T[_.XRANGEIDENTIFIERLOOSE]})(?:\\.(${T[_.XRANGEIDENTIFIERLOOSE]})(?:\\.(${T[_.XRANGEIDENTIFIERLOOSE]})(?:${T[_.PRERELEASELOOSE]})?${T[_.BUILD]}?)?)?`);x("XRANGE",`^${T[_.GTLT]}\\s*${T[_.XRANGEPLAIN]}$`);x("XRANGELOOSE",`^${T[_.GTLT]}\\s*${T[_.XRANGEPLAINLOOSE]}$`);x("COERCEPLAIN",`(^|[^\\d])(\\d{1,${jo}})(?:\\.(\\d{1,${jo}}))?(?:\\.(\\d{1,${jo}}))?`);x("COERCE",`${T[_.COERCEPLAIN]}(?:$|[^\\d])`);x("COERCEFULL",T[_.COERCEPLAIN]+`(?:${T[_.PRERELEASE]})?(?:${T[_.BUILD]})?(?:$|[^\\d])`);x("COERCERTL",T[_.COERCE],!0);x("COERCERTLFULL",T[_.COERCEFULL],!0);x("LONETILDE","(?:~>?)");x("TILDETRIM",`(\\s*)${T[_.LONETILDE]}\\s+`,!0);Ie.tildeTrimReplace="$1~";x("TILDE",`^${T[_.LONETILDE]}${T[_.XRANGEPLAIN]}$`);x("TILDELOOSE",`^${T[_.LONETILDE]}${T[_.XRANGEPLAINLOOSE]}$`);x("LONECARET","(?:\\^)");x("CARETTRIM",`(\\s*)${T[_.LONECARET]}\\s+`,!0);Ie.caretTrimReplace="$1^";x("CARET",`^${T[_.LONECARET]}${T[_.XRANGEPLAIN]}$`);x("CARETLOOSE",`^${T[_.LONECARET]}${T[_.XRANGEPLAINLOOSE]}$`);x("COMPARATORLOOSE",`^${T[_.GTLT]}\\s*(${T[_.LOOSEPLAIN]})$|^$`);x("COMPARATOR",`^${T[_.GTLT]}\\s*(${T[_.FULLPLAIN]})$|^$`);x("COMPARATORTRIM",`(\\s*)${T[_.GTLT]}\\s*(${T[_.LOOSEPLAIN]}|${T[_.XRANGEPLAIN]})`,!0);Ie.comparatorTrimReplace="$1$2$3";x("HYPHENRANGE",`^\\s*(${T[_.XRANGEPLAIN]})\\s+-\\s+(${T[_.XRANGEPLAIN]})\\s*$`);x("HYPHENRANGELOOSE",`^\\s*(${T[_.XRANGEPLAINLOOSE]})\\s+-\\s+(${T[_.XRANGEPLAINLOOSE]})\\s*$`);x("STAR","(<|>)?=?\\s*\\*");x("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");x("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var En=I((Jv,Ja)=>{"use strict";var rd=Object.freeze({loose:!0}),sd=Object.freeze({}),nd=i(n=>n?typeof n!="object"?rd:n:sd,"parseOptions");Ja.exports=nd});var zo=I((Yv,Qa)=>{"use strict";var Ka=/^[0-9]+$/,Ya=i((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=Ka.test(n),r=Ka.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),od=i((n,e)=>Ya(e,n),"rcompareIdentifiers");Qa.exports={compareIdentifiers:Ya,rcompareIdentifiers:od}});var te=I((Zv,ec)=>{"use strict";var Cn=ms(),{MAX_LENGTH:Za,MAX_SAFE_INTEGER:Sn}=fs(),{safeRe:vn,t:yn}=Zt(),id=En(),{compareIdentifiers:Wo}=zo(),qo=class n{static{i(this,"SemVer")}constructor(e,t){if(t=id(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>Za)throw new TypeError(`version is longer than ${Za} characters`);Cn("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?vn[yn.LOOSE]:vn[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>Sn||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Sn||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Sn||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<Sn)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(Cn("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(Cn("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 Wo(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(Cn("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 Wo(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?vn[yn.PRERELEASELOOSE]:vn[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]),Wo(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}};ec.exports=qo});var Tt=I((ty,rc)=>{"use strict";var tc=te(),ad=i((n,e,t=!1)=>{if(n instanceof tc)return n;try{return new tc(n,e)}catch(r){if(!t)return null;throw r}},"parse");rc.exports=ad});var nc=I((sy,sc)=>{"use strict";var cd=Tt(),ld=i((n,e)=>{let t=cd(n,e);return t?t.version:null},"valid");sc.exports=ld});var ic=I((oy,oc)=>{"use strict";var ud=Tt(),pd=i((n,e)=>{let t=ud(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");oc.exports=pd});var lc=I((ay,cc)=>{"use strict";var ac=te(),dd=i((n,e,t,r,s)=>{typeof t=="string"&&(s=r,r=t,t=void 0);try{return new ac(n instanceof ac?n.version:n,t).inc(e,r,s).version}catch{return null}},"inc");cc.exports=dd});var dc=I((ly,pc)=>{"use strict";var uc=Tt(),fd=i((n,e)=>{let t=uc(n,null,!0),r=uc(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 f=l?"pre":"";return t.major!==r.major?f+"major":t.minor!==r.minor?f+"minor":t.patch!==r.patch?f+"patch":"prerelease"},"diff");pc.exports=fd});var mc=I((py,fc)=>{"use strict";var md=te(),gd=i((n,e)=>new md(n,e).major,"major");fc.exports=gd});var hc=I((fy,gc)=>{"use strict";var hd=te(),Ed=i((n,e)=>new hd(n,e).minor,"minor");gc.exports=Ed});var Cc=I((gy,Ec)=>{"use strict";var Cd=te(),Sd=i((n,e)=>new Cd(n,e).patch,"patch");Ec.exports=Sd});var vc=I((Ey,Sc)=>{"use strict";var vd=Tt(),yd=i((n,e)=>{let t=vd(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Sc.exports=yd});var Ee=I((Sy,Tc)=>{"use strict";var yc=te(),Td=i((n,e,t)=>new yc(n,t).compare(new yc(e,t)),"compare");Tc.exports=Td});var Rc=I((yy,_c)=>{"use strict";var _d=Ee(),Rd=i((n,e,t)=>_d(e,n,t),"rcompare");_c.exports=Rd});var Ac=I((_y,Pc)=>{"use strict";var Pd=Ee(),Ad=i((n,e)=>Pd(n,e,!0),"compareLoose");Pc.exports=Ad});var Tn=I((Py,wc)=>{"use strict";var bc=te(),bd=i((n,e,t)=>{let r=new bc(n,t),s=new bc(e,t);return r.compare(s)||r.compareBuild(s)},"compareBuild");wc.exports=bd});var Mc=I((by,Ic)=>{"use strict";var wd=Tn(),Id=i((n,e)=>n.sort((t,r)=>wd(t,r,e)),"sort");Ic.exports=Id});var Oc=I((Iy,xc)=>{"use strict";var Md=Tn(),xd=i((n,e)=>n.sort((t,r)=>Md(r,t,e)),"rsort");xc.exports=xd});var gs=I((xy,Nc)=>{"use strict";var Od=Ee(),Nd=i((n,e,t)=>Od(n,e,t)>0,"gt");Nc.exports=Nd});var _n=I((Ny,Lc)=>{"use strict";var Ld=Ee(),$d=i((n,e,t)=>Ld(n,e,t)<0,"lt");Lc.exports=$d});var Go=I(($y,$c)=>{"use strict";var Dd=Ee(),kd=i((n,e,t)=>Dd(n,e,t)===0,"eq");$c.exports=kd});var Xo=I((ky,Dc)=>{"use strict";var Fd=Ee(),Hd=i((n,e,t)=>Fd(n,e,t)!==0,"neq");Dc.exports=Hd});var Rn=I((Hy,kc)=>{"use strict";var Ud=Ee(),Vd=i((n,e,t)=>Ud(n,e,t)>=0,"gte");kc.exports=Vd});var Pn=I((Vy,Fc)=>{"use strict";var jd=Ee(),Bd=i((n,e,t)=>jd(n,e,t)<=0,"lte");Fc.exports=Bd});var Jo=I((By,Hc)=>{"use strict";var zd=Go(),Wd=Xo(),qd=gs(),Gd=Rn(),Xd=_n(),Jd=Pn(),Kd=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 zd(n,t,r);case"!=":return Wd(n,t,r);case">":return qd(n,t,r);case">=":return Gd(n,t,r);case"<":return Xd(n,t,r);case"<=":return Jd(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");Hc.exports=Kd});var Vc=I((Wy,Uc)=>{"use strict";var Yd=te(),Qd=Tt(),{safeRe:An,t:bn}=Zt(),Zd=i((n,e)=>{if(n instanceof Yd)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?An[bn.COERCEFULL]:An[bn.COERCE]);else{let l=e.includePrerelease?An[bn.COERCERTLFULL]:An[bn.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 Qd(`${r}.${s}.${o}${a}${c}`,e)},"coerce");Uc.exports=Zd});var Bc=I((Gy,jc)=>{"use strict";var Ko=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}};jc.exports=Ko});var Ce=I((Jy,Gc)=>{"use strict";var ef=/\s+/g,Yo=class n{static{i(this,"Range")}constructor(e,t){if(t=rf(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof Qo)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(ef," "),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=>!Wc(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&&uf(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&&cf)|(this.options.loose&&lf))+":"+e,s=zc.get(r);if(s)return s;let o=this.options.loose,a=o?ie[re.HYPHENRANGELOOSE]:ie[re.HYPHENRANGE];e=e.replace(a,vf(this.options.includePrerelease)),k("hyphen replace",e),e=e.replace(ie[re.COMPARATORTRIM],nf),k("comparator trim",e),e=e.replace(ie[re.TILDETRIM],of),k("tilde trim",e),e=e.replace(ie[re.CARETTRIM],af),k("caret trim",e);let c=e.split(" ").map(d=>pf(d,this.options)).join(" ").split(/\s+/).map(d=>Sf(d,this.options));o&&(c=c.filter(d=>(k("loose invalid filter",d,this.options),!!d.match(ie[re.COMPARATORLOOSE])))),k("range list",c);let l=new Map,p=c.map(d=>new Qo(d,this.options));for(let d of p){if(Wc(d))return[d];l.set(d.value,d)}l.size>1&&l.has("")&&l.delete("");let f=[...l.values()];return zc.set(r,f),f}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>qc(r,t)&&e.set.some(s=>qc(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 sf(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(yf(this.set[t],e,this.options))return!0;return!1}};Gc.exports=Yo;var tf=Bc(),zc=new tf,rf=En(),Qo=hs(),k=ms(),sf=te(),{safeRe:ie,t:re,comparatorTrimReplace:nf,tildeTrimReplace:of,caretTrimReplace:af}=Zt(),{FLAG_INCLUDE_PRERELEASE:cf,FLAG_LOOSE:lf}=fs(),Wc=i(n=>n.value==="<0.0.0-0","isNullSet"),uf=i(n=>n.value==="","isAny"),qc=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"),pf=i((n,e)=>(n=n.replace(ie[re.BUILD],""),k("comp",n,e),n=mf(n,e),k("caret",n),n=df(n,e),k("tildes",n),n=hf(n,e),k("xrange",n),n=Cf(n,e),k("stars",n),n),"parseComparator"),ae=i(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),df=i((n,e)=>n.trim().split(/\s+/).map(t=>ff(t,e)).join(" "),"replaceTildes"),ff=i((n,e)=>{let t=e.loose?ie[re.TILDELOOSE]:ie[re.TILDE];return n.replace(t,(r,s,o,a,c)=>{k("tilde",n,r,s,o,a,c);let l;return ae(s)?l="":ae(o)?l=`>=${s}.0.0 <${+s+1}.0.0-0`:ae(a)?l=`>=${s}.${o}.0 <${s}.${+o+1}.0-0`:c?(k("replaceTilde pr",c),l=`>=${s}.${o}.${a}-${c} <${s}.${+o+1}.0-0`):l=`>=${s}.${o}.${a} <${s}.${+o+1}.0-0`,k("tilde return",l),l})},"replaceTilde"),mf=i((n,e)=>n.trim().split(/\s+/).map(t=>gf(t,e)).join(" "),"replaceCarets"),gf=i((n,e)=>{k("caret",n,e);let t=e.loose?ie[re.CARETLOOSE]:ie[re.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(s,o,a,c,l)=>{k("caret",n,s,o,a,c,l);let p;return ae(o)?p="":ae(a)?p=`>=${o}.0.0${r} <${+o+1}.0.0-0`:ae(c)?o==="0"?p=`>=${o}.${a}.0${r} <${o}.${+a+1}.0-0`:p=`>=${o}.${a}.0${r} <${+o+1}.0.0-0`:l?(k("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`):(k("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`),k("caret return",p),p})},"replaceCaret"),hf=i((n,e)=>(k("replaceXRanges",n,e),n.split(/\s+/).map(t=>Ef(t,e)).join(" ")),"replaceXRanges"),Ef=i((n,e)=>{n=n.trim();let t=e.loose?ie[re.XRANGELOOSE]:ie[re.XRANGE];return n.replace(t,(r,s,o,a,c,l)=>{k("xRange",n,r,s,o,a,c,l);let p=ae(o),f=p||ae(a),d=f||ae(c),C=d;return s==="="&&C&&(s=""),l=e.includePrerelease?"-0":"",p?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&C?(f&&(a=0),c=0,s===">"?(s=">=",f?(o=+o+1,a=0,c=0):(a=+a+1,c=0)):s==="<="&&(s="<",f?o=+o+1:a=+a+1),s==="<"&&(l="-0"),r=`${s+o}.${a}.${c}${l}`):f?r=`>=${o}.0.0${l} <${+o+1}.0.0-0`:d&&(r=`>=${o}.${a}.0${l} <${o}.${+a+1}.0-0`),k("xRange return",r),r})},"replaceXRange"),Cf=i((n,e)=>(k("replaceStars",n,e),n.trim().replace(ie[re.STAR],"")),"replaceStars"),Sf=i((n,e)=>(k("replaceGTE0",n,e),n.trim().replace(ie[e.includePrerelease?re.GTE0PRE:re.GTE0],"")),"replaceGTE0"),vf=i(n=>(e,t,r,s,o,a,c,l,p,f,d,C)=>(ae(r)?t="":ae(s)?t=`>=${r}.0.0${n?"-0":""}`:ae(o)?t=`>=${r}.${s}.0${n?"-0":""}`:a?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,ae(p)?l="":ae(f)?l=`<${+p+1}.0.0-0`:ae(d)?l=`<${p}.${+f+1}.0-0`:C?l=`<=${p}.${f}.${d}-${C}`:n?l=`<${p}.${f}.${+d+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),yf=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(k(n[r].semver),n[r].semver!==Qo.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 hs=I((Yy,Zc)=>{"use strict";var Es=Symbol("SemVer ANY"),ti=class n{static{i(this,"Comparator")}static get ANY(){return Es}constructor(e,t){if(t=Xc(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),ei("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Es?this.value="":this.value=this.operator+this.semver.version,ei("comp",this)}parse(e){let t=this.options.loose?Jc[Kc.COMPARATORLOOSE]:Jc[Kc.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 Yc(r[2],this.options.loose):this.semver=Es}toString(){return this.value}test(e){if(ei("Comparator.test",e,this.options.loose),this.semver===Es||e===Es)return!0;if(typeof e=="string")try{e=new Yc(e,this.options)}catch{return!1}return Zo(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 Qc(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new Qc(this.value,t).test(e.semver):(t=Xc(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("=")||Zo(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Zo(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Zc.exports=ti;var Xc=En(),{safeRe:Jc,t:Kc}=Zt(),Zo=Jo(),ei=ms(),Yc=te(),Qc=Ce()});var Cs=I((Zy,el)=>{"use strict";var Tf=Ce(),_f=i((n,e,t)=>{try{e=new Tf(e,t)}catch{return!1}return e.test(n)},"satisfies");el.exports=_f});var rl=I((tT,tl)=>{"use strict";var Rf=Ce(),Pf=i((n,e)=>new Rf(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");tl.exports=Pf});var nl=I((sT,sl)=>{"use strict";var Af=te(),bf=Ce(),wf=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new bf(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===-1)&&(r=a,s=new Af(r,t))}),r},"maxSatisfying");sl.exports=wf});var il=I((oT,ol)=>{"use strict";var If=te(),Mf=Ce(),xf=i((n,e,t)=>{let r=null,s=null,o=null;try{o=new Mf(e,t)}catch{return null}return n.forEach(a=>{o.test(a)&&(!r||s.compare(a)===1)&&(r=a,s=new If(r,t))}),r},"minSatisfying");ol.exports=xf});var ll=I((aT,cl)=>{"use strict";var ri=te(),Of=Ce(),al=gs(),Nf=i((n,e)=>{n=new Of(n,e);let t=new ri("0.0.0");if(n.test(t)||(t=new ri("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 ri(a.semver.version);switch(a.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!o||al(c,o))&&(o=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${a.operator}`)}}),o&&(!t||al(t,o))&&(t=o)}return t&&n.test(t)?t:null},"minVersion");cl.exports=Nf});var pl=I((lT,ul)=>{"use strict";var Lf=Ce(),$f=i((n,e)=>{try{return new Lf(n,e).range||"*"}catch{return null}},"validRange");ul.exports=$f});var wn=I((pT,gl)=>{"use strict";var Df=te(),ml=hs(),{ANY:kf}=ml,Ff=Ce(),Hf=Cs(),dl=gs(),fl=_n(),Uf=Pn(),Vf=Rn(),jf=i((n,e,t,r)=>{n=new Df(n,r),e=new Ff(e,r);let s,o,a,c,l;switch(t){case">":s=dl,o=Uf,a=fl,c=">",l=">=";break;case"<":s=fl,o=Vf,a=dl,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Hf(n,e,r))return!1;for(let p=0;p<e.set.length;++p){let f=e.set[p],d=null,C=null;if(f.forEach(m=>{m.semver===kf&&(m=new ml(">=0.0.0")),d=d||m,C=C||m,s(m.semver,d.semver,r)?d=m:a(m.semver,C.semver,r)&&(C=m)}),d.operator===c||d.operator===l||(!C.operator||C.operator===c)&&o(n,C.semver))return!1;if(C.operator===l&&a(n,C.semver))return!1}return!0},"outside");gl.exports=jf});var El=I((fT,hl)=>{"use strict";var Bf=wn(),zf=i((n,e,t)=>Bf(n,e,">",t),"gtr");hl.exports=zf});var Sl=I((gT,Cl)=>{"use strict";var Wf=wn(),qf=i((n,e,t)=>Wf(n,e,"<",t),"ltr");Cl.exports=qf});var Tl=I((ET,yl)=>{"use strict";var vl=Ce(),Gf=i((n,e,t)=>(n=new vl(n,t),e=new vl(e,t),n.intersects(e,t)),"intersects");yl.exports=Gf});var Rl=I((ST,_l)=>{"use strict";var Xf=Cs(),Jf=Ee();_l.exports=(n,e,t)=>{let r=[],s=null,o=null,a=n.sort((f,d)=>Jf(f,d,t));for(let f of a)Xf(f,e,t)?(o=f,s||(s=f)):(o&&r.push([s,o]),o=null,s=null);s&&r.push([s,null]);let c=[];for(let[f,d]of r)f===d?c.push(f):!d&&f===a[0]?c.push("*"):d?f===a[0]?c.push(`<=${d}`):c.push(`${f} - ${d}`):c.push(`>=${f}`);let l=c.join(" || "),p=typeof e.raw=="string"?e.raw:String(e);return l.length<p.length?l:e}});var Ml=I((vT,Il)=>{"use strict";var Pl=Ce(),ni=hs(),{ANY:si}=ni,Ss=Cs(),oi=Ee(),Kf=i((n,e,t={})=>{if(n===e)return!0;n=new Pl(n,t),e=new Pl(e,t);let r=!1;e:for(let s of n.set){for(let o of e.set){let a=Qf(s,o,t);if(r=r||a!==null,a)continue e}if(r)return!1}return!0},"subset"),Yf=[new ni(">=0.0.0-0")],Al=[new ni(">=0.0.0")],Qf=i((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===si){if(e.length===1&&e[0].semver===si)return!0;t.includePrerelease?n=Yf:n=Al}if(e.length===1&&e[0].semver===si){if(t.includePrerelease)return!0;e=Al}let r=new Set,s,o;for(let m of n)m.operator===">"||m.operator===">="?s=bl(s,m,t):m.operator==="<"||m.operator==="<="?o=wl(o,m,t):r.add(m.semver);if(r.size>1)return null;let a;if(s&&o){if(a=oi(s.semver,o.semver,t),a>0)return null;if(a===0&&(s.operator!==">="||o.operator!=="<="))return null}for(let m of r){if(s&&!Ss(m,String(s),t)||o&&!Ss(m,String(o),t))return null;for(let R of e)if(!Ss(m,String(R),t))return!1;return!0}let c,l,p,f,d=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1,C=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1;d&&d.prerelease.length===1&&o.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let m of e){if(f=f||m.operator===">"||m.operator===">=",p=p||m.operator==="<"||m.operator==="<=",s){if(C&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===C.major&&m.semver.minor===C.minor&&m.semver.patch===C.patch&&(C=!1),m.operator===">"||m.operator===">="){if(c=bl(s,m,t),c===m&&c!==s)return!1}else if(s.operator===">="&&!Ss(s.semver,String(m),t))return!1}if(o){if(d&&m.semver.prerelease&&m.semver.prerelease.length&&m.semver.major===d.major&&m.semver.minor===d.minor&&m.semver.patch===d.patch&&(d=!1),m.operator==="<"||m.operator==="<="){if(l=wl(o,m,t),l===m&&l!==o)return!1}else if(o.operator==="<="&&!Ss(o.semver,String(m),t))return!1}if(!m.operator&&(o||s)&&a!==0)return!1}return!(s&&p&&!o&&a!==0||o&&f&&!s&&a!==0||C||d)},"simpleSubset"),bl=i((n,e,t)=>{if(!n)return e;let r=oi(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),wl=i((n,e,t)=>{if(!n)return e;let r=oi(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");Il.exports=Kf});var Ll=I((TT,Nl)=>{"use strict";var ii=Zt(),xl=fs(),Zf=te(),Ol=zo(),em=Tt(),tm=nc(),rm=ic(),sm=lc(),nm=dc(),om=mc(),im=hc(),am=Cc(),cm=vc(),lm=Ee(),um=Rc(),pm=Ac(),dm=Tn(),fm=Mc(),mm=Oc(),gm=gs(),hm=_n(),Em=Go(),Cm=Xo(),Sm=Rn(),vm=Pn(),ym=Jo(),Tm=Vc(),_m=hs(),Rm=Ce(),Pm=Cs(),Am=rl(),bm=nl(),wm=il(),Im=ll(),Mm=pl(),xm=wn(),Om=El(),Nm=Sl(),Lm=Tl(),$m=Rl(),Dm=Ml();Nl.exports={parse:em,valid:tm,clean:rm,inc:sm,diff:nm,major:om,minor:im,patch:am,prerelease:cm,compare:lm,rcompare:um,compareLoose:pm,compareBuild:dm,sort:fm,rsort:mm,gt:gm,lt:hm,eq:Em,neq:Cm,gte:Sm,lte:vm,cmp:ym,coerce:Tm,Comparator:_m,Range:Rm,satisfies:Pm,toComparators:Am,maxSatisfying:bm,minSatisfying:wm,minVersion:Im,validRange:Mm,outside:xm,gtr:Om,ltr:Nm,intersects:Lm,simplifyRange:$m,subset:Dm,SemVer:Zf,re:ii.re,src:ii.src,tokens:ii.t,SEMVER_SPEC_VERSION:xl.SEMVER_SPEC_VERSION,RELEASE_TYPES:xl.RELEASE_TYPES,compareIdentifiers:Ol.compareIdentifiers,rcompareIdentifiers:Ol.rcompareIdentifiers}});import{createServer as Dh}from"http";import*as oe from"fs";import*as ge from"path";import Kr from"chalk";import Xt from"pino";import{z as rp}from"zod";var sp=rp.enum(["fatal","error","warn","info","debug","trace"]);function np(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}`}i(np,"formatDateTime");var yo=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=sp.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:Xt.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:Xt.destination({dest:"/dev/null"})}),Xt({level:this.logLevel,timestamp:Xt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((t,r)=>({level:r}),"level")},base:null,serializers:{err:Xt.stdSerializers?.err||(t=>t)}},Xt.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Kr.gray}],[30,{name:"INFO",color:Kr.blue}],[40,{name:"WARN",color:Kr.yellow}],[50,{name:"ERROR",color:Kr.red}],[60,{name:"FATAL",color:Kr.red}]]);return{write:i(t=>{try{let r=JSON.parse(t),s=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${s}
2
+ `)}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=np(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=ge.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded();try{oe.existsSync(this.logFilePath)||oe.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||!oe.existsSync(this.logFilePath)))try{oe.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=ge.dirname(this.logFilePath),t=ge.basename(this.logFilePath,".log");for(let s=this.maxLogFiles-1;s>=1;s--){let o=ge.join(e,`${t}.${s}.log`),a=ge.join(e,`${t}.${s+1}.log`);oe.existsSync(o)&&(s===this.maxLogFiles-1?oe.unlinkSync(o):oe.renameSync(o,a))}let r=ge.join(e,`${t}.1.log`);oe.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=ge.dirname(this.logFilePath),t=ge.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let s=ge.join(e,`${t}.${r}.log`);oe.existsSync(s)&&oe.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}},vo=null,op="info";function ip(){return vo||(vo=new yo(op)),vo}i(ip,"getLogger");var u=ip();import{existsSync as St,mkdirSync as ap,readFileSync as va,readdirSync as cp,rmSync as lp,statSync as up,writeFileSync as ya}from"fs";import{dirname as To,isAbsolute as Ta,resolve as Yr}from"path";import{configManager as _o}from"@xiaozhi-client/config";var Sa="\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";function pp(n){let e=n.replace(/\\/g,"/");return!!(e.startsWith("./")||e.startsWith("../")||Ta(n))}i(pp,"isPromptPath");function dp(n){try{let e=n.replace(/\\/g,"/"),t;if(Ta(e))t=e;else{let s=_o.getConfigPath(),o=To(s);t=Yr(o,e)}if(!St(t))return null;let r=va(t,"utf-8").trim();return r||null}catch{return null}}i(dp,"resolvePromptFromPath");function _a(n){return!n||n.trim()===""?Sa:pp(n)?dp(n)||Sa:n}i(_a,"resolvePrompt");function Ra(){try{let n=_o.getConfigPath(),e=To(n),t=Yr(e,"prompts");return St(t)?cp(t).filter(o=>o.endsWith(".md")).map(o=>({fileName:o,relativePath:`./prompts/${o}`})):[]}catch{return[]}}i(Ra,"listPromptFiles");var Ro=100*1024,Pa=/^[\u4e00-\u9fa5a-zA-Z0-9_-]+\.md$/;function Po(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 Pa.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"}}i(Po,"validatePromptPath");function fp(n){return Pa.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"}}i(fp,"validatePromptFileName");function Aa(){let n=_o.getConfigPath(),e=To(n);return Yr(e,"prompts")}i(Aa,"getPromptsDir");function Ao(n){let e=Aa(),t=n.replace("./prompts/","");return Yr(e,t)}i(Ao,"resolvePromptPath");function ba(n){let e=Po(n);if(!e.valid)throw new Error(e.error);let t=Ao(n);if(!St(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);if(up(t).size>Ro)throw new Error("\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let s=va(t,"utf-8");return{fileName:n.replace("./prompts/",""),relativePath:n,content:s}}i(ba,"readPromptFile");function wa(n,e){let t=Po(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>Ro)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let r=Ao(n);if(!St(r))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);return ya(r,e,"utf-8"),{fileName:n.replace("./prompts/",""),relativePath:n,content:e}}i(wa,"updatePromptFile");function Ia(n,e){let t=fp(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>Ro)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let s=Aa();St(s)||ap(s,{recursive:!0});let o=Yr(s,n),a=`./prompts/${n}`;if(St(o))throw new Error(`\u6587\u4EF6\u5DF2\u5B58\u5728: ${n}`);return ya(o,e,"utf-8"),{fileName:n,relativePath:a,content:e}}i(Ia,"createPromptFile");function Ma(n){let e=Po(n);if(!e.valid)throw new Error(e.error);let t=Ao(n);if(!St(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);lp(t)}i(Ma,"deletePromptFile");import{configManager as he}from"@xiaozhi-client/config";var B=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)}}};var Ys=class extends B{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=he.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(he.validateConfig(t),he.updateConfig(t),t.mcpServerConfig)for(let[r,s]of Object.entries(t.mcpServerConfig))for(let[o,a]of Object.entries(s.tools))he.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=he.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=he.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=he.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=he.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"),he.reloadConfig();let t=he.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=he.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=he.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=Ra();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=ba(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=wa(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=Ia(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?(Ma(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 Se={};ep(Se,{CozeApiService:()=>Xe,config:()=>Qr,createCozeClient:()=>Qs});var Qr={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"}};Jr(Se,gE);import*as gE from"@coze/api";function Qs(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Qr[e]||Qr.zh;return new Se.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}i(Qs,"createCozeClient");import mp from"node-cache";var Xe=class{static{i(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Qs(this.token),this.cache=new mp({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}}};import{configManager as Jt}from"@xiaozhi-client/config";function bo(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)}i(bo,"isErrorWithCode");function Zs(){let n=Jt.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 Xe(n)}i(Zs,"getCozeApiService");var Zr=class extends B{static{i(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),bo(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(bo(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(bo(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"),!Jt.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=Zs();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"),!Jt.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=Zs();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=Jt.getCustomMCPTools(),p=c.items.map(f=>{let d=l.find(C=>C.handler.type==="proxy"&&C.handler.platform==="coze"&&C.handler.config.workflow_id===f.workflow_id);return{...f,isAddedAsTool:!!d,toolName:d?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${p.filter(f=>f.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"),!Jt.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=Zs(),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"),!Jt.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=Zs().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 wo={DEFAULT_LIMIT:50,MAX_LIMIT:200};var Q={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"},ve={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},Je={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},Kt={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},vt={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 Ke={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},es=[Ke.V2024_11_05,Ke.V2025_06_18],Io={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},Ye={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"};var Mo={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"};var en={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"};var xa={TTL:3e5,CLEANUP_INTERVAL:6e4},Oa={DEFAULT:3e4,LONG_RUNNING:6e4};var xo={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3};var Oo={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3};var Na={DEFAULT:1024*1024,MAX:10*1024*1024};var No={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},La={SERVICE_TOOL_SEPARATOR:"__"};var Lo=[{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"}];function $a(){let n=new Set;for(let e of Lo)n.add(e.scene);return Array.from(n)}i($a,"getVoiceScenes");function be(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)}}i(be,"sendWebSocketError");import{configManager as gp}from"@xiaozhi-client/config";var tn=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),be(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:gp.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>xo.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()},xo.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 hp}from"events";var $o=class extends hp{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")}},Yt=null;function N(){return Yt||(Yt=new $o),Yt}i(N,"getEventBus");function Da(){Yt&&(Yt.destroy(),Yt=null)}i(Da,"destroyEventBus");var ts=class{static{i(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=u,this.endpointManager=e,this.configManager=t,this.eventBus=N()}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(f){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,f)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(f){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,f);try{await a.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(d){this.logger.warn(`\u56DE\u6EDA\u65F6\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u5C06\u7EE7\u7EED\u4ECE\u7BA1\u7406\u5668\u79FB\u9664\u7AEF\u70B9: ${r}`,d)}throw await this.endpointManager.removeEndpoint(a),f}let l=this.endpointManager.getConnectionStatus().find(f=>f.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)}}};import{EventEmitter as Tp}from"events";function Ep(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}i(Ep,"isValidToolJSONSchema");function rn(n){return Ep(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}i(rn,"ensureToolJSONSchema");var Qe=class extends Error{constructor(t,r,s){super(r);this.code=t;this.data=s;this.name="ToolCallError"}static{i(this,"ToolCallError")}};import{isModelScopeURL as _p}from"@xiaozhi-client/config";import{configManager as pe}from"@xiaozhi-client/config";import{createHash as Cp}from"crypto";function we(n,e){let t=Cp("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}i(we,"generateCacheKey");function Do(n,e){let t=new Date(n).getTime();return Date.now()-t>e}i(Do,"isCacheExpired");function rs(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>ss.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}i(rs,"shouldCleanupCache");var ss={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0};var ns=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}}};function ka(n,e){return{content:[{type:"text",text:e?Sp(e,n):Fa(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"}}i(ka,"createTimeoutResponse");function Sp(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...
3
3
 
4
4
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
5
5
  - \u4EFB\u52A1ID: ${e}
@@ -10,7 +10,7 @@ var Mu=Object.create;var Xs=Object.defineProperty;var xu=Object.getOwnPropertyDe
10
10
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
11
11
  1. \u4F7F\u7528\u76F8\u540C\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
12
12
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
13
- 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:Ca(e)};return t[n]||t.default}i(Gu,"getToolSpecificTimeoutMessage");function Ca(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
13
+ 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:Fa(e)};return t[n]||t.default}i(Sp,"getToolSpecificTimeoutMessage");function Fa(n){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
14
14
 
15
15
  \u{1F4CB} \u4EFB\u52A1\u4FE1\u606F\uFF1A
16
16
  - \u4EFB\u52A1ID: ${n}
@@ -20,11 +20,11 @@ var Mu=Object.create;var Xs=Object.defineProperty;var xu=Object.getOwnPropertyDe
20
20
  \u{1F504} \u540E\u7EED\u64CD\u4F5C\uFF1A
21
21
  1. \u4F7F\u7528\u76F8\u540C\u7684\u53C2\u6570\u91CD\u65B0\u8C03\u7528\u5DE5\u5177
22
22
  2. \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C
23
- 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}i(Ca,"getDefaultTimeoutMessage");import{configManager as Ea}from"@xiaozhi-client/config";function Xu(n){return n.type==="proxy"}i(Xu,"isProxyHandler");var ns=class{static{i(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=rs.TIMEOUT;CACHE_TTL=rs.CACHE_TTL;configUpdateListener=null;constructor(e,t){this.logger=u,this.cacheManager=e||new Ze,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=Ea.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new Xe(e)}setupEventListeners(){let e=N();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||Ea.getCustomMCPTools();this.tools.clear();for(let r of t)Xu(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:en(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 ss){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}`),ga(c,e)}throw a}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new ss(`\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&&!bo(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 we(e,t)}generateCacheKey(e,t){return we(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&&(N().offEvent("config:updated",this.configUpdateListener),this.configUpdateListener=null),this.tools.clear(),this.cacheManager.cleanup()}};import*as et from"fs";import*as vt from"path";import{tmpdir as Ju}from"os";var os=class{static{i(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||Ju()}};import tn from"pino";var is=class{static{i(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=vt.resolve(vt.normalize(e.logFilePath));else{let r=t||os.getTempDir();this.logFilePath=vt.join(vt.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:tn.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 tn({level:"info",timestamp:tn.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((r,s)=>({level:s}),"level")},base:null},tn.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(!et.existsSync(this.logFilePath))return;let t=et.readFileSync(this.logFilePath,"utf8").trim().split(`
23
+ 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}i(Fa,"getDefaultTimeoutMessage");import{configManager as Ha}from"@xiaozhi-client/config";function vp(n){return n.type==="proxy"}i(vp,"isProxyHandler");var os=class{static{i(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=ss.TIMEOUT;CACHE_TTL=ss.CACHE_TTL;configUpdateListener=null;constructor(e,t){this.logger=u,this.cacheManager=e||new Ze,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=Ha.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new Xe(e)}setupEventListeners(){let e=N();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||Ha.getCustomMCPTools();this.tools.clear();for(let r of t)vp(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:rn(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 ns){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}`),ka(c,e)}throw a}}async createTimeoutPromise(e,t){return new Promise((r,s)=>{setTimeout(()=>{s(new ns(`\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&&!Do(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];rs(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 we(e,t)}generateCacheKey(e,t){return we(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&&(N().offEvent("config:updated",this.configUpdateListener),this.configUpdateListener=null),this.tools.clear(),this.cacheManager.cleanup()}};import*as et from"fs";import*as yt from"path";import{tmpdir as yp}from"os";var is=class{static{i(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||yp()}};import sn from"pino";var as=class{static{i(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=yt.resolve(yt.normalize(e.logFilePath));else{let r=t||is.getTempDir();this.logFilePath=yt.join(yt.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:sn.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 sn({level:"info",timestamp:sn.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:i((r,s)=>({level:s}),"level")},base:null},sn.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(!et.existsSync(this.logFilePath))return;let t=et.readFileSync(this.logFilePath,"utf8").trim().split(`
24
24
  `).filter(a=>a.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,s=t.slice(r),o=s.join(`
25
25
  `)+(s.length>0?`
26
- `:"");et.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}},rn=class{static{i(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||os.getConfigDir()}getLogFilePath(){return new is({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!et.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=et.readFileSync(e,"utf8").trim().split(`
27
- `).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 Yt=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 Ye.INITIALIZE:return await this.handleInitialize(e.params,e.id);case Ye.INITIALIZED:return await this.handleInitializedNotification(e.params);case Ye.TOOLS_LIST:return await this.handleToolsList(e.id);case Ye.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case Ye.RESOURCES_LIST:return await this.handleResourcesList(e.id);case Ye.PROMPTS_LIST:return await this.handlePromptsList(e.id);case Ye.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=Zr.includes(r)?r:Ke.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:To.NAME,version:To.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=Sa(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}};var as=class extends Ku{static{i(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=N();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 Ze(r),this.customMCPHandler=new ns(this.cacheManager,this);let s=ue.getToolCallLogConfig(),o=ue.getConfigDir();this.toolCallLogger=new is(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 Yt(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 sn(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=ue.isToolEnabled(s,c.name),p=ue.getMcpServerConfig()[s].tools[c.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let f=`${s}__${c.name}`;t.push({name:f,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 ue.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 ue.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 ue.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 ue.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{ue.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=ue.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?Yu(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=ue.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=ue.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 d of s){let E=o[d.name];E?a[d.name]={...E,description:d.description||E.description||""}:a[d.name]={description:d.description||"",enable:!0}}let c=s.map(d=>d.name),p=Object.keys(o).filter(d=>!c.includes(d));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)){ue.updateServerToolsConfig(t,a);let d=Object.keys(a).filter(m=>!o[m]),E=Object.keys(a).filter(m=>{let R=o[m],A=a[m];return R&&R.description!==A.description});u.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),d.length>0&&u.debug(` - \u65B0\u589E\u5DE5\u5177: ${d.join(", ")}`),E.length>0&&u.debug(` - \u66F4\u65B0\u5DE5\u5177: ${E.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 Qu}from"@xiaozhi-client/mcp-core";var sn=class{static{i(this,"MCPService")}connection;eventBus=N();constructor(e){let{name:t,...r}=e,s={onConnected:i(o=>{this.eventBus.emitEvent(Qs.CONNECTED,o)},"onConnected"),onDisconnected:i(o=>{this.eventBus.emitEvent(Qs.DISCONNECTED,o)},"onDisconnected"),onConnectionFailed:i(o=>{this.eventBus.emitEvent(Qs.CONNECTION_FAILED,o)},"onConnectionFailed")};this.connection=new Qu(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 AE}from"@xiaozhi-client/mcp-core";function Sa(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new Qe(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new Qe(-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 Qe(-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 Qe(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let s=t.customValidator(r);if(s)throw new Qe(-32602,s)}return{name:r.name,arguments:r.arguments}}i(Sa,"validateToolCallParams");import{createHash as ep}from"crypto";import{existsSync as cs,mkdirSync as tp,readFileSync as ya,renameSync as rp,writeFileSync as Ta}from"fs";import{dirname as sp,resolve as _a}from"path";import{Hono as Zu}from"hono";var va=i(()=>new Zu,"createApp");var nn=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");import np from"dayjs";var Ze=class{static{i(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=_o.CACHE_VERSION;CACHE_ENTRY_VERSION=_o.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=pa.CLEANUP_INTERVAL;constructor(e){this.logger=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return np().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return _a(e,Ao.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return _a(t,Ao.FILENAME)}}async ensureCacheFile(){try{if(!cs(this.cachePath)){let e=sp(this.cachePath);cs(e)||(tp(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(!cs(this.cachePath))return await this.createInitialCache();let e=ya(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{Ta(r,t,"utf8"),rp(r,e)}catch(s){try{cs(r)&&Ta(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return ep("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:cs(this.cachePath)?ya(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}${ma.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=we(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=we(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=we(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=we(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=we(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(f=>f.status==="pending").length,o=t.filter(f=>f.status==="completed").length,a=t.filter(f=>f.status==="failed").length,c=t.filter(f=>f.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 on=class{static{i(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=u,this.config={maxMessageSize:e.maxMessageSize??fa.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 Yt(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(Se.CONTENT_LENGTH);if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${St.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(Se.CONTENT_TYPE)?.includes(Q.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${St.INVALID_REQUEST}: ${St.INVALID_CONTENT_TYPE}`);let a=e.req.header("mcp-protocol-version")||e.req.header(Se.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");a&&!Zr.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${Zr.join(", ")}`);let c;try{let f=await e.req.text();if(f.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(f),r=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,St.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${St.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:Je.NO_CONTENT,headers:{[Se.MCP_PROTOCOL_VERSION]:Ke.DEFAULT,[Se.X_RESPONSE_TIME]:p.toString()}}):e.json(l,Je.OK,{[Se.CONTENT_TYPE]:Q.APPLICATION_JSON,[Se.MCP_PROTOCOL_VERSION]:Ke.DEFAULT,[Se.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,`${St.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:Je.BAD_REQUEST,headers:{[Se.CONTENT_TYPE]:Q.APPLICATION_JSON,[Se.MCP_PROTOCOL_VERSION]:Ke.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 v=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}})}},an=class{static{i(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof v)}handle(e,t){return v.fromError(e,"INTERNAL_ERROR","system")}},Io=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 v.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Mo=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 v.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},xo=class{static{i(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Io),this.registerHandler(new Mo),this.registerHandler(new an)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof v)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new an().handle(e,t)}},CS=new xo;import{normalizeServiceConfig as ap}from"@xiaozhi-client/config";import{TypeFieldNormalizer as Oo}from"@xiaozhi-client/mcp-core";var ls=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 v)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=v.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?o=v.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?o=v.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?o=v.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):o=v.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=v.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,f=await this.addMCPServersBatch(p),d=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:f.addedCount,failedCount:f.failedCount,duration:d}),e.success(f,f.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=Oo.normalizeTypeField(t);try{let s=ye.validateServiceName(e);if(!s.isValid){let f=v.validationError("INVALID_SERVICE_NAME",s.errors.join(", "),{serverName:e,errors:s.errors});throw this.logger.error("addMCPServerSingle",{validationError:f,serverName:e,phase:"name_validation"}),f}if(ye.checkServiceExists(e,this.configManager)){let f=v.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:f,serverName:e,phase:"existence_check"}),f}let o=ye.validateConfig(r);if(!o.isValid){let f=v.configError("INVALID_CONFIG",o.errors.join(", "),{serverName:e,config:r,errors:o.errors});throw this.logger.error("addMCPServerSingle",{configError:f,serverName:e,phase:"config_validation"}),f}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=ap(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(f=>f.name);return N().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}`),N().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)&&N().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=ye.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!ye.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),N().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=ye.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!ye.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 v.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 v.validationError("INVALID_CONFIG",a.errors.join(", "));try{for(let[f,d]of Object.entries(t)){let E=Oo.normalizeTypeField(d);try{let m=await this.addMCPServerSingle(f,E);s.push({name:f,success:!0,config:E,tools:m.tools,status:m.status}),o.push(f),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:f,toolsCount:m.tools?.length||0})}catch(m){let R=this.handleError(m,"addMCPServersBatch",{serverName:f,serverConfig:E});s.push({name:f,success:!1,error:R.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:f,error:R.message})}}let c=o.length,l=r.length-c;if(c===0)throw v.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");N().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 v?c:v.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=ye.validateServiceName(s);if(!a.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${a.errors.join(", ")}`);continue}if(ye.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let c=Oo.normalizeTypeField(o),l=ye.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),N().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})}},ye;(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")})(ye||={});import{configManager as us}from"@xiaozhi-client/config";var cn=class{static{i(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=u,this.notificationService=e,this.statusService=t,this.eventBus=N()}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}),Ae(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),Ae(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=us.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),Ae(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(us.validateConfig(t),us.updateConfig(t),t.mcpServerConfig)for(let[s,o]of Object.entries(t.mcpServerConfig))for(let[a,c]of Object.entries(o.tools))us.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),Ae(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),Ae(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),Ae(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=us.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),Ae(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 cp}from"child_process";var ln=class{static{i(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u,this.statusService=e,this.eventBus=N()}spawnXiaozhiProcess(e){let t=cp("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=nn(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},Po.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")}},Po.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=nn(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 un}from"fs";import{readFile as lp}from"fs/promises";import{dirname as up,join as Z}from"path";import{fileURLToPath as pp}from"url";var ps=class extends j{static{i(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=u,this.initializeWebPath()}initializeWebPath(){try{let e=up(pp(import.meta.url));u.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[Z(e,"..","..","..","frontend"),Z(e,"..","..","frontend"),Z(e,"..","frontend"),Z(e,"..","..","apps","frontend","dist"),Z(e,"..","apps","frontend","dist"),Z(e,"..","..","apps","frontend"),Z(e,"..","apps","frontend"),Z(e,"..","..","web","dist"),Z(e,"..","web","dist"),Z(e,"..","..","web"),Z(e,"..","web"),Z(e,"..","..","..","apps","frontend","dist"),Z(e,"..","..","..","apps","frontend"),Z(e,"..","..","..","web","dist"),Z(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=un(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",Je.FORBIDDEN);let s=Z(this.webPath,r);if(!un(s)){let a=Z(this.webPath,"index.html");return un(a)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,a,Q.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${s}`),e.text("Not Found",Je.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",Je.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let s=await lp(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:Q.TEXT_HTML,htm:Q.TEXT_HTML,js:Q.APPLICATION_JAVASCRIPT,mjs:Q.APPLICATION_JAVASCRIPT,css:Q.TEXT_CSS,json:Q.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:Q.APPLICATION_PDF,txt:Q.TEXT_PLAIN,xml:Q.APPLICATION_XML,zip:Q.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||Q.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
26
+ `:"");et.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}},nn=class{static{i(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||is.getConfigDir()}getLogFilePath(){return new as({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!et.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=et.readFileSync(e,"utf8").trim().split(`
27
+ `).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 Qt=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 Ye.INITIALIZE:return await this.handleInitialize(e.params,e.id);case Ye.INITIALIZED:return await this.handleInitializedNotification(e.params);case Ye.TOOLS_LIST:return await this.handleToolsList(e.id);case Ye.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case Ye.RESOURCES_LIST:return await this.handleResourcesList(e.id);case Ye.PROMPTS_LIST:return await this.handlePromptsList(e.id);case Ye.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=es.includes(r)?r:Ke.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:Io.NAME,version:Io.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=Ua(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}};var cs=class extends Tp{static{i(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=N();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 Ze(r),this.customMCPHandler=new os(this.cacheManager,this);let s=pe.getToolCallLogConfig(),o=pe.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 Qt(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 on(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=pe.isToolEnabled(s,c.name),p=pe.getMcpServerConfig()[s].tools[c.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let f=`${s}__${c.name}`;t.push({name:f,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 pe.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 pe.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 pe.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 pe.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{pe.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=pe.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?_p(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=pe.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=pe.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 d of s){let C=o[d.name];C?a[d.name]={...C,description:d.description||C.description||""}:a[d.name]={description:d.description||"",enable:!0}}let c=s.map(d=>d.name),p=Object.keys(o).filter(d=>!c.includes(d));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)){pe.updateServerToolsConfig(t,a);let d=Object.keys(a).filter(m=>!o[m]),C=Object.keys(a).filter(m=>{let R=o[m],A=a[m];return R&&R.description!==A.description});u.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),d.length>0&&u.debug(` - \u65B0\u589E\u5DE5\u5177: ${d.join(", ")}`),C.length>0&&u.debug(` - \u66F4\u65B0\u5DE5\u5177: ${C.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 Rp}from"@xiaozhi-client/mcp-core";var on=class{static{i(this,"MCPService")}connection;eventBus=N();constructor(e){let{name:t,...r}=e,s={onConnected:i(o=>{this.eventBus.emitEvent(en.CONNECTED,o)},"onConnected"),onDisconnected:i(o=>{this.eventBus.emitEvent(en.DISCONNECTED,o)},"onDisconnected"),onConnectionFailed:i(o=>{this.eventBus.emitEvent(en.CONNECTION_FAILED,o)},"onConnectionFailed")};this.connection=new Rp(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 ZC}from"@xiaozhi-client/mcp-core";function Ua(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new Qe(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new Qe(-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 Qe(-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 Qe(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let s=t.customValidator(r);if(s)throw new Qe(-32602,s)}return{name:r.name,arguments:r.arguments}}i(Ua,"validateToolCallParams");import{createHash as Ap}from"crypto";import{existsSync as ls,mkdirSync as bp,readFileSync as ja,renameSync as wp,writeFileSync as Ba}from"fs";import{dirname as Ip,resolve as za}from"path";import{Hono as Pp}from"hono";var Va=i(()=>new Pp,"createApp");var an=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");import Mp from"dayjs";var Ze=class{static{i(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=Mo.CACHE_VERSION;CACHE_ENTRY_VERSION=Mo.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=xa.CLEANUP_INTERVAL;constructor(e){this.logger=u,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Mp().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return za(e,No.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return za(t,No.FILENAME)}}async ensureCacheFile(){try{if(!ls(this.cachePath)){let e=Ip(this.cachePath);ls(e)||(bp(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(!ls(this.cachePath))return await this.createInitialCache();let e=ja(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{Ba(r,t,"utf8"),wp(r,e)}catch(s){try{ls(r)&&Ba(r,"","utf8")}catch{}throw s}}generateConfigHash(e){try{return Ap("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:ls(this.cachePath)?ja(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}${La.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=we(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=we(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=we(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=we(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=we(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)rs(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(f=>f.status==="pending").length,o=t.filter(f=>f.status==="completed").length,a=t.filter(f=>f.status==="failed").length,c=t.filter(f=>f.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 cn=class{static{i(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=u,this.config={maxMessageSize:e.maxMessageSize??Na.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 Qt(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(ve.CONTENT_LENGTH);if(s&&Number.parseInt(s)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${vt.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(ve.CONTENT_TYPE)?.includes(Q.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${vt.INVALID_REQUEST}: ${vt.INVALID_CONTENT_TYPE}`);let a=e.req.header("mcp-protocol-version")||e.req.header(ve.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");a&&!es.includes(a)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${a}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${es.join(", ")}`);let c;try{let f=await e.req.text();if(f.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(f),r=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,vt.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${vt.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:Je.NO_CONTENT,headers:{[ve.MCP_PROTOCOL_VERSION]:Ke.DEFAULT,[ve.X_RESPONSE_TIME]:p.toString()}}):e.json(l,Je.OK,{[ve.CONTENT_TYPE]:Q.APPLICATION_JSON,[ve.MCP_PROTOCOL_VERSION]:Ke.DEFAULT,[ve.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,`${vt.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:Je.BAD_REQUEST,headers:{[ve.CONTENT_TYPE]:Q.APPLICATION_JSON,[ve.MCP_PROTOCOL_VERSION]:Ke.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 v=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}})}},ln=class{static{i(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof v)}handle(e,t){return v.fromError(e,"INTERNAL_ERROR","system")}},ko=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 v.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Fo=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 v.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},Ho=class{static{i(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new ko),this.registerHandler(new Fo),this.registerHandler(new ln)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof v)return e;for(let r of this.handlers)if(r.canHandle(e)){let s=r.handle(e,t);if(s)return s}return new ln().handle(e,t)}},zS=new Ho;import{normalizeServiceConfig as Np}from"@xiaozhi-client/config";import{TypeFieldNormalizer as Uo}from"@xiaozhi-client/mcp-core";var us=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 v)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=v.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?o=v.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?o=v.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?o=v.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):o=v.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=v.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,f=await this.addMCPServersBatch(p),d=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:f.addedCount,failedCount:f.failedCount,duration:d}),e.success(f,f.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=Uo.normalizeTypeField(t);try{let s=Te.validateServiceName(e);if(!s.isValid){let f=v.validationError("INVALID_SERVICE_NAME",s.errors.join(", "),{serverName:e,errors:s.errors});throw this.logger.error("addMCPServerSingle",{validationError:f,serverName:e,phase:"name_validation"}),f}if(Te.checkServiceExists(e,this.configManager)){let f=v.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:f,serverName:e,phase:"existence_check"}),f}let o=Te.validateConfig(r);if(!o.isValid){let f=v.configError("INVALID_CONFIG",o.errors.join(", "),{serverName:e,config:r,errors:o.errors});throw this.logger.error("addMCPServerSingle",{configError:f,serverName:e,phase:"config_validation"}),f}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=Np(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(f=>f.name);return N().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}`),N().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)&&N().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=Te.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!Te.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),N().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=Te.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!Te.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 v.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 v.validationError("INVALID_CONFIG",a.errors.join(", "));try{for(let[f,d]of Object.entries(t)){let C=Uo.normalizeTypeField(d);try{let m=await this.addMCPServerSingle(f,C);s.push({name:f,success:!0,config:C,tools:m.tools,status:m.status}),o.push(f),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:f,toolsCount:m.tools?.length||0})}catch(m){let R=this.handleError(m,"addMCPServersBatch",{serverName:f,serverConfig:C});s.push({name:f,success:!1,error:R.message,config:C}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:f,error:R.message})}}let c=o.length,l=r.length-c;if(c===0)throw v.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");N().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 v?c:v.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=Te.validateServiceName(s);if(!a.isValid){t.push(`\u670D\u52A1 "${s}" \u540D\u79F0\u65E0\u6548: ${a.errors.join(", ")}`);continue}if(Te.checkServiceExists(s,this.configManager)){t.push(`\u670D\u52A1 "${s}" \u5DF2\u5B58\u5728`);continue}let c=Uo.normalizeTypeField(o),l=Te.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),N().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})}},Te;(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")})(Te||={});import{configManager as ps}from"@xiaozhi-client/config";var un=class{static{i(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=u,this.notificationService=e,this.statusService=t,this.eventBus=N()}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}),be(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),be(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=ps.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),be(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(ps.validateConfig(t),ps.updateConfig(t),t.mcpServerConfig)for(let[s,o]of Object.entries(t.mcpServerConfig))for(let[a,c]of Object.entries(o.tools))ps.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),be(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),be(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),be(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=ps.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),be(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 Lp}from"child_process";var pn=class{static{i(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=u,this.statusService=e,this.eventBus=N()}spawnXiaozhiProcess(e){let t=Lp("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=an(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},Oo.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")}},Oo.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=an(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 dn}from"fs";import{readFile as $p}from"fs/promises";import{dirname as Dp,join as Z}from"path";import{fileURLToPath as kp}from"url";var ds=class extends B{static{i(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=u,this.initializeWebPath()}initializeWebPath(){try{let e=Dp(kp(import.meta.url));u.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[Z(e,"..","..","..","frontend"),Z(e,"..","..","frontend"),Z(e,"..","frontend"),Z(e,"..","..","apps","frontend","dist"),Z(e,"..","apps","frontend","dist"),Z(e,"..","..","apps","frontend"),Z(e,"..","apps","frontend"),Z(e,"..","..","web","dist"),Z(e,"..","web","dist"),Z(e,"..","..","web"),Z(e,"..","web"),Z(e,"..","..","..","apps","frontend","dist"),Z(e,"..","..","..","apps","frontend"),Z(e,"..","..","..","web","dist"),Z(e,"..","..","..","web")];this.webPath=t.find(r=>{let s=dn(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",Je.FORBIDDEN);let s=Z(this.webPath,r);if(!dn(s)){let a=Z(this.webPath,"index.html");return dn(a)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,a,Q.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${s}`),e.text("Not Found",Je.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",Je.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let s=await $p(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:Q.TEXT_HTML,htm:Q.TEXT_HTML,js:Q.APPLICATION_JAVASCRIPT,mjs:Q.APPLICATION_JAVASCRIPT,css:Q.TEXT_CSS,json:Q.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:Q.APPLICATION_PDF,txt:Q.TEXT_PLAIN,xml:Q.APPLICATION_XML,zip:Q.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||Q.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
28
28
  <!DOCTYPE html>
29
29
  <html>
30
30
  <head>
@@ -81,20 +81,20 @@ var Mu=Object.create;var Xs=Object.defineProperty;var xu=Object.getOwnPropertyDe
81
81
  </div>
82
82
  </body>
83
83
  </html>
84
- `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&un(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}};var pn=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 Qt=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(Qt||{});var dp={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")};function Ra(n,e){let t=dp[e.field];return t?[...n].sort(t):(u.warn(`[sortTools] \u672A\u77E5\u7684\u6392\u5E8F\u5B57\u6BB5: ${e.field}`),n)}i(Ra,"sortTools");import{configManager as O}from"@xiaozhi-client/config";import fp from"ajv";import dn from"dayjs";var fn=class{static{i(this,"MCPToolHandler")}logger;ajv;constructor(){this.logger=u,this.ajv=new fp({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:da.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"),!O.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=O.getCustomMCPTools(),r=O.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")):O.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=Ra(c,{field:o});let l=c.map(f=>({name:f.name,description:f.description,inputSchema:f.inputSchema,handler:{type:"mcp",config:{serviceName:f.serviceName,toolName:f.originalName}},enabled:f.enabled,usageCount:f.usageCount,lastUsedTime:f.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?v.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`):v.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),v.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 v.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 f=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(a.errors||[]).map(d=>{let E=d.instancePath||d.schemaPath||"",m=d.message||"\u672A\u77E5\u9519\u8BEF";if(d.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${d.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(d.keyword==="type"){let R=d.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${R}`}if(d.keyword==="enum"){let R=d.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${R.join(", ")}`}return`\u53C2\u6570 ${E} ${m}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,f),v.validationError("TOOL_VALIDATION_FAILED",f)}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),v.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(Qt).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(Qt).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 O.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(P){let V=P instanceof Error?P.message:String(P);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",V,void 0,404)}let p=await new Ze().getAllCachedTools(),f=`${r}__${s}`,d=p.find(P=>P.name===f);if(!d)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`,void 0,404);let E=o||f,m=O.getCustomMCPTools();if(new Set(m.map(P=>P.name)).has(E))return e.fail("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${E}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`,void 0,409);let A={name:E,description:a||d.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:d.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:dn().format("YYYY-MM-DD HH:mm:ss")}};O.addCustomMCPTool(A),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 $=O.getServerToolsConfig(r);$?.toolName&&($[s].enable=!0,O.updateServerToolsConfig(r,$),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: ${E}`);let L={tool:A,toolName:E,toolType:"mcp",addedAt:dn().format("YYYY-MM-DD HH:mm:ss")};return e.success(L,`MCP \u5DE5\u5177 "${E}" \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);O.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:dn().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(Qt).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(Qt).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=O.getCustomMCPTools().find(m=>m.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 f=this.generateInputSchema(s,c),d={...p,description:a||p.description,inputSchema:f};O.updateCustomMCPTool(t,d),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:d,toolName:t,toolType:"coze",updatedAt:dn().format("YYYY-MM-DD HH:mm:ss")};return e.success(E,`Coze \u5DE5\u5177 "${t}" \u914D\u7F6E\u66F4\u65B0\u6210\u529F`)}handleUpdateToolError(e){let t=e instanceof Error?e.message:"\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{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=O.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=O.getServerToolsConfig(o.serviceName);a?.[o.toolName]&&(a[o.toolName].enable=!1,O.updateServerToolsConfig(o.serviceName,a),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${o.serviceName}/${o.toolName}`))}}return O.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),f={name:a,description:c,inputSchema:l,handler:p};return this.validateGeneratedTool(f),f}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 v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw v.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 v.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 v.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 v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED","\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw v.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 v.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 v.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 v.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 v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${s}`)}resolveToolNameConflict(e){let t=O.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 v.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=O.getCozePlatformConfig();if(!e||!e.token)throw v.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),!O.validateCustomMCPTools([e]))throw v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw v.validationError("TOOL_VALIDATION_FAILED","HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw v.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw v.validationError("TOOL_VALIDATION_FAILED","Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw v.configError("INVALID_CONFIG","\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw v.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED","Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw v.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw v.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 v.validationError("TOOL_VALIDATION_FAILED",`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw v.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=O.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=O.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),O.setToolEnabled(t,r,!0,s);let a=O.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),O.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=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=!O.isToolEnabled(t,r);return O.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(!O.getMcpServers()[t])return e.fail("SERVICE_NOT_FOUND",`MCP \u670D\u52A1 "${t}" \u4E0D\u5B58\u5728`,void 0,404);let o=O.getServerToolsConfig(t),a=Object.entries(o).map(([p,f])=>{let d={toolName:p,enabled:f.enable!==!1,description:f.description||""};return r&&(d.usageCount=f.usageCount,d.lastUsedTime=f.lastUsedTime),d}),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=O.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,f])=>{let d={toolName:p,enabled:f.enable!==!1,description:f.description||""};return t&&(d.usageCount=f.usageCount,d.lastUsedTime=f.lastUsedTime),d}),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 v.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!/^[a-zA-Z0-9_-]+$/.test(e))throw v.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 v.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(!O.getMcpServers()[e])throw v.validationError("SERVER_NOT_FOUND",`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!O.getServerToolsConfig(e)[t])throw v.validationError("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}};import{z as tt}from"zod";var mp=tt.object({limit:tt.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=yo.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${yo.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:tt.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:tt.string().optional(),serverName:tt.string().optional(),success:tt.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:tt.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:tt.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"]}),mn=class extends j{static{i(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new rn}parseAndValidateQueryParams(e){let t=e.req.query(),r=mp.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)}}};import{exec as pm,spawn as dm}from"child_process";import{promisify as fm}from"util";var Ss=Du(fl(),1);var ml=fm(pm),Tt=class{static{i(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||N()}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=dm("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 f=`\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:f,duration:p,timestamp:Date.now()}),c(new Error(f))}})})}async getCurrentVersion(){let{stdout:e}=await ml("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 ml("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(o=>o&&typeof o=="string"&&Ss.default.valid(o));return e!=="all"&&(s=s.filter(o=>{let a=Ss.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)=>Ss.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=Ss.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"}}}};import{z as hl}from"zod";var mm=hl.object({version:hl.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),wn=class extends j{static{i(this,"UpdateApiHandler")}npmManager;eventBus=N();activeInstalls=new Map;constructor(){super(),this.npmManager=new Tt(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=mm.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 Qo}from"@xiaozhi-client/version";var bn=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=Qo.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=Qo.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"),Qo.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 Tt().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 Tt().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 hm from"fs";import{configManager as gm}from"@xiaozhi-client/config";import{TTS as Cm}from"@xiaozhi-client/tts";var 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=gm.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 f=new Cm({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 d=await f.synthesize(t.text);return hm.writeFileSync("audio.wav",Buffer.from(d)),e.get("logger").info(`\u8BED\u97F3\u5408\u6210\u6210\u529F: audioSize=${d.length} bytes`),new Response(Buffer.from(d),{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 ys=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 Zo=i(async(n,e)=>{n.set("logger",u),n.logger=u,await e()},"loggerMiddleware");import{cors as Sm}from"hono/cors";var ei=Sm({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]});var ti=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"),ri=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 si=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 er=class extends Error{static{i(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},Ts=class extends Error{static{i(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}};var ni=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 Ts("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 er)n.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof Ts?(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 oi=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 vm}from"@xiaozhi-client/config";var ii=i(()=>{let n=null,e;return async(t,r)=>{let s=t.get("endpointManager");s!==e&&(e=s,s?n=new es(s,vm):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware");var In=class{static{i(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=u,this.eventBus=N()}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 ym}from"@xiaozhi-client/config";var Mn=class{static{i(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=u,this.eventBus=N(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=ym.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 xn=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")}};import{randomBytes as Rm}from"crypto";function gl(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}i(gl,"encodeBinaryProtocol2");function Cl(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}}i(Cl,"parseBinaryProtocol2");function El(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)}i(El,"isBinaryProtocol2");function Sl(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)}i(Sl,"isBinaryProtocol3");function vl(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}}i(vl,"parseBinaryProtocol3");function yl(n,e){let t=Tm(n,e),r=_m(n,e);return{boardType:t,appVersion:r}}i(yl,"extractDeviceInfo");function Tm(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}i(Tm,"extractBoardType");function _m(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}i(_m,"extractAppVersion");function tr(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=>tr(r,e));let t={};for(let r of Object.keys(n)){let s=r.replace(/([A-Z])/g,"_$1").toLowerCase();t[s]=tr(n[r],e)}return t}i(tr,"camelToSnakeCase");var On=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=Rm(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&&!Pm(e)){if(El(e)){let s=Cl(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(Sl(e)){let s=vl(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=tr(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=gl(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}};function Pm(n){try{let e=n.toString("utf-8");return Buffer.from(e,"utf-8").equals(n)?!e.includes("\uFFFD"):!1}catch{return!1}}i(Pm,"isValidUTF8");import{ASR as Am,AudioFormat as wm,AuthMethod as bm,OpusDecoder as Im}from"@xiaozhi-client/asr";import{configManager as Mm}from"@xiaozhi-client/config";var Nn=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=Mm.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 Am({bytedance:{v2:{app:{appid:t.appid,token:t.accessToken,cluster:t.cluster||"volcengine_streaming_common"},user:{uid:`device_${e}`},audio:{format:wm.RAW,language:"zh-CN"},request:{reqid:`req_${e}_${Date.now()}`,sequence:1}}},authMethod:bm.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 Im.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 xm,readFileSync as Om}from"fs";import{dirname as Nm,isAbsolute as _l,resolve as Lm}from"path";import{configManager as $m}from"@xiaozhi-client/config";var Tl="\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";function Dm(n){let e=n.replace(/\\/g,"/");return!!(e.startsWith("./")||e.startsWith("../")||_l(n))}i(Dm,"isPromptPath");function km(n){try{let e=n.replace(/\\/g,"/"),t;if(_l(e))t=e;else{let s=$m.getConfigPath(),o=Nm(s);t=Lm(o,e)}if(!xm(t))return null;let r=Om(t,"utf-8").trim();return r||null}catch{return null}}i(km,"resolvePromptFromPath");function Rl(n){return!n||n.trim()===""?Tl:Dm(n)?km(n)||Tl:n}i(Rl,"resolvePrompt");import{configManager as Wi}from"@xiaozhi-client/config";function w(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}i(w,"__classPrivateFieldSet");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)}i(h,"__classPrivateFieldGet");var ai=i(function(){let{crypto:n}=globalThis;if(n?.randomUUID)return ai=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 _s(n){return typeof n=="object"&&n!==null&&("name"in n&&n.name==="AbortError"||"message"in n&&String(n.message).includes("FetchRequestCanceledException"))}i(_s,"isAbortError");var Rs=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 y=class extends Error{static{i(this,"OpenAIError")}},q=class n extends y{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 rt({message:r,cause:Rs(t)});let o=t?.error;return e===400?new rr(e,o,r,s):e===401?new sr(e,o,r,s):e===403?new nr(e,o,r,s):e===404?new or(e,o,r,s):e===409?new ir(e,o,r,s):e===422?new ar(e,o,r,s):e===429?new cr(e,o,r,s):e>=500?new lr(e,o,r,s):new n(e,o,r,s)}},z=class extends q{static{i(this,"APIUserAbortError")}constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},rt=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 rt{static{i(this,"APIConnectionTimeoutError")}constructor({message:e}={}){super({message:e??"Request timed out."})}},rr=class extends q{static{i(this,"BadRequestError")}},sr=class extends q{static{i(this,"AuthenticationError")}},nr=class extends q{static{i(this,"PermissionDeniedError")}},or=class extends q{static{i(this,"NotFoundError")}},ir=class extends q{static{i(this,"ConflictError")}},ar=class extends q{static{i(this,"UnprocessableEntityError")}},cr=class extends q{static{i(this,"RateLimitError")}},lr=class extends q{static{i(this,"InternalServerError")}},ur=class extends y{static{i(this,"LengthFinishReasonError")}constructor(){super("Could not parse response content as the length limit was reached")}},pr=class extends y{static{i(this,"ContentFilterFinishReasonError")}constructor(){super("Could not parse response content as the request was rejected by the content filter")}},Ie=class extends Error{static{i(this,"InvalidWebhookSignatureError")}constructor(e){super(e)}};var Hm=/^[a-z][a-z0-9+.-]*:/i,Pl=i(n=>Hm.test(n),"isAbsoluteURL"),se=i(n=>(se=Array.isArray,se(n)),"isArray"),ci=se;function li(n){return typeof n!="object"?{}:n??{}}i(li,"maybeObj");function Al(n){if(!n)return!0;for(let e in n)return!1;return!0}i(Al,"isEmptyObj");function wl(n,e){return Object.prototype.hasOwnProperty.call(n,e)}i(wl,"hasOwn");function Ps(n){return n!=null&&typeof n=="object"&&!Array.isArray(n)}i(Ps,"isObj");var bl=i((n,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new y(`${n} must be an integer`);if(e<0)throw new y(`${n} must be a positive integer`);return e},"validatePositiveInteger");var Il=i(n=>{try{return JSON.parse(n)}catch{return}},"safeJSON");var Me=i(n=>new Promise(e=>setTimeout(e,n)),"sleep");var nt="6.24.0";var Nl=i(()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u","isRunningInBrowser");function Um(){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"}i(Um,"getDetectedPlatform");var Vm=i(()=>{let n=Um();if(n==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":nt,"X-Stainless-OS":xl(Deno.build.os),"X-Stainless-Arch":Ml(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":nt,"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":nt,"X-Stainless-OS":xl(globalThis.process.platform??"unknown"),"X-Stainless-Arch":Ml(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=Bm();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":nt,"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":nt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},"getPlatformProperties");function Bm(){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}i(Bm,"getBrowserInfo");var Ml=i(n=>n==="x32"?"x32":n==="x86_64"||n==="x64"?"x64":n==="arm"?"arm":n==="aarch64"||n==="arm64"?"arm64":n?`other:${n}`:"unknown","normalizeArch"),xl=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"),Ol,Ll=i(()=>Ol??(Ol=Vm()),"getPlatformHeaders");function $l(){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`")}i($l,"getDefaultFetch");function ui(...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)}i(ui,"makeReadableStream");function Ln(n){let e=Symbol.asyncIterator in n?n[Symbol.asyncIterator]():n[Symbol.iterator]();return ui({start(){},async pull(t){let{done:r,value:s}=await e.next();r?t.close():t.enqueue(s)},async cancel(){await e.return?.()}})}i(Ln,"ReadableStreamFrom");function pi(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}}}i(pi,"ReadableStreamToAsyncIterable");async function Dl(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}i(Dl,"CancelReadableStream");var kl=i(({headers:n,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)}),"FallbackEncoder");var $n="RFC3986",di=i(n=>String(n),"default_formatter"),Dn={RFC1738:i(n=>String(n).replace(/%20/g,"+"),"RFC1738"),RFC3986:di},fi="RFC1738";var kn=i((n,e)=>(kn=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),kn(n,e)),"has"),xe=(()=>{let n=[];for(let e=0;e<256;++e)n.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return n})();var mi=1024,Fl=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+=mi){let l=o.length>=mi?o.slice(c,c+mi):o,p=[];for(let f=0;f<l.length;++f){let d=l.charCodeAt(f);if(d===45||d===46||d===95||d===126||d>=48&&d<=57||d>=65&&d<=90||d>=97&&d<=122||s===fi&&(d===40||d===41)){p[p.length]=l.charAt(f);continue}if(d<128){p[p.length]=xe[d];continue}if(d<2048){p[p.length]=xe[192|d>>6]+xe[128|d&63];continue}if(d<55296||d>=57344){p[p.length]=xe[224|d>>12]+xe[128|d>>6&63]+xe[128|d&63];continue}f+=1,d=65536+((d&1023)<<10|l.charCodeAt(f)&1023),p[p.length]=xe[240|d>>18]+xe[128|d>>12&63]+xe[128|d>>6&63]+xe[128|d&63]}a+=p.join("")}return a},"encode");function Hl(n){return!n||typeof n!="object"?!1:!!(n.constructor&&n.constructor.isBuffer&&n.constructor.isBuffer(n))}i(Hl,"is_buffer");function hi(n,e){if(se(n)){let t=[];for(let r=0;r<n.length;r+=1)t.push(e(n[r]));return t}return e(n)}i(hi,"maybe_map");var Vl={brackets(n){return String(n)+"[]"},comma:"comma",indices(n,e){return String(n)+"["+e+"]"},repeat(n){return String(n)}},Bl=i(function(n,e){Array.prototype.push.apply(n,se(e)?e:[e])},"push_to_array"),Ul,G={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:Fl,encodeValuesOnly:!1,format:$n,formatter:di,indices:!1,serializeDate(n){return(Ul??(Ul=Function.prototype.call.bind(Date.prototype.toISOString)))(n)},skipNulls:!1,strictNullHandling:!1};function Wm(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"||typeof n=="symbol"||typeof n=="bigint"}i(Wm,"is_non_nullish_primitive");var gi={};function jl(n,e,t,r,s,o,a,c,l,p,f,d,E,m,R,A,$,L){let P=n,V=L,F=0,le=!1;for(;(V=V.get(gi))!==void 0&&!le;){let B=V.get(n);if(F+=1,typeof B<"u"){if(B===F)throw new RangeError("Cyclic object value");le=!0}typeof V.get(gi)>"u"&&(F=0)}if(typeof p=="function"?P=p(e,P):P instanceof Date?P=E?.(P):t==="comma"&&se(P)&&(P=hi(P,function(B){return B instanceof Date?E?.(B):B})),P===null){if(o)return l&&!A?l(e,G.encoder,$,"key",m):e;P=""}if(Wm(P)||Hl(P)){if(l){let B=A?e:l(e,G.encoder,$,"key",m);return[R?.(B)+"="+R?.(l(P,G.encoder,$,"value",m))]}return[R?.(e)+"="+R?.(String(P))]}let ne=[];if(typeof P>"u")return ne;let H;if(t==="comma"&&se(P))A&&l&&(P=hi(P,l)),H=[{value:P.length>0?P.join(",")||null:void 0}];else if(se(p))H=p;else{let B=Object.keys(P);H=f?B.sort(f):B}let J=c?String(e).replace(/\./g,"%2E"):String(e),K=r&&se(P)&&P.length===1?J+"[]":J;if(s&&se(P)&&P.length===0)return K+"[]";for(let B=0;B<H.length;++B){let W=H[B],la=typeof W=="object"&&typeof W.value<"u"?W.value:P[W];if(a&&la===null)continue;let go=d&&c?W.replace(/\./g,"%2E"):W,Iu=se(P)?typeof t=="function"?t(K,go):K:K+(d?"."+go:"["+go+"]");L.set(n,F);let ua=new WeakMap;ua.set(gi,L),Bl(ne,jl(la,Iu,t,r,s,o,a,c,t==="comma"&&A&&se(P)?null:l,p,f,d,E,m,R,A,$,ua))}return ne}i(jl,"inner_stringify");function qm(n=G){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||G.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=$n;if(typeof n.format<"u"){if(!kn(Dn,n.format))throw new TypeError("Unknown format option provided.");t=n.format}let r=Dn[t],s=G.filter;(typeof n.filter=="function"||se(n.filter))&&(s=n.filter);let o;if(n.arrayFormat&&n.arrayFormat in Vl?o=n.arrayFormat:"indices"in n?o=n.indices?"indices":"repeat":o=G.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:G.allowDots:!!n.allowDots;return{addQueryPrefix:typeof n.addQueryPrefix=="boolean"?n.addQueryPrefix:G.addQueryPrefix,allowDots:a,allowEmptyArrays:typeof n.allowEmptyArrays=="boolean"?!!n.allowEmptyArrays:G.allowEmptyArrays,arrayFormat:o,charset:e,charsetSentinel:typeof n.charsetSentinel=="boolean"?n.charsetSentinel:G.charsetSentinel,commaRoundTrip:!!n.commaRoundTrip,delimiter:typeof n.delimiter>"u"?G.delimiter:n.delimiter,encode:typeof n.encode=="boolean"?n.encode:G.encode,encodeDotInKeys:typeof n.encodeDotInKeys=="boolean"?n.encodeDotInKeys:G.encodeDotInKeys,encoder:typeof n.encoder=="function"?n.encoder:G.encoder,encodeValuesOnly:typeof n.encodeValuesOnly=="boolean"?n.encodeValuesOnly:G.encodeValuesOnly,filter:s,format:t,formatter:r,serializeDate:typeof n.serializeDate=="function"?n.serializeDate:G.serializeDate,skipNulls:typeof n.skipNulls=="boolean"?n.skipNulls:G.skipNulls,sort:typeof n.sort=="function"?n.sort:null,strictNullHandling:typeof n.strictNullHandling=="boolean"?n.strictNullHandling:G.strictNullHandling}}i(qm,"normalize_stringify_options");function Ci(n,e={}){let t=n,r=qm(e),s,o;typeof r.filter=="function"?(o=r.filter,t=o("",t)):se(r.filter)&&(o=r.filter,s=o);let a=[];if(typeof t!="object"||t===null)return"";let c=Vl[r.arrayFormat],l=c==="comma"&&r.commaRoundTrip;s||(s=Object.keys(t)),r.sort&&s.sort(r.sort);let p=new WeakMap;for(let E=0;E<s.length;++E){let m=s[E];r.skipNulls&&t[m]===null||Bl(a,jl(t[m],m,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 f=a.join(r.delimiter),d=r.addQueryPrefix===!0?"?":"";return r.charsetSentinel&&(r.charset==="iso-8859-1"?d+="utf8=%26%2310003%3B&":d+="utf8=%E2%9C%93&"),f.length>0?d+f:""}i(Ci,"stringify");function ql(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}i(ql,"concatBytes");var zl;function dr(n){let e;return(zl??(e=new globalThis.TextEncoder,zl=e.encode.bind(e)))(n)}i(dr,"encodeUTF8");var Wl;function Ei(n){let e;return(Wl??(e=new globalThis.TextDecoder,Wl=e.decode.bind(e)))(n)}i(Ei,"decodeUTF8");var pe,de,_t=class{static{i(this,"LineDecoder")}constructor(){pe.set(this,void 0),de.set(this,void 0),w(this,pe,new Uint8Array,"f"),w(this,de,null,"f")}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?dr(e):e;w(this,pe,ql([h(this,pe,"f"),t]),"f");let r=[],s;for(;(s=Xm(h(this,pe,"f"),h(this,de,"f")))!=null;){if(s.carriage&&h(this,de,"f")==null){w(this,de,s.index,"f");continue}if(h(this,de,"f")!=null&&(s.index!==h(this,de,"f")+1||s.carriage)){r.push(Ei(h(this,pe,"f").subarray(0,h(this,de,"f")-1))),w(this,pe,h(this,pe,"f").subarray(h(this,de,"f")),"f"),w(this,de,null,"f");continue}let o=h(this,de,"f")!==null?s.preceding-1:s.preceding,a=Ei(h(this,pe,"f").subarray(0,o));r.push(a),w(this,pe,h(this,pe,"f").subarray(s.index),"f"),w(this,de,null,"f")}return r}flush(){return h(this,pe,"f").length?this.decode(`
85
- `):[]}};pe=new WeakMap,de=new WeakMap;_t.NEWLINE_CHARS=new Set([`
86
- `,"\r"]);_t.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function Xm(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}i(Xm,"findNewlineIndex");function Gl(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}i(Gl,"findDoubleNewlineIndex");var Hn={off:0,error:200,warn:300,info:400,debug:500},Si=i((n,e,t)=>{if(n){if(wl(Hn,n))return n;U(t).warn(`${e} was set to ${JSON.stringify(n)}, expected one of ${JSON.stringify(Object.keys(Hn))}`)}},"parseLogLevel");function As(){}i(As,"noop");function Fn(n,e,t){return!e||Hn[n]>Hn[t]?As:e[n].bind(e)}i(Fn,"makeLogFn");var Jm={error:As,warn:As,info:As,debug:As},Xl=new WeakMap;function U(n){let e=n.logger,t=n.logLevel??"off";if(!e)return Jm;let r=Xl.get(e);if(r&&r[0]===t)return r[1];let s={error:Fn("error",e,t),warn:Fn("warn",e,t),info:Fn("info",e,t),debug:Fn("debug",e,t)};return Xl.set(e,[t,s]),s}i(U,"loggerFor");var De=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");var ws,Oe=class n{static{i(this,"Stream")}constructor(e,t,r){this.iterator=e,ws.set(this,void 0),this.controller=t,w(this,ws,r,"f")}static fromSSEResponse(e,t,r){let s=!1,o=r?U(r):console;async function*a(){if(s)throw new y("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let c=!1;try{for await(let l of Km(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(f){throw o.error("Could not parse message into JSON:",l.data),o.error("From chunk:",l.raw),f}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(f){throw f}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(_s(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 _t,l=pi(e);for await(let p of l)for(let f of c.decode(p))yield f;for(let p of c.flush())yield p}i(o,"iterLines");async function*a(){if(s)throw new y("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(_s(l))return;throw l}finally{c||t.abort()}}return i(a,"iterator"),new n(a,t,r)}[(ws=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,ws,"f")),new n(()=>s(t),this.controller,h(this,ws,"f"))]}toReadableStream(){let e=this,t;return ui({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=dr(JSON.stringify(s)+`
87
- `);r.enqueue(a)}catch(s){r.error(s)}},async cancel(){await t.return?.()}})}};async function*Km(n,e){if(!n.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new y("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 y("Attempted to iterate over a response with no body");let t=new vi,r=new _t,s=pi(n.body);for await(let o of Ym(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)}}i(Km,"_iterSSEMessages");async function*Ym(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"?dr(t):t,s=new Uint8Array(e.length+r.length);s.set(e),s.set(r,e.length),e=s;let o;for(;(o=Gl(e))!==-1;)yield e.slice(0,o),e=e.slice(o)}e.length>0&&(yield e)}i(Ym,"iterSSEChunks");var vi=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(`
88
- `),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]=Qm(e,":");return s.startsWith(" ")&&(s=s.substring(1)),t==="event"?this.event=s:t==="data"&&this.data.push(s),null}};function Qm(n,e){let t=n.indexOf(e);return t!==-1?[n.substring(0,t),e,n.substring(t+e.length)]:[n,"",""]}i(Qm,"partition");async function Un(n,e){let{response:t,requestLogID:r,retryOfRequestLogID:s,startTime:o}=e,a=await(async()=>{if(e.options.stream)return U(n).debug("response",t.status,t.url,t.headers,t.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(t,e.controller,n):Oe.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 E=await t.json();return yi(E,t)}return await t.text()})();return U(n).debug(`[${r}] response parsed`,De({retryOfRequestLogID:s,url:t.url,status:t.status,body:a,durationMs:Date.now()-o})),a}i(Un,"defaultParseResponse");function yi(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})}i(yi,"addRequestID");var bs,Rt=class n extends Promise{static{i(this,"APIPromise")}constructor(e,t,r=Un){super(s=>{s(null)}),this.responsePromise=t,this.parseResponse=r,bs.set(this,void 0),w(this,bs,e,"f")}_thenUnwrap(e){return new n(h(this,bs,"f"),this.responsePromise,async(t,r)=>yi(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,bs,"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)}};bs=new WeakMap;var Vn,Is=class{static{i(this,"AbstractPage")}constructor(e,t,r,s){Vn.set(this,void 0),w(this,Vn,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 y("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await h(this,Vn,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(Vn=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},Ms=class extends Rt{static{i(this,"PagePromise")}constructor(e,t,r){super(e,t,async(s,o)=>new r(s,o.response,await Un(s,o),o.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},Ne=class extends Is{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}},M=class extends Is{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:{...li(this.options.query),after:t}}:null}},ke=class extends Is{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:{...li(this.options.query),after:e}}:null}};var Ri=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");function fr(n,e,t){return Ri(),new File(n,e??"unknown_file",t)}i(fr,"makeFile");function xs(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}i(xs,"getName");var Bn=i(n=>n!=null&&typeof n=="object"&&typeof n[Symbol.asyncIterator]=="function","isAsyncIterable"),Fe=i(async(n,e)=>Ti(n.body)?{...n,body:await Kl(n.body,e)}:n,"maybeMultipartFormRequestOptions"),Te=i(async(n,e)=>({...n,body:await Kl(n.body,e)}),"multipartFormRequestOptions"),Jl=new WeakMap;function eh(n){let e=typeof n=="function"?n:n.fetch,t=Jl.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 Jl.set(e,r),r}i(eh,"supportsFormData");var Kl=i(async(n,e)=>{if(!await eh(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])=>_i(t,r,s))),t},"createForm"),Yl=i(n=>n instanceof Blob&&"name"in n,"isNamedBlob"),th=i(n=>typeof n=="object"&&n!==null&&(n instanceof Response||Bn(n)||Yl(n)),"isUploadable"),Ti=i(n=>{if(th(n))return!0;if(Array.isArray(n))return n.some(Ti);if(n&&typeof n=="object"){for(let e in n)if(Ti(n[e]))return!0}return!1},"hasUploadableValue"),_i=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,fr([await t.blob()],xs(t)));else if(Bn(t))n.append(e,fr([await new Response(Ln(t)).blob()],xs(t)));else if(Yl(t))n.append(e,t,xs(t));else if(Array.isArray(t))await Promise.all(t.map(r=>_i(n,e+"[]",r)));else if(typeof t=="object")await Promise.all(Object.entries(t).map(([r,s])=>_i(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");var Ql=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"),rh=i(n=>n!=null&&typeof n=="object"&&typeof n.name=="string"&&typeof n.lastModified=="number"&&Ql(n),"isFileLike"),sh=i(n=>n!=null&&typeof n=="object"&&typeof n.url=="string"&&typeof n.blob=="function","isResponseLike");async function jn(n,e,t){if(Ri(),n=await n,rh(n))return n instanceof File?n:fr([await n.arrayBuffer()],n.name);if(sh(n)){let s=await n.blob();return e||(e=new URL(n.url).pathname.split(/[\\/]/).pop()),fr(await Pi(s),e,t)}let r=await Pi(n);if(e||(e=xs(n)),!t?.type){let s=r.find(o=>typeof o=="object"&&"type"in o&&o.type);typeof s=="string"&&(t={...t,type:s})}return fr(r,e,t)}i(jn,"toFile");async function Pi(n){let e=[];if(typeof n=="string"||ArrayBuffer.isView(n)||n instanceof ArrayBuffer)e.push(n);else if(Ql(n))e.push(n instanceof Blob?n:await n.arrayBuffer());else if(Bn(n))for await(let t of n)e.push(...await Pi(t));else{let t=n?.constructor?.name;throw new Error(`Unexpected data type: ${typeof n}${t?`; constructor: ${t}`:""}${nh(n)}`)}return e}i(Pi,"getBytes");function nh(n){return typeof n!="object"||n===null?"":`; props: [${Object.getOwnPropertyNames(n).map(t=>`"${t}"`).join(", ")}]`}i(nh,"propsForError");var C=class{static{i(this,"APIResource")}constructor(e){this._client=e}};function eu(n){return n.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}i(eu,"encodeURIPath");var Zl=Object.freeze(Object.create(null)),ih=i((n=eu)=>i(function(t,...r){if(t.length===1)return t[0];let s=!1,o=[],a=t.reduce((f,d,E)=>{/[?#]/.test(d)&&(s=!0);let m=r[E],R=(s?encodeURIComponent:n)(""+m);return E!==r.length&&(m==null||typeof m=="object"&&m.toString===Object.getPrototypeOf(Object.getPrototypeOf(m.hasOwnProperty??Zl)??Zl)?.toString)&&(R=m+"",o.push({start:f.length+d.length,length:R.length,error:`Value of type ${Object.prototype.toString.call(m).slice(8,-1)} is not a valid path parameter`})),f+d+(E===r.length?"":R)},""),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((f,d)=>f.start-d.start),o.length>0){let f=0,d=o.reduce((E,m)=>{let R=" ".repeat(m.start-f),A="^".repeat(m.length);return f=m.start+m.length,E+R+A},"");throw new y(`Path parameters result in path with invalid segments:
89
- ${o.map(E=>E.error).join(`
84
+ `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&dn(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}};var fn=class extends B{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 Vo=(s=>(s.MCP="mcp",s.COZE="coze",s.HTTP="http",s.FUNCTION="function",s))(Vo||{});var Fp={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")};function Wa(n,e){let t=Fp[e.field];return t?[...n].sort(t):(u.warn(`[sortTools] \u672A\u77E5\u7684\u6392\u5E8F\u5B57\u6BB5: ${e.field}`),n)}i(Wa,"sortTools");import{configManager as O}from"@xiaozhi-client/config";import Hp from"ajv";import mn from"dayjs";var 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(Vo);constructor(){this.logger=u,this.ajv=new Hp({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:Oa.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"),!O.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=O.getCustomMCPTools(),r=O.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")):O.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=Wa(c,{field:o});let l=c.map(f=>({name:f.name,description:f.description,inputSchema:f.inputSchema,handler:{type:"mcp",config:{serviceName:f.serviceName,toolName:f.originalName}},enabled:f.enabled,usageCount:f.usageCount,lastUsedTime:f.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?v.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`):v.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),v.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 v.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 f=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(a.errors||[]).map(d=>{let C=d.instancePath||d.schemaPath||"",m=d.message||"\u672A\u77E5\u9519\u8BEF";if(d.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${d.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(d.keyword==="type"){let R=d.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${C} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${R}`}if(d.keyword==="enum"){let R=d.params?.allowedValues||[];return`\u53C2\u6570 ${C} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${R.join(", ")}`}return`\u53C2\u6570 ${C} ${m}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,f),v.validationError("TOOL_VALIDATION_FAILED",f)}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),v.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 O.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(P){let V=P instanceof Error?P.message:String(P);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",V,void 0,404)}let p=await new Ze().getAllCachedTools(),f=`${r}__${s}`,d=p.find(P=>P.name===f);if(!d)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${s}`,void 0,404);let C=o||f,m=O.getCustomMCPTools();if(new Set(m.map(P=>P.name)).has(C))return e.fail("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${C}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`,void 0,409);let A={name:C,description:a||d.description||`MCP \u5DE5\u5177: ${r}/${s}`,inputSchema:d.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:s}},stats:{usageCount:0,lastUsedTime:mn().format("YYYY-MM-DD HH:mm:ss")}};O.addCustomMCPTool(A),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 $=O.getServerToolsConfig(r);$?.toolName&&($[s].enable=!0,O.updateServerToolsConfig(r,$),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: ${C}`);let L={tool:A,toolName:C,toolType:"mcp",addedAt:mn().format("YYYY-MM-DD HH:mm:ss")};return e.success(L,`MCP \u5DE5\u5177 "${C}" \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);O.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:mn().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=O.getCustomMCPTools().find(m=>m.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 f=this.generateInputSchema(s,c),d={...p,description:a||p.description,inputSchema:f};O.updateCustomMCPTool(t,d),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let C={tool:d,toolName:t,toolType:"coze",updatedAt:mn().format("YYYY-MM-DD HH:mm:ss")};return e.success(C,`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=O.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=O.getServerToolsConfig(o.serviceName);a?.[o.toolName]&&(a[o.toolName].enable=!1,O.updateServerToolsConfig(o.serviceName,a),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${o.serviceName}/${o.toolName}`))}}return O.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),f={name:a,description:c,inputSchema:l,handler:p};return this.validateGeneratedTool(f),f}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 v.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 v.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 v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.app_id))throw v.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 v.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 v.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 v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED","\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw v.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 v.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 v.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 v.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 v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${s}`)}resolveToolNameConflict(e){let t=O.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 v.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=O.getCozePlatformConfig();if(!e||!e.token)throw v.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),!O.validateCustomMCPTools([e]))throw v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw v.validationError("TOOL_VALIDATION_FAILED","HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw v.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw v.validationError("TOOL_VALIDATION_FAILED","Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw v.configError("INVALID_CONFIG","\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw v.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw v.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 v.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 v.validationError("TOOL_VALIDATION_FAILED","Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw v.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw v.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 v.validationError("TOOL_VALIDATION_FAILED",`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw v.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 v.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw v.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw v.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=O.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=O.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),O.setToolEnabled(t,r,!0,s);let a=O.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),O.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=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=!O.isToolEnabled(t,r);return O.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(!O.getMcpServers()[t])return e.fail("SERVICE_NOT_FOUND",`MCP \u670D\u52A1 "${t}" \u4E0D\u5B58\u5728`,void 0,404);let o=O.getServerToolsConfig(t),a=Object.entries(o).map(([p,f])=>{let d={toolName:p,enabled:f.enable!==!1,description:f.description||""};return r&&(d.usageCount=f.usageCount,d.lastUsedTime=f.lastUsedTime),d}),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=O.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,f])=>{let d={toolName:p,enabled:f.enable!==!1,description:f.description||""};return t&&(d.usageCount=f.usageCount,d.lastUsedTime=f.lastUsedTime),d}),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 v.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw v.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e))throw v.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 v.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(!O.getMcpServers()[e])throw v.validationError("SERVER_NOT_FOUND",`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!O.getServerToolsConfig(e)[t])throw v.validationError("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}};import{z as tt}from"zod";var Up=tt.object({limit:tt.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=wo.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${wo.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:tt.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:tt.string().optional(),serverName:tt.string().optional(),success:tt.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:tt.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:tt.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"]}),hn=class extends B{static{i(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new nn}parseAndValidateQueryParams(e){let t=e.req.query(),r=Up.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)}}};import{exec as km,spawn as Fm}from"child_process";import{promisify as Hm}from"util";var vs=tp(Ll(),1);var $l=Hm(km),_t=class{static{i(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||N()}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=Fm("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 f=`\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:f,duration:p,timestamp:Date.now()}),c(new Error(f))}})})}async getCurrentVersion(){let{stdout:e}=await $l("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 $l("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),s=JSON.parse(t).filter(o=>o&&typeof o=="string"&&vs.default.valid(o));return e!=="all"&&(s=s.filter(o=>{let a=vs.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)=>vs.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=vs.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"}}}};import{z as Dl}from"zod";var Um=Dl.object({version:Dl.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),In=class extends B{static{i(this,"UpdateApiHandler")}npmManager;eventBus=N();activeInstalls=new Map;constructor(){super(),this.npmManager=new _t(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=Um.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 ai}from"@xiaozhi-client/version";var Mn=class extends B{static{i(this,"VersionApiHandler")}async getVersion(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=ai.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=ai.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"),ai.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 _t().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 _t().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 Vm from"fs";import{configManager as jm}from"@xiaozhi-client/config";import{TTS as Bm}from"@xiaozhi-client/tts";var ys=class extends B{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=jm.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 f=new Bm({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 d=await f.synthesize(t.text);return Vm.writeFileSync("audio.wav",Buffer.from(d)),e.get("logger").info(`\u8BED\u97F3\u5408\u6210\u6210\u529F: audioSize=${d.length} bytes`),new Response(Buffer.from(d),{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=Lo,r=$a(),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 Ts=class extends B{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 ci=i(async(n,e)=>{n.set("logger",u),n.logger=u,await e()},"loggerMiddleware");import{cors as Wm}from"hono/cors";var li=Wm({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]});var ui=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"),pi=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 di=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 er=class extends Error{static{i(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},_s=class extends Error{static{i(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}};var fi=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 _s("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 er)n.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof _s?(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 mi=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 qm}from"@xiaozhi-client/config";var gi=i(()=>{let n=null,e;return async(t,r)=>{let s=t.get("endpointManager");s!==e&&(e=s,s?n=new ts(s,qm):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware");var xn=class{static{i(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=u,this.eventBus=N()}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 Gm}from"@xiaozhi-client/config";var On=class{static{i(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=u,this.eventBus=N(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=Gm.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 Nn=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")}};import{randomBytes as Km}from"crypto";function kl(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}i(kl,"encodeBinaryProtocol2");function Fl(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}}i(Fl,"parseBinaryProtocol2");function Hl(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)}i(Hl,"isBinaryProtocol2");function Ul(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)}i(Ul,"isBinaryProtocol3");function Vl(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}}i(Vl,"parseBinaryProtocol3");function jl(n,e){let t=Xm(n,e),r=Jm(n,e);return{boardType:t,appVersion:r}}i(jl,"extractDeviceInfo");function Xm(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}i(Xm,"extractBoardType");function Jm(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}i(Jm,"extractAppVersion");function tr(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=>tr(r,e));let t={};for(let r of Object.keys(n)){let s=r.replace(/([A-Z])/g,"_$1").toLowerCase();t[s]=tr(n[r],e)}return t}i(tr,"camelToSnakeCase");var Ln=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=Km(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&&!Ym(e)){if(Hl(e)){let s=Fl(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(Ul(e)){let s=Vl(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=tr(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=kl(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}};function Ym(n){try{let e=n.toString("utf-8");return Buffer.from(e,"utf-8").equals(n)?!e.includes("\uFFFD"):!1}catch{return!1}}i(Ym,"isValidUTF8");import{ASR as Qm,AudioFormat as Zm,AuthMethod as eg,OpusDecoder as tg}from"@xiaozhi-client/asr";import{configManager as rg}from"@xiaozhi-client/config";var $n=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=rg.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 Qm({bytedance:{v2:{app:{appid:t.appid,token:t.accessToken,cluster:t.cluster||"volcengine_streaming_common"},user:{uid:`device_${e}`},audio:{format:Zm.RAW,language:"zh-CN"},request:{reqid:`req_${e}_${Date.now()}`,sequence:1}}},authMethod:eg.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 tg.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{configManager as po}from"@xiaozhi-client/config";function b(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}i(b,"__classPrivateFieldSet");function g(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)}i(g,"__classPrivateFieldGet");var hi=i(function(){let{crypto:n}=globalThis;if(n?.randomUUID)return hi=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 Rs(n){return typeof n=="object"&&n!==null&&("name"in n&&n.name==="AbortError"||"message"in n&&String(n.message).includes("FetchRequestCanceledException"))}i(Rs,"isAbortError");var Ps=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 y=class extends Error{static{i(this,"OpenAIError")}},q=class n extends y{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 rt({message:r,cause:Ps(t)});let o=t?.error;return e===400?new rr(e,o,r,s):e===401?new sr(e,o,r,s):e===403?new nr(e,o,r,s):e===404?new or(e,o,r,s):e===409?new ir(e,o,r,s):e===422?new ar(e,o,r,s):e===429?new cr(e,o,r,s):e>=500?new lr(e,o,r,s):new n(e,o,r,s)}},z=class extends q{static{i(this,"APIUserAbortError")}constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},rt=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 rt{static{i(this,"APIConnectionTimeoutError")}constructor({message:e}={}){super({message:e??"Request timed out."})}},rr=class extends q{static{i(this,"BadRequestError")}},sr=class extends q{static{i(this,"AuthenticationError")}},nr=class extends q{static{i(this,"PermissionDeniedError")}},or=class extends q{static{i(this,"NotFoundError")}},ir=class extends q{static{i(this,"ConflictError")}},ar=class extends q{static{i(this,"UnprocessableEntityError")}},cr=class extends q{static{i(this,"RateLimitError")}},lr=class extends q{static{i(this,"InternalServerError")}},ur=class extends y{static{i(this,"LengthFinishReasonError")}constructor(){super("Could not parse response content as the length limit was reached")}},pr=class extends y{static{i(this,"ContentFilterFinishReasonError")}constructor(){super("Could not parse response content as the request was rejected by the content filter")}},Me=class extends Error{static{i(this,"InvalidWebhookSignatureError")}constructor(e){super(e)}};var ng=/^[a-z][a-z0-9+.-]*:/i,Bl=i(n=>ng.test(n),"isAbsoluteURL"),se=i(n=>(se=Array.isArray,se(n)),"isArray"),Ei=se;function Ci(n){return typeof n!="object"?{}:n??{}}i(Ci,"maybeObj");function zl(n){if(!n)return!0;for(let e in n)return!1;return!0}i(zl,"isEmptyObj");function Wl(n,e){return Object.prototype.hasOwnProperty.call(n,e)}i(Wl,"hasOwn");function As(n){return n!=null&&typeof n=="object"&&!Array.isArray(n)}i(As,"isObj");var ql=i((n,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new y(`${n} must be an integer`);if(e<0)throw new y(`${n} must be a positive integer`);return e},"validatePositiveInteger");var Gl=i(n=>{try{return JSON.parse(n)}catch{return}},"safeJSON");var xe=i(n=>new Promise(e=>setTimeout(e,n)),"sleep");var nt="6.24.0";var Yl=i(()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u","isRunningInBrowser");function og(){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"}i(og,"getDetectedPlatform");var ig=i(()=>{let n=og();if(n==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":nt,"X-Stainless-OS":Jl(Deno.build.os),"X-Stainless-Arch":Xl(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":nt,"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":nt,"X-Stainless-OS":Jl(globalThis.process.platform??"unknown"),"X-Stainless-Arch":Xl(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=ag();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":nt,"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":nt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}},"getPlatformProperties");function ag(){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}i(ag,"getBrowserInfo");var Xl=i(n=>n==="x32"?"x32":n==="x86_64"||n==="x64"?"x64":n==="arm"?"arm":n==="aarch64"||n==="arm64"?"arm64":n?`other:${n}`:"unknown","normalizeArch"),Jl=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"),Kl,Ql=i(()=>Kl??(Kl=ig()),"getPlatformHeaders");function Zl(){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`")}i(Zl,"getDefaultFetch");function Si(...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)}i(Si,"makeReadableStream");function Dn(n){let e=Symbol.asyncIterator in n?n[Symbol.asyncIterator]():n[Symbol.iterator]();return Si({start(){},async pull(t){let{done:r,value:s}=await e.next();r?t.close():t.enqueue(s)},async cancel(){await e.return?.()}})}i(Dn,"ReadableStreamFrom");function vi(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}}}i(vi,"ReadableStreamToAsyncIterable");async function eu(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}i(eu,"CancelReadableStream");var tu=i(({headers:n,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)}),"FallbackEncoder");var kn="RFC3986",yi=i(n=>String(n),"default_formatter"),Fn={RFC1738:i(n=>String(n).replace(/%20/g,"+"),"RFC1738"),RFC3986:yi},Ti="RFC1738";var Hn=i((n,e)=>(Hn=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),Hn(n,e)),"has"),Oe=(()=>{let n=[];for(let e=0;e<256;++e)n.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return n})();var _i=1024,ru=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+=_i){let l=o.length>=_i?o.slice(c,c+_i):o,p=[];for(let f=0;f<l.length;++f){let d=l.charCodeAt(f);if(d===45||d===46||d===95||d===126||d>=48&&d<=57||d>=65&&d<=90||d>=97&&d<=122||s===Ti&&(d===40||d===41)){p[p.length]=l.charAt(f);continue}if(d<128){p[p.length]=Oe[d];continue}if(d<2048){p[p.length]=Oe[192|d>>6]+Oe[128|d&63];continue}if(d<55296||d>=57344){p[p.length]=Oe[224|d>>12]+Oe[128|d>>6&63]+Oe[128|d&63];continue}f+=1,d=65536+((d&1023)<<10|l.charCodeAt(f)&1023),p[p.length]=Oe[240|d>>18]+Oe[128|d>>12&63]+Oe[128|d>>6&63]+Oe[128|d&63]}a+=p.join("")}return a},"encode");function su(n){return!n||typeof n!="object"?!1:!!(n.constructor&&n.constructor.isBuffer&&n.constructor.isBuffer(n))}i(su,"is_buffer");function Ri(n,e){if(se(n)){let t=[];for(let r=0;r<n.length;r+=1)t.push(e(n[r]));return t}return e(n)}i(Ri,"maybe_map");var ou={brackets(n){return String(n)+"[]"},comma:"comma",indices(n,e){return String(n)+"["+e+"]"},repeat(n){return String(n)}},iu=i(function(n,e){Array.prototype.push.apply(n,se(e)?e:[e])},"push_to_array"),nu,G={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:ru,encodeValuesOnly:!1,format:kn,formatter:yi,indices:!1,serializeDate(n){return(nu??(nu=Function.prototype.call.bind(Date.prototype.toISOString)))(n)},skipNulls:!1,strictNullHandling:!1};function ug(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"||typeof n=="symbol"||typeof n=="bigint"}i(ug,"is_non_nullish_primitive");var Pi={};function au(n,e,t,r,s,o,a,c,l,p,f,d,C,m,R,A,$,L){let P=n,V=L,F=0,ue=!1;for(;(V=V.get(Pi))!==void 0&&!ue;){let j=V.get(n);if(F+=1,typeof j<"u"){if(j===F)throw new RangeError("Cyclic object value");ue=!0}typeof V.get(Pi)>"u"&&(F=0)}if(typeof p=="function"?P=p(e,P):P instanceof Date?P=C?.(P):t==="comma"&&se(P)&&(P=Ri(P,function(j){return j instanceof Date?C?.(j):j})),P===null){if(o)return l&&!A?l(e,G.encoder,$,"key",m):e;P=""}if(ug(P)||su(P)){if(l){let j=A?e:l(e,G.encoder,$,"key",m);return[R?.(j)+"="+R?.(l(P,G.encoder,$,"value",m))]}return[R?.(e)+"="+R?.(String(P))]}let ne=[];if(typeof P>"u")return ne;let H;if(t==="comma"&&se(P))A&&l&&(P=Ri(P,l)),H=[{value:P.length>0?P.join(",")||null:void 0}];else if(se(p))H=p;else{let j=Object.keys(P);H=f?j.sort(f):j}let J=c?String(e).replace(/\./g,"%2E"):String(e),K=r&&se(P)&&P.length===1?J+"[]":J;if(s&&se(P)&&P.length===0)return K+"[]";for(let j=0;j<H.length;++j){let W=H[j],Ea=typeof W=="object"&&typeof W.value<"u"?W.value:P[W];if(a&&Ea===null)continue;let Co=d&&c?W.replace(/\./g,"%2E"):W,Xu=se(P)?typeof t=="function"?t(K,Co):K:K+(d?"."+Co:"["+Co+"]");L.set(n,F);let Ca=new WeakMap;Ca.set(Pi,L),iu(ne,au(Ea,Xu,t,r,s,o,a,c,t==="comma"&&A&&se(P)?null:l,p,f,d,C,m,R,A,$,Ca))}return ne}i(au,"inner_stringify");function pg(n=G){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||G.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=kn;if(typeof n.format<"u"){if(!Hn(Fn,n.format))throw new TypeError("Unknown format option provided.");t=n.format}let r=Fn[t],s=G.filter;(typeof n.filter=="function"||se(n.filter))&&(s=n.filter);let o;if(n.arrayFormat&&n.arrayFormat in ou?o=n.arrayFormat:"indices"in n?o=n.indices?"indices":"repeat":o=G.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:G.allowDots:!!n.allowDots;return{addQueryPrefix:typeof n.addQueryPrefix=="boolean"?n.addQueryPrefix:G.addQueryPrefix,allowDots:a,allowEmptyArrays:typeof n.allowEmptyArrays=="boolean"?!!n.allowEmptyArrays:G.allowEmptyArrays,arrayFormat:o,charset:e,charsetSentinel:typeof n.charsetSentinel=="boolean"?n.charsetSentinel:G.charsetSentinel,commaRoundTrip:!!n.commaRoundTrip,delimiter:typeof n.delimiter>"u"?G.delimiter:n.delimiter,encode:typeof n.encode=="boolean"?n.encode:G.encode,encodeDotInKeys:typeof n.encodeDotInKeys=="boolean"?n.encodeDotInKeys:G.encodeDotInKeys,encoder:typeof n.encoder=="function"?n.encoder:G.encoder,encodeValuesOnly:typeof n.encodeValuesOnly=="boolean"?n.encodeValuesOnly:G.encodeValuesOnly,filter:s,format:t,formatter:r,serializeDate:typeof n.serializeDate=="function"?n.serializeDate:G.serializeDate,skipNulls:typeof n.skipNulls=="boolean"?n.skipNulls:G.skipNulls,sort:typeof n.sort=="function"?n.sort:null,strictNullHandling:typeof n.strictNullHandling=="boolean"?n.strictNullHandling:G.strictNullHandling}}i(pg,"normalize_stringify_options");function Ai(n,e={}){let t=n,r=pg(e),s,o;typeof r.filter=="function"?(o=r.filter,t=o("",t)):se(r.filter)&&(o=r.filter,s=o);let a=[];if(typeof t!="object"||t===null)return"";let c=ou[r.arrayFormat],l=c==="comma"&&r.commaRoundTrip;s||(s=Object.keys(t)),r.sort&&s.sort(r.sort);let p=new WeakMap;for(let C=0;C<s.length;++C){let m=s[C];r.skipNulls&&t[m]===null||iu(a,au(t[m],m,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 f=a.join(r.delimiter),d=r.addQueryPrefix===!0?"?":"";return r.charsetSentinel&&(r.charset==="iso-8859-1"?d+="utf8=%26%2310003%3B&":d+="utf8=%E2%9C%93&"),f.length>0?d+f:""}i(Ai,"stringify");function uu(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}i(uu,"concatBytes");var cu;function dr(n){let e;return(cu??(e=new globalThis.TextEncoder,cu=e.encode.bind(e)))(n)}i(dr,"encodeUTF8");var lu;function bi(n){let e;return(lu??(e=new globalThis.TextDecoder,lu=e.decode.bind(e)))(n)}i(bi,"decodeUTF8");var de,fe,Rt=class{static{i(this,"LineDecoder")}constructor(){de.set(this,void 0),fe.set(this,void 0),b(this,de,new Uint8Array,"f"),b(this,fe,null,"f")}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?dr(e):e;b(this,de,uu([g(this,de,"f"),t]),"f");let r=[],s;for(;(s=fg(g(this,de,"f"),g(this,fe,"f")))!=null;){if(s.carriage&&g(this,fe,"f")==null){b(this,fe,s.index,"f");continue}if(g(this,fe,"f")!=null&&(s.index!==g(this,fe,"f")+1||s.carriage)){r.push(bi(g(this,de,"f").subarray(0,g(this,fe,"f")-1))),b(this,de,g(this,de,"f").subarray(g(this,fe,"f")),"f"),b(this,fe,null,"f");continue}let o=g(this,fe,"f")!==null?s.preceding-1:s.preceding,a=bi(g(this,de,"f").subarray(0,o));r.push(a),b(this,de,g(this,de,"f").subarray(s.index),"f"),b(this,fe,null,"f")}return r}flush(){return g(this,de,"f").length?this.decode(`
85
+ `):[]}};de=new WeakMap,fe=new WeakMap;Rt.NEWLINE_CHARS=new Set([`
86
+ `,"\r"]);Rt.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function fg(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}i(fg,"findNewlineIndex");function pu(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}i(pu,"findDoubleNewlineIndex");var Vn={off:0,error:200,warn:300,info:400,debug:500},wi=i((n,e,t)=>{if(n){if(Wl(Vn,n))return n;U(t).warn(`${e} was set to ${JSON.stringify(n)}, expected one of ${JSON.stringify(Object.keys(Vn))}`)}},"parseLogLevel");function bs(){}i(bs,"noop");function Un(n,e,t){return!e||Vn[n]>Vn[t]?bs:e[n].bind(e)}i(Un,"makeLogFn");var mg={error:bs,warn:bs,info:bs,debug:bs},du=new WeakMap;function U(n){let e=n.logger,t=n.logLevel??"off";if(!e)return mg;let r=du.get(e);if(r&&r[0]===t)return r[1];let s={error:Un("error",e,t),warn:Un("warn",e,t),info:Un("info",e,t),debug:Un("debug",e,t)};return du.set(e,[t,s]),s}i(U,"loggerFor");var ke=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");var ws,Ne=class n{static{i(this,"Stream")}constructor(e,t,r){this.iterator=e,ws.set(this,void 0),this.controller=t,b(this,ws,r,"f")}static fromSSEResponse(e,t,r){let s=!1,o=r?U(r):console;async function*a(){if(s)throw new y("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let c=!1;try{for await(let l of gg(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(f){throw o.error("Could not parse message into JSON:",l.data),o.error("From chunk:",l.raw),f}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(f){throw f}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(Rs(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 Rt,l=vi(e);for await(let p of l)for(let f of c.decode(p))yield f;for(let p of c.flush())yield p}i(o,"iterLines");async function*a(){if(s)throw new y("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(Rs(l))return;throw l}finally{c||t.abort()}}return i(a,"iterator"),new n(a,t,r)}[(ws=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,g(this,ws,"f")),new n(()=>s(t),this.controller,g(this,ws,"f"))]}toReadableStream(){let e=this,t;return Si({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=dr(JSON.stringify(s)+`
87
+ `);r.enqueue(a)}catch(s){r.error(s)}},async cancel(){await t.return?.()}})}};async function*gg(n,e){if(!n.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new y("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 y("Attempted to iterate over a response with no body");let t=new Ii,r=new Rt,s=vi(n.body);for await(let o of hg(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)}}i(gg,"_iterSSEMessages");async function*hg(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"?dr(t):t,s=new Uint8Array(e.length+r.length);s.set(e),s.set(r,e.length),e=s;let o;for(;(o=pu(e))!==-1;)yield e.slice(0,o),e=e.slice(o)}e.length>0&&(yield e)}i(hg,"iterSSEChunks");var Ii=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(`
88
+ `),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]=Eg(e,":");return s.startsWith(" ")&&(s=s.substring(1)),t==="event"?this.event=s:t==="data"&&this.data.push(s),null}};function Eg(n,e){let t=n.indexOf(e);return t!==-1?[n.substring(0,t),e,n.substring(t+e.length)]:[n,"",""]}i(Eg,"partition");async function jn(n,e){let{response:t,requestLogID:r,retryOfRequestLogID:s,startTime:o}=e,a=await(async()=>{if(e.options.stream)return U(n).debug("response",t.status,t.url,t.headers,t.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(t,e.controller,n):Ne.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 C=await t.json();return Mi(C,t)}return await t.text()})();return U(n).debug(`[${r}] response parsed`,ke({retryOfRequestLogID:s,url:t.url,status:t.status,body:a,durationMs:Date.now()-o})),a}i(jn,"defaultParseResponse");function Mi(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})}i(Mi,"addRequestID");var Is,Pt=class n extends Promise{static{i(this,"APIPromise")}constructor(e,t,r=jn){super(s=>{s(null)}),this.responsePromise=t,this.parseResponse=r,Is.set(this,void 0),b(this,Is,e,"f")}_thenUnwrap(e){return new n(g(this,Is,"f"),this.responsePromise,async(t,r)=>Mi(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(g(this,Is,"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)}};Is=new WeakMap;var Bn,Ms=class{static{i(this,"AbstractPage")}constructor(e,t,r,s){Bn.set(this,void 0),b(this,Bn,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 y("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await g(this,Bn,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(Bn=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},xs=class extends Pt{static{i(this,"PagePromise")}constructor(e,t,r){super(e,t,async(s,o)=>new r(s,o.response,await jn(s,o),o.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},Le=class extends Ms{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}},M=class extends Ms{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:{...Ci(this.options.query),after:t}}:null}},Fe=class extends Ms{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:{...Ci(this.options.query),after:e}}:null}};var Ni=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");function fr(n,e,t){return Ni(),new File(n,e??"unknown_file",t)}i(fr,"makeFile");function Os(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}i(Os,"getName");var zn=i(n=>n!=null&&typeof n=="object"&&typeof n[Symbol.asyncIterator]=="function","isAsyncIterable"),He=i(async(n,e)=>xi(n.body)?{...n,body:await mu(n.body,e)}:n,"maybeMultipartFormRequestOptions"),_e=i(async(n,e)=>({...n,body:await mu(n.body,e)}),"multipartFormRequestOptions"),fu=new WeakMap;function Sg(n){let e=typeof n=="function"?n:n.fetch,t=fu.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 fu.set(e,r),r}i(Sg,"supportsFormData");var mu=i(async(n,e)=>{if(!await Sg(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])=>Oi(t,r,s))),t},"createForm"),gu=i(n=>n instanceof Blob&&"name"in n,"isNamedBlob"),vg=i(n=>typeof n=="object"&&n!==null&&(n instanceof Response||zn(n)||gu(n)),"isUploadable"),xi=i(n=>{if(vg(n))return!0;if(Array.isArray(n))return n.some(xi);if(n&&typeof n=="object"){for(let e in n)if(xi(n[e]))return!0}return!1},"hasUploadableValue"),Oi=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,fr([await t.blob()],Os(t)));else if(zn(t))n.append(e,fr([await new Response(Dn(t)).blob()],Os(t)));else if(gu(t))n.append(e,t,Os(t));else if(Array.isArray(t))await Promise.all(t.map(r=>Oi(n,e+"[]",r)));else if(typeof t=="object")await Promise.all(Object.entries(t).map(([r,s])=>Oi(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");var hu=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"),yg=i(n=>n!=null&&typeof n=="object"&&typeof n.name=="string"&&typeof n.lastModified=="number"&&hu(n),"isFileLike"),Tg=i(n=>n!=null&&typeof n=="object"&&typeof n.url=="string"&&typeof n.blob=="function","isResponseLike");async function Wn(n,e,t){if(Ni(),n=await n,yg(n))return n instanceof File?n:fr([await n.arrayBuffer()],n.name);if(Tg(n)){let s=await n.blob();return e||(e=new URL(n.url).pathname.split(/[\\/]/).pop()),fr(await Li(s),e,t)}let r=await Li(n);if(e||(e=Os(n)),!t?.type){let s=r.find(o=>typeof o=="object"&&"type"in o&&o.type);typeof s=="string"&&(t={...t,type:s})}return fr(r,e,t)}i(Wn,"toFile");async function Li(n){let e=[];if(typeof n=="string"||ArrayBuffer.isView(n)||n instanceof ArrayBuffer)e.push(n);else if(hu(n))e.push(n instanceof Blob?n:await n.arrayBuffer());else if(zn(n))for await(let t of n)e.push(...await Li(t));else{let t=n?.constructor?.name;throw new Error(`Unexpected data type: ${typeof n}${t?`; constructor: ${t}`:""}${_g(n)}`)}return e}i(Li,"getBytes");function _g(n){return typeof n!="object"||n===null?"":`; props: [${Object.getOwnPropertyNames(n).map(t=>`"${t}"`).join(", ")}]`}i(_g,"propsForError");var E=class{static{i(this,"APIResource")}constructor(e){this._client=e}};function Cu(n){return n.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}i(Cu,"encodeURIPath");var Eu=Object.freeze(Object.create(null)),Pg=i((n=Cu)=>i(function(t,...r){if(t.length===1)return t[0];let s=!1,o=[],a=t.reduce((f,d,C)=>{/[?#]/.test(d)&&(s=!0);let m=r[C],R=(s?encodeURIComponent:n)(""+m);return C!==r.length&&(m==null||typeof m=="object"&&m.toString===Object.getPrototypeOf(Object.getPrototypeOf(m.hasOwnProperty??Eu)??Eu)?.toString)&&(R=m+"",o.push({start:f.length+d.length,length:R.length,error:`Value of type ${Object.prototype.toString.call(m).slice(8,-1)} is not a valid path parameter`})),f+d+(C===r.length?"":R)},""),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((f,d)=>f.start-d.start),o.length>0){let f=0,d=o.reduce((C,m)=>{let R=" ".repeat(m.start-f),A="^".repeat(m.length);return f=m.start+m.length,C+R+A},"");throw new y(`Path parameters result in path with invalid segments:
89
+ ${o.map(C=>C.error).join(`
90
90
  `)}
91
91
  ${a}
92
- ${d}`)}return a},"path"),"createPathTagFunction"),g=ih(eu);var Pt=class extends C{static{i(this,"Messages")}list(e,t={},r){return this._client.getAPIList(g`/chat/completions/${e}/messages`,M,{query:t,...r})}};function Os(n){return n!==void 0&&"function"in n&&n.function!==void 0}i(Os,"isChatCompletionFunctionTool");function Ns(n){return n?.$brand==="auto-parseable-response-format"}i(Ns,"isAutoParsableResponseFormat");function At(n){return n?.$brand==="auto-parseable-tool"}i(At,"isAutoParsableTool");function tu(n,e){return!e||!Ai(e)?{...n,choices:n.choices.map(t=>(su(t.message.tool_calls),{...t,message:{...t.message,parsed:null,...t.message.tool_calls?{tool_calls:t.message.tool_calls}:void 0}}))}:Ls(n,e)}i(tu,"maybeParseChatCompletion");function Ls(n,e){let t=n.choices.map(r=>{if(r.finish_reason==="length")throw new ur;if(r.finish_reason==="content_filter")throw new pr;return su(r.message.tool_calls),{...r,message:{...r.message,...r.message.tool_calls?{tool_calls:r.message.tool_calls?.map(s=>uh(e,s))??void 0}:void 0,parsed:r.message.content&&!r.message.refusal?lh(e,r.message.content):null}}});return{...n,choices:t}}i(Ls,"parseChatCompletion");function lh(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}i(lh,"parseResponseFormat");function uh(n,e){let t=n.tools?.find(r=>Os(r)&&r.function?.name===e.function.name);return{...e,function:{...e.function,parsed_arguments:At(t)?t.$parseRaw(e.function.arguments):t?.function.strict?JSON.parse(e.function.arguments):null}}}i(uh,"parseToolCall");function ru(n,e){if(!n||!("tools"in n)||!n.tools)return!1;let t=n.tools?.find(r=>Os(r)&&r.function?.name===e.function.name);return Os(t)&&(At(t)||t?.function.strict||!1)}i(ru,"shouldParseToolCall");function Ai(n){return Ns(n.response_format)?!0:n.tools?.some(e=>At(e)||e.type==="function"&&e.function.strict===!0)??!1}i(Ai,"hasAutoParseableInput");function su(n){for(let e of n||[])if(e.type!=="function")throw new y(`Currently only \`function\` tool calls are supported; Received \`${e.type}\``)}i(su,"assertToolCallsAreChatCompletionFunctionToolCalls");function nu(n){for(let e of n??[]){if(e.type!=="function")throw new y(`Currently only \`function\` tool types support auto-parsing; Received \`${e.type}\``);if(e.function.strict!==!0)throw new y(`The \`${e.function.name}\` tool is not marked with \`strict: true\`. Only strict function tools can be auto-parsed`)}}i(nu,"validateInputTools");var mr=i(n=>n?.role==="assistant","isAssistantMessage"),wi=i(n=>n?.role==="tool","isToolMessage");var bi,zn,Wn,$s,Ds,qn,ks,He,Fs,Gn,Xn,hr,ou,ot=class{static{i(this,"EventStream")}constructor(){bi.add(this),this.controller=new AbortController,zn.set(this,void 0),Wn.set(this,()=>{}),$s.set(this,()=>{}),Ds.set(this,void 0),qn.set(this,()=>{}),ks.set(this,()=>{}),He.set(this,{}),Fs.set(this,!1),Gn.set(this,!1),Xn.set(this,!1),hr.set(this,!1),w(this,zn,new Promise((e,t)=>{w(this,Wn,e,"f"),w(this,$s,t,"f")}),"f"),w(this,Ds,new Promise((e,t)=>{w(this,qn,e,"f"),w(this,ks,t,"f")}),"f"),h(this,zn,"f").catch(()=>{}),h(this,Ds,"f").catch(()=>{})}_run(e){setTimeout(()=>{e().then(()=>{this._emitFinal(),this._emit("end")},h(this,bi,"m",ou).bind(this))},0)}_connected(){this.ended||(h(this,Wn,"f").call(this),this._emit("connect"))}get ended(){return h(this,Fs,"f")}get errored(){return h(this,Gn,"f")}get aborted(){return h(this,Xn,"f")}abort(){this.controller.abort()}on(e,t){return(h(this,He,"f")[e]||(h(this,He,"f")[e]=[])).push({listener:t}),this}off(e,t){let r=h(this,He,"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,He,"f")[e]||(h(this,He,"f")[e]=[])).push({listener:t,once:!0}),this}emitted(e){return new Promise((t,r)=>{w(this,hr,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,t)})}async done(){w(this,hr,!0,"f"),await h(this,Ds,"f")}_emit(e,...t){if(h(this,Fs,"f"))return;e==="end"&&(w(this,Fs,!0,"f"),h(this,qn,"f").call(this));let r=h(this,He,"f")[e];if(r&&(h(this,He,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...t))),e==="abort"){let s=t[0];!h(this,hr,"f")&&!r?.length&&Promise.reject(s),h(this,$s,"f").call(this,s),h(this,ks,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=t[0];!h(this,hr,"f")&&!r?.length&&Promise.reject(s),h(this,$s,"f").call(this,s),h(this,ks,"f").call(this,s),this._emit("end")}}_emitFinal(){}};zn=new WeakMap,Wn=new WeakMap,$s=new WeakMap,Ds=new WeakMap,qn=new WeakMap,ks=new WeakMap,He=new WeakMap,Fs=new WeakMap,Gn=new WeakMap,Xn=new WeakMap,hr=new WeakMap,bi=new WeakSet,ou=i(function(e){if(w(this,Gn,!0,"f"),e instanceof Error&&e.name==="AbortError"&&(e=new z),e instanceof z)return w(this,Xn,!0,"f"),this._emit("abort",e);if(e instanceof y)return this._emit("error",e);if(e instanceof Error){let t=new y(e.message);return t.cause=e,this._emit("error",t)}return this._emit("error",new y(String(e)))},"_EventStream_handleError");function iu(n){return typeof n.parse=="function"}i(iu,"isRunnableFunctionWithParse");var ce,Ii,Jn,Mi,xi,Oi,au,cu,ph=10,gr=class extends ot{static{i(this,"AbstractChatCompletionRunner")}constructor(){super(...arguments),ce.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),wi(e)&&e.content)this._emit("functionToolCallResult",e.content);else if(mr(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 y("stream ended without producing a ChatCompletion");return e}async finalContent(){return await this.done(),h(this,ce,"m",Ii).call(this)}async finalMessage(){return await this.done(),h(this,ce,"m",Jn).call(this)}async finalFunctionToolCall(){return await this.done(),h(this,ce,"m",Mi).call(this)}async finalFunctionToolCallResult(){return await this.done(),h(this,ce,"m",xi).call(this)}async totalUsage(){return await this.done(),h(this,ce,"m",Oi).call(this)}allChatCompletions(){return[...this._chatCompletions]}_emitFinal(){let e=this._chatCompletions[this._chatCompletions.length-1];e&&this._emit("finalChatCompletion",e);let t=h(this,ce,"m",Jn).call(this);t&&this._emit("finalMessage",t);let r=h(this,ce,"m",Ii).call(this);r&&this._emit("finalContent",r);let s=h(this,ce,"m",Mi).call(this);s&&this._emit("finalFunctionToolCall",s);let o=h(this,ce,"m",xi).call(this);o!=null&&this._emit("finalFunctionToolCallResult",o),this._chatCompletions.some(a=>a.usage)&&this._emit("totalUsage",h(this,ce,"m",Oi).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,ce,"m",au).call(this,t);let o=await e.chat.completions.create({...t,stream:!1},{...r,signal:this.controller.signal});return this._connected(),this._addChatCompletion(Ls(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=ph}=r||{},f=t.tools.map(m=>{if(At(m)){if(!m.$callback)throw new y("Tool given to `.runTools()` that does not have an associated function");return{type:"function",function:{function:m.$callback,name:m.function.name,description:m.function.description||"",parameters:m.function.parameters,parse:m.$parseRaw,strict:!0}}}return m}),d={};for(let m of f)m.type==="function"&&(d[m.function.name||m.function.function.name]=m.function);let E="tools"in t?f.map(m=>m.type==="function"?{type:"function",function:{name:m.function.name||m.function.function.name,parameters:m.function.parameters,description:m.function.description,strict:m.function.strict}}:m):void 0;for(let m of t.messages)this._addMessage(m,!1);for(let m=0;m<p;++m){let A=(await this._createChatCompletion(e,{...c,tool_choice:o,tools:E,messages:[...this.messages]},r)).choices[0]?.message;if(!A)throw new y("missing message in ChatCompletion response");if(!A.tool_calls?.length)return;for(let $ of A.tool_calls){if($.type!=="function")continue;let L=$.id,{name:P,arguments:V}=$.function,F=d[P];if(F){if(l&&l!==P){let J=`Invalid tool_call: ${JSON.stringify(P)}. ${JSON.stringify(l)} requested. Please try again`;this._addMessage({role:s,tool_call_id:L,content:J});continue}}else{let J=`Invalid tool_call: ${JSON.stringify(P)}. Available options are: ${Object.keys(d).map(K=>JSON.stringify(K)).join(", ")}. Please try again`;this._addMessage({role:s,tool_call_id:L,content:J});continue}let le;try{le=iu(F)?await F.parse(V):V}catch(J){let K=J instanceof Error?J.message:String(J);this._addMessage({role:s,tool_call_id:L,content:K});continue}let ne=await F.function(le,this),H=h(this,ce,"m",cu).call(this,ne);if(this._addMessage({role:s,tool_call_id:L,content:H}),l)return}}}};ce=new WeakSet,Ii=i(function(){return h(this,ce,"m",Jn).call(this).content??null},"_AbstractChatCompletionRunner_getFinalContent"),Jn=i(function(){let e=this.messages.length;for(;e-- >0;){let t=this.messages[e];if(mr(t))return{...t,content:t.content??null,refusal:t.refusal??null}}throw new y("stream ended without producing a ChatCompletionMessage with role=assistant")},"_AbstractChatCompletionRunner_getFinalMessage"),Mi=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(mr(t)&&t?.tool_calls?.length)return t.tool_calls.filter(r=>r.type==="function").at(-1)?.function}},"_AbstractChatCompletionRunner_getFinalFunctionToolCall"),xi=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(wi(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"),Oi=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"),au=i(function(e){if(e.n!=null&&e.n>1)throw new y("ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.")},"_AbstractChatCompletionRunner_validateParams"),cu=i(function(e){return typeof e=="string"?e:e===void 0?"undefined":JSON.stringify(e)},"_AbstractChatCompletionRunner_stringifyFunctionCallResult");var Hs=class n extends gr{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),mr(e)&&e.content&&this._emit("content",e.content)}};var Y={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},Ni=class extends Error{static{i(this,"PartialJSON")}},Li=class extends Error{static{i(this,"MalformedJSON")}};function dh(n,e=Y.ALL){if(typeof n!="string")throw new TypeError(`expecting str, got ${typeof n}`);if(!n.trim())throw new Error(`${n} is empty`);return fh(n.trim(),e)}i(dh,"parseJSON");var fh=i((n,e)=>{let t=n.length,r=0,s=i(E=>{throw new Ni(`${E} at position ${r}`)},"markPartialJSON"),o=i(E=>{throw new Li(`${E} at position ${r}`)},"throwMalformedError"),a=i(()=>(d(),r>=t&&s("Unexpected end of input"),n[r]==='"'?c():n[r]==="{"?l():n[r]==="["?p():n.substring(r,r+4)==="null"||Y.NULL&e&&t-r<4&&"null".startsWith(n.substring(r))?(r+=4,null):n.substring(r,r+4)==="true"||Y.BOOL&e&&t-r<4&&"true".startsWith(n.substring(r))?(r+=4,!0):n.substring(r,r+5)==="false"||Y.BOOL&e&&t-r<5&&"false".startsWith(n.substring(r))?(r+=5,!1):n.substring(r,r+8)==="Infinity"||Y.INFINITY&e&&t-r<8&&"Infinity".startsWith(n.substring(r))?(r+=8,1/0):n.substring(r,r+9)==="-Infinity"||Y.MINUS_INFINITY&e&&1<t-r&&t-r<9&&"-Infinity".startsWith(n.substring(r))?(r+=9,-1/0):n.substring(r,r+3)==="NaN"||Y.NAN&e&&t-r<3&&"NaN".startsWith(n.substring(r))?(r+=3,NaN):f()),"parseAny"),c=i(()=>{let E=r,m=!1;for(r++;r<t&&(n[r]!=='"'||m&&n[r-1]==="\\");)m=n[r]==="\\"?!m:!1,r++;if(n.charAt(r)=='"')try{return JSON.parse(n.substring(E,++r-Number(m)))}catch(R){o(String(R))}else if(Y.STR&e)try{return JSON.parse(n.substring(E,r-Number(m))+'"')}catch{return JSON.parse(n.substring(E,n.lastIndexOf("\\"))+'"')}s("Unterminated string literal")},"parseStr"),l=i(()=>{r++,d();let E={};try{for(;n[r]!=="}";){if(d(),r>=t&&Y.OBJ&e)return E;let m=c();d(),r++;try{let R=a();Object.defineProperty(E,m,{value:R,writable:!0,enumerable:!0,configurable:!0})}catch(R){if(Y.OBJ&e)return E;throw R}d(),n[r]===","&&r++}}catch{if(Y.OBJ&e)return E;s("Expected '}' at end of object")}return r++,E},"parseObj"),p=i(()=>{r++;let E=[];try{for(;n[r]!=="]";)E.push(a()),d(),n[r]===","&&r++}catch{if(Y.ARR&e)return E;s("Expected ']' at end of array")}return r++,E},"parseArr"),f=i(()=>{if(r===0){n==="-"&&Y.NUM&e&&s("Not sure what '-' is");try{return JSON.parse(n)}catch(m){if(Y.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(m))}}let E=r;for(n[r]==="-"&&r++;n[r]&&!",]}".includes(n[r]);)r++;r==t&&!(Y.NUM&e)&&s("Unterminated number literal");try{return JSON.parse(n.substring(E,r))}catch{n.substring(E,r)==="-"&&Y.NUM&e&&s("Not sure what '-' is");try{return JSON.parse(n.substring(E,n.lastIndexOf("e")))}catch(R){o(String(R))}}},"parseNum"),d=i(()=>{for(;r<t&&`
93
- \r `.includes(n[r]);)r++},"skipBlank");return a()},"_parseJSON"),$i=i(n=>dh(n,Y.ALL^Y.NUM),"partialParse");var X,Ue,Cr,it,Di,Kn,ki,Fi,Hi,Yn,Ui,lu,wt=class n extends gr{static{i(this,"ChatCompletionStream")}constructor(e){super(),X.add(this),Ue.set(this,void 0),Cr.set(this,void 0),it.set(this,void 0),w(this,Ue,e,"f"),w(this,Cr,[],"f")}get currentChatCompletionSnapshot(){return h(this,it,"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,X,"m",Di).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,X,"m",ki).call(this,a);if(o.controller.signal?.aborted)throw new z;return this._addChatCompletion(h(this,X,"m",Yn).call(this))}async _fromReadableStream(e,t){let r=t?.signal;r&&(r.aborted&&this.controller.abort(),r.addEventListener("abort",()=>this.controller.abort())),h(this,X,"m",Di).call(this),this._connected();let s=Oe.fromReadableStream(e,this.controller),o;for await(let a of s)o&&o!==a.id&&this._addChatCompletion(h(this,X,"m",Yn).call(this)),h(this,X,"m",ki).call(this,a),o=a.id;if(s.controller.signal?.aborted)throw new z;return this._addChatCompletion(h(this,X,"m",Yn).call(this))}[(Ue=new WeakMap,Cr=new WeakMap,it=new WeakMap,X=new WeakSet,Di=i(function(){this.ended||w(this,it,void 0,"f")},"_ChatCompletionStream_beginRequest"),Kn=i(function(t){let r=h(this,Cr,"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,Cr,"f")[t.index]=r,r)},"_ChatCompletionStream_getChoiceEventState"),ki=i(function(t){if(this.ended)return;let r=h(this,X,"m",lu).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,X,"m",Kn).call(this,o);o.finish_reason&&(h(this,X,"m",Hi).call(this,o),a.current_tool_call_index!=null&&h(this,X,"m",Fi).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,X,"m",Hi).call(this,o),a.current_tool_call_index!=null&&h(this,X,"m",Fi).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"),Fi=i(function(t,r){if(h(this,X,"m",Kn).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,Ue,"f")?.tools?.find(c=>Os(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:At(a)?a.$parseRaw(o.function.arguments):a?.function.strict?JSON.parse(o.function.arguments):null})}else o.type},"_ChatCompletionStream_emitToolCallDoneEvent"),Hi=i(function(t){let r=h(this,X,"m",Kn).call(this,t);if(t.message.content&&!r.content_done){r.content_done=!0;let s=h(this,X,"m",Ui).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"),Yn=i(function(){if(this.ended)throw new y("stream has ended, this shouldn't happen");let t=h(this,it,"f");if(!t)throw new y("request ended without sending any chunks");return w(this,it,void 0,"f"),w(this,Cr,[],"f"),mh(t,h(this,Ue,"f"))},"_ChatCompletionStream_endRequest"),Ui=i(function(){let t=h(this,Ue,"f")?.response_format;return Ns(t)?t:null},"_ChatCompletionStream_getAutoParseableResponseFormat"),lu=i(function(t){var r,s,o,a;let c=h(this,it,"f"),{choices:l,...p}=t;c?Object.assign(c,p):c=w(this,it,{...p,choices:[]},"f");for(let{delta:f,finish_reason:d,index:E,logprobs:m=null,...R}of t.choices){let A=c.choices[E];if(A||(A=c.choices[E]={finish_reason:d,index:E,message:{},logprobs:m,...R}),m)if(!A.logprobs)A.logprobs=Object.assign({},m);else{let{content:ne,refusal:H,...J}=m;Object.assign(A.logprobs,J),ne&&((r=A.logprobs).content??(r.content=[]),A.logprobs.content.push(...ne)),H&&((s=A.logprobs).refusal??(s.refusal=[]),A.logprobs.refusal.push(...H))}if(d&&(A.finish_reason=d,h(this,Ue,"f")&&Ai(h(this,Ue,"f")))){if(d==="length")throw new ur;if(d==="content_filter")throw new pr}if(Object.assign(A,R),!f)continue;let{content:$,refusal:L,function_call:P,role:V,tool_calls:F,...le}=f;if(Object.assign(A.message,le),L&&(A.message.refusal=(A.message.refusal||"")+L),V&&(A.message.role=V),P&&(A.message.function_call?(P.name&&(A.message.function_call.name=P.name),P.arguments&&((o=A.message.function_call).arguments??(o.arguments=""),A.message.function_call.arguments+=P.arguments)):A.message.function_call=P),$&&(A.message.content=(A.message.content||"")+$,!A.message.refusal&&h(this,X,"m",Ui).call(this)&&(A.message.parsed=$i(A.message.content))),F){A.message.tool_calls||(A.message.tool_calls=[]);for(let{index:ne,id:H,type:J,function:K,...B}of F){let W=(a=A.message.tool_calls)[ne]??(a[ne]={});Object.assign(W,B),H&&(W.id=H),J&&(W.type=J),K&&(W.function??(W.function={name:K.name??"",arguments:""})),K?.name&&(W.function.name=K.name),K?.arguments&&(W.function.arguments+=K.arguments,ru(h(this,Ue,"f"),W)&&(W.function.parsed_arguments=$i(W.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 Oe(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}};function mh(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:f,index:d,logprobs:E,...m})=>{if(!f)throw new y(`missing finish_reason for choice ${d}`);let{content:R=null,function_call:A,tool_calls:$,...L}=p,P=p.role;if(!P)throw new y(`missing role for choice ${d}`);if(A){let{arguments:V,name:F}=A;if(V==null)throw new y(`missing function_call.arguments for choice ${d}`);if(!F)throw new y(`missing function_call.name for choice ${d}`);return{...m,message:{content:R,function_call:{arguments:V,name:F},role:P,refusal:p.refusal??null},finish_reason:f,index:d,logprobs:E}}return $?{...m,index:d,finish_reason:f,logprobs:E,message:{...L,role:P,content:R,refusal:p.refusal??null,tool_calls:$.map((V,F)=>{let{function:le,type:ne,id:H,...J}=V,{arguments:K,name:B,...W}=le||{};if(H==null)throw new y(`missing choices[${d}].tool_calls[${F}].id
94
- ${Qn(n)}`);if(ne==null)throw new y(`missing choices[${d}].tool_calls[${F}].type
95
- ${Qn(n)}`);if(B==null)throw new y(`missing choices[${d}].tool_calls[${F}].function.name
96
- ${Qn(n)}`);if(K==null)throw new y(`missing choices[${d}].tool_calls[${F}].function.arguments
97
- ${Qn(n)}`);return{...J,id:H,type:ne,function:{...W,name:B,arguments:K}}})}}:{...m,message:{...L,content:R,role:P,refusal:p.refusal??null},finish_reason:f,index:d,logprobs:E}}),created:s,model:o,object:"chat.completion",...a?{system_fingerprint:a}:{}};return tu(l,e)}i(mh,"finalizeChatCompletion");function Qn(n){return JSON.stringify(n)}i(Qn,"str");var Us=class n extends wt{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 Ve=class extends C{static{i(this,"Completions")}constructor(){super(...arguments),this.messages=new Pt(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(g`/chat/completions/${e}`,t)}update(e,t,r){return this._client.post(g`/chat/completions/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/chat/completions",M,{query:e,...t})}delete(e,t){return this._client.delete(g`/chat/completions/${e}`,t)}parse(e,t){return nu(e.tools),this._client.chat.completions.create(e,{...t,headers:{...t?.headers,"X-Stainless-Helper-Method":"chat.completions.parse"}})._thenUnwrap(r=>Ls(r,e))}runTools(e,t){return e.stream?Us.runTools(this._client,e,t):Hs.runTools(this._client,e,t)}stream(e,t){return wt.createChatCompletion(this._client,e,t)}};Ve.Messages=Pt;var at=class extends C{static{i(this,"Chat")}constructor(){super(...arguments),this.completions=new Ve(this._client)}};at.Completions=Ve;var uu=Symbol("brand.privateNullableHeaders");function*gh(n){if(!n)return;if(uu 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():ci(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=ci(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])}}i(gh,"iterateHeaders");var S=i(n=>{let e=new Headers,t=new Set;for(let r of n){let s=new Set;for(let[o,a]of gh(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{[uu]:!0,values:e,nulls:t}},"buildHeaders");var Er=class extends C{static{i(this,"Speech")}create(e,t){return this._client.post("/audio/speech",{body:e,...t,headers:S([{Accept:"application/octet-stream"},t?.headers]),__binaryResponse:!0})}};var Sr=class extends C{static{i(this,"Transcriptions")}create(e,t){return this._client.post("/audio/transcriptions",Te({body:e,...t,stream:e.stream??!1,__metadata:{model:e.model}},this._client))}};var vr=class extends C{static{i(this,"Translations")}create(e,t){return this._client.post("/audio/translations",Te({body:e,...t,__metadata:{model:e.model}},this._client))}};var Le=class extends C{static{i(this,"Audio")}constructor(){super(...arguments),this.transcriptions=new Sr(this._client),this.translations=new vr(this._client),this.speech=new Er(this._client)}};Le.Transcriptions=Sr;Le.Translations=vr;Le.Speech=Er;var bt=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(g`/batches/${e}`,t)}list(e={},t){return this._client.getAPIList("/batches",M,{query:e,...t})}cancel(e,t){return this._client.post(g`/batches/${e}/cancel`,t)}};var yr=class extends C{static{i(this,"Assistants")}create(e,t){return this._client.post("/assistants",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(g`/assistants/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(g`/assistants/${e}`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e={},t){return this._client.getAPIList("/assistants",M,{query:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}delete(e,t){return this._client.delete(g`/assistants/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}};var Tr=class extends C{static{i(this,"Sessions")}create(e,t){return this._client.post("/realtime/sessions",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}};var _r=class extends C{static{i(this,"TranscriptionSessions")}create(e,t){return this._client.post("/realtime/transcription_sessions",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}};var ct=class extends C{static{i(this,"Realtime")}constructor(){super(...arguments),this.sessions=new Tr(this._client),this.transcriptionSessions=new _r(this._client)}};ct.Sessions=Tr;ct.TranscriptionSessions=_r;var Rr=class extends C{static{i(this,"Sessions")}create(e,t){return this._client.post("/chatkit/sessions",{body:e,...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}cancel(e,t){return this._client.post(g`/chatkit/sessions/${e}/cancel`,{...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}};var Pr=class extends C{static{i(this,"Threads")}retrieve(e,t){return this._client.get(g`/chatkit/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}list(e={},t){return this._client.getAPIList("/chatkit/threads",ke,{query:e,...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}delete(e,t){return this._client.delete(g`/chatkit/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}listItems(e,t={},r){return this._client.getAPIList(g`/chatkit/threads/${e}/items`,ke,{query:t,...r,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},r?.headers])})}};var lt=class extends C{static{i(this,"ChatKit")}constructor(){super(...arguments),this.sessions=new Rr(this._client),this.threads=new Pr(this._client)}};lt.Sessions=Rr;lt.Threads=Pr;var Ar=class extends C{static{i(this,"Messages")}create(e,t,r){return this._client.post(g`/threads/${e}/messages`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{thread_id:s}=t;return this._client.get(g`/threads/${s}/messages/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{thread_id:s,...o}=t;return this._client.post(g`/threads/${s}/messages/${e}`,{body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(g`/threads/${e}/messages`,M,{query:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t,r){let{thread_id:s}=t;return this._client.delete(g`/threads/${s}/messages/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};var wr=class extends C{static{i(this,"Steps")}retrieve(e,t,r){let{thread_id:s,run_id:o,...a}=t;return this._client.get(g`/threads/${s}/runs/${o}/steps/${e}`,{query:a,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t,r){let{thread_id:s,...o}=t;return this._client.getAPIList(g`/threads/${s}/runs/${e}/steps`,M,{query:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};var pu=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 ut=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 ee,Mt,Vi,$e,Zn,_e,xt,br,It,ro,fe,eo,to,js,Vs,Bs,du,fu,mu,hu,gu,Cu,Eu,Be=class extends ot{static{i(this,"AssistantStream")}constructor(){super(...arguments),ee.add(this),Vi.set(this,[]),$e.set(this,{}),Zn.set(this,{}),_e.set(this,void 0),xt.set(this,void 0),br.set(this,void 0),It.set(this,void 0),ro.set(this,void 0),fe.set(this,void 0),eo.set(this,void 0),to.set(this,void 0),js.set(this,void 0)}[(Vi=new WeakMap,$e=new WeakMap,Zn=new WeakMap,_e=new WeakMap,xt=new WeakMap,br=new WeakMap,It=new WeakMap,ro=new WeakMap,fe=new WeakMap,eo=new WeakMap,to=new WeakMap,js=new WeakMap,ee=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 Mt;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=Oe.fromReadableStream(e,this.controller);for await(let o of s)h(this,ee,"m",Vs).call(this,o);if(s.controller.signal?.aborted)throw new z;return this._addRun(h(this,ee,"m",Bs).call(this))}toReadableStream(){return new Oe(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}static createToolAssistantStream(e,t,r,s){let o=new Mt;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,ee,"m",Vs).call(this,l);if(c.controller.signal?.aborted)throw new z;return this._addRun(h(this,ee,"m",Bs).call(this))}static createThreadAssistantStream(e,t,r){let s=new Mt;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 Mt;return o._run(()=>o._runAssistantStream(e,t,r,{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),o}currentEvent(){return h(this,eo,"f")}currentRun(){return h(this,to,"f")}currentMessageSnapshot(){return h(this,_e,"f")}currentRunStepSnapshot(){return h(this,js,"f")}async finalRunSteps(){return await this.done(),Object.values(h(this,$e,"f"))}async finalMessages(){return await this.done(),Object.values(h(this,Zn,"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,ee,"m",Vs).call(this,c);if(a.controller.signal?.aborted)throw new z;return this._addRun(h(this,ee,"m",Bs).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,ee,"m",Vs).call(this,l);if(c.controller.signal?.aborted)throw new z;return this._addRun(h(this,ee,"m",Bs).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(Ps(o)&&Ps(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(!Ps(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)}};Mt=Be,Vs=i(function(e){if(!this.ended)switch(w(this,eo,e,"f"),h(this,ee,"m",mu).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,ee,"m",Eu).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,ee,"m",fu).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,ee,"m",du).call(this,e);break;case"error":throw new Error("Encountered an error event in event processing - errors should be processed earlier");default:}},"_AssistantStream_addEvent"),Bs=i(function(){if(this.ended)throw new y("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"),du=i(function(e){let[t,r]=h(this,ee,"m",gu).call(this,e,h(this,_e,"f"));w(this,_e,t,"f"),h(this,Zn,"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,br,"f")){if(h(this,It,"f"))switch(h(this,It,"f").type){case"text":this._emit("textDone",h(this,It,"f").text,h(this,_e,"f"));break;case"image_file":this._emit("imageFileDone",h(this,It,"f").image_file,h(this,_e,"f"));break}w(this,br,s.index,"f")}w(this,It,t.content[s.index],"f")}break;case"thread.message.completed":case"thread.message.incomplete":if(h(this,br,"f")!==void 0){let s=e.data.content[h(this,br,"f")];if(s)switch(s.type){case"image_file":this._emit("imageFileDone",s.image_file,h(this,_e,"f"));break;case"text":this._emit("textDone",s.text,h(this,_e,"f"));break}}h(this,_e,"f")&&this._emit("messageDone",e.data),w(this,_e,void 0,"f")}},"_AssistantStream_handleMessage"),fu=i(function(e){let t=h(this,ee,"m",hu).call(this,e);switch(w(this,js,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,ro,"f")?this._emit("toolCallDelta",o,t.step_details.tool_calls[o.index]):(h(this,fe,"f")&&this._emit("toolCallDone",h(this,fe,"f")),w(this,ro,o.index,"f"),w(this,fe,t.step_details.tool_calls[o.index],"f"),h(this,fe,"f")&&this._emit("toolCallCreated",h(this,fe,"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":w(this,js,void 0,"f"),e.data.step_details.type=="tool_calls"&&h(this,fe,"f")&&(this._emit("toolCallDone",h(this,fe,"f")),w(this,fe,void 0,"f")),this._emit("runStepDone",e.data,t);break;case"thread.run.step.in_progress":break}},"_AssistantStream_handleRunStep"),mu=i(function(e){h(this,Vi,"f").push(e),this._emit("event",e)},"_AssistantStream_handleEvent"),hu=i(function(e){switch(e.event){case"thread.run.step.created":return h(this,$e,"f")[e.data.id]=e.data,e.data;case"thread.run.step.delta":let t=h(this,$e,"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=Mt.accumulateDelta(t,r.delta);h(this,$e,"f")[e.data.id]=s}return h(this,$e,"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,$e,"f")[e.data.id]=e.data;break}if(h(this,$e,"f")[e.data.id])return h(this,$e,"f")[e.data.id];throw new Error("No snapshot available")},"_AssistantStream_accumulateRunStep"),gu=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,ee,"m",Cu).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"),Cu=i(function(e,t){return Mt.accumulateDelta(t,e)},"_AssistantStream_accumulateContent"),Eu=i(function(e){switch(w(this,to,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":w(this,xt,e.data,"f"),h(this,fe,"f")&&(this._emit("toolCallDone",h(this,fe,"f")),w(this,fe,void 0,"f"));break;case"thread.run.cancelling":break}},"_AssistantStream_handleRun");var Ot=class extends C{static{i(this,"Runs")}constructor(){super(...arguments),this.steps=new wr(this._client)}create(e,t,r){let{include:s,...o}=t;return this._client.post(g`/threads/${e}/runs`,{query:{include:s},body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers]),stream:t.stream??!1})}retrieve(e,t,r){let{thread_id:s}=t;return this._client.get(g`/threads/${s}/runs/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{thread_id:s,...o}=t;return this._client.post(g`/threads/${s}/runs/${e}`,{body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(g`/threads/${e}/runs`,M,{query:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}cancel(e,t,r){let{thread_id:s}=t;return this._client.post(g`/threads/${s}/runs/${e}/cancel`,{...r,headers:S([{"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 Be.createAssistantStream(e,this._client.beta.threads.runs,t,r)}async poll(e,t,r){let s=S([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 Me(c);break;case"requires_action":case"incomplete":case"cancelled":case"completed":case"failed":case"expired":return o}}}stream(e,t,r){return Be.createAssistantStream(e,this._client.beta.threads.runs,t,r)}submitToolOutputs(e,t,r){let{thread_id:s,...o}=t;return this._client.post(g`/threads/${s}/runs/${e}/submit_tool_outputs`,{body:o,...r,headers:S([{"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 Be.createToolAssistantStream(e,this._client.beta.threads.runs,t,r)}};Ot.Steps=wr;var pt=class extends C{static{i(this,"Threads")}constructor(){super(...arguments),this.runs=new Ot(this._client),this.messages=new Ar(this._client)}create(e={},t){return this._client.post("/threads",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(g`/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(g`/threads/${e}`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t){return this._client.delete(g`/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}createAndRun(e,t){return this._client.post("/threads/runs",{body:e,...t,headers:S([{"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 Be.createThreadAssistantStream(e,this._client.beta.threads,t)}};pt.Runs=Ot;pt.Messages=Ar;var Re=class extends C{static{i(this,"Beta")}constructor(){super(...arguments),this.realtime=new ct(this._client),this.chatkit=new lt(this._client),this.assistants=new yr(this._client),this.threads=new pt(this._client)}};Re.Realtime=ct;Re.ChatKit=lt;Re.Assistants=yr;Re.Threads=pt;var Nt=class extends C{static{i(this,"Completions")}create(e,t){return this._client.post("/completions",{body:e,...t,stream:e.stream??!1})}};var Ir=class extends C{static{i(this,"Content")}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(g`/containers/${s}/files/${e}/content`,{...r,headers:S([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}};var Lt=class extends C{static{i(this,"Files")}constructor(){super(...arguments),this.content=new Ir(this._client)}create(e,t,r){return this._client.post(g`/containers/${e}/files`,Fe({body:t,...r},this._client))}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(g`/containers/${s}/files/${e}`,r)}list(e,t={},r){return this._client.getAPIList(g`/containers/${e}/files`,M,{query:t,...r})}delete(e,t,r){let{container_id:s}=t;return this._client.delete(g`/containers/${s}/files/${e}`,{...r,headers:S([{Accept:"*/*"},r?.headers])})}};Lt.Content=Ir;var dt=class extends C{static{i(this,"Containers")}constructor(){super(...arguments),this.files=new Lt(this._client)}create(e,t){return this._client.post("/containers",{body:e,...t})}retrieve(e,t){return this._client.get(g`/containers/${e}`,t)}list(e={},t){return this._client.getAPIList("/containers",M,{query:e,...t})}delete(e,t){return this._client.delete(g`/containers/${e}`,{...t,headers:S([{Accept:"*/*"},t?.headers])})}};dt.Files=Lt;var Mr=class extends C{static{i(this,"Items")}create(e,t,r){let{include:s,...o}=t;return this._client.post(g`/conversations/${e}/items`,{query:{include:s},body:o,...r})}retrieve(e,t,r){let{conversation_id:s,...o}=t;return this._client.get(g`/conversations/${s}/items/${e}`,{query:o,...r})}list(e,t={},r){return this._client.getAPIList(g`/conversations/${e}/items`,ke,{query:t,...r})}delete(e,t,r){let{conversation_id:s}=t;return this._client.delete(g`/conversations/${s}/items/${e}`,r)}};var ft=class extends C{static{i(this,"Conversations")}constructor(){super(...arguments),this.items=new Mr(this._client)}create(e={},t){return this._client.post("/conversations",{body:e,...t})}retrieve(e,t){return this._client.get(g`/conversations/${e}`,t)}update(e,t,r){return this._client.post(g`/conversations/${e}`,{body:t,...r})}delete(e,t){return this._client.delete(g`/conversations/${e}`,t)}};ft.Items=Mr;var $t=class extends C{static{i(this,"Embeddings")}create(e,t){let r=!!e.encoding_format,s=r?e.encoding_format:"base64";r&&U(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:(U(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=pu(l)}),a)))}};var xr=class extends C{static{i(this,"OutputItems")}retrieve(e,t,r){let{eval_id:s,run_id:o}=t;return this._client.get(g`/evals/${s}/runs/${o}/output_items/${e}`,r)}list(e,t,r){let{eval_id:s,...o}=t;return this._client.getAPIList(g`/evals/${s}/runs/${e}/output_items`,M,{query:o,...r})}};var Dt=class extends C{static{i(this,"Runs")}constructor(){super(...arguments),this.outputItems=new xr(this._client)}create(e,t,r){return this._client.post(g`/evals/${e}/runs`,{body:t,...r})}retrieve(e,t,r){let{eval_id:s}=t;return this._client.get(g`/evals/${s}/runs/${e}`,r)}list(e,t={},r){return this._client.getAPIList(g`/evals/${e}/runs`,M,{query:t,...r})}delete(e,t,r){let{eval_id:s}=t;return this._client.delete(g`/evals/${s}/runs/${e}`,r)}cancel(e,t,r){let{eval_id:s}=t;return this._client.post(g`/evals/${s}/runs/${e}`,r)}};Dt.OutputItems=xr;var mt=class extends C{static{i(this,"Evals")}constructor(){super(...arguments),this.runs=new Dt(this._client)}create(e,t){return this._client.post("/evals",{body:e,...t})}retrieve(e,t){return this._client.get(g`/evals/${e}`,t)}update(e,t,r){return this._client.post(g`/evals/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/evals",M,{query:e,...t})}delete(e,t){return this._client.delete(g`/evals/${e}`,t)}};mt.Runs=Dt;var kt=class extends C{static{i(this,"Files")}create(e,t){return this._client.post("/files",Te({body:e,...t},this._client))}retrieve(e,t){return this._client.get(g`/files/${e}`,t)}list(e={},t){return this._client.getAPIList("/files",M,{query:e,...t})}delete(e,t){return this._client.delete(g`/files/${e}`,t)}content(e,t){return this._client.get(g`/files/${e}/content`,{...t,headers:S([{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 Me(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 Or=class extends C{static{i(this,"Methods")}};var Nr=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 Ft=class extends C{static{i(this,"Alpha")}constructor(){super(...arguments),this.graders=new Nr(this._client)}};Ft.Graders=Nr;var Lr=class extends C{static{i(this,"Permissions")}create(e,t,r){return this._client.getAPIList(g`/fine_tuning/checkpoints/${e}/permissions`,Ne,{body:t,method:"post",...r})}retrieve(e,t={},r){return this._client.get(g`/fine_tuning/checkpoints/${e}/permissions`,{query:t,...r})}delete(e,t,r){let{fine_tuned_model_checkpoint:s}=t;return this._client.delete(g`/fine_tuning/checkpoints/${s}/permissions/${e}`,r)}};var Ht=class extends C{static{i(this,"Checkpoints")}constructor(){super(...arguments),this.permissions=new Lr(this._client)}};Ht.Permissions=Lr;var $r=class extends C{static{i(this,"Checkpoints")}list(e,t={},r){return this._client.getAPIList(g`/fine_tuning/jobs/${e}/checkpoints`,M,{query:t,...r})}};var Ut=class extends C{static{i(this,"Jobs")}constructor(){super(...arguments),this.checkpoints=new $r(this._client)}create(e,t){return this._client.post("/fine_tuning/jobs",{body:e,...t})}retrieve(e,t){return this._client.get(g`/fine_tuning/jobs/${e}`,t)}list(e={},t){return this._client.getAPIList("/fine_tuning/jobs",M,{query:e,...t})}cancel(e,t){return this._client.post(g`/fine_tuning/jobs/${e}/cancel`,t)}listEvents(e,t={},r){return this._client.getAPIList(g`/fine_tuning/jobs/${e}/events`,M,{query:t,...r})}pause(e,t){return this._client.post(g`/fine_tuning/jobs/${e}/pause`,t)}resume(e,t){return this._client.post(g`/fine_tuning/jobs/${e}/resume`,t)}};Ut.Checkpoints=$r;var Pe=class extends C{static{i(this,"FineTuning")}constructor(){super(...arguments),this.methods=new Or(this._client),this.jobs=new Ut(this._client),this.checkpoints=new Ht(this._client),this.alpha=new Ft(this._client)}};Pe.Methods=Or;Pe.Jobs=Ut;Pe.Checkpoints=Ht;Pe.Alpha=Ft;var Dr=class extends C{static{i(this,"GraderModels")}};var ht=class extends C{static{i(this,"Graders")}constructor(){super(...arguments),this.graderModels=new Dr(this._client)}};ht.GraderModels=Dr;var Vt=class extends C{static{i(this,"Images")}createVariation(e,t){return this._client.post("/images/variations",Te({body:e,...t},this._client))}edit(e,t){return this._client.post("/images/edits",Te({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 Bt=class extends C{static{i(this,"Models")}retrieve(e,t){return this._client.get(g`/models/${e}`,t)}list(e){return this._client.getAPIList("/models",Ne,e)}delete(e,t){return this._client.delete(g`/models/${e}`,t)}};var jt=class extends C{static{i(this,"Moderations")}create(e,t){return this._client.post("/moderations",{body:e,...t})}};var kr=class extends C{static{i(this,"Calls")}accept(e,t,r){return this._client.post(g`/realtime/calls/${e}/accept`,{body:t,...r,headers:S([{Accept:"*/*"},r?.headers])})}hangup(e,t){return this._client.post(g`/realtime/calls/${e}/hangup`,{...t,headers:S([{Accept:"*/*"},t?.headers])})}refer(e,t,r){return this._client.post(g`/realtime/calls/${e}/refer`,{body:t,...r,headers:S([{Accept:"*/*"},r?.headers])})}reject(e,t={},r){return this._client.post(g`/realtime/calls/${e}/reject`,{body:t,...r,headers:S([{Accept:"*/*"},r?.headers])})}};var Fr=class extends C{static{i(this,"ClientSecrets")}create(e,t){return this._client.post("/realtime/client_secrets",{body:e,...t})}};var je=class extends C{static{i(this,"Realtime")}constructor(){super(...arguments),this.clientSecrets=new Fr(this._client),this.calls=new kr(this._client)}};je.ClientSecrets=Fr;je.Calls=kr;function Su(n,e){return!e||!Gh(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)}:Bi(n,e)}i(Su,"maybeParseResponse");function Bi(n,e){let t=n.output.map(s=>{if(s.type==="function_call")return{...s,parsed_arguments:Kh(e,s)};if(s.type==="message"){let o=s.content.map(a=>a.type==="output_text"?{...a,parsed:qh(e,a.text)}:a);return{...s,content:o}}return s}),r=Object.assign({},n,{output:t});return Object.getOwnPropertyDescriptor(n,"output_text")||so(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}i(Bi,"parseResponse");function qh(n,e){return n.text?.format?.type!=="json_schema"?null:"$parseRaw"in n.text?.format?(n.text?.format).$parseRaw(e):JSON.parse(e)}i(qh,"parseTextFormat");function Gh(n){return!!Ns(n.text?.format)}i(Gh,"hasAutoParseableInput");function Xh(n){return n?.$brand==="auto-parseable-tool"}i(Xh,"isAutoParsableTool");function Jh(n,e){return n.find(t=>t.type==="function"&&t.name===e)}i(Jh,"getInputToolByName");function Kh(n,e){let t=Jh(n.tools??[],e.name);return{...e,...e,parsed_arguments:Xh(t)?t.$parseRaw(e.arguments):t?.strict?JSON.parse(e.arguments):null}}i(Kh,"parseToolCall");function so(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("")}i(so,"addOutputText");var Hr,no,gt,oo,vu,yu,Tu,_u,io=class n extends ot{static{i(this,"ResponseStream")}constructor(e){super(),Hr.add(this),no.set(this,void 0),gt.set(this,void 0),oo.set(this,void 0),w(this,no,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,Hr,"m",vu).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,Hr,"m",yu).call(this,c,a);if(o.controller.signal?.aborted)throw new z;return h(this,Hr,"m",Tu).call(this)}[(no=new WeakMap,gt=new WeakMap,oo=new WeakMap,Hr=new WeakSet,vu=i(function(){this.ended||w(this,gt,void 0,"f")},"_ResponseStream_beginRequest"),yu=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,Hr,"m",_u).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 y(`missing output at index ${t.output_index}`);if(a.type==="message"){let c=a.content[t.content_index];if(!c)throw new y(`missing content at index ${t.content_index}`);if(c.type!=="output_text")throw new y(`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 y(`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"),Tu=i(function(){if(this.ended)throw new y("stream has ended, this shouldn't happen");let t=h(this,gt,"f");if(!t)throw new y("request ended without sending any events");w(this,gt,void 0,"f");let r=Yh(t,h(this,no,"f"));return w(this,oo,r,"f"),r},"_ResponseStream_endRequest"),_u=i(function(t){let r=h(this,gt,"f");if(!r){if(t.type!=="response.created")throw new y(`When snapshot hasn't been set yet, expected 'response.created' event, got ${t.type}`);return r=w(this,gt,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 y(`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 y(`missing output at index ${t.output_index}`);if(s.type==="message"){let o=s.content[t.content_index];if(!o)throw new y(`missing content at index ${t.content_index}`);if(o.type!=="output_text")throw new y(`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 y(`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 y(`missing output at index ${t.output_index}`);if(s.type==="reasoning"){let o=s.content?.[t.content_index];if(!o)throw new y(`missing content at index ${t.content_index}`);if(o.type!=="reasoning_text")throw new y(`expected content to be 'reasoning_text', got ${o.type}`);o.text+=t.delta}break}case"response.completed":{w(this,gt,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,oo,"f");if(!e)throw new y("stream ended without producing a ChatCompletion");return e}};function Yh(n,e){return Su(n,e)}i(Yh,"finalizeResponse");var Ur=class extends C{static{i(this,"InputItems")}list(e,t={},r){return this._client.getAPIList(g`/responses/${e}/input_items`,M,{query:t,...r})}};var Vr=class extends C{static{i(this,"InputTokens")}count(e={},t){return this._client.post("/responses/input_tokens",{body:e,...t})}};var ze=class extends C{static{i(this,"Responses")}constructor(){super(...arguments),this.inputItems=new Ur(this._client),this.inputTokens=new Vr(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"&&so(r),r))}retrieve(e,t={},r){return this._client.get(g`/responses/${e}`,{query:t,...r,stream:t?.stream??!1})._thenUnwrap(s=>("object"in s&&s.object==="response"&&so(s),s))}delete(e,t){return this._client.delete(g`/responses/${e}`,{...t,headers:S([{Accept:"*/*"},t?.headers])})}parse(e,t){return this._client.responses.create(e,t)._thenUnwrap(r=>Bi(r,e))}stream(e,t){return io.createResponse(this._client,e,t)}cancel(e,t){return this._client.post(g`/responses/${e}/cancel`,t)}compact(e,t){return this._client.post("/responses/compact",{body:e,...t})}};ze.InputItems=Ur;ze.InputTokens=Vr;var Br=class extends C{static{i(this,"Content")}retrieve(e,t){return this._client.get(g`/skills/${e}/content`,{...t,headers:S([{Accept:"application/binary"},t?.headers]),__binaryResponse:!0})}};var jr=class extends C{static{i(this,"Content")}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(g`/skills/${s}/versions/${e}/content`,{...r,headers:S([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}};var zt=class extends C{static{i(this,"Versions")}constructor(){super(...arguments),this.content=new jr(this._client)}create(e,t={},r){return this._client.post(g`/skills/${e}/versions`,Fe({body:t,...r},this._client))}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(g`/skills/${s}/versions/${e}`,r)}list(e,t={},r){return this._client.getAPIList(g`/skills/${e}/versions`,M,{query:t,...r})}delete(e,t,r){let{skill_id:s}=t;return this._client.delete(g`/skills/${s}/versions/${e}`,r)}};zt.Content=jr;var We=class extends C{static{i(this,"Skills")}constructor(){super(...arguments),this.content=new Br(this._client),this.versions=new zt(this._client)}create(e={},t){return this._client.post("/skills",Fe({body:e,...t},this._client))}retrieve(e,t){return this._client.get(g`/skills/${e}`,t)}update(e,t,r){return this._client.post(g`/skills/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/skills",M,{query:e,...t})}delete(e,t){return this._client.delete(g`/skills/${e}`,t)}};We.Content=Br;We.Versions=zt;var zr=class extends C{static{i(this,"Parts")}create(e,t,r){return this._client.post(g`/uploads/${e}/parts`,Te({body:t,...r},this._client))}};var Ct=class extends C{static{i(this,"Uploads")}constructor(){super(...arguments),this.parts=new zr(this._client)}create(e,t){return this._client.post("/uploads",{body:e,...t})}cancel(e,t){return this._client.post(g`/uploads/${e}/cancel`,t)}complete(e,t,r){return this._client.post(g`/uploads/${e}/complete`,{body:t,...r})}};Ct.Parts=zr;var Ru=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 Wr=class extends C{static{i(this,"FileBatches")}create(e,t,r){return this._client.post(g`/vector_stores/${e}/file_batches`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{vector_store_id:s}=t;return this._client.get(g`/vector_stores/${s}/file_batches/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}cancel(e,t,r){let{vector_store_id:s}=t;return this._client.post(g`/vector_stores/${s}/file_batches/${e}/cancel`,{...r,headers:S([{"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(g`/vector_stores/${s}/file_batches/${e}/files`,M,{query:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}async poll(e,t,r){let s=S([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 Me(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 f(E){for(let m of E){let R=await c.files.create({file:m,purpose:"assistants"},s);p.push(R.id)}}i(f,"processFiles");let d=Array(a).fill(l).map(f);return await Ru(d),await this.createAndPoll(e,{file_ids:p})}};var qr=class extends C{static{i(this,"Files")}create(e,t,r){return this._client.post(g`/vector_stores/${e}/files`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{vector_store_id:s}=t;return this._client.get(g`/vector_stores/${s}/files/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{vector_store_id:s,...o}=t;return this._client.post(g`/vector_stores/${s}/files/${e}`,{body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(g`/vector_stores/${e}/files`,M,{query:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t,r){let{vector_store_id:s}=t;return this._client.delete(g`/vector_stores/${s}/files/${e}`,{...r,headers:S([{"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=S([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 Me(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(g`/vector_stores/${s}/files/${e}/content`,Ne,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};var qe=class extends C{static{i(this,"VectorStores")}constructor(){super(...arguments),this.files=new qr(this._client),this.fileBatches=new Wr(this._client)}create(e,t){return this._client.post("/vector_stores",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(g`/vector_stores/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(g`/vector_stores/${e}`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e={},t){return this._client.getAPIList("/vector_stores",M,{query:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}delete(e,t){return this._client.delete(g`/vector_stores/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}search(e,t,r){return this._client.getAPIList(g`/vector_stores/${e}/search`,Ne,{body:t,method:"post",...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};qe.Files=qr;qe.FileBatches=Wr;var Wt=class extends C{static{i(this,"Videos")}create(e,t){return this._client.post("/videos",Fe({body:e,...t},this._client))}retrieve(e,t){return this._client.get(g`/videos/${e}`,t)}list(e={},t){return this._client.getAPIList("/videos",ke,{query:e,...t})}delete(e,t){return this._client.delete(g`/videos/${e}`,t)}downloadContent(e,t={},r){return this._client.get(g`/videos/${e}/content`,{query:t,...r,headers:S([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}remix(e,t,r){return this._client.post(g`/videos/${e}/remix`,Fe({body:t,...r},this._client))}};var Gr,Pu,ao,qt=class extends C{static{i(this,"Webhooks")}constructor(){super(...arguments),Gr.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,Gr,"m",Pu).call(this,r);let o=S([t]).values,a=h(this,Gr,"m",ao).call(this,o,"webhook-signature"),c=h(this,Gr,"m",ao).call(this,o,"webhook-timestamp"),l=h(this,Gr,"m",ao).call(this,o,"webhook-id"),p=parseInt(c,10);if(isNaN(p))throw new Ie("Invalid webhook timestamp format");let f=Math.floor(Date.now()/1e3);if(f-p>s)throw new Ie("Webhook timestamp is too old");if(p>f+s)throw new Ie("Webhook timestamp is too new");let d=a.split(" ").map(A=>A.startsWith("v1,")?A.substring(3):A),E=r.startsWith("whsec_")?Buffer.from(r.replace("whsec_",""),"base64"):Buffer.from(r,"utf-8"),m=l?`${l}.${c}.${e}`:`${c}.${e}`,R=await crypto.subtle.importKey("raw",E,{name:"HMAC",hash:"SHA-256"},!1,["verify"]);for(let A of d)try{let $=Buffer.from(A,"base64");if(await crypto.subtle.verify("HMAC",R,$,new TextEncoder().encode(m)))return}catch{continue}throw new Ie("The given webhook signature does not match the expected signature")}};Gr=new WeakSet,Pu=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"),ao=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 ji,zi,co,Au,b=class{static{i(this,"OpenAI")}constructor({baseURL:e=ut("OPENAI_BASE_URL"),apiKey:t=ut("OPENAI_API_KEY"),organization:r=ut("OPENAI_ORG_ID")??null,project:s=ut("OPENAI_PROJECT_ID")??null,webhookSecret:o=ut("OPENAI_WEBHOOK_SECRET")??null,...a}={}){if(ji.add(this),co.set(this,void 0),this.completions=new Nt(this),this.chat=new at(this),this.embeddings=new $t(this),this.files=new kt(this),this.images=new Vt(this),this.audio=new Le(this),this.moderations=new jt(this),this.models=new Bt(this),this.fineTuning=new Pe(this),this.graders=new ht(this),this.vectorStores=new qe(this),this.webhooks=new qt(this),this.beta=new Re(this),this.batches=new bt(this),this.uploads=new Ct(this),this.responses=new ze(this),this.realtime=new je(this),this.conversations=new ft(this),this.evals=new mt(this),this.containers=new dt(this),this.skills=new We(this),this.videos=new Wt(this),t===void 0)throw new y("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&&Nl())throw new y(`It looks like you're running in a browser-like environment.
92
+ ${d}`)}return a},"path"),"createPathTagFunction"),h=Pg(Cu);var At=class extends E{static{i(this,"Messages")}list(e,t={},r){return this._client.getAPIList(h`/chat/completions/${e}/messages`,M,{query:t,...r})}};function Ns(n){return n!==void 0&&"function"in n&&n.function!==void 0}i(Ns,"isChatCompletionFunctionTool");function Ls(n){return n?.$brand==="auto-parseable-response-format"}i(Ls,"isAutoParsableResponseFormat");function bt(n){return n?.$brand==="auto-parseable-tool"}i(bt,"isAutoParsableTool");function Su(n,e){return!e||!$i(e)?{...n,choices:n.choices.map(t=>(yu(t.message.tool_calls),{...t,message:{...t.message,parsed:null,...t.message.tool_calls?{tool_calls:t.message.tool_calls}:void 0}}))}:$s(n,e)}i(Su,"maybeParseChatCompletion");function $s(n,e){let t=n.choices.map(r=>{if(r.finish_reason==="length")throw new ur;if(r.finish_reason==="content_filter")throw new pr;return yu(r.message.tool_calls),{...r,message:{...r.message,...r.message.tool_calls?{tool_calls:r.message.tool_calls?.map(s=>Ig(e,s))??void 0}:void 0,parsed:r.message.content&&!r.message.refusal?wg(e,r.message.content):null}}});return{...n,choices:t}}i($s,"parseChatCompletion");function wg(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}i(wg,"parseResponseFormat");function Ig(n,e){let t=n.tools?.find(r=>Ns(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}}}i(Ig,"parseToolCall");function vu(n,e){if(!n||!("tools"in n)||!n.tools)return!1;let t=n.tools?.find(r=>Ns(r)&&r.function?.name===e.function.name);return Ns(t)&&(bt(t)||t?.function.strict||!1)}i(vu,"shouldParseToolCall");function $i(n){return Ls(n.response_format)?!0:n.tools?.some(e=>bt(e)||e.type==="function"&&e.function.strict===!0)??!1}i($i,"hasAutoParseableInput");function yu(n){for(let e of n||[])if(e.type!=="function")throw new y(`Currently only \`function\` tool calls are supported; Received \`${e.type}\``)}i(yu,"assertToolCallsAreChatCompletionFunctionToolCalls");function Tu(n){for(let e of n??[]){if(e.type!=="function")throw new y(`Currently only \`function\` tool types support auto-parsing; Received \`${e.type}\``);if(e.function.strict!==!0)throw new y(`The \`${e.function.name}\` tool is not marked with \`strict: true\`. Only strict function tools can be auto-parsed`)}}i(Tu,"validateInputTools");var mr=i(n=>n?.role==="assistant","isAssistantMessage"),Di=i(n=>n?.role==="tool","isToolMessage");var ki,qn,Gn,Ds,ks,Xn,Fs,Ue,Hs,Jn,Kn,gr,_u,ot=class{static{i(this,"EventStream")}constructor(){ki.add(this),this.controller=new AbortController,qn.set(this,void 0),Gn.set(this,()=>{}),Ds.set(this,()=>{}),ks.set(this,void 0),Xn.set(this,()=>{}),Fs.set(this,()=>{}),Ue.set(this,{}),Hs.set(this,!1),Jn.set(this,!1),Kn.set(this,!1),gr.set(this,!1),b(this,qn,new Promise((e,t)=>{b(this,Gn,e,"f"),b(this,Ds,t,"f")}),"f"),b(this,ks,new Promise((e,t)=>{b(this,Xn,e,"f"),b(this,Fs,t,"f")}),"f"),g(this,qn,"f").catch(()=>{}),g(this,ks,"f").catch(()=>{})}_run(e){setTimeout(()=>{e().then(()=>{this._emitFinal(),this._emit("end")},g(this,ki,"m",_u).bind(this))},0)}_connected(){this.ended||(g(this,Gn,"f").call(this),this._emit("connect"))}get ended(){return g(this,Hs,"f")}get errored(){return g(this,Jn,"f")}get aborted(){return g(this,Kn,"f")}abort(){this.controller.abort()}on(e,t){return(g(this,Ue,"f")[e]||(g(this,Ue,"f")[e]=[])).push({listener:t}),this}off(e,t){let r=g(this,Ue,"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(g(this,Ue,"f")[e]||(g(this,Ue,"f")[e]=[])).push({listener:t,once:!0}),this}emitted(e){return new Promise((t,r)=>{b(this,gr,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,t)})}async done(){b(this,gr,!0,"f"),await g(this,ks,"f")}_emit(e,...t){if(g(this,Hs,"f"))return;e==="end"&&(b(this,Hs,!0,"f"),g(this,Xn,"f").call(this));let r=g(this,Ue,"f")[e];if(r&&(g(this,Ue,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...t))),e==="abort"){let s=t[0];!g(this,gr,"f")&&!r?.length&&Promise.reject(s),g(this,Ds,"f").call(this,s),g(this,Fs,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=t[0];!g(this,gr,"f")&&!r?.length&&Promise.reject(s),g(this,Ds,"f").call(this,s),g(this,Fs,"f").call(this,s),this._emit("end")}}_emitFinal(){}};qn=new WeakMap,Gn=new WeakMap,Ds=new WeakMap,ks=new WeakMap,Xn=new WeakMap,Fs=new WeakMap,Ue=new WeakMap,Hs=new WeakMap,Jn=new WeakMap,Kn=new WeakMap,gr=new WeakMap,ki=new WeakSet,_u=i(function(e){if(b(this,Jn,!0,"f"),e instanceof Error&&e.name==="AbortError"&&(e=new z),e instanceof z)return b(this,Kn,!0,"f"),this._emit("abort",e);if(e instanceof y)return this._emit("error",e);if(e instanceof Error){let t=new y(e.message);return t.cause=e,this._emit("error",t)}return this._emit("error",new y(String(e)))},"_EventStream_handleError");function Ru(n){return typeof n.parse=="function"}i(Ru,"isRunnableFunctionWithParse");var ce,Fi,Yn,Hi,Ui,Vi,Pu,Au,Mg=10,hr=class extends ot{static{i(this,"AbstractChatCompletionRunner")}constructor(){super(...arguments),ce.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),Di(e)&&e.content)this._emit("functionToolCallResult",e.content);else if(mr(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 y("stream ended without producing a ChatCompletion");return e}async finalContent(){return await this.done(),g(this,ce,"m",Fi).call(this)}async finalMessage(){return await this.done(),g(this,ce,"m",Yn).call(this)}async finalFunctionToolCall(){return await this.done(),g(this,ce,"m",Hi).call(this)}async finalFunctionToolCallResult(){return await this.done(),g(this,ce,"m",Ui).call(this)}async totalUsage(){return await this.done(),g(this,ce,"m",Vi).call(this)}allChatCompletions(){return[...this._chatCompletions]}_emitFinal(){let e=this._chatCompletions[this._chatCompletions.length-1];e&&this._emit("finalChatCompletion",e);let t=g(this,ce,"m",Yn).call(this);t&&this._emit("finalMessage",t);let r=g(this,ce,"m",Fi).call(this);r&&this._emit("finalContent",r);let s=g(this,ce,"m",Hi).call(this);s&&this._emit("finalFunctionToolCall",s);let o=g(this,ce,"m",Ui).call(this);o!=null&&this._emit("finalFunctionToolCallResult",o),this._chatCompletions.some(a=>a.usage)&&this._emit("totalUsage",g(this,ce,"m",Vi).call(this))}async _createChatCompletion(e,t,r){let s=r?.signal;s&&(s.aborted&&this.controller.abort(),s.addEventListener("abort",()=>this.controller.abort())),g(this,ce,"m",Pu).call(this,t);let o=await e.chat.completions.create({...t,stream:!1},{...r,signal:this.controller.signal});return this._connected(),this._addChatCompletion($s(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=Mg}=r||{},f=t.tools.map(m=>{if(bt(m)){if(!m.$callback)throw new y("Tool given to `.runTools()` that does not have an associated function");return{type:"function",function:{function:m.$callback,name:m.function.name,description:m.function.description||"",parameters:m.function.parameters,parse:m.$parseRaw,strict:!0}}}return m}),d={};for(let m of f)m.type==="function"&&(d[m.function.name||m.function.function.name]=m.function);let C="tools"in t?f.map(m=>m.type==="function"?{type:"function",function:{name:m.function.name||m.function.function.name,parameters:m.function.parameters,description:m.function.description,strict:m.function.strict}}:m):void 0;for(let m of t.messages)this._addMessage(m,!1);for(let m=0;m<p;++m){let A=(await this._createChatCompletion(e,{...c,tool_choice:o,tools:C,messages:[...this.messages]},r)).choices[0]?.message;if(!A)throw new y("missing message in ChatCompletion response");if(!A.tool_calls?.length)return;for(let $ of A.tool_calls){if($.type!=="function")continue;let L=$.id,{name:P,arguments:V}=$.function,F=d[P];if(F){if(l&&l!==P){let J=`Invalid tool_call: ${JSON.stringify(P)}. ${JSON.stringify(l)} requested. Please try again`;this._addMessage({role:s,tool_call_id:L,content:J});continue}}else{let J=`Invalid tool_call: ${JSON.stringify(P)}. Available options are: ${Object.keys(d).map(K=>JSON.stringify(K)).join(", ")}. Please try again`;this._addMessage({role:s,tool_call_id:L,content:J});continue}let ue;try{ue=Ru(F)?await F.parse(V):V}catch(J){let K=J instanceof Error?J.message:String(J);this._addMessage({role:s,tool_call_id:L,content:K});continue}let ne=await F.function(ue,this),H=g(this,ce,"m",Au).call(this,ne);if(this._addMessage({role:s,tool_call_id:L,content:H}),l)return}}}};ce=new WeakSet,Fi=i(function(){return g(this,ce,"m",Yn).call(this).content??null},"_AbstractChatCompletionRunner_getFinalContent"),Yn=i(function(){let e=this.messages.length;for(;e-- >0;){let t=this.messages[e];if(mr(t))return{...t,content:t.content??null,refusal:t.refusal??null}}throw new y("stream ended without producing a ChatCompletionMessage with role=assistant")},"_AbstractChatCompletionRunner_getFinalMessage"),Hi=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(mr(t)&&t?.tool_calls?.length)return t.tool_calls.filter(r=>r.type==="function").at(-1)?.function}},"_AbstractChatCompletionRunner_getFinalFunctionToolCall"),Ui=i(function(){for(let e=this.messages.length-1;e>=0;e--){let t=this.messages[e];if(Di(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"),Vi=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"),Pu=i(function(e){if(e.n!=null&&e.n>1)throw new y("ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.")},"_AbstractChatCompletionRunner_validateParams"),Au=i(function(e){return typeof e=="string"?e:e===void 0?"undefined":JSON.stringify(e)},"_AbstractChatCompletionRunner_stringifyFunctionCallResult");var Us=class n extends hr{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),mr(e)&&e.content&&this._emit("content",e.content)}};var Y={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},ji=class extends Error{static{i(this,"PartialJSON")}},Bi=class extends Error{static{i(this,"MalformedJSON")}};function xg(n,e=Y.ALL){if(typeof n!="string")throw new TypeError(`expecting str, got ${typeof n}`);if(!n.trim())throw new Error(`${n} is empty`);return Og(n.trim(),e)}i(xg,"parseJSON");var Og=i((n,e)=>{let t=n.length,r=0,s=i(C=>{throw new ji(`${C} at position ${r}`)},"markPartialJSON"),o=i(C=>{throw new Bi(`${C} at position ${r}`)},"throwMalformedError"),a=i(()=>(d(),r>=t&&s("Unexpected end of input"),n[r]==='"'?c():n[r]==="{"?l():n[r]==="["?p():n.substring(r,r+4)==="null"||Y.NULL&e&&t-r<4&&"null".startsWith(n.substring(r))?(r+=4,null):n.substring(r,r+4)==="true"||Y.BOOL&e&&t-r<4&&"true".startsWith(n.substring(r))?(r+=4,!0):n.substring(r,r+5)==="false"||Y.BOOL&e&&t-r<5&&"false".startsWith(n.substring(r))?(r+=5,!1):n.substring(r,r+8)==="Infinity"||Y.INFINITY&e&&t-r<8&&"Infinity".startsWith(n.substring(r))?(r+=8,1/0):n.substring(r,r+9)==="-Infinity"||Y.MINUS_INFINITY&e&&1<t-r&&t-r<9&&"-Infinity".startsWith(n.substring(r))?(r+=9,-1/0):n.substring(r,r+3)==="NaN"||Y.NAN&e&&t-r<3&&"NaN".startsWith(n.substring(r))?(r+=3,NaN):f()),"parseAny"),c=i(()=>{let C=r,m=!1;for(r++;r<t&&(n[r]!=='"'||m&&n[r-1]==="\\");)m=n[r]==="\\"?!m:!1,r++;if(n.charAt(r)=='"')try{return JSON.parse(n.substring(C,++r-Number(m)))}catch(R){o(String(R))}else if(Y.STR&e)try{return JSON.parse(n.substring(C,r-Number(m))+'"')}catch{return JSON.parse(n.substring(C,n.lastIndexOf("\\"))+'"')}s("Unterminated string literal")},"parseStr"),l=i(()=>{r++,d();let C={};try{for(;n[r]!=="}";){if(d(),r>=t&&Y.OBJ&e)return C;let m=c();d(),r++;try{let R=a();Object.defineProperty(C,m,{value:R,writable:!0,enumerable:!0,configurable:!0})}catch(R){if(Y.OBJ&e)return C;throw R}d(),n[r]===","&&r++}}catch{if(Y.OBJ&e)return C;s("Expected '}' at end of object")}return r++,C},"parseObj"),p=i(()=>{r++;let C=[];try{for(;n[r]!=="]";)C.push(a()),d(),n[r]===","&&r++}catch{if(Y.ARR&e)return C;s("Expected ']' at end of array")}return r++,C},"parseArr"),f=i(()=>{if(r===0){n==="-"&&Y.NUM&e&&s("Not sure what '-' is");try{return JSON.parse(n)}catch(m){if(Y.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(m))}}let C=r;for(n[r]==="-"&&r++;n[r]&&!",]}".includes(n[r]);)r++;r==t&&!(Y.NUM&e)&&s("Unterminated number literal");try{return JSON.parse(n.substring(C,r))}catch{n.substring(C,r)==="-"&&Y.NUM&e&&s("Not sure what '-' is");try{return JSON.parse(n.substring(C,n.lastIndexOf("e")))}catch(R){o(String(R))}}},"parseNum"),d=i(()=>{for(;r<t&&`
93
+ \r `.includes(n[r]);)r++},"skipBlank");return a()},"_parseJSON"),zi=i(n=>xg(n,Y.ALL^Y.NUM),"partialParse");var X,Ve,Er,it,Wi,Qn,qi,Gi,Xi,Zn,Ji,bu,wt=class n extends hr{static{i(this,"ChatCompletionStream")}constructor(e){super(),X.add(this),Ve.set(this,void 0),Er.set(this,void 0),it.set(this,void 0),b(this,Ve,e,"f"),b(this,Er,[],"f")}get currentChatCompletionSnapshot(){return g(this,it,"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())),g(this,X,"m",Wi).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)g(this,X,"m",qi).call(this,a);if(o.controller.signal?.aborted)throw new z;return this._addChatCompletion(g(this,X,"m",Zn).call(this))}async _fromReadableStream(e,t){let r=t?.signal;r&&(r.aborted&&this.controller.abort(),r.addEventListener("abort",()=>this.controller.abort())),g(this,X,"m",Wi).call(this),this._connected();let s=Ne.fromReadableStream(e,this.controller),o;for await(let a of s)o&&o!==a.id&&this._addChatCompletion(g(this,X,"m",Zn).call(this)),g(this,X,"m",qi).call(this,a),o=a.id;if(s.controller.signal?.aborted)throw new z;return this._addChatCompletion(g(this,X,"m",Zn).call(this))}[(Ve=new WeakMap,Er=new WeakMap,it=new WeakMap,X=new WeakSet,Wi=i(function(){this.ended||b(this,it,void 0,"f")},"_ChatCompletionStream_beginRequest"),Qn=i(function(t){let r=g(this,Er,"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},g(this,Er,"f")[t.index]=r,r)},"_ChatCompletionStream_getChoiceEventState"),qi=i(function(t){if(this.ended)return;let r=g(this,X,"m",bu).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=g(this,X,"m",Qn).call(this,o);o.finish_reason&&(g(this,X,"m",Xi).call(this,o),a.current_tool_call_index!=null&&g(this,X,"m",Gi).call(this,o,a.current_tool_call_index));for(let c of s.delta.tool_calls??[])a.current_tool_call_index!==c.index&&(g(this,X,"m",Xi).call(this,o),a.current_tool_call_index!=null&&g(this,X,"m",Gi).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"),Gi=i(function(t,r){if(g(this,X,"m",Qn).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=g(this,Ve,"f")?.tools?.find(c=>Ns(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"),Xi=i(function(t){let r=g(this,X,"m",Qn).call(this,t);if(t.message.content&&!r.content_done){r.content_done=!0;let s=g(this,X,"m",Ji).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"),Zn=i(function(){if(this.ended)throw new y("stream has ended, this shouldn't happen");let t=g(this,it,"f");if(!t)throw new y("request ended without sending any chunks");return b(this,it,void 0,"f"),b(this,Er,[],"f"),Ng(t,g(this,Ve,"f"))},"_ChatCompletionStream_endRequest"),Ji=i(function(){let t=g(this,Ve,"f")?.response_format;return Ls(t)?t:null},"_ChatCompletionStream_getAutoParseableResponseFormat"),bu=i(function(t){var r,s,o,a;let c=g(this,it,"f"),{choices:l,...p}=t;c?Object.assign(c,p):c=b(this,it,{...p,choices:[]},"f");for(let{delta:f,finish_reason:d,index:C,logprobs:m=null,...R}of t.choices){let A=c.choices[C];if(A||(A=c.choices[C]={finish_reason:d,index:C,message:{},logprobs:m,...R}),m)if(!A.logprobs)A.logprobs=Object.assign({},m);else{let{content:ne,refusal:H,...J}=m;Object.assign(A.logprobs,J),ne&&((r=A.logprobs).content??(r.content=[]),A.logprobs.content.push(...ne)),H&&((s=A.logprobs).refusal??(s.refusal=[]),A.logprobs.refusal.push(...H))}if(d&&(A.finish_reason=d,g(this,Ve,"f")&&$i(g(this,Ve,"f")))){if(d==="length")throw new ur;if(d==="content_filter")throw new pr}if(Object.assign(A,R),!f)continue;let{content:$,refusal:L,function_call:P,role:V,tool_calls:F,...ue}=f;if(Object.assign(A.message,ue),L&&(A.message.refusal=(A.message.refusal||"")+L),V&&(A.message.role=V),P&&(A.message.function_call?(P.name&&(A.message.function_call.name=P.name),P.arguments&&((o=A.message.function_call).arguments??(o.arguments=""),A.message.function_call.arguments+=P.arguments)):A.message.function_call=P),$&&(A.message.content=(A.message.content||"")+$,!A.message.refusal&&g(this,X,"m",Ji).call(this)&&(A.message.parsed=zi(A.message.content))),F){A.message.tool_calls||(A.message.tool_calls=[]);for(let{index:ne,id:H,type:J,function:K,...j}of F){let W=(a=A.message.tool_calls)[ne]??(a[ne]={});Object.assign(W,j),H&&(W.id=H),J&&(W.type=J),K&&(W.function??(W.function={name:K.name??"",arguments:""})),K?.name&&(W.function.name=K.name),K?.arguments&&(W.function.arguments+=K.arguments,vu(g(this,Ve,"f"),W)&&(W.function.parsed_arguments=zi(W.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 Ne(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}};function Ng(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:f,index:d,logprobs:C,...m})=>{if(!f)throw new y(`missing finish_reason for choice ${d}`);let{content:R=null,function_call:A,tool_calls:$,...L}=p,P=p.role;if(!P)throw new y(`missing role for choice ${d}`);if(A){let{arguments:V,name:F}=A;if(V==null)throw new y(`missing function_call.arguments for choice ${d}`);if(!F)throw new y(`missing function_call.name for choice ${d}`);return{...m,message:{content:R,function_call:{arguments:V,name:F},role:P,refusal:p.refusal??null},finish_reason:f,index:d,logprobs:C}}return $?{...m,index:d,finish_reason:f,logprobs:C,message:{...L,role:P,content:R,refusal:p.refusal??null,tool_calls:$.map((V,F)=>{let{function:ue,type:ne,id:H,...J}=V,{arguments:K,name:j,...W}=ue||{};if(H==null)throw new y(`missing choices[${d}].tool_calls[${F}].id
94
+ ${eo(n)}`);if(ne==null)throw new y(`missing choices[${d}].tool_calls[${F}].type
95
+ ${eo(n)}`);if(j==null)throw new y(`missing choices[${d}].tool_calls[${F}].function.name
96
+ ${eo(n)}`);if(K==null)throw new y(`missing choices[${d}].tool_calls[${F}].function.arguments
97
+ ${eo(n)}`);return{...J,id:H,type:ne,function:{...W,name:j,arguments:K}}})}}:{...m,message:{...L,content:R,role:P,refusal:p.refusal??null},finish_reason:f,index:d,logprobs:C}}),created:s,model:o,object:"chat.completion",...a?{system_fingerprint:a}:{}};return Su(l,e)}i(Ng,"finalizeChatCompletion");function eo(n){return JSON.stringify(n)}i(eo,"str");var Vs=class n extends wt{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 je=class extends E{static{i(this,"Completions")}constructor(){super(...arguments),this.messages=new At(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(h`/chat/completions/${e}`,t)}update(e,t,r){return this._client.post(h`/chat/completions/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/chat/completions",M,{query:e,...t})}delete(e,t){return this._client.delete(h`/chat/completions/${e}`,t)}parse(e,t){return Tu(e.tools),this._client.chat.completions.create(e,{...t,headers:{...t?.headers,"X-Stainless-Helper-Method":"chat.completions.parse"}})._thenUnwrap(r=>$s(r,e))}runTools(e,t){return e.stream?Vs.runTools(this._client,e,t):Us.runTools(this._client,e,t)}stream(e,t){return wt.createChatCompletion(this._client,e,t)}};je.Messages=At;var at=class extends E{static{i(this,"Chat")}constructor(){super(...arguments),this.completions=new je(this._client)}};at.Completions=je;var wu=Symbol("brand.privateNullableHeaders");function*$g(n){if(!n)return;if(wu 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():Ei(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=Ei(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])}}i($g,"iterateHeaders");var S=i(n=>{let e=new Headers,t=new Set;for(let r of n){let s=new Set;for(let[o,a]of $g(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{[wu]:!0,values:e,nulls:t}},"buildHeaders");var Cr=class extends E{static{i(this,"Speech")}create(e,t){return this._client.post("/audio/speech",{body:e,...t,headers:S([{Accept:"application/octet-stream"},t?.headers]),__binaryResponse:!0})}};var Sr=class extends E{static{i(this,"Transcriptions")}create(e,t){return this._client.post("/audio/transcriptions",_e({body:e,...t,stream:e.stream??!1,__metadata:{model:e.model}},this._client))}};var vr=class extends E{static{i(this,"Translations")}create(e,t){return this._client.post("/audio/translations",_e({body:e,...t,__metadata:{model:e.model}},this._client))}};var $e=class extends E{static{i(this,"Audio")}constructor(){super(...arguments),this.transcriptions=new Sr(this._client),this.translations=new vr(this._client),this.speech=new Cr(this._client)}};$e.Transcriptions=Sr;$e.Translations=vr;$e.Speech=Cr;var It=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(h`/batches/${e}`,t)}list(e={},t){return this._client.getAPIList("/batches",M,{query:e,...t})}cancel(e,t){return this._client.post(h`/batches/${e}/cancel`,t)}};var yr=class extends E{static{i(this,"Assistants")}create(e,t){return this._client.post("/assistants",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(h`/assistants/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(h`/assistants/${e}`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e={},t){return this._client.getAPIList("/assistants",M,{query:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}delete(e,t){return this._client.delete(h`/assistants/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}};var Tr=class extends E{static{i(this,"Sessions")}create(e,t){return this._client.post("/realtime/sessions",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}};var _r=class extends E{static{i(this,"TranscriptionSessions")}create(e,t){return this._client.post("/realtime/transcription_sessions",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}};var ct=class extends E{static{i(this,"Realtime")}constructor(){super(...arguments),this.sessions=new Tr(this._client),this.transcriptionSessions=new _r(this._client)}};ct.Sessions=Tr;ct.TranscriptionSessions=_r;var Rr=class extends E{static{i(this,"Sessions")}create(e,t){return this._client.post("/chatkit/sessions",{body:e,...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}cancel(e,t){return this._client.post(h`/chatkit/sessions/${e}/cancel`,{...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}};var Pr=class extends E{static{i(this,"Threads")}retrieve(e,t){return this._client.get(h`/chatkit/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}list(e={},t){return this._client.getAPIList("/chatkit/threads",Fe,{query:e,...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}delete(e,t){return this._client.delete(h`/chatkit/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},t?.headers])})}listItems(e,t={},r){return this._client.getAPIList(h`/chatkit/threads/${e}/items`,Fe,{query:t,...r,headers:S([{"OpenAI-Beta":"chatkit_beta=v1"},r?.headers])})}};var lt=class extends E{static{i(this,"ChatKit")}constructor(){super(...arguments),this.sessions=new Rr(this._client),this.threads=new Pr(this._client)}};lt.Sessions=Rr;lt.Threads=Pr;var Ar=class extends E{static{i(this,"Messages")}create(e,t,r){return this._client.post(h`/threads/${e}/messages`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{thread_id:s}=t;return this._client.get(h`/threads/${s}/messages/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{thread_id:s,...o}=t;return this._client.post(h`/threads/${s}/messages/${e}`,{body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(h`/threads/${e}/messages`,M,{query:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t,r){let{thread_id:s}=t;return this._client.delete(h`/threads/${s}/messages/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};var br=class extends E{static{i(this,"Steps")}retrieve(e,t,r){let{thread_id:s,run_id:o,...a}=t;return this._client.get(h`/threads/${s}/runs/${o}/steps/${e}`,{query:a,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t,r){let{thread_id:s,...o}=t;return this._client.getAPIList(h`/threads/${s}/runs/${e}/steps`,M,{query:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};var Iu=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 ut=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 ee,xt,Ki,De,to,Re,Ot,wr,Mt,no,me,ro,so,zs,js,Bs,Mu,xu,Ou,Nu,Lu,$u,Du,Be=class extends ot{static{i(this,"AssistantStream")}constructor(){super(...arguments),ee.add(this),Ki.set(this,[]),De.set(this,{}),to.set(this,{}),Re.set(this,void 0),Ot.set(this,void 0),wr.set(this,void 0),Mt.set(this,void 0),no.set(this,void 0),me.set(this,void 0),ro.set(this,void 0),so.set(this,void 0),zs.set(this,void 0)}[(Ki=new WeakMap,De=new WeakMap,to=new WeakMap,Re=new WeakMap,Ot=new WeakMap,wr=new WeakMap,Mt=new WeakMap,no=new WeakMap,me=new WeakMap,ro=new WeakMap,so=new WeakMap,zs=new WeakMap,ee=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 xt;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=Ne.fromReadableStream(e,this.controller);for await(let o of s)g(this,ee,"m",js).call(this,o);if(s.controller.signal?.aborted)throw new z;return this._addRun(g(this,ee,"m",Bs).call(this))}toReadableStream(){return new Ne(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}static createToolAssistantStream(e,t,r,s){let o=new xt;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)g(this,ee,"m",js).call(this,l);if(c.controller.signal?.aborted)throw new z;return this._addRun(g(this,ee,"m",Bs).call(this))}static createThreadAssistantStream(e,t,r){let s=new xt;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 xt;return o._run(()=>o._runAssistantStream(e,t,r,{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),o}currentEvent(){return g(this,ro,"f")}currentRun(){return g(this,so,"f")}currentMessageSnapshot(){return g(this,Re,"f")}currentRunStepSnapshot(){return g(this,zs,"f")}async finalRunSteps(){return await this.done(),Object.values(g(this,De,"f"))}async finalMessages(){return await this.done(),Object.values(g(this,to,"f"))}async finalRun(){if(await this.done(),!g(this,Ot,"f"))throw Error("Final run was not received.");return g(this,Ot,"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)g(this,ee,"m",js).call(this,c);if(a.controller.signal?.aborted)throw new z;return this._addRun(g(this,ee,"m",Bs).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)g(this,ee,"m",js).call(this,l);if(c.controller.signal?.aborted)throw new z;return this._addRun(g(this,ee,"m",Bs).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(As(o)&&As(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(!As(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)}};xt=Be,js=i(function(e){if(!this.ended)switch(b(this,ro,e,"f"),g(this,ee,"m",Ou).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":g(this,ee,"m",Du).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":g(this,ee,"m",xu).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":g(this,ee,"m",Mu).call(this,e);break;case"error":throw new Error("Encountered an error event in event processing - errors should be processed earlier");default:}},"_AssistantStream_addEvent"),Bs=i(function(){if(this.ended)throw new y("stream has ended, this shouldn't happen");if(!g(this,Ot,"f"))throw Error("Final run has not been received");return g(this,Ot,"f")},"_AssistantStream_endRequest"),Mu=i(function(e){let[t,r]=g(this,ee,"m",Lu).call(this,e,g(this,Re,"f"));b(this,Re,t,"f"),g(this,to,"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!=g(this,wr,"f")){if(g(this,Mt,"f"))switch(g(this,Mt,"f").type){case"text":this._emit("textDone",g(this,Mt,"f").text,g(this,Re,"f"));break;case"image_file":this._emit("imageFileDone",g(this,Mt,"f").image_file,g(this,Re,"f"));break}b(this,wr,s.index,"f")}b(this,Mt,t.content[s.index],"f")}break;case"thread.message.completed":case"thread.message.incomplete":if(g(this,wr,"f")!==void 0){let s=e.data.content[g(this,wr,"f")];if(s)switch(s.type){case"image_file":this._emit("imageFileDone",s.image_file,g(this,Re,"f"));break;case"text":this._emit("textDone",s.text,g(this,Re,"f"));break}}g(this,Re,"f")&&this._emit("messageDone",e.data),b(this,Re,void 0,"f")}},"_AssistantStream_handleMessage"),xu=i(function(e){let t=g(this,ee,"m",Nu).call(this,e);switch(b(this,zs,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==g(this,no,"f")?this._emit("toolCallDelta",o,t.step_details.tool_calls[o.index]):(g(this,me,"f")&&this._emit("toolCallDone",g(this,me,"f")),b(this,no,o.index,"f"),b(this,me,t.step_details.tool_calls[o.index],"f"),g(this,me,"f")&&this._emit("toolCallCreated",g(this,me,"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":b(this,zs,void 0,"f"),e.data.step_details.type=="tool_calls"&&g(this,me,"f")&&(this._emit("toolCallDone",g(this,me,"f")),b(this,me,void 0,"f")),this._emit("runStepDone",e.data,t);break;case"thread.run.step.in_progress":break}},"_AssistantStream_handleRunStep"),Ou=i(function(e){g(this,Ki,"f").push(e),this._emit("event",e)},"_AssistantStream_handleEvent"),Nu=i(function(e){switch(e.event){case"thread.run.step.created":return g(this,De,"f")[e.data.id]=e.data,e.data;case"thread.run.step.delta":let t=g(this,De,"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=xt.accumulateDelta(t,r.delta);g(this,De,"f")[e.data.id]=s}return g(this,De,"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":g(this,De,"f")[e.data.id]=e.data;break}if(g(this,De,"f")[e.data.id])return g(this,De,"f")[e.data.id];throw new Error("No snapshot available")},"_AssistantStream_accumulateRunStep"),Lu=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]=g(this,ee,"m",$u).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"),$u=i(function(e,t){return xt.accumulateDelta(t,e)},"_AssistantStream_accumulateContent"),Du=i(function(e){switch(b(this,so,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":b(this,Ot,e.data,"f"),g(this,me,"f")&&(this._emit("toolCallDone",g(this,me,"f")),b(this,me,void 0,"f"));break;case"thread.run.cancelling":break}},"_AssistantStream_handleRun");var Nt=class extends E{static{i(this,"Runs")}constructor(){super(...arguments),this.steps=new br(this._client)}create(e,t,r){let{include:s,...o}=t;return this._client.post(h`/threads/${e}/runs`,{query:{include:s},body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers]),stream:t.stream??!1})}retrieve(e,t,r){let{thread_id:s}=t;return this._client.get(h`/threads/${s}/runs/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{thread_id:s,...o}=t;return this._client.post(h`/threads/${s}/runs/${e}`,{body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(h`/threads/${e}/runs`,M,{query:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}cancel(e,t,r){let{thread_id:s}=t;return this._client.post(h`/threads/${s}/runs/${e}/cancel`,{...r,headers:S([{"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 Be.createAssistantStream(e,this._client.beta.threads.runs,t,r)}async poll(e,t,r){let s=S([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 xe(c);break;case"requires_action":case"incomplete":case"cancelled":case"completed":case"failed":case"expired":return o}}}stream(e,t,r){return Be.createAssistantStream(e,this._client.beta.threads.runs,t,r)}submitToolOutputs(e,t,r){let{thread_id:s,...o}=t;return this._client.post(h`/threads/${s}/runs/${e}/submit_tool_outputs`,{body:o,...r,headers:S([{"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 Be.createToolAssistantStream(e,this._client.beta.threads.runs,t,r)}};Nt.Steps=br;var pt=class extends E{static{i(this,"Threads")}constructor(){super(...arguments),this.runs=new Nt(this._client),this.messages=new Ar(this._client)}create(e={},t){return this._client.post("/threads",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(h`/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(h`/threads/${e}`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t){return this._client.delete(h`/threads/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}createAndRun(e,t){return this._client.post("/threads/runs",{body:e,...t,headers:S([{"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 Be.createThreadAssistantStream(e,this._client.beta.threads,t)}};pt.Runs=Nt;pt.Messages=Ar;var Pe=class extends E{static{i(this,"Beta")}constructor(){super(...arguments),this.realtime=new ct(this._client),this.chatkit=new lt(this._client),this.assistants=new yr(this._client),this.threads=new pt(this._client)}};Pe.Realtime=ct;Pe.ChatKit=lt;Pe.Assistants=yr;Pe.Threads=pt;var Lt=class extends E{static{i(this,"Completions")}create(e,t){return this._client.post("/completions",{body:e,...t,stream:e.stream??!1})}};var Ir=class extends E{static{i(this,"Content")}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(h`/containers/${s}/files/${e}/content`,{...r,headers:S([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}};var $t=class extends E{static{i(this,"Files")}constructor(){super(...arguments),this.content=new Ir(this._client)}create(e,t,r){return this._client.post(h`/containers/${e}/files`,He({body:t,...r},this._client))}retrieve(e,t,r){let{container_id:s}=t;return this._client.get(h`/containers/${s}/files/${e}`,r)}list(e,t={},r){return this._client.getAPIList(h`/containers/${e}/files`,M,{query:t,...r})}delete(e,t,r){let{container_id:s}=t;return this._client.delete(h`/containers/${s}/files/${e}`,{...r,headers:S([{Accept:"*/*"},r?.headers])})}};$t.Content=Ir;var dt=class extends E{static{i(this,"Containers")}constructor(){super(...arguments),this.files=new $t(this._client)}create(e,t){return this._client.post("/containers",{body:e,...t})}retrieve(e,t){return this._client.get(h`/containers/${e}`,t)}list(e={},t){return this._client.getAPIList("/containers",M,{query:e,...t})}delete(e,t){return this._client.delete(h`/containers/${e}`,{...t,headers:S([{Accept:"*/*"},t?.headers])})}};dt.Files=$t;var Mr=class extends E{static{i(this,"Items")}create(e,t,r){let{include:s,...o}=t;return this._client.post(h`/conversations/${e}/items`,{query:{include:s},body:o,...r})}retrieve(e,t,r){let{conversation_id:s,...o}=t;return this._client.get(h`/conversations/${s}/items/${e}`,{query:o,...r})}list(e,t={},r){return this._client.getAPIList(h`/conversations/${e}/items`,Fe,{query:t,...r})}delete(e,t,r){let{conversation_id:s}=t;return this._client.delete(h`/conversations/${s}/items/${e}`,r)}};var ft=class extends E{static{i(this,"Conversations")}constructor(){super(...arguments),this.items=new Mr(this._client)}create(e={},t){return this._client.post("/conversations",{body:e,...t})}retrieve(e,t){return this._client.get(h`/conversations/${e}`,t)}update(e,t,r){return this._client.post(h`/conversations/${e}`,{body:t,...r})}delete(e,t){return this._client.delete(h`/conversations/${e}`,t)}};ft.Items=Mr;var Dt=class extends E{static{i(this,"Embeddings")}create(e,t){let r=!!e.encoding_format,s=r?e.encoding_format:"base64";r&&U(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:(U(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=Iu(l)}),a)))}};var xr=class extends E{static{i(this,"OutputItems")}retrieve(e,t,r){let{eval_id:s,run_id:o}=t;return this._client.get(h`/evals/${s}/runs/${o}/output_items/${e}`,r)}list(e,t,r){let{eval_id:s,...o}=t;return this._client.getAPIList(h`/evals/${s}/runs/${e}/output_items`,M,{query:o,...r})}};var kt=class extends E{static{i(this,"Runs")}constructor(){super(...arguments),this.outputItems=new xr(this._client)}create(e,t,r){return this._client.post(h`/evals/${e}/runs`,{body:t,...r})}retrieve(e,t,r){let{eval_id:s}=t;return this._client.get(h`/evals/${s}/runs/${e}`,r)}list(e,t={},r){return this._client.getAPIList(h`/evals/${e}/runs`,M,{query:t,...r})}delete(e,t,r){let{eval_id:s}=t;return this._client.delete(h`/evals/${s}/runs/${e}`,r)}cancel(e,t,r){let{eval_id:s}=t;return this._client.post(h`/evals/${s}/runs/${e}`,r)}};kt.OutputItems=xr;var mt=class extends E{static{i(this,"Evals")}constructor(){super(...arguments),this.runs=new kt(this._client)}create(e,t){return this._client.post("/evals",{body:e,...t})}retrieve(e,t){return this._client.get(h`/evals/${e}`,t)}update(e,t,r){return this._client.post(h`/evals/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/evals",M,{query:e,...t})}delete(e,t){return this._client.delete(h`/evals/${e}`,t)}};mt.Runs=kt;var Ft=class extends E{static{i(this,"Files")}create(e,t){return this._client.post("/files",_e({body:e,...t},this._client))}retrieve(e,t){return this._client.get(h`/files/${e}`,t)}list(e={},t){return this._client.getAPIList("/files",M,{query:e,...t})}delete(e,t){return this._client.delete(h`/files/${e}`,t)}content(e,t){return this._client.get(h`/files/${e}/content`,{...t,headers:S([{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 xe(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 Or=class extends E{static{i(this,"Methods")}};var Nr=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 Ht=class extends E{static{i(this,"Alpha")}constructor(){super(...arguments),this.graders=new Nr(this._client)}};Ht.Graders=Nr;var Lr=class extends E{static{i(this,"Permissions")}create(e,t,r){return this._client.getAPIList(h`/fine_tuning/checkpoints/${e}/permissions`,Le,{body:t,method:"post",...r})}retrieve(e,t={},r){return this._client.get(h`/fine_tuning/checkpoints/${e}/permissions`,{query:t,...r})}delete(e,t,r){let{fine_tuned_model_checkpoint:s}=t;return this._client.delete(h`/fine_tuning/checkpoints/${s}/permissions/${e}`,r)}};var Ut=class extends E{static{i(this,"Checkpoints")}constructor(){super(...arguments),this.permissions=new Lr(this._client)}};Ut.Permissions=Lr;var $r=class extends E{static{i(this,"Checkpoints")}list(e,t={},r){return this._client.getAPIList(h`/fine_tuning/jobs/${e}/checkpoints`,M,{query:t,...r})}};var Vt=class extends E{static{i(this,"Jobs")}constructor(){super(...arguments),this.checkpoints=new $r(this._client)}create(e,t){return this._client.post("/fine_tuning/jobs",{body:e,...t})}retrieve(e,t){return this._client.get(h`/fine_tuning/jobs/${e}`,t)}list(e={},t){return this._client.getAPIList("/fine_tuning/jobs",M,{query:e,...t})}cancel(e,t){return this._client.post(h`/fine_tuning/jobs/${e}/cancel`,t)}listEvents(e,t={},r){return this._client.getAPIList(h`/fine_tuning/jobs/${e}/events`,M,{query:t,...r})}pause(e,t){return this._client.post(h`/fine_tuning/jobs/${e}/pause`,t)}resume(e,t){return this._client.post(h`/fine_tuning/jobs/${e}/resume`,t)}};Vt.Checkpoints=$r;var Ae=class extends E{static{i(this,"FineTuning")}constructor(){super(...arguments),this.methods=new Or(this._client),this.jobs=new Vt(this._client),this.checkpoints=new Ut(this._client),this.alpha=new Ht(this._client)}};Ae.Methods=Or;Ae.Jobs=Vt;Ae.Checkpoints=Ut;Ae.Alpha=Ht;var Dr=class extends E{static{i(this,"GraderModels")}};var gt=class extends E{static{i(this,"Graders")}constructor(){super(...arguments),this.graderModels=new Dr(this._client)}};gt.GraderModels=Dr;var jt=class extends E{static{i(this,"Images")}createVariation(e,t){return this._client.post("/images/variations",_e({body:e,...t},this._client))}edit(e,t){return this._client.post("/images/edits",_e({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 Bt=class extends E{static{i(this,"Models")}retrieve(e,t){return this._client.get(h`/models/${e}`,t)}list(e){return this._client.getAPIList("/models",Le,e)}delete(e,t){return this._client.delete(h`/models/${e}`,t)}};var zt=class extends E{static{i(this,"Moderations")}create(e,t){return this._client.post("/moderations",{body:e,...t})}};var kr=class extends E{static{i(this,"Calls")}accept(e,t,r){return this._client.post(h`/realtime/calls/${e}/accept`,{body:t,...r,headers:S([{Accept:"*/*"},r?.headers])})}hangup(e,t){return this._client.post(h`/realtime/calls/${e}/hangup`,{...t,headers:S([{Accept:"*/*"},t?.headers])})}refer(e,t,r){return this._client.post(h`/realtime/calls/${e}/refer`,{body:t,...r,headers:S([{Accept:"*/*"},r?.headers])})}reject(e,t={},r){return this._client.post(h`/realtime/calls/${e}/reject`,{body:t,...r,headers:S([{Accept:"*/*"},r?.headers])})}};var Fr=class extends E{static{i(this,"ClientSecrets")}create(e,t){return this._client.post("/realtime/client_secrets",{body:e,...t})}};var ze=class extends E{static{i(this,"Realtime")}constructor(){super(...arguments),this.clientSecrets=new Fr(this._client),this.calls=new kr(this._client)}};ze.ClientSecrets=Fr;ze.Calls=kr;function ku(n,e){return!e||!dh(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)}:Yi(n,e)}i(ku,"maybeParseResponse");function Yi(n,e){let t=n.output.map(s=>{if(s.type==="function_call")return{...s,parsed_arguments:gh(e,s)};if(s.type==="message"){let o=s.content.map(a=>a.type==="output_text"?{...a,parsed:ph(e,a.text)}:a);return{...s,content:o}}return s}),r=Object.assign({},n,{output:t});return Object.getOwnPropertyDescriptor(n,"output_text")||oo(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}i(Yi,"parseResponse");function ph(n,e){return n.text?.format?.type!=="json_schema"?null:"$parseRaw"in n.text?.format?(n.text?.format).$parseRaw(e):JSON.parse(e)}i(ph,"parseTextFormat");function dh(n){return!!Ls(n.text?.format)}i(dh,"hasAutoParseableInput");function fh(n){return n?.$brand==="auto-parseable-tool"}i(fh,"isAutoParsableTool");function mh(n,e){return n.find(t=>t.type==="function"&&t.name===e)}i(mh,"getInputToolByName");function gh(n,e){let t=mh(n.tools??[],e.name);return{...e,...e,parsed_arguments:fh(t)?t.$parseRaw(e.arguments):t?.strict?JSON.parse(e.arguments):null}}i(gh,"parseToolCall");function oo(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("")}i(oo,"addOutputText");var Hr,io,ht,ao,Fu,Hu,Uu,Vu,co=class n extends ot{static{i(this,"ResponseStream")}constructor(e){super(),Hr.add(this),io.set(this,void 0),ht.set(this,void 0),ao.set(this,void 0),b(this,io,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())),g(this,Hr,"m",Fu).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)g(this,Hr,"m",Hu).call(this,c,a);if(o.controller.signal?.aborted)throw new z;return g(this,Hr,"m",Uu).call(this)}[(io=new WeakMap,ht=new WeakMap,ao=new WeakMap,Hr=new WeakSet,Fu=i(function(){this.ended||b(this,ht,void 0,"f")},"_ResponseStream_beginRequest"),Hu=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=g(this,Hr,"m",Vu).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 y(`missing output at index ${t.output_index}`);if(a.type==="message"){let c=a.content[t.content_index];if(!c)throw new y(`missing content at index ${t.content_index}`);if(c.type!=="output_text")throw new y(`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 y(`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"),Uu=i(function(){if(this.ended)throw new y("stream has ended, this shouldn't happen");let t=g(this,ht,"f");if(!t)throw new y("request ended without sending any events");b(this,ht,void 0,"f");let r=hh(t,g(this,io,"f"));return b(this,ao,r,"f"),r},"_ResponseStream_endRequest"),Vu=i(function(t){let r=g(this,ht,"f");if(!r){if(t.type!=="response.created")throw new y(`When snapshot hasn't been set yet, expected 'response.created' event, got ${t.type}`);return r=b(this,ht,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 y(`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 y(`missing output at index ${t.output_index}`);if(s.type==="message"){let o=s.content[t.content_index];if(!o)throw new y(`missing content at index ${t.content_index}`);if(o.type!=="output_text")throw new y(`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 y(`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 y(`missing output at index ${t.output_index}`);if(s.type==="reasoning"){let o=s.content?.[t.content_index];if(!o)throw new y(`missing content at index ${t.content_index}`);if(o.type!=="reasoning_text")throw new y(`expected content to be 'reasoning_text', got ${o.type}`);o.text+=t.delta}break}case"response.completed":{b(this,ht,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=g(this,ao,"f");if(!e)throw new y("stream ended without producing a ChatCompletion");return e}};function hh(n,e){return ku(n,e)}i(hh,"finalizeResponse");var Ur=class extends E{static{i(this,"InputItems")}list(e,t={},r){return this._client.getAPIList(h`/responses/${e}/input_items`,M,{query:t,...r})}};var Vr=class extends E{static{i(this,"InputTokens")}count(e={},t){return this._client.post("/responses/input_tokens",{body:e,...t})}};var We=class extends E{static{i(this,"Responses")}constructor(){super(...arguments),this.inputItems=new Ur(this._client),this.inputTokens=new Vr(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"&&oo(r),r))}retrieve(e,t={},r){return this._client.get(h`/responses/${e}`,{query:t,...r,stream:t?.stream??!1})._thenUnwrap(s=>("object"in s&&s.object==="response"&&oo(s),s))}delete(e,t){return this._client.delete(h`/responses/${e}`,{...t,headers:S([{Accept:"*/*"},t?.headers])})}parse(e,t){return this._client.responses.create(e,t)._thenUnwrap(r=>Yi(r,e))}stream(e,t){return co.createResponse(this._client,e,t)}cancel(e,t){return this._client.post(h`/responses/${e}/cancel`,t)}compact(e,t){return this._client.post("/responses/compact",{body:e,...t})}};We.InputItems=Ur;We.InputTokens=Vr;var jr=class extends E{static{i(this,"Content")}retrieve(e,t){return this._client.get(h`/skills/${e}/content`,{...t,headers:S([{Accept:"application/binary"},t?.headers]),__binaryResponse:!0})}};var Br=class extends E{static{i(this,"Content")}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(h`/skills/${s}/versions/${e}/content`,{...r,headers:S([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}};var Wt=class extends E{static{i(this,"Versions")}constructor(){super(...arguments),this.content=new Br(this._client)}create(e,t={},r){return this._client.post(h`/skills/${e}/versions`,He({body:t,...r},this._client))}retrieve(e,t,r){let{skill_id:s}=t;return this._client.get(h`/skills/${s}/versions/${e}`,r)}list(e,t={},r){return this._client.getAPIList(h`/skills/${e}/versions`,M,{query:t,...r})}delete(e,t,r){let{skill_id:s}=t;return this._client.delete(h`/skills/${s}/versions/${e}`,r)}};Wt.Content=Br;var qe=class extends E{static{i(this,"Skills")}constructor(){super(...arguments),this.content=new jr(this._client),this.versions=new Wt(this._client)}create(e={},t){return this._client.post("/skills",He({body:e,...t},this._client))}retrieve(e,t){return this._client.get(h`/skills/${e}`,t)}update(e,t,r){return this._client.post(h`/skills/${e}`,{body:t,...r})}list(e={},t){return this._client.getAPIList("/skills",M,{query:e,...t})}delete(e,t){return this._client.delete(h`/skills/${e}`,t)}};qe.Content=jr;qe.Versions=Wt;var zr=class extends E{static{i(this,"Parts")}create(e,t,r){return this._client.post(h`/uploads/${e}/parts`,_e({body:t,...r},this._client))}};var Et=class extends E{static{i(this,"Uploads")}constructor(){super(...arguments),this.parts=new zr(this._client)}create(e,t){return this._client.post("/uploads",{body:e,...t})}cancel(e,t){return this._client.post(h`/uploads/${e}/cancel`,t)}complete(e,t,r){return this._client.post(h`/uploads/${e}/complete`,{body:t,...r})}};Et.Parts=zr;var ju=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 Wr=class extends E{static{i(this,"FileBatches")}create(e,t,r){return this._client.post(h`/vector_stores/${e}/file_batches`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{vector_store_id:s}=t;return this._client.get(h`/vector_stores/${s}/file_batches/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}cancel(e,t,r){let{vector_store_id:s}=t;return this._client.post(h`/vector_stores/${s}/file_batches/${e}/cancel`,{...r,headers:S([{"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(h`/vector_stores/${s}/file_batches/${e}/files`,M,{query:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}async poll(e,t,r){let s=S([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 xe(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 f(C){for(let m of C){let R=await c.files.create({file:m,purpose:"assistants"},s);p.push(R.id)}}i(f,"processFiles");let d=Array(a).fill(l).map(f);return await ju(d),await this.createAndPoll(e,{file_ids:p})}};var qr=class extends E{static{i(this,"Files")}create(e,t,r){return this._client.post(h`/vector_stores/${e}/files`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}retrieve(e,t,r){let{vector_store_id:s}=t;return this._client.get(h`/vector_stores/${s}/files/${e}`,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}update(e,t,r){let{vector_store_id:s,...o}=t;return this._client.post(h`/vector_stores/${s}/files/${e}`,{body:o,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e,t={},r){return this._client.getAPIList(h`/vector_stores/${e}/files`,M,{query:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}delete(e,t,r){let{vector_store_id:s}=t;return this._client.delete(h`/vector_stores/${s}/files/${e}`,{...r,headers:S([{"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=S([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 xe(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(h`/vector_stores/${s}/files/${e}/content`,Le,{...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};var Ge=class extends E{static{i(this,"VectorStores")}constructor(){super(...arguments),this.files=new qr(this._client),this.fileBatches=new Wr(this._client)}create(e,t){return this._client.post("/vector_stores",{body:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}retrieve(e,t){return this._client.get(h`/vector_stores/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}update(e,t,r){return this._client.post(h`/vector_stores/${e}`,{body:t,...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}list(e={},t){return this._client.getAPIList("/vector_stores",M,{query:e,...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}delete(e,t){return this._client.delete(h`/vector_stores/${e}`,{...t,headers:S([{"OpenAI-Beta":"assistants=v2"},t?.headers])})}search(e,t,r){return this._client.getAPIList(h`/vector_stores/${e}/search`,Le,{body:t,method:"post",...r,headers:S([{"OpenAI-Beta":"assistants=v2"},r?.headers])})}};Ge.Files=qr;Ge.FileBatches=Wr;var qt=class extends E{static{i(this,"Videos")}create(e,t){return this._client.post("/videos",He({body:e,...t},this._client))}retrieve(e,t){return this._client.get(h`/videos/${e}`,t)}list(e={},t){return this._client.getAPIList("/videos",Fe,{query:e,...t})}delete(e,t){return this._client.delete(h`/videos/${e}`,t)}downloadContent(e,t={},r){return this._client.get(h`/videos/${e}/content`,{query:t,...r,headers:S([{Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}remix(e,t,r){return this._client.post(h`/videos/${e}/remix`,He({body:t,...r},this._client))}};var Gr,Bu,lo,Gt=class extends E{static{i(this,"Webhooks")}constructor(){super(...arguments),Gr.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");g(this,Gr,"m",Bu).call(this,r);let o=S([t]).values,a=g(this,Gr,"m",lo).call(this,o,"webhook-signature"),c=g(this,Gr,"m",lo).call(this,o,"webhook-timestamp"),l=g(this,Gr,"m",lo).call(this,o,"webhook-id"),p=parseInt(c,10);if(isNaN(p))throw new Me("Invalid webhook timestamp format");let f=Math.floor(Date.now()/1e3);if(f-p>s)throw new Me("Webhook timestamp is too old");if(p>f+s)throw new Me("Webhook timestamp is too new");let d=a.split(" ").map(A=>A.startsWith("v1,")?A.substring(3):A),C=r.startsWith("whsec_")?Buffer.from(r.replace("whsec_",""),"base64"):Buffer.from(r,"utf-8"),m=l?`${l}.${c}.${e}`:`${c}.${e}`,R=await crypto.subtle.importKey("raw",C,{name:"HMAC",hash:"SHA-256"},!1,["verify"]);for(let A of d)try{let $=Buffer.from(A,"base64");if(await crypto.subtle.verify("HMAC",R,$,new TextEncoder().encode(m)))return}catch{continue}throw new Me("The given webhook signature does not match the expected signature")}};Gr=new WeakSet,Bu=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"),lo=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 Qi,Zi,uo,zu,w=class{static{i(this,"OpenAI")}constructor({baseURL:e=ut("OPENAI_BASE_URL"),apiKey:t=ut("OPENAI_API_KEY"),organization:r=ut("OPENAI_ORG_ID")??null,project:s=ut("OPENAI_PROJECT_ID")??null,webhookSecret:o=ut("OPENAI_WEBHOOK_SECRET")??null,...a}={}){if(Qi.add(this),uo.set(this,void 0),this.completions=new Lt(this),this.chat=new at(this),this.embeddings=new Dt(this),this.files=new Ft(this),this.images=new jt(this),this.audio=new $e(this),this.moderations=new zt(this),this.models=new Bt(this),this.fineTuning=new Ae(this),this.graders=new gt(this),this.vectorStores=new Ge(this),this.webhooks=new Gt(this),this.beta=new Pe(this),this.batches=new It(this),this.uploads=new Et(this),this.responses=new We(this),this.realtime=new ze(this),this.conversations=new ft(this),this.evals=new mt(this),this.containers=new dt(this),this.skills=new qe(this),this.videos=new qt(this),t===void 0)throw new y("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&&Yl())throw new y(`It looks like you're running in a browser-like environment.
98
98
 
99
99
  This is disabled by default, as it risks exposing your secret API credentials to attackers.
100
100
  If you understand the risks and have appropriate mitigations in place,
@@ -103,10 +103,10 @@ you can set the \`dangerouslyAllowBrowser\` option to \`true\`, e.g.,
103
103
  new OpenAI({ apiKey, dangerouslyAllowBrowser: true });
104
104
 
105
105
  https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
106
- `);this.baseURL=c.baseURL,this.timeout=c.timeout??zi.DEFAULT_TIMEOUT,this.logger=c.logger??console;let l="warn";this.logLevel=l,this.logLevel=Si(c.logLevel,"ClientOptions.logLevel",this)??Si(ut("OPENAI_LOG"),"process.env['OPENAI_LOG']",this)??l,this.fetchOptions=c.fetchOptions,this.maxRetries=c.maxRetries??2,this.fetch=c.fetch??$l(),w(this,co,kl,"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 S([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return Ci(e,{arrayFormat:"brackets"})}getUserAgent(){return`${this.constructor.name}/JS ${nt}`}defaultIdempotencyKey(){return`stainless-node-retry-${ai()}`}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 y?r:new y(`Failed to get token from 'apiKey' function: ${r.message}`,{cause:r})}if(typeof t!="string"||!t)throw new y(`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,ji,"m",Au).call(this)&&r||this.baseURL,o=Pl(e)?new URL(e):new URL(s+(s.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),a=this.defaultQuery();return Al(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 Rt(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"),f=r===void 0?"":`, retryOf: ${r}`,d=Date.now();if(U(this).debug(`[${p}] sending request`,De({retryOfRequestLogID:r,method:s.method,url:c,options:s,headers:a.headers})),s.signal?.aborted)throw new z;let E=new AbortController,m=await this.fetchWithTimeout(c,a,l,E).catch(Rs),R=Date.now();if(m instanceof globalThis.Error){let L=`retrying, ${t} attempts remaining`;if(s.signal?.aborted)throw new z;let P=_s(m)||/timed? ?out/i.test(String(m)+("cause"in m?String(m.cause):""));if(t)return U(this).info(`[${p}] connection ${P?"timed out":"failed"} - ${L}`),U(this).debug(`[${p}] connection ${P?"timed out":"failed"} (${L})`,De({retryOfRequestLogID:r,url:c,durationMs:R-d,message:m.message})),this.retryRequest(s,t,r??p);throw U(this).info(`[${p}] connection ${P?"timed out":"failed"} - error; no more retries left`),U(this).debug(`[${p}] connection ${P?"timed out":"failed"} (error; no more retries left)`,De({retryOfRequestLogID:r,url:c,durationMs:R-d,message:m.message})),P?new st:new rt({cause:m})}let A=[...m.headers.entries()].filter(([L])=>L==="x-request-id").map(([L,P])=>", "+L+": "+JSON.stringify(P)).join(""),$=`[${p}${f}${A}] ${a.method} ${c} ${m.ok?"succeeded":"failed"} with status ${m.status} in ${R-d}ms`;if(!m.ok){let L=await this.shouldRetry(m);if(t&&L){let H=`retrying, ${t} attempts remaining`;return await Dl(m.body),U(this).info(`${$} - ${H}`),U(this).debug(`[${p}] response error (${H})`,De({retryOfRequestLogID:r,url:m.url,status:m.status,headers:m.headers,durationMs:R-d})),this.retryRequest(s,t,r??p,m.headers)}let P=L?"error; no more retries left":"error; not retryable";U(this).info(`${$} - ${P}`);let V=await m.text().catch(H=>Rs(H).message),F=Il(V),le=F?void 0:V;throw U(this).debug(`[${p}] response error (${P})`,De({retryOfRequestLogID:r,url:m.url,status:m.status,headers:m.headers,message:le,durationMs:Date.now()-d})),this.makeStatusError(m.status,F,le,m.headers)}return U(this).info($),U(this).debug(`[${p}] response start`,De({retryOfRequestLogID:r,url:m.url,status:m.status,headers:m.headers,durationMs:R-d})),{response:m,options:s,controller:E,requestLogID:p,retryOfRequestLogID:r,startTime:d}}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 Ms(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),f=globalThis.ReadableStream&&c.body instanceof globalThis.ReadableStream||typeof c.body=="object"&&c.body!==null&&Symbol.asyncIterator in c.body,d={signal:s.signal,...f?{duplex:"half"}:{},method:"GET",...c};a&&(d.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,d)}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 Me(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&&bl("timeout",r.timeout),r.timeout=r.timeout??this.timeout;let{bodyHeaders:p,body:f}=this.buildBody({options:r}),d=await this.buildHeaders({options:e,method:s,bodyHeaders:p,retryCount:t});return{req:{method:s,headers:d,...r.signal&&{signal:r.signal},...globalThis.ReadableStream&&f instanceof globalThis.ReadableStream&&{duplex:"half"},...f&&{body:f},...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=S([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))}:{},...Ll(),"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=S([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:Ln(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,co,"f").call(this,{body:e,headers:r})}};zi=b,co=new WeakMap,ji=new WeakSet,Au=i(function(){return this.baseURL!=="https://api.openai.com/v1"},"_OpenAI_baseURLOverridden");b.OpenAI=zi;b.DEFAULT_TIMEOUT=6e5;b.OpenAIError=y;b.APIError=q;b.APIConnectionError=rt;b.APIConnectionTimeoutError=st;b.APIUserAbortError=z;b.NotFoundError=or;b.ConflictError=ir;b.RateLimitError=cr;b.BadRequestError=rr;b.AuthenticationError=sr;b.InternalServerError=lr;b.PermissionDeniedError=nr;b.UnprocessableEntityError=ar;b.InvalidWebhookSignatureError=Ie;b.toFile=jn;b.Completions=Nt;b.Chat=at;b.Embeddings=$t;b.Files=kt;b.Images=Vt;b.Audio=Le;b.Moderations=jt;b.Models=Bt;b.FineTuning=Pe;b.Graders=ht;b.VectorStores=qe;b.Webhooks=qt;b.Beta=Re;b.Batches=bt;b.Uploads=Ct;b.Responses=ze;b.Realtime=je;b.Conversations=ft;b.Evals=mt;b.Containers=dt;b.Skills=We;b.Videos=Wt;function ag(n){return n.replace(/<think>[\s\S]*?<\/think>/g,"").trim()}i(ag,"removeThinkTags");var lo=class{static{i(this,"LLMService")}client=null;model="";constructor(){this.initClient()}initClient(){let e=Wi.getLLMConfig();if(!e||!Wi.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 b({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=Wi.getLLMConfig(),r=Rl(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=ag(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 cg}from"stream";import{configManager as lg}from"@xiaozhi-client/config";import{TTS as ug}from"@xiaozhi-client/tts";import*as qi from"prism-media";var uo=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=lg.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 qi.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 ug({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 qi.opus.OggDemuxer,a=cg.from(e),c=0,l=0,p=0;a.pause();let f=i(async R=>{let A=this.getPacketDuration(R);try{await t(R,{index:c,size:R.length,duration:A,timestamp:l}),c++,l+=A,p+=A}catch($){u.error(`\u53D1\u9001\u5305 ${c} \u5931\u8D25:`,$)}},"processPacket"),d=!1,E=[],m=i(async()=>{if(!(d||E.length===0)){for(d=!0;E.length>0;){let R=E.shift();await f(R)}d=!1}},"processQueue");a.pipe(o).on("data",R=>{E.push(R),m()}).on("end",()=>{let R=i(()=>{E.length>0||d?setTimeout(R,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");R()}).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 po=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 lo,this.asrService=this.createASRService(),this.ttsService=this.createTTSService(),this.setupTTSGetConnection()}createASRService(){return new Nn({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 uo({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}=yl(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 f=`ws://${o.includes(":")?o:`${o}:9999`}/ws`;u.info(`\u8FD4\u56DEWebSocket\u914D\u7F6E: deviceId=${e}, clientId=${t}, wsUrl=${f}`);let d={websocket:{url:f,token:"",version:2},serverTime:{timestamp:Date.now(),timezoneOffset:new Date().getTimezoneOffset()*-60*1e3},firmware:{version:"2.2.2",url:"",force:!1}};return tr(d)}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 On(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")}};import{serve as Sg}from"@hono/node-server";import{normalizeServiceConfig as vg}from"@xiaozhi-client/config";import{configManager as Gs}from"@xiaozhi-client/config";import{EndpointManager as yg}from"@xiaozhi-client/endpoint";import{WebSocketServer as Tg}from"ws";function pg(n){return Array.isArray(n.routes)}i(pg,"isRouteGroup");function wu(n){if(pg(n)){let{routes:e,middleware:t}=n;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return n}i(wu,"normalizeRoutes");function D(n){return e=>t=>{let s=t.get("dependencies")[n];return e(s,t)}}i(D,"createHandler");var zs=class{constructor(e){this.logger=e}static{i(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=wu(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,f)=>{try{return await a(p)}catch(d){return this.logger.error(`\u8DEF\u7531\u5904\u7406\u9519\u8BEF [${s} ${o}]:`,d),p.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",d instanceof Error?d.message:String(d),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 Ge=D("configApiHandler"),Gi=[{method:"GET",path:"/api/config",handler:Ge((n,e)=>n.getConfig(e))},{method:"PUT",path:"/api/config",handler:Ge((n,e)=>n.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:Ge((n,e)=>n.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:Ge((n,e)=>n.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:Ge((n,e)=>n.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:Ge((n,e)=>n.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:Ge((n,e)=>n.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:Ge((n,e)=>n.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:Ge((n,e)=>n.checkConfigExists(e))}];var Xr=D("statusApiHandler"),Xi=[{method:"GET",path:"/api/status",handler:Xr((n,e)=>n.getStatus(e))},{method:"GET",path:"/api/status/client",handler:Xr((n,e)=>n.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:Xr((n,e)=>n.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:Xr((n,e)=>n.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:Xr((n,e)=>n.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:Xr((n,e)=>n.setActiveMCPServers(e))}];var Et=D("mcpToolHandler"),Ji=[{method:"POST",path:"/api/tools/call",handler:Et((n,e)=>n.callTool(e))},{method:"GET",path:"/api/tools/list",handler:Et((n,e)=>n.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:Et((n,e)=>n.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:Et((n,e)=>n.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:Et((n,e)=>n.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:Et((n,e)=>n.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:Et((n,e)=>n.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:Et((n,e)=>n.listMCPTools(e))}];var dg=D("mcpRouteHandler"),Ki=[{method:"POST",path:"/mcp",handler:dg((n,e)=>n.handlePost(e))}];var fo=D("versionApiHandler"),Yi=[{method:"GET",path:"/api/version",handler:fo((n,e)=>n.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:fo((n,e)=>n.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:fo((n,e)=>n.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:fo((n,e)=>n.checkLatestVersion(e))}];var Ws=D("serviceApiHandler"),Qi=[{method:"POST",path:"/api/services/restart",handler:Ws((n,e)=>n.restartService(e))},{method:"POST",path:"/api/services/stop",handler:Ws((n,e)=>n.stopService(e))},{method:"POST",path:"/api/services/start",handler:Ws((n,e)=>n.startService(e))},{method:"GET",path:"/api/services/status",handler:Ws((n,e)=>n.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:Ws((n,e)=>n.getServiceHealth(e))}];var fg=D("updateApiHandler"),Zi=[{method:"POST",path:"/api/update",handler:fg((n,e)=>n.performUpdate(e))}];var mg=D("staticFileHandler"),ea=[{method:"GET",path:"/*",handler:mg(async(n,e)=>e.req.path.startsWith("/api/")?e.notFound():await n.handleStaticFile(e))}];var mo=D("cozeHandler"),ta=[{method:"GET",path:"/api/coze/workspaces",handler:mo((n,e)=>n.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:mo((n,e)=>n.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:mo((n,e)=>n.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:mo((n,e)=>n.getCacheStats(e))}];var hg=D("mcpToolLogHandler"),ra=[{method:"GET",path:"/api/tool-calls/logs",handler:hg((n,e)=>n.getToolCallLogs(e))}];var ho=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"),sa=[{method:"POST",path:"/api/mcp-servers",handler:i(n=>ho(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:i(n=>ho(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:i(n=>ho(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:i(n=>ho(n,e=>e.listMCPServers(n)),"handler")}];var qs=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"),na=[{method:"POST",path:"/api/endpoint/status",handler:i(n=>qs(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:i(n=>qs(n,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:i(n=>qs(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:i(n=>qs(n,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:i(n=>qs(n,"removeEndpoint"),"handler")}];var gg=D("serviceApiHandler"),oa=[{method:"POST",path:"/api/restart",handler:gg((n,e)=>n.restartService(e))}];var Cg=D("ttsApiHandler"),ia=[{method:"POST",path:"/api/tts",handler:Cg((n,e)=>n.synthesize(e))}];var cL=D("esp32Handler"),aa=i(n=>async e=>{let r=e.get("dependencies").esp32Handler;return r?n(r,e):e.json({error:"ESP32 service not available"},503)},"createESP32Handler"),ca=[{method:"POST",path:"/",handler:aa((n,e)=>n.handleOTA(e))},{method:"POST",path:"/xiaozhi/ota/",handler:aa((n,e)=>n.handleOTA(e))},{method:"GET",path:"/ws",handler:aa(async(n,e)=>(e.get("logger").debug("ESP32 WebSocket\u7AEF\u70B9\u8BBF\u95EE"),e.text("WebSocket Upgrade Required",426)))}];var bu=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??Gs.getWebUIPort()??Jt.DEFAULT_PORT}catch{this.port=e??Jt.DEFAULT_PORT}this.logger=u,this.eventBus=N(),this.statusService=new In,this.notificationService=new Mn,this.deviceRegistryService=new xn,this.esp32Service=new po(this.deviceRegistryService),this.esp32Service.setupTTSGetConnection(),this.configApiHandler=new Js,this.statusApiHandler=new pn(this.statusService),this.serviceApiHandler=new ln(this.statusService),this.mcpToolHandler=new fn,this.mcpToolLogHandler=new mn,this.versionApiHandler=new bn,this.staticFileHandler=new ps,this.mcpRouteHandler=new on,this.updateApiHandler=new wn,this.cozeHandler=new Qr,this.ttsApiHandler=new vs,this.esp32Handler=new ys(this.esp32Service),this.realtimeNotificationHandler=new cn(this.notificationService,this.statusService),this.heartbeatHandler=new Zs(this.statusService,this.notificationService),this.app=va(),this.setupMiddleware(),this.app.notFound(ri),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 as,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new ls(this.mcpServiceManager,Gs),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:en(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
106
+ `);this.baseURL=c.baseURL,this.timeout=c.timeout??Zi.DEFAULT_TIMEOUT,this.logger=c.logger??console;let l="warn";this.logLevel=l,this.logLevel=wi(c.logLevel,"ClientOptions.logLevel",this)??wi(ut("OPENAI_LOG"),"process.env['OPENAI_LOG']",this)??l,this.fetchOptions=c.fetchOptions,this.maxRetries=c.maxRetries??2,this.fetch=c.fetch??Zl(),b(this,uo,tu,"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 S([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return Ai(e,{arrayFormat:"brackets"})}getUserAgent(){return`${this.constructor.name}/JS ${nt}`}defaultIdempotencyKey(){return`stainless-node-retry-${hi()}`}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 y?r:new y(`Failed to get token from 'apiKey' function: ${r.message}`,{cause:r})}if(typeof t!="string"||!t)throw new y(`Expected 'apiKey' function argument to return a string but it returned ${t}`);return this.apiKey=t,!0}buildURL(e,t,r){let s=!g(this,Qi,"m",zu).call(this)&&r||this.baseURL,o=Bl(e)?new URL(e):new URL(s+(s.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),a=this.defaultQuery();return zl(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 Pt(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"),f=r===void 0?"":`, retryOf: ${r}`,d=Date.now();if(U(this).debug(`[${p}] sending request`,ke({retryOfRequestLogID:r,method:s.method,url:c,options:s,headers:a.headers})),s.signal?.aborted)throw new z;let C=new AbortController,m=await this.fetchWithTimeout(c,a,l,C).catch(Ps),R=Date.now();if(m instanceof globalThis.Error){let L=`retrying, ${t} attempts remaining`;if(s.signal?.aborted)throw new z;let P=Rs(m)||/timed? ?out/i.test(String(m)+("cause"in m?String(m.cause):""));if(t)return U(this).info(`[${p}] connection ${P?"timed out":"failed"} - ${L}`),U(this).debug(`[${p}] connection ${P?"timed out":"failed"} (${L})`,ke({retryOfRequestLogID:r,url:c,durationMs:R-d,message:m.message})),this.retryRequest(s,t,r??p);throw U(this).info(`[${p}] connection ${P?"timed out":"failed"} - error; no more retries left`),U(this).debug(`[${p}] connection ${P?"timed out":"failed"} (error; no more retries left)`,ke({retryOfRequestLogID:r,url:c,durationMs:R-d,message:m.message})),P?new st:new rt({cause:m})}let A=[...m.headers.entries()].filter(([L])=>L==="x-request-id").map(([L,P])=>", "+L+": "+JSON.stringify(P)).join(""),$=`[${p}${f}${A}] ${a.method} ${c} ${m.ok?"succeeded":"failed"} with status ${m.status} in ${R-d}ms`;if(!m.ok){let L=await this.shouldRetry(m);if(t&&L){let H=`retrying, ${t} attempts remaining`;return await eu(m.body),U(this).info(`${$} - ${H}`),U(this).debug(`[${p}] response error (${H})`,ke({retryOfRequestLogID:r,url:m.url,status:m.status,headers:m.headers,durationMs:R-d})),this.retryRequest(s,t,r??p,m.headers)}let P=L?"error; no more retries left":"error; not retryable";U(this).info(`${$} - ${P}`);let V=await m.text().catch(H=>Ps(H).message),F=Gl(V),ue=F?void 0:V;throw U(this).debug(`[${p}] response error (${P})`,ke({retryOfRequestLogID:r,url:m.url,status:m.status,headers:m.headers,message:ue,durationMs:Date.now()-d})),this.makeStatusError(m.status,F,ue,m.headers)}return U(this).info($),U(this).debug(`[${p}] response start`,ke({retryOfRequestLogID:r,url:m.url,status:m.status,headers:m.headers,durationMs:R-d})),{response:m,options:s,controller:C,requestLogID:p,retryOfRequestLogID:r,startTime:d}}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 xs(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),f=globalThis.ReadableStream&&c.body instanceof globalThis.ReadableStream||typeof c.body=="object"&&c.body!==null&&Symbol.asyncIterator in c.body,d={signal:s.signal,...f?{duplex:"half"}:{},method:"GET",...c};a&&(d.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,d)}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 xe(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&&ql("timeout",r.timeout),r.timeout=r.timeout??this.timeout;let{bodyHeaders:p,body:f}=this.buildBody({options:r}),d=await this.buildHeaders({options:e,method:s,bodyHeaders:p,retryCount:t});return{req:{method:s,headers:d,...r.signal&&{signal:r.signal},...globalThis.ReadableStream&&f instanceof globalThis.ReadableStream&&{duplex:"half"},...f&&{body:f},...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=S([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))}:{},...Ql(),"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=S([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:Dn(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)}:g(this,uo,"f").call(this,{body:e,headers:r})}};Zi=w,uo=new WeakMap,Qi=new WeakSet,zu=i(function(){return this.baseURL!=="https://api.openai.com/v1"},"_OpenAI_baseURLOverridden");w.OpenAI=Zi;w.DEFAULT_TIMEOUT=6e5;w.OpenAIError=y;w.APIError=q;w.APIConnectionError=rt;w.APIConnectionTimeoutError=st;w.APIUserAbortError=z;w.NotFoundError=or;w.ConflictError=ir;w.RateLimitError=cr;w.BadRequestError=rr;w.AuthenticationError=sr;w.InternalServerError=lr;w.PermissionDeniedError=nr;w.UnprocessableEntityError=ar;w.InvalidWebhookSignatureError=Me;w.toFile=Wn;w.Completions=Lt;w.Chat=at;w.Embeddings=Dt;w.Files=Ft;w.Images=jt;w.Audio=$e;w.Moderations=zt;w.Models=Bt;w.FineTuning=Ae;w.Graders=gt;w.VectorStores=Ge;w.Webhooks=Gt;w.Beta=Pe;w.Batches=It;w.Uploads=Et;w.Responses=We;w.Realtime=ze;w.Conversations=ft;w.Evals=mt;w.Containers=dt;w.Skills=qe;w.Videos=qt;function Ah(n){return n.replace(/<think>[\s\S]*?<\/think>/g,"").trim()}i(Ah,"removeThinkTags");var Ws=class{static{i(this,"LLMService")}client=null;model="";constructor(){this.initClient()}initClient(){let e=po.getLLMConfig();if(!e||!po.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 w({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&&po.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=po.getLLMConfig(),r=_a(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=Ah(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 bh}from"stream";import{configManager as wh}from"@xiaozhi-client/config";import{TTS as Ih}from"@xiaozhi-client/tts";import*as ea from"prism-media";var fo=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=wh.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 ea.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 Ih({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 ea.opus.OggDemuxer,a=bh.from(e),c=0,l=0,p=0;a.pause();let f=i(async R=>{let A=this.getPacketDuration(R);try{await t(R,{index:c,size:R.length,duration:A,timestamp:l}),c++,l+=A,p+=A}catch($){u.error(`\u53D1\u9001\u5305 ${c} \u5931\u8D25:`,$)}},"processPacket"),d=!1,C=[],m=i(async()=>{if(!(d||C.length===0)){for(d=!0;C.length>0;){let R=C.shift();await f(R)}d=!1}},"processQueue");a.pipe(o).on("data",R=>{C.push(R),m()}).on("end",()=>{let R=i(()=>{C.length>0||d?setTimeout(R,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");R()}).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 mo=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 Ws,this.asrService=this.createASRService(),this.ttsService=this.createTTSService(),this.setupTTSGetConnection()}createASRService(){return new $n({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 fo({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 Ws,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}=jl(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 f=`ws://${o.includes(":")?o:`${o}:9999`}/ws`;u.info(`\u8FD4\u56DEWebSocket\u914D\u7F6E: deviceId=${e}, clientId=${t}, wsUrl=${f}`);let d={websocket:{url:f,token:"",version:2},serverTime:{timestamp:Date.now(),timezoneOffset:new Date().getTimezoneOffset()*-60*1e3},firmware:{version:"2.2.2",url:"",force:!1}};return tr(d)}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 Ln(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")}};import{serve as kh}from"@hono/node-server";import{normalizeServiceConfig as Fh}from"@xiaozhi-client/config";import{configManager as Js}from"@xiaozhi-client/config";import{EndpointManager as Hh}from"@xiaozhi-client/endpoint";import{WebSocketServer as Uh}from"ws";function Mh(n){return Array.isArray(n.routes)}i(Mh,"isRouteGroup");function Wu(n){if(Mh(n)){let{routes:e,middleware:t}=n;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return n}i(Wu,"normalizeRoutes");function D(n){return e=>t=>{let s=t.get("dependencies")[n];return e(s,t)}}i(D,"createHandler");var qs=class{constructor(e){this.logger=e}static{i(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=Wu(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,f)=>{try{return await a(p)}catch(d){return this.logger.error(`\u8DEF\u7531\u5904\u7406\u9519\u8BEF [${s} ${o}]:`,d),p.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",d instanceof Error?d.message:String(d),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 le=D("configApiHandler"),ta=[{method:"GET",path:"/api/config",handler:le((n,e)=>n.getConfig(e))},{method:"PUT",path:"/api/config",handler:le((n,e)=>n.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:le((n,e)=>n.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:le((n,e)=>n.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:le((n,e)=>n.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:le((n,e)=>n.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:le((n,e)=>n.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:le((n,e)=>n.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:le((n,e)=>n.checkConfigExists(e))},{method:"GET",path:"/api/config/prompts",handler:le((n,e)=>n.getPromptFiles(e))},{method:"GET",path:"/api/config/prompts/content",handler:le((n,e)=>n.getPromptFileContent(e))},{method:"PUT",path:"/api/config/prompts/content",handler:le((n,e)=>n.updatePromptFileContent(e))},{method:"POST",path:"/api/config/prompts/content",handler:le((n,e)=>n.createPromptFileContent(e))},{method:"DELETE",path:"/api/config/prompts/content",handler:le((n,e)=>n.deletePromptFileContent(e))}];var Xr=D("statusApiHandler"),ra=[{method:"GET",path:"/api/status",handler:Xr((n,e)=>n.getStatus(e))},{method:"GET",path:"/api/status/client",handler:Xr((n,e)=>n.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:Xr((n,e)=>n.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:Xr((n,e)=>n.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:Xr((n,e)=>n.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:Xr((n,e)=>n.setActiveMCPServers(e))}];var Ct=D("mcpToolHandler"),sa=[{method:"POST",path:"/api/tools/call",handler:Ct((n,e)=>n.callTool(e))},{method:"GET",path:"/api/tools/list",handler:Ct((n,e)=>n.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:Ct((n,e)=>n.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:Ct((n,e)=>n.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:Ct((n,e)=>n.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:Ct((n,e)=>n.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:Ct((n,e)=>n.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:Ct((n,e)=>n.listMCPTools(e))}];var xh=D("mcpRouteHandler"),na=[{method:"POST",path:"/mcp",handler:xh((n,e)=>n.handlePost(e))}];var go=D("versionApiHandler"),oa=[{method:"GET",path:"/api/version",handler:go((n,e)=>n.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:go((n,e)=>n.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:go((n,e)=>n.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:go((n,e)=>n.checkLatestVersion(e))}];var Gs=D("serviceApiHandler"),ia=[{method:"POST",path:"/api/services/restart",handler:Gs((n,e)=>n.restartService(e))},{method:"POST",path:"/api/services/stop",handler:Gs((n,e)=>n.stopService(e))},{method:"POST",path:"/api/services/start",handler:Gs((n,e)=>n.startService(e))},{method:"GET",path:"/api/services/status",handler:Gs((n,e)=>n.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:Gs((n,e)=>n.getServiceHealth(e))}];var Oh=D("updateApiHandler"),aa=[{method:"POST",path:"/api/update",handler:Oh((n,e)=>n.performUpdate(e))}];var Nh=D("staticFileHandler"),ca=[{method:"GET",path:"/*",handler:Nh(async(n,e)=>e.req.path.startsWith("/api/")?e.notFound():await n.handleStaticFile(e))}];var ho=D("cozeHandler"),la=[{method:"GET",path:"/api/coze/workspaces",handler:ho((n,e)=>n.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:ho((n,e)=>n.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:ho((n,e)=>n.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:ho((n,e)=>n.getCacheStats(e))}];var Lh=D("mcpToolLogHandler"),ua=[{method:"GET",path:"/api/tool-calls/logs",handler:Lh((n,e)=>n.getToolCallLogs(e))}];var Eo=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"),pa=[{method:"POST",path:"/api/mcp-servers",handler:i(n=>Eo(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:i(n=>Eo(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:i(n=>Eo(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:i(n=>Eo(n,e=>e.listMCPServers(n)),"handler")}];var Xs=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"),da=[{method:"POST",path:"/api/endpoint/status",handler:i(n=>Xs(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:i(n=>Xs(n,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:i(n=>Xs(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:i(n=>Xs(n,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:i(n=>Xs(n,"removeEndpoint"),"handler")}];var $h=D("serviceApiHandler"),fa=[{method:"POST",path:"/api/restart",handler:$h((n,e)=>n.restartService(e))}];var qu=D("ttsApiHandler"),ma=[{method:"POST",path:"/api/tts",handler:qu((n,e)=>n.synthesize(e))},{method:"GET",path:"/api/tts/voices",handler:qu((n,e)=>n.getVoices(e))}];var xL=D("esp32Handler"),ga=i(n=>async e=>{let r=e.get("dependencies").esp32Handler;return r?n(r,e):e.json({error:"ESP32 service not available"},503)},"createESP32Handler"),ha=[{method:"POST",path:"/",handler:ga((n,e)=>n.handleOTA(e))},{method:"POST",path:"/xiaozhi/ota/",handler:ga((n,e)=>n.handleOTA(e))},{method:"GET",path:"/ws",handler:ga(async(n,e)=>(e.get("logger").debug("ESP32 WebSocket\u7AEF\u70B9\u8BBF\u95EE"),e.text("WebSocket Upgrade Required",426)))}];var Gu=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??Js.getWebUIPort()??Kt.DEFAULT_PORT}catch{this.port=e??Kt.DEFAULT_PORT}this.logger=u,this.eventBus=N(),this.statusService=new xn,this.notificationService=new On,this.deviceRegistryService=new Nn,this.esp32Service=new mo(this.deviceRegistryService),this.esp32Service.setupTTSGetConnection(),this.configApiHandler=new Ys,this.statusApiHandler=new fn(this.statusService),this.serviceApiHandler=new pn(this.statusService),this.mcpToolHandler=new gn,this.mcpToolLogHandler=new hn,this.versionApiHandler=new Mn,this.staticFileHandler=new ds,this.mcpRouteHandler=new cn,this.updateApiHandler=new In,this.cozeHandler=new Zr,this.ttsApiHandler=new ys,this.esp32Handler=new Ts(this.esp32Service),this.realtimeNotificationHandler=new un(this.notificationService,this.statusService),this.heartbeatHandler=new tn(this.statusService,this.notificationService),this.app=Va(),this.setupMiddleware(),this.app.notFound(pi),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 cs,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new us(this.mcpServiceManager,Js),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:rn(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
107
  1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
108
108
  2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
109
109
  3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
110
110
  4. \u7528\u6237\u9700\u8981\u901A\u8FC7 API \u91CD\u65B0\u914D\u7F6E\u7AEF\u70B9\u6216\u670D\u52A1\u5668
111
- 5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new as,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(!Gs.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");Gs.cleanupInvalidServerToolsConfig();let e=Gs.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??Jt.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=vg(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 yg({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 er("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 f=Math.min(s*a**(l-1),o);this.logger.info(`${t} - ${f}ms \u540E\u91CD\u8BD5...`),await this.sleep(f)}}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("*",Zo),this.app?.use("*",si),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",ni),this.app?.use("*",oi()),this.app?.use("*",ii()),this.app?.use("*",ei),this.app?.onError(ti),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 zs(this.logger)}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Gi,status:Xi,tools:Ji,mcp:Ki,version:Yi,services:Qi,update:Zi,coze:ta,"tool-logs":ra,mcpserver:sa,endpoint:na,misc:oa,tts:ia,esp32:ca,static:ea}),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=Sg({fetch:this.app.fetch,port:this.port,hostname:Jt.DEFAULT_BIND_ADDRESS,createServer:Eg});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Tg({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${Jt.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(),ha(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}};export{bu as WebServer};
111
+ 5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new cs,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(!Js.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");Js.cleanupInvalidServerToolsConfig();let e=Js.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??Kt.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=Fh(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 Hh({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 er("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 f=Math.min(s*a**(l-1),o);this.logger.info(`${t} - ${f}ms \u540E\u91CD\u8BD5...`),await this.sleep(f)}}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("*",ci),this.app?.use("*",di),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",fi),this.app?.use("*",mi()),this.app?.use("*",gi()),this.app?.use("*",li),this.app?.onError(ui),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 qs(this.logger)}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:ta,status:ra,tools:sa,mcp:na,version:oa,services:ia,update:aa,coze:la,"tool-logs":ua,mcpserver:pa,endpoint:da,misc:fa,tts:ma,esp32:ha,static:ca}),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=kh({fetch:this.app.fetch,port:this.port,hostname:Kt.DEFAULT_BIND_ADDRESS,createServer:Dh});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Uh({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${Kt.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(),Da(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}};export{Gu as WebServer};
112
112
  //# sourceMappingURL=WebServer.js.map