xiaozhi-client 2.1.0 → 2.3.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/backend/WebServer.js +10 -32
- package/dist/backend/WebServer.js.map +1 -1
- package/dist/backend/WebServerLauncher.js +10 -32
- package/dist/backend/WebServerLauncher.js.map +1 -1
- package/dist/backend/package.json +52 -8
- package/dist/frontend/assets/form-utils-n2_wJnKb.js +41 -0
- package/dist/frontend/assets/form-utils-n2_wJnKb.js.map +1 -0
- package/dist/frontend/assets/index-C3xvW3AQ.js +81 -0
- package/dist/frontend/assets/index-C3xvW3AQ.js.map +1 -0
- package/dist/frontend/assets/index-CLIN00a1.css +1 -0
- package/dist/frontend/assets/radix-ui-B9D1KdKb.js +2 -0
- package/dist/frontend/assets/radix-ui-B9D1KdKb.js.map +1 -0
- package/dist/frontend/assets/react-vendor-CmWLnLSk.js +67 -0
- package/dist/frontend/assets/react-vendor-CmWLnLSk.js.map +1 -0
- package/dist/frontend/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/dist/frontend/assets/utils-UasCLNM3.js +2 -0
- package/dist/frontend/assets/utils-UasCLNM3.js.map +1 -0
- package/dist/frontend/index.html +7 -6
- package/package.json +25 -11
- package/dist/frontend/assets/form-utils-Bskf0D3l.js +0 -41
- package/dist/frontend/assets/form-utils-Bskf0D3l.js.map +0 -1
- package/dist/frontend/assets/index-BAV6nu4X.js +0 -81
- package/dist/frontend/assets/index-BAV6nu4X.js.map +0 -1
- package/dist/frontend/assets/index-HDlbxheg.css +0 -1
- package/dist/frontend/assets/radix-ui-BQCqNqg0.js +0 -2
- package/dist/frontend/assets/radix-ui-BQCqNqg0.js.map +0 -1
- package/dist/frontend/assets/react-vendor-BPQojLhf.js +0 -67
- package/dist/frontend/assets/react-vendor-BPQojLhf.js.map +0 -1
- package/dist/frontend/assets/utils-BWIWSmq9.js +0 -2
- package/dist/frontend/assets/utils-BWIWSmq9.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
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...
|
|
1
|
+
var Es=Object.create;var Ye=Object.defineProperty;var vs=Object.getOwnPropertyDescriptor;var Ts=Object.getOwnPropertyNames;var Ss=Object.getPrototypeOf,Rs=Object.prototype.hasOwnProperty;var a=(n,e)=>Ye(n,"name",{value:e,configurable:!0});var v=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Ms=(n,e)=>{for(var t in e)Ye(n,t,{get:e[t],enumerable:!0})},$t=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ts(e))!Rs.call(n,o)&&o!==t&&Ye(n,o,{get:()=>e[o],enumerable:!(r=vs(e,o))||r.enumerable});return n},Ce=(n,e,t)=>($t(n,e,"default"),t&&$t(t,e,"default")),Ps=(n,e,t)=>(t=n!=null?Es(Ss(n)):{},$t(e||!n||!n.__esModule?Ye(t,"default",{value:n,enumerable:!0}):t,n));var xe=v((wd,vo)=>{"use strict";var li="2.0.0",gi=Number.MAX_SAFE_INTEGER||9007199254740991,ui=16,pi=250,di=["major","premajor","minor","preminor","patch","prepatch","prerelease"];vo.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:ui,MAX_SAFE_BUILD_LENGTH:pi,MAX_SAFE_INTEGER:gi,RELEASE_TYPES:di,SEMVER_SPEC_VERSION:li,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var De=v((Ld,To)=>{"use strict";var mi=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...n)=>{}:()=>{};To.exports=mi});var me=v((W,So)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:or,MAX_SAFE_BUILD_LENGTH:hi,MAX_LENGTH:fi}=xe(),Ci=De();W=So.exports={};var Ei=W.re=[],vi=W.safeRe=[],h=W.src=[],Ti=W.safeSrc=[],f=W.t={},Si=0,nr="[a-zA-Z0-9-]",Ri=[["\\s",1],["\\d",fi],[nr,hi]],Mi=a(n=>{for(let[e,t]of Ri)n=n.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return n},"makeSafeRegex"),T=a((n,e,t)=>{let r=Mi(e),o=Si++;Ci(n,o,e),f[n]=o,h[o]=e,Ti[o]=r,Ei[o]=new RegExp(e,t?"g":void 0),vi[o]=new RegExp(r,t?"g":void 0)},"createToken");T("NUMERICIDENTIFIER","0|[1-9]\\d*");T("NUMERICIDENTIFIERLOOSE","\\d+");T("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${nr}*`);T("MAINVERSION",`(${h[f.NUMERICIDENTIFIER]})\\.(${h[f.NUMERICIDENTIFIER]})\\.(${h[f.NUMERICIDENTIFIER]})`);T("MAINVERSIONLOOSE",`(${h[f.NUMERICIDENTIFIERLOOSE]})\\.(${h[f.NUMERICIDENTIFIERLOOSE]})\\.(${h[f.NUMERICIDENTIFIERLOOSE]})`);T("PRERELEASEIDENTIFIER",`(?:${h[f.NONNUMERICIDENTIFIER]}|${h[f.NUMERICIDENTIFIER]})`);T("PRERELEASEIDENTIFIERLOOSE",`(?:${h[f.NONNUMERICIDENTIFIER]}|${h[f.NUMERICIDENTIFIERLOOSE]})`);T("PRERELEASE",`(?:-(${h[f.PRERELEASEIDENTIFIER]}(?:\\.${h[f.PRERELEASEIDENTIFIER]})*))`);T("PRERELEASELOOSE",`(?:-?(${h[f.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${h[f.PRERELEASEIDENTIFIERLOOSE]})*))`);T("BUILDIDENTIFIER",`${nr}+`);T("BUILD",`(?:\\+(${h[f.BUILDIDENTIFIER]}(?:\\.${h[f.BUILDIDENTIFIER]})*))`);T("FULLPLAIN",`v?${h[f.MAINVERSION]}${h[f.PRERELEASE]}?${h[f.BUILD]}?`);T("FULL",`^${h[f.FULLPLAIN]}$`);T("LOOSEPLAIN",`[v=\\s]*${h[f.MAINVERSIONLOOSE]}${h[f.PRERELEASELOOSE]}?${h[f.BUILD]}?`);T("LOOSE",`^${h[f.LOOSEPLAIN]}$`);T("GTLT","((?:<|>)?=?)");T("XRANGEIDENTIFIERLOOSE",`${h[f.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);T("XRANGEIDENTIFIER",`${h[f.NUMERICIDENTIFIER]}|x|X|\\*`);T("XRANGEPLAIN",`[v=\\s]*(${h[f.XRANGEIDENTIFIER]})(?:\\.(${h[f.XRANGEIDENTIFIER]})(?:\\.(${h[f.XRANGEIDENTIFIER]})(?:${h[f.PRERELEASE]})?${h[f.BUILD]}?)?)?`);T("XRANGEPLAINLOOSE",`[v=\\s]*(${h[f.XRANGEIDENTIFIERLOOSE]})(?:\\.(${h[f.XRANGEIDENTIFIERLOOSE]})(?:\\.(${h[f.XRANGEIDENTIFIERLOOSE]})(?:${h[f.PRERELEASELOOSE]})?${h[f.BUILD]}?)?)?`);T("XRANGE",`^${h[f.GTLT]}\\s*${h[f.XRANGEPLAIN]}$`);T("XRANGELOOSE",`^${h[f.GTLT]}\\s*${h[f.XRANGEPLAINLOOSE]}$`);T("COERCEPLAIN",`(^|[^\\d])(\\d{1,${or}})(?:\\.(\\d{1,${or}}))?(?:\\.(\\d{1,${or}}))?`);T("COERCE",`${h[f.COERCEPLAIN]}(?:$|[^\\d])`);T("COERCEFULL",h[f.COERCEPLAIN]+`(?:${h[f.PRERELEASE]})?(?:${h[f.BUILD]})?(?:$|[^\\d])`);T("COERCERTL",h[f.COERCE],!0);T("COERCERTLFULL",h[f.COERCEFULL],!0);T("LONETILDE","(?:~>?)");T("TILDETRIM",`(\\s*)${h[f.LONETILDE]}\\s+`,!0);W.tildeTrimReplace="$1~";T("TILDE",`^${h[f.LONETILDE]}${h[f.XRANGEPLAIN]}$`);T("TILDELOOSE",`^${h[f.LONETILDE]}${h[f.XRANGEPLAINLOOSE]}$`);T("LONECARET","(?:\\^)");T("CARETTRIM",`(\\s*)${h[f.LONECARET]}\\s+`,!0);W.caretTrimReplace="$1^";T("CARET",`^${h[f.LONECARET]}${h[f.XRANGEPLAIN]}$`);T("CARETLOOSE",`^${h[f.LONECARET]}${h[f.XRANGEPLAINLOOSE]}$`);T("COMPARATORLOOSE",`^${h[f.GTLT]}\\s*(${h[f.LOOSEPLAIN]})$|^$`);T("COMPARATOR",`^${h[f.GTLT]}\\s*(${h[f.FULLPLAIN]})$|^$`);T("COMPARATORTRIM",`(\\s*)${h[f.GTLT]}\\s*(${h[f.LOOSEPLAIN]}|${h[f.XRANGEPLAIN]})`,!0);W.comparatorTrimReplace="$1$2$3";T("HYPHENRANGE",`^\\s*(${h[f.XRANGEPLAIN]})\\s+-\\s+(${h[f.XRANGEPLAIN]})\\s*$`);T("HYPHENRANGELOOSE",`^\\s*(${h[f.XRANGEPLAINLOOSE]})\\s+-\\s+(${h[f.XRANGEPLAINLOOSE]})\\s*$`);T("STAR","(<|>)?=?\\s*\\*");T("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");T("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var ft=v((Dd,Ro)=>{"use strict";var Pi=Object.freeze({loose:!0}),yi=Object.freeze({}),Ii=a(n=>n?typeof n!="object"?Pi:n:yi,"parseOptions");Ro.exports=Ii});var sr=v((kd,yo)=>{"use strict";var Mo=/^[0-9]+$/,Po=a((n,e)=>{if(typeof n=="number"&&typeof e=="number")return n===e?0:n<e?-1:1;let t=Mo.test(n),r=Mo.test(e);return t&&r&&(n=+n,e=+e),n===e?0:t&&!r?-1:r&&!t?1:n<e?-1:1},"compareIdentifiers"),Ai=a((n,e)=>Po(e,n),"rcompareIdentifiers");yo.exports={compareIdentifiers:Po,rcompareIdentifiers:Ai}});var _=v((Fd,Ao)=>{"use strict";var Ct=De(),{MAX_LENGTH:Io,MAX_SAFE_INTEGER:Et}=xe(),{safeRe:vt,t:Tt}=me(),_i=ft(),{compareIdentifiers:ir}=sr(),ar=class n{static{a(this,"SemVer")}constructor(e,t){if(t=_i(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>Io)throw new TypeError(`version is longer than ${Io} characters`);Ct("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?vt[Tt.LOOSE]:vt[Tt.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>Et||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Et||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Et||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(o=>{if(/^[0-9]+$/.test(o)){let s=+o;if(s>=0&&s<Et)return s}return o}):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(Ct("SemVer.compare",this.version,this.options,e),!(e instanceof n)){if(typeof e=="string"&&e===this.version)return 0;e=new n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof n||(e=new n(e,this.options)),this.major<e.major?-1:this.major>e.major?1:this.minor<e.minor?-1:this.minor>e.minor?1:this.patch<e.patch?-1:this.patch>e.patch?1:0}comparePre(e){if(e instanceof n||(e=new n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let r=this.prerelease[t],o=e.prerelease[t];if(Ct("prerelease compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return ir(r,o)}while(++t)}compareBuild(e){e instanceof n||(e=new n(e,this.options));let t=0;do{let r=this.build[t],o=e.build[t];if(Ct("build compare",t,r,o),r===void 0&&o===void 0)return 0;if(o===void 0)return 1;if(r===void 0)return-1;if(r===o)continue;return ir(r,o)}while(++t)}inc(e,t,r){if(e.startsWith("pre")){if(!t&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(t){let o=`-${t}`.match(this.options.loose?vt[Tt.PRERELEASELOOSE]:vt[Tt.PRERELEASE]);if(!o||o[1]!==t)throw new Error(`invalid identifier: ${t}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t,r),this.inc("pre",t,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",t,r),this.inc("pre",t,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let o=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[o];else{let s=this.prerelease.length;for(;--s>=0;)typeof this.prerelease[s]=="number"&&(this.prerelease[s]++,s=-2);if(s===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(o)}}if(t){let s=[t,o];r===!1&&(s=[t]),ir(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=s):this.prerelease=s}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};Ao.exports=ar});var ie=v((Ud,Oo)=>{"use strict";var _o=_(),Oi=a((n,e,t=!1)=>{if(n instanceof _o)return n;try{return new _o(n,e)}catch(r){if(!t)return null;throw r}},"parse");Oo.exports=Oi});var bo=v((jd,No)=>{"use strict";var Ni=ie(),bi=a((n,e)=>{let t=Ni(n,e);return t?t.version:null},"valid");No.exports=bi});var Lo=v((qd,wo)=>{"use strict";var wi=ie(),Li=a((n,e)=>{let t=wi(n.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");wo.exports=Li});var $o=v((Bd,Do)=>{"use strict";var xo=_(),xi=a((n,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new xo(n instanceof xo?n.version:n,t).inc(e,r,o).version}catch{return null}},"inc");Do.exports=xi});var Fo=v((Yd,Ho)=>{"use strict";var ko=ie(),Di=a((n,e)=>{let t=ko(n,null,!0),r=ko(e,null,!0),o=t.compare(r);if(o===0)return null;let s=o>0,i=s?t:r,c=s?r:t,l=!!i.prerelease.length;if(!!c.prerelease.length&&!l){if(!c.patch&&!c.minor)return"major";if(c.compareMain(i)===0)return c.minor&&!c.patch?"minor":"patch"}let p=l?"pre":"";return t.major!==r.major?p+"major":t.minor!==r.minor?p+"minor":t.patch!==r.patch?p+"patch":"prerelease"},"diff");Ho.exports=Di});var Uo=v((Kd,Vo)=>{"use strict";var $i=_(),ki=a((n,e)=>new $i(n,e).major,"major");Vo.exports=ki});var jo=v((Zd,zo)=>{"use strict";var Hi=_(),Fi=a((n,e)=>new Hi(n,e).minor,"minor");zo.exports=Fi});var qo=v((tm,Go)=>{"use strict";var Vi=_(),Ui=a((n,e)=>new Vi(n,e).patch,"patch");Go.exports=Ui});var Bo=v((om,Wo)=>{"use strict";var zi=ie(),ji=a((n,e)=>{let t=zi(n,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Wo.exports=ji});var H=v((sm,Yo)=>{"use strict";var Xo=_(),Gi=a((n,e,t)=>new Xo(n,t).compare(new Xo(e,t)),"compare");Yo.exports=Gi});var Ko=v((am,Jo)=>{"use strict";var qi=H(),Wi=a((n,e,t)=>qi(e,n,t),"rcompare");Jo.exports=Wi});var Zo=v((lm,Qo)=>{"use strict";var Bi=H(),Xi=a((n,e)=>Bi(n,e,!0),"compareLoose");Qo.exports=Xi});var St=v((um,tn)=>{"use strict";var en=_(),Yi=a((n,e,t)=>{let r=new en(n,t),o=new en(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");tn.exports=Yi});var on=v((dm,rn)=>{"use strict";var Ji=St(),Ki=a((n,e)=>n.sort((t,r)=>Ji(t,r,e)),"sort");rn.exports=Ki});var sn=v((hm,nn)=>{"use strict";var Qi=St(),Zi=a((n,e)=>n.sort((t,r)=>Qi(r,t,e)),"rsort");nn.exports=Zi});var $e=v((Cm,an)=>{"use strict";var ea=H(),ta=a((n,e,t)=>ea(n,e,t)>0,"gt");an.exports=ta});var Rt=v((vm,cn)=>{"use strict";var ra=H(),oa=a((n,e,t)=>ra(n,e,t)<0,"lt");cn.exports=oa});var cr=v((Sm,ln)=>{"use strict";var na=H(),sa=a((n,e,t)=>na(n,e,t)===0,"eq");ln.exports=sa});var lr=v((Mm,gn)=>{"use strict";var ia=H(),aa=a((n,e,t)=>ia(n,e,t)!==0,"neq");gn.exports=aa});var Mt=v((ym,un)=>{"use strict";var ca=H(),la=a((n,e,t)=>ca(n,e,t)>=0,"gte");un.exports=la});var Pt=v((Am,pn)=>{"use strict";var ga=H(),ua=a((n,e,t)=>ga(n,e,t)<=0,"lte");pn.exports=ua});var gr=v((Om,dn)=>{"use strict";var pa=cr(),da=lr(),ma=$e(),ha=Mt(),fa=Rt(),Ca=Pt(),Ea=a((n,e,t,r)=>{switch(e){case"===":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n===t;case"!==":return typeof n=="object"&&(n=n.version),typeof t=="object"&&(t=t.version),n!==t;case"":case"=":case"==":return pa(n,t,r);case"!=":return da(n,t,r);case">":return ma(n,t,r);case">=":return ha(n,t,r);case"<":return fa(n,t,r);case"<=":return Ca(n,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");dn.exports=Ea});var hn=v((bm,mn)=>{"use strict";var va=_(),Ta=ie(),{safeRe:yt,t:It}=me(),Sa=a((n,e)=>{if(n instanceof va)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?yt[It.COERCEFULL]:yt[It.COERCE]);else{let l=e.includePrerelease?yt[It.COERCERTLFULL]:yt[It.COERCERTL],u;for(;(u=l.exec(n))&&(!t||t.index+t[0].length!==n.length);)(!t||u.index+u[0].length!==t.index+t[0].length)&&(t=u),l.lastIndex=u.index+u[1].length+u[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],o=t[3]||"0",s=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",c=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Ta(`${r}.${o}.${s}${i}${c}`,e)},"coerce");mn.exports=Sa});var Cn=v((Lm,fn)=>{"use strict";var ur=class{static{a(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let o=this.map.keys().next().value;this.delete(o)}this.map.set(e,t)}return this}};fn.exports=ur});var F=v((Dm,Sn)=>{"use strict";var Ra=/\s+/g,pr=class n{static{a(this,"Range")}constructor(e,t){if(t=Pa(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof dr)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(Ra," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(o=>!vn(o[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let o of this.set)if(o.length===1&&ba(o[0])){this.set=[o];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let t=this.set[e];for(let r=0;r<t.length;r++)r>0&&(this.formatted+=" "),this.formatted+=t[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let r=((this.options.includePrerelease&&Oa)|(this.options.loose&&Na))+":"+e,o=En.get(r);if(o)return o;let s=this.options.loose,i=s?b[O.HYPHENRANGELOOSE]:b[O.HYPHENRANGE];e=e.replace(i,Ua(this.options.includePrerelease)),P("hyphen replace",e),e=e.replace(b[O.COMPARATORTRIM],Ia),P("comparator trim",e),e=e.replace(b[O.TILDETRIM],Aa),P("tilde trim",e),e=e.replace(b[O.CARETTRIM],_a),P("caret trim",e);let c=e.split(" ").map(d=>wa(d,this.options)).join(" ").split(/\s+/).map(d=>Va(d,this.options));s&&(c=c.filter(d=>(P("loose invalid filter",d,this.options),!!d.match(b[O.COMPARATORLOOSE])))),P("range list",c);let l=new Map,u=c.map(d=>new dr(d,this.options));for(let d of u){if(vn(d))return[d];l.set(d.value,d)}l.size>1&&l.has("")&&l.delete("");let p=[...l.values()];return En.set(r,p),p}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>Tn(r,t)&&e.set.some(o=>Tn(o,t)&&r.every(s=>o.every(i=>s.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new ya(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(za(this.set[t],e,this.options))return!0;return!1}};Sn.exports=pr;var Ma=Cn(),En=new Ma,Pa=ft(),dr=ke(),P=De(),ya=_(),{safeRe:b,t:O,comparatorTrimReplace:Ia,tildeTrimReplace:Aa,caretTrimReplace:_a}=me(),{FLAG_INCLUDE_PRERELEASE:Oa,FLAG_LOOSE:Na}=xe(),vn=a(n=>n.value==="<0.0.0-0","isNullSet"),ba=a(n=>n.value==="","isAny"),Tn=a((n,e)=>{let t=!0,r=n.slice(),o=r.pop();for(;t&&r.length;)t=r.every(s=>o.intersects(s,e)),o=r.pop();return t},"isSatisfiable"),wa=a((n,e)=>(n=n.replace(b[O.BUILD],""),P("comp",n,e),n=Da(n,e),P("caret",n),n=La(n,e),P("tildes",n),n=ka(n,e),P("xrange",n),n=Fa(n,e),P("stars",n),n),"parseComparator"),w=a(n=>!n||n.toLowerCase()==="x"||n==="*","isX"),La=a((n,e)=>n.trim().split(/\s+/).map(t=>xa(t,e)).join(" "),"replaceTildes"),xa=a((n,e)=>{let t=e.loose?b[O.TILDELOOSE]:b[O.TILDE];return n.replace(t,(r,o,s,i,c)=>{P("tilde",n,r,o,s,i,c);let l;return w(o)?l="":w(s)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:w(i)?l=`>=${o}.${s}.0 <${o}.${+s+1}.0-0`:c?(P("replaceTilde pr",c),l=`>=${o}.${s}.${i}-${c} <${o}.${+s+1}.0-0`):l=`>=${o}.${s}.${i} <${o}.${+s+1}.0-0`,P("tilde return",l),l})},"replaceTilde"),Da=a((n,e)=>n.trim().split(/\s+/).map(t=>$a(t,e)).join(" "),"replaceCarets"),$a=a((n,e)=>{P("caret",n,e);let t=e.loose?b[O.CARETLOOSE]:b[O.CARET],r=e.includePrerelease?"-0":"";return n.replace(t,(o,s,i,c,l)=>{P("caret",n,o,s,i,c,l);let u;return w(s)?u="":w(i)?u=`>=${s}.0.0${r} <${+s+1}.0.0-0`:w(c)?s==="0"?u=`>=${s}.${i}.0${r} <${s}.${+i+1}.0-0`:u=`>=${s}.${i}.0${r} <${+s+1}.0.0-0`:l?(P("replaceCaret pr",l),s==="0"?i==="0"?u=`>=${s}.${i}.${c}-${l} <${s}.${i}.${+c+1}-0`:u=`>=${s}.${i}.${c}-${l} <${s}.${+i+1}.0-0`:u=`>=${s}.${i}.${c}-${l} <${+s+1}.0.0-0`):(P("no pr"),s==="0"?i==="0"?u=`>=${s}.${i}.${c}${r} <${s}.${i}.${+c+1}-0`:u=`>=${s}.${i}.${c}${r} <${s}.${+i+1}.0-0`:u=`>=${s}.${i}.${c} <${+s+1}.0.0-0`),P("caret return",u),u})},"replaceCaret"),ka=a((n,e)=>(P("replaceXRanges",n,e),n.split(/\s+/).map(t=>Ha(t,e)).join(" ")),"replaceXRanges"),Ha=a((n,e)=>{n=n.trim();let t=e.loose?b[O.XRANGELOOSE]:b[O.XRANGE];return n.replace(t,(r,o,s,i,c,l)=>{P("xRange",n,r,o,s,i,c,l);let u=w(s),p=u||w(i),d=p||w(c),E=d;return o==="="&&E&&(o=""),l=e.includePrerelease?"-0":"",u?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&E?(p&&(i=0),c=0,o===">"?(o=">=",p?(s=+s+1,i=0,c=0):(i=+i+1,c=0)):o==="<="&&(o="<",p?s=+s+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+s}.${i}.${c}${l}`):p?r=`>=${s}.0.0${l} <${+s+1}.0.0-0`:d&&(r=`>=${s}.${i}.0${l} <${s}.${+i+1}.0-0`),P("xRange return",r),r})},"replaceXRange"),Fa=a((n,e)=>(P("replaceStars",n,e),n.trim().replace(b[O.STAR],"")),"replaceStars"),Va=a((n,e)=>(P("replaceGTE0",n,e),n.trim().replace(b[e.includePrerelease?O.GTE0PRE:O.GTE0],"")),"replaceGTE0"),Ua=a(n=>(e,t,r,o,s,i,c,l,u,p,d,E)=>(w(r)?t="":w(o)?t=`>=${r}.0.0${n?"-0":""}`:w(s)?t=`>=${r}.${o}.0${n?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${n?"-0":""}`,w(u)?l="":w(p)?l=`<${+u+1}.0.0-0`:w(d)?l=`<${u}.${+p+1}.0-0`:E?l=`<=${u}.${p}.${d}-${E}`:n?l=`<${u}.${p}.${+d+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),za=a((n,e,t)=>{for(let r=0;r<n.length;r++)if(!n[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<n.length;r++)if(P(n[r].semver),n[r].semver!==dr.ANY&&n[r].semver.prerelease.length>0){let o=n[r].semver;if(o.major===e.major&&o.minor===e.minor&&o.patch===e.patch)return!0}return!1}return!0},"testSet")});var ke=v((km,An)=>{"use strict";var He=Symbol("SemVer ANY"),fr=class n{static{a(this,"Comparator")}static get ANY(){return He}constructor(e,t){if(t=Rn(t),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),hr("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===He?this.value="":this.value=this.operator+this.semver.version,hr("comp",this)}parse(e){let t=this.options.loose?Mn[Pn.COMPARATORLOOSE]:Mn[Pn.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 yn(r[2],this.options.loose):this.semver=He}toString(){return this.value}test(e){if(hr("Comparator.test",e,this.options.loose),this.semver===He||e===He)return!0;if(typeof e=="string")try{e=new yn(e,this.options)}catch{return!1}return mr(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 In(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new In(this.value,t).test(e.semver):(t=Rn(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("=")||mr(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||mr(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};An.exports=fr;var Rn=ft(),{safeRe:Mn,t:Pn}=me(),mr=gr(),hr=De(),yn=_(),In=F()});var Fe=v((Fm,_n)=>{"use strict";var ja=F(),Ga=a((n,e,t)=>{try{e=new ja(e,t)}catch{return!1}return e.test(n)},"satisfies");_n.exports=Ga});var Nn=v((Um,On)=>{"use strict";var qa=F(),Wa=a((n,e)=>new qa(n,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");On.exports=Wa});var wn=v((jm,bn)=>{"use strict";var Ba=_(),Xa=F(),Ya=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new Xa(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new Ba(r,t))}),r},"maxSatisfying");bn.exports=Ya});var xn=v((qm,Ln)=>{"use strict";var Ja=_(),Ka=F(),Qa=a((n,e,t)=>{let r=null,o=null,s=null;try{s=new Ka(e,t)}catch{return null}return n.forEach(i=>{s.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new Ja(r,t))}),r},"minSatisfying");Ln.exports=Qa});var kn=v((Bm,$n)=>{"use strict";var Cr=_(),Za=F(),Dn=$e(),ec=a((n,e)=>{n=new Za(n,e);let t=new Cr("0.0.0");if(n.test(t)||(t=new Cr("0.0.0-0"),n.test(t)))return t;t=null;for(let r=0;r<n.set.length;++r){let o=n.set[r],s=null;o.forEach(i=>{let c=new Cr(i.semver.version);switch(i.operator){case">":c.prerelease.length===0?c.patch++:c.prerelease.push(0),c.raw=c.format();case"":case">=":(!s||Dn(c,s))&&(s=c);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),s&&(!t||Dn(t,s))&&(t=s)}return t&&n.test(t)?t:null},"minVersion");$n.exports=ec});var Fn=v((Ym,Hn)=>{"use strict";var tc=F(),rc=a((n,e)=>{try{return new tc(n,e).range||"*"}catch{return null}},"validRange");Hn.exports=rc});var At=v((Km,jn)=>{"use strict";var oc=_(),zn=ke(),{ANY:nc}=zn,sc=F(),ic=Fe(),Vn=$e(),Un=Rt(),ac=Pt(),cc=Mt(),lc=a((n,e,t,r)=>{n=new oc(n,r),e=new sc(e,r);let o,s,i,c,l;switch(t){case">":o=Vn,s=ac,i=Un,c=">",l=">=";break;case"<":o=Un,s=cc,i=Vn,c="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ic(n,e,r))return!1;for(let u=0;u<e.set.length;++u){let p=e.set[u],d=null,E=null;if(p.forEach(C=>{C.semver===nc&&(C=new zn(">=0.0.0")),d=d||C,E=E||C,o(C.semver,d.semver,r)?d=C:i(C.semver,E.semver,r)&&(E=C)}),d.operator===c||d.operator===l||(!E.operator||E.operator===c)&&s(n,E.semver))return!1;if(E.operator===l&&i(n,E.semver))return!1}return!0},"outside");jn.exports=lc});var qn=v((Zm,Gn)=>{"use strict";var gc=At(),uc=a((n,e,t)=>gc(n,e,">",t),"gtr");Gn.exports=uc});var Bn=v((th,Wn)=>{"use strict";var pc=At(),dc=a((n,e,t)=>pc(n,e,"<",t),"ltr");Wn.exports=dc});var Jn=v((oh,Yn)=>{"use strict";var Xn=F(),mc=a((n,e,t)=>(n=new Xn(n,t),e=new Xn(e,t),n.intersects(e,t)),"intersects");Yn.exports=mc});var Qn=v((sh,Kn)=>{"use strict";var hc=Fe(),fc=H();Kn.exports=(n,e,t)=>{let r=[],o=null,s=null,i=n.sort((p,d)=>fc(p,d,t));for(let p of i)hc(p,e,t)?(s=p,o||(o=p)):(s&&r.push([o,s]),s=null,o=null);o&&r.push([o,null]);let c=[];for(let[p,d]of r)p===d?c.push(p):!d&&p===i[0]?c.push("*"):d?p===i[0]?c.push(`<=${d}`):c.push(`${p} - ${d}`):c.push(`>=${p}`);let l=c.join(" || "),u=typeof e.raw=="string"?e.raw:String(e);return l.length<u.length?l:e}});var ns=v((ih,os)=>{"use strict";var Zn=F(),vr=ke(),{ANY:Er}=vr,Ve=Fe(),Tr=H(),Cc=a((n,e,t={})=>{if(n===e)return!0;n=new Zn(n,t),e=new Zn(e,t);let r=!1;e:for(let o of n.set){for(let s of e.set){let i=vc(o,s,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Ec=[new vr(">=0.0.0-0")],es=[new vr(">=0.0.0")],vc=a((n,e,t)=>{if(n===e)return!0;if(n.length===1&&n[0].semver===Er){if(e.length===1&&e[0].semver===Er)return!0;t.includePrerelease?n=Ec:n=es}if(e.length===1&&e[0].semver===Er){if(t.includePrerelease)return!0;e=es}let r=new Set,o,s;for(let C of n)C.operator===">"||C.operator===">="?o=ts(o,C,t):C.operator==="<"||C.operator==="<="?s=rs(s,C,t):r.add(C.semver);if(r.size>1)return null;let i;if(o&&s){if(i=Tr(o.semver,s.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||s.operator!=="<="))return null}for(let C of r){if(o&&!Ve(C,String(o),t)||s&&!Ve(C,String(s),t))return null;for(let x of e)if(!Ve(C,String(x),t))return!1;return!0}let c,l,u,p,d=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,E=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;d&&d.prerelease.length===1&&s.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let C of e){if(p=p||C.operator===">"||C.operator===">=",u=u||C.operator==="<"||C.operator==="<=",o){if(E&&C.semver.prerelease&&C.semver.prerelease.length&&C.semver.major===E.major&&C.semver.minor===E.minor&&C.semver.patch===E.patch&&(E=!1),C.operator===">"||C.operator===">="){if(c=ts(o,C,t),c===C&&c!==o)return!1}else if(o.operator===">="&&!Ve(o.semver,String(C),t))return!1}if(s){if(d&&C.semver.prerelease&&C.semver.prerelease.length&&C.semver.major===d.major&&C.semver.minor===d.minor&&C.semver.patch===d.patch&&(d=!1),C.operator==="<"||C.operator==="<="){if(l=rs(s,C,t),l===C&&l!==s)return!1}else if(s.operator==="<="&&!Ve(s.semver,String(C),t))return!1}if(!C.operator&&(s||o)&&i!==0)return!1}return!(o&&u&&!s&&i!==0||s&&p&&!o&&i!==0||E||d)},"simpleSubset"),ts=a((n,e,t)=>{if(!n)return e;let r=Tr(n.semver,e.semver,t);return r>0?n:r<0||e.operator===">"&&n.operator===">="?e:n},"higherGT"),rs=a((n,e,t)=>{if(!n)return e;let r=Tr(n.semver,e.semver,t);return r<0?n:r>0||e.operator==="<"&&n.operator==="<="?e:n},"lowerLT");os.exports=Cc});var cs=v((ch,as)=>{"use strict";var Sr=me(),ss=xe(),Tc=_(),is=sr(),Sc=ie(),Rc=bo(),Mc=Lo(),Pc=$o(),yc=Fo(),Ic=Uo(),Ac=jo(),_c=qo(),Oc=Bo(),Nc=H(),bc=Ko(),wc=Zo(),Lc=St(),xc=on(),Dc=sn(),$c=$e(),kc=Rt(),Hc=cr(),Fc=lr(),Vc=Mt(),Uc=Pt(),zc=gr(),jc=hn(),Gc=ke(),qc=F(),Wc=Fe(),Bc=Nn(),Xc=wn(),Yc=xn(),Jc=kn(),Kc=Fn(),Qc=At(),Zc=qn(),el=Bn(),tl=Jn(),rl=Qn(),ol=ns();as.exports={parse:Sc,valid:Rc,clean:Mc,inc:Pc,diff:yc,major:Ic,minor:Ac,patch:_c,prerelease:Oc,compare:Nc,rcompare:bc,compareLoose:wc,compareBuild:Lc,sort:xc,rsort:Dc,gt:$c,lt:kc,eq:Hc,neq:Fc,gte:Vc,lte:Uc,cmp:zc,coerce:jc,Comparator:Gc,Range:qc,satisfies:Wc,toComparators:Bc,maxSatisfying:Xc,minSatisfying:Yc,minVersion:Jc,validRange:Kc,outside:Qc,gtr:Zc,ltr:el,intersects:tl,simplifyRange:rl,subset:ol,SemVer:Tc,re:Sr.re,src:Sr.src,tokens:Sr.t,SEMVER_SPEC_VERSION:ss.SEMVER_SPEC_VERSION,RELEASE_TYPES:ss.RELEASE_TYPES,compareIdentifiers:is.compareIdentifiers,rcompareIdentifiers:is.rcompareIdentifiers}});import{createServer as Rl}from"http";import*as N from"fs";import*as $ from"path";import Ee from"chalk";import ce from"pino";import{z as ys}from"zod";var Is=ys.enum(["fatal","error","warn","info","debug","trace"]);function As(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),o=String(n.getHours()).padStart(2,"0"),s=String(n.getMinutes()).padStart(2,"0"),i=String(n.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${o}:${s}:${i}`}a(As,"formatDateTime");var Ht=class{static{a(this,"Logger")}logFilePath=null;pinoInstance;isDaemonMode;logLevel;maxLogFileSize=10*1024*1024;maxLogFiles=5;constructor(e="info"){this.isDaemonMode=process.env.XIAOZHI_DAEMON==="true",this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}validateLogLevel(e){let t=e.toLowerCase(),r=Is.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:ce.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:ce.destination({dest:"/dev/null"})}),ce({level:this.logLevel,timestamp:ce.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((t,r)=>({level:r}),"level")},base:null,serializers:{err:ce.stdSerializers?.err||(t=>t)}},ce.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Ee.gray}],[30,{name:"INFO",color:Ee.blue}],[40,{name:"WARN",color:Ee.yellow}],[50,{name:"ERROR",color:Ee.red}],[60,{name:"FATAL",color:Ee.red}]]);return{write:a(t=>{try{let r=JSON.parse(t),o=this.formatConsoleMessageOptimized(r,e);this.safeWrite(`${o}
|
|
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=As(new Date),o=t.get(e.level)||{name:"UNKNOWN",color:a(c=>c,"color")},s=o.color(`[${o.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let c=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${c}`}return`[${r}] ${s} ${i}`}initLogFile(e){this.logFilePath=$.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded();try{N.existsSync(this.logFilePath)||N.writeFileSync(this.logFilePath,"")}catch{this.logFilePath=null}this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){this.logInfo(e,...t)}logInfo(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){this.logInfo(e,...t)}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(o=>o instanceof Error?this.pinoInstance.level==="debug"?o.message:{message:o.message,stack:o.stack,name:o.name,cause:o.cause}:o);this.pinoInstance.error({args:r},e)}else{let r=this.enhanceErrorObject(e);this.pinoInstance.error(r,t[0]||"")}}debug(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.debug(e):this.pinoInstance.debug({args:t},e):this.pinoInstance.debug(e,t[0]||"")}log(e,...t){this.logInfo(e,...t)}enhanceErrorObject(e){let t={...e};for(let[r,o]of Object.entries(t))o instanceof Error&&(t[r]={message:o.message,stack:o.stack,name:o.name,cause:o.cause});return t}rotateLogFileIfNeeded(){if(!(!this.logFilePath||!N.existsSync(this.logFilePath)))try{N.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=$.dirname(this.logFilePath),t=$.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let s=$.join(e,`${t}.${o}.log`),i=$.join(e,`${t}.${o+1}.log`);N.existsSync(s)&&(o===this.maxLogFiles-1?N.unlinkSync(s):N.renameSync(s,i))}let r=$.join(e,`${t}.1.log`);N.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=$.dirname(this.logFilePath),t=$.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=$.join(e,`${t}.${r}.log`);N.existsSync(o)&&N.unlinkSync(o)}}catch{}}setLogFileOptions(e,t){this.maxLogFileSize=e,this.maxLogFiles=t}close(){}setLevel(e){this.logLevel=this.validateLogLevel(e),this.pinoInstance=this.createPinoInstance()}getLevel(){return this.logLevel}},kt=null,_s="info";function Os(){return kt||(kt=new Ht(_s)),kt}a(Os,"getLogger");var g=Os();import{existsSync as le,mkdirSync as Ns,readFileSync as bs,readdirSync as ws,rmSync as Ls,statSync as xs,writeFileSync as Br}from"fs";import{dirname as Xr,isAbsolute as $l,resolve as Je}from"path";import{configManager as Yr}from"@xiaozhi-client/config";function Jr(){try{let n=Yr.getConfigPath(),e=Xr(n),t=Je(e,"prompts");return le(t)?ws(t).filter(s=>s.endsWith(".md")).map(s=>({fileName:s,relativePath:`./prompts/${s}`})):[]}catch{return[]}}a(Jr,"listPromptFiles");var Ft=100*1024,Kr=/^[\u4e00-\u9fa5a-zA-Z0-9_-]+\.md$/;function Vt(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 Kr.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"}}a(Vt,"validatePromptPath");function Ds(n){return Kr.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"}}a(Ds,"validatePromptFileName");function Qr(){let n=Yr.getConfigPath(),e=Xr(n);return Je(e,"prompts")}a(Qr,"getPromptsDir");function Ut(n){let e=Qr(),t=n.replace("./prompts/","");return Je(e,t)}a(Ut,"resolvePromptPath");function Zr(n){let e=Vt(n);if(!e.valid)throw new Error(e.error);let t=Ut(n);if(!le(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);if(xs(t).size>Ft)throw new Error("\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let o=bs(t,"utf-8");return{fileName:n.replace("./prompts/",""),relativePath:n,content:o}}a(Zr,"readPromptFile");function eo(n,e){let t=Vt(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>Ft)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let r=Ut(n);if(!le(r))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);return Br(r,e,"utf-8"),{fileName:n.replace("./prompts/",""),relativePath:n,content:e}}a(eo,"updatePromptFile");function to(n,e){let t=Ds(n);if(!t.valid)throw new Error(t.error);if(Buffer.byteLength(e,"utf8")>Ft)throw new Error("\u5185\u5BB9\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 100KB\uFF09");let o=Qr();le(o)||Ns(o,{recursive:!0});let s=Je(o,n),i=`./prompts/${n}`;if(le(s))throw new Error(`\u6587\u4EF6\u5DF2\u5B58\u5728: ${n}`);return Br(s,e,"utf-8"),{fileName:n,relativePath:i,content:e}}a(to,"createPromptFile");function ro(n){let e=Vt(n);if(!e.valid)throw new Error(e.error);let t=Ut(n);if(!le(t))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${n}`);Ls(t)}a(ro,"deletePromptFile");import{configManager as k}from"@xiaozhi-client/config";var y=class{static{a(this,"BaseHandler")}handleError(e,t,r,o="OPERATION_FAILED",s="\u64CD\u4F5C\u5931\u8D25",i=500){let c=t instanceof Error?t.message:String(t),l=t instanceof Error&&"code"in t?String(t.code):o;return e.get("logger").error(`${r}\u5931\u8D25:`,t),e.fail(l,c||s,void 0,i)}async parseJsonBody(e,t="\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"){try{return await e.req.json()}catch(r){let o=r instanceof Error?`${t}: ${r.message}`:t;throw new Error(o)}}};var Ke=class extends y{static{a(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){let t=e.get("logger");try{t.debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let r=k.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(k.validateConfig(t),k.updateConfig(t),t.mcpServerConfig)for(let[r,o]of Object.entries(t.mcpServerConfig))for(let[s,i]of Object.entries(o.tools))k.setToolEnabled(r,s,i.enable);return e.get("logger").info("\u914D\u7F6E\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u914D\u7F6E\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u914D\u7F6E\u66F4\u65B0\u5931\u8D25:",t),e.fail("CONFIG_UPDATE_ERROR",t instanceof Error?t.message:"\u914D\u7F6E\u66F4\u65B0\u5931\u8D25")}}async getMcpEndpoint(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6 MCP \u7AEF\u70B9\u8BF7\u6C42");let t=k.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=k.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=k.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=k.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"),k.reloadConfig();let t=k.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=k.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=k.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=Jr();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=Zr(t);return e.get("logger").debug(`\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u6210\u529F: ${t}`),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async updatePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{path:r,content:o}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","path \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(o===void 0||typeof o!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let s=eo(r,o);return e.get("logger").info(`\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(s,"\u63D0\u793A\u8BCD\u6587\u4EF6\u66F4\u65B0\u6210\u529F")}catch(t){return e.get("logger").error("\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25:",t),e.fail("PROMPT_FILE_UPDATE_ERROR",t instanceof Error?t.message:"\u66F4\u65B0\u63D0\u793A\u8BCD\u6587\u4EF6\u5185\u5BB9\u5931\u8D25",void 0,400)}}async createPromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=await e.req.json();if(!t||typeof t!="object")return e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF",void 0,400);let{fileName:r,content:o}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","fileName \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);if(o===void 0||typeof o!="string")return e.fail("INVALID_REQUEST","content \u53C2\u6570\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let s=to(r,o);return e.get("logger").info(`\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u6210\u529F: ${r}`),e.success(s,"\u63D0\u793A\u8BCD\u6587\u4EF6\u521B\u5EFA\u6210\u529F")}catch(t){return e.get("logger").error("\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25:",t),e.fail("PROMPT_FILE_CREATE_ERROR",t instanceof Error?t.message:"\u521B\u5EFA\u63D0\u793A\u8BCD\u6587\u4EF6\u5931\u8D25",void 0,400)}}async deletePromptFileContent(e){try{e.get("logger").debug("\u5904\u7406\u5220\u9664\u63D0\u793A\u8BCD\u6587\u4EF6\u8BF7\u6C42");let t=e.req.query("path");return t?(ro(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 V={};Ms(V,{CozeApiService:()=>X,config:()=>ve,createCozeClient:()=>Qe});var ve={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"}};Ce(V,og);import*as og from"@coze/api";function Qe(n,e="zh"){if(!n||typeof n!="string"||n.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=ve[e]||ve.zh;return new V.CozeAPI({baseURL:t.COZE_BASE_URL,token:n.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}a(Qe,"createCozeClient");import $s from"node-cache";var X=class{static{a(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Qe(this.token),this.cache=new $s({stdTTL:300})}async getWorkspaces(){try{let e="workspaces",t=this.cache.get(e);if(t)return t;let{workspaces:r=[]}=await this.client.workspaces.list();return this.cache.set(e,r,1800),r}catch(e){let t=e instanceof Error?e.message:String(e);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25: ${t}`)}}async getWorkflows(e){try{let{workspace_id:t,page_num:r=1,page_size:o=20}=e;if(!t||typeof t!="string")throw new Error("\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A");let s=`workflows:${t}:${r}:${o}`,i=this.cache.get(s);if(i)return i;let l=(await this.client.get("/v1/workflows",{workspace_id:t,page_num:r,page_size:o,workflow_mode:"workflow"})).data;return this.cache.set(s,l),l}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25: ${r}`)}}async callWorkflow(e,t){try{return await this.client.workflows.runs.create({workflow_id:e,parameters:t})}catch(r){let o=r instanceof Error?r.message:String(r);throw new Error(`\u8FD0\u884C\u5DE5\u4F5C\u6D41\u5931\u8D25: ${o}`)}}clearCache(e){if(!e){this.cache.flushAll();return}let r=this.cache.keys().filter(o=>o.startsWith(e));this.cache.del(r)}getCacheStats(){let e=this.cache.getStats(),t=this.cache.keys(),r=e.hits+e.misses,o=r>0?e.hits/r:0;return{size:e.keys,keys:t,hits:e.hits,misses:e.misses,hitRate:o,ksize:e.ksize,vsize:e.vsize}}};import{configManager as ge}from"@xiaozhi-client/config";function zt(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)}a(zt,"isErrorWithCode");function Ze(){let n=ge.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 X(n)}a(Ze,"getCozeApiService");var Te=class extends y{static{a(this,"CozeHandler")}constructor(){super()}handleCozeApiError(e,t,r){if(e.get("logger").error(`${r}\u5931\u8D25:`,t),zt(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(zt(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(zt(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);let o=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:`${r}\u5931\u8D25`,o,500)}async getWorkspaces(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!ge.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=Ze();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"),!ge.isCozeConfigValid())return e.get("logger").debug("\u6263\u5B50\u914D\u7F6E\u65E0\u6548"),e.fail("CONFIG_INVALID","\u6263\u5B50\u914D\u7F6E\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5 platforms.coze.token \u914D\u7F6E",void 0,400);let t=e.req.query("workspace_id"),r=Number.parseInt(e.req.query("page_num")||"1",10),o=Number.parseInt(e.req.query("page_size")||"20",10);if(!t)return e.get("logger").warn("\u7F3A\u5C11 workspace_id \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: workspace_id",void 0,400);if(r<1||r>1e3)return e.fail("INVALID_PARAMETER","page_num \u5FC5\u987B\u5728 1-1000 \u4E4B\u95F4",void 0,400);if(o<1||o>100)return e.fail("INVALID_PARAMETER","page_size \u5FC5\u987B\u5728 1-100 \u4E4B\u95F4",void 0,400);let s={workspace_id:t,page_num:r,page_size:o},i=Ze();e.get("logger").info(`\u5F00\u59CB\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684\u5DE5\u4F5C\u6D41\u5217\u8868\uFF0C\u9875\u7801: ${r}\uFF0C\u6BCF\u9875: ${o}`);let c=await i.getWorkflows(s);e.get("logger").info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${c.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=ge.getCustomMCPTools(),u=c.items.map(p=>{let d=l.find(E=>E.handler.type==="proxy"&&E.handler.platform==="coze"&&E.handler.config.workflow_id===p.workflow_id);return{...p,isAddedAsTool:!!d,toolName:d?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${u.filter(p=>p.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.success({items:u,has_more:c.has_more,page_num:r,page_size:o,total_count:c.items.length},`\u6210\u529F\u83B7\u53D6 ${u.length} \u4E2A\u5DE5\u4F5C\u6D41`)}catch(t){return this.handleCozeApiError(e,t,"\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868")}}async clearCache(e){try{if(e.get("logger").info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!ge.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=Ze(),o=r.getCacheStats();e.get("logger").info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let s=r.getCacheStats();return e.get("logger").info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${s.size} \u9879`),e.success({cleared:o.size-s.size,remaining:s.size,pattern:t||"all"},"\u7F13\u5B58\u6E05\u9664\u6210\u529F")}catch(t){e.get("logger").error("\u6E05\u9664\u7F13\u5B58\u5931\u8D25:",t);let r=process.env.NODE_ENV==="development"&&t instanceof Error?t.stack:void 0;return e.fail("INTERNAL_ERROR",t instanceof Error?t.message:"\u6E05\u9664\u7F13\u5B58\u5931\u8D25",r,500)}}async getCacheStats(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u8BF7\u6C42"),!ge.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=Ze().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 jt={DEFAULT_LIMIT:50,MAX_LIMIT:200};var I={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"},U={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},Y={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},ue={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},ne={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 J={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},Se=[J.V2024_11_05,J.V2025_06_18],Gt={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},K={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"};var qt={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"};var et={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"};var oo={TTL:3e5,CLEANUP_INTERVAL:6e4},no={DEFAULT:3e4,LONG_RUNNING:6e4};var Wt={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3};var Bt={EXECUTION_DELAY:500,SUCCESS_NOTIFICATION_DELAY:5e3};var so={DEFAULT:1024*1024,MAX:10*1024*1024};var Xt={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},io={SERVICE_TOOL_SEPARATOR:"__"};var Yt=[{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 ao(){let n=new Set;for(let e of Yt)n.add(e.scene);return Array.from(n)}a(ao,"getVoiceScenes");function G(n,e,t,r){try{let o={type:"error",error:{code:e,message:t,timestamp:Date.now()}};n.send(JSON.stringify(o))}catch(o){r.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}a(G,"sendWebSocketError");import{configManager as ks}from"@xiaozhi-client/config";var tt=class{static{a(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=g,this.statusService=e,this.notificationService=t}async handleClientStatus(e,t,r){try{this.logger.debug(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0: ${r}`,t.data);let o={...t.data,lastHeartbeat:Date.now()};this.statusService.updateClientInfo(o,`websocket-${r}`),await this.sendLatestConfig(e,r),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F: ${r}`)}catch(o){this.logger.error(`\u5904\u7406\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25: ${r}`,o),G(e,"CLIENT_STATUS_ERROR",o instanceof Error?o.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25",this.logger)}}async sendLatestConfig(e,t){try{let o={type:"configUpdate",data:ks.getConfig(),timestamp:Date.now()};e.send(JSON.stringify(o)),this.logger.debug(`\u6700\u65B0\u914D\u7F6E\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF: ${t}`)}catch(r){this.logger.error(`\u53D1\u9001\u6700\u65B0\u914D\u7F6E\u5931\u8D25: ${t}`,r)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>Wt.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()},Wt.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 Hs}from"events";var Jt=class extends Hs{static{a(this,"EventBus")}logger;eventStats=new Map;maxListeners;constructor(){super(),this.logger=g;let e=process.env.NODE_ENV==="test"||process.env.VITEST==="true";this.maxListeners=e?200:50,this.setMaxListeners(this.maxListeners),this.setupErrorHandling()}setupErrorHandling(){this.on("error",e=>{this.logger.error("EventBus \u5185\u90E8\u9519\u8BEF:",e)}),this.on("newListener",e=>{let t=this.listenerCount(e);t>this.maxListeners*.8&&this.logger.warn(`\u4E8B\u4EF6 ${e} \u7684\u76D1\u542C\u5668\u6570\u91CF\u8FC7\u591A: ${t}`)})}emitEvent(e,t){try{return this.updateEventStats(e),this.logger.debug(`\u53D1\u5C04\u4E8B\u4EF6: ${e}`,t),super.emit(e,t)}catch(r){return this.logger.error(`\u53D1\u5C04\u4E8B\u4EF6\u5931\u8D25: ${e}`,r),r instanceof Error&&this.emit("error",r),!1}}onEvent(e,t){return this.logger.debug(`\u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.on(e,t)}onceEvent(e,t){this.logger.debug(`\u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`);let r=a(o=>{try{t(o)}catch(s){throw this.emit("error",s),s}finally{this.offEvent(e,r)}},"onceListener");return this.on(e,r)}offEvent(e,t){return this.logger.debug(`\u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668: ${e}`),this.off(e,t)}updateEventStats(e){let t=this.eventStats.get(e)||{count:0,lastEmitted:new Date};t.count++,t.lastEmitted=new Date,this.eventStats.set(e,t)}getEventStats(){let e={};for(let[t,r]of this.eventStats)e[t]={...r};return e}getListenerStats(){let e={};for(let t of this.eventNames())e[t]=this.listenerCount(t);return e}clearEventStats(){this.eventStats.clear(),this.logger.info("\u4E8B\u4EF6\u7EDF\u8BA1\u5DF2\u6E05\u7406")}getStatus(){return{totalEvents:this.eventStats.size,totalListeners:Object.values(this.getListenerStats()).reduce((e,t)=>e+t,0),eventStats:this.getEventStats(),listenerStats:this.getListenerStats()}}destroy(){this.removeAllListeners(),this.eventStats.clear(),this.logger.info("EventBus \u5DF2\u9500\u6BC1")}},pe=null;function R(){return pe||(pe=new Jt),pe}a(R,"getEventBus");function co(){pe&&(pe.destroy(),pe=null)}a(co,"destroyEventBus");var Re=class{static{a(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=g,this.endpointManager=e,this.configManager=t,this.eventBus=R()}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(s){return this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",s),{ok:!1,response:e.fail(t,"JSON\u89E3\u6790\u5931\u8D25",s instanceof Error?s.message:void 0,500)}}let o=r.endpoint;return!o||typeof o!="string"?{ok:!1,response:e.fail("INVALID_ENDPOINT","\u7AEF\u70B9\u53C2\u6570\u65E0\u6548",void 0,500)}:{ok:!0,endpoint:o}}validateEndpoint(e){let t=[];if(!e||typeof e!="string")return t.push("\u7AEF\u70B9\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:t};try{new URL(e)}catch{t.push("\u7AEF\u70B9 URL \u683C\u5F0F\u65E0\u6548")}return{isValid:t.length===0,errors:t}}async getEndpointStatus(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_STATUS_READ_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.debug(`\u5904\u7406\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u8BF7\u6C42: ${r}`);try{let s=this.endpointManager.getConnectionStatus().find(i=>i.endpoint===r);return s?(this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.success(s)):e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500)}catch(o){return this.logger.error("\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25:",o),e.fail("ENDPOINT_STATUS_READ_ERROR",o instanceof Error?o.message:"\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u5931\u8D25",void 0,500)}}async connectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_CONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u8FDE\u63A5\u8BF7\u6C42: ${r}`);try{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6DFB\u52A0\u63A5\u5165\u70B9",void 0,500);await this.endpointManager.connect(r);let i=this.endpointManager.getConnectionStatus().find(c=>c.endpoint===r);return i?(this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!0,operation:"connect",success:!0,message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u8FDE\u63A5\u6210\u529F: ${r}`),e.success(i)):e.fail("ENDPOINT_STATUS_NOT_FOUND","\u65E0\u6CD5\u83B7\u53D6\u7AEF\u70B9\u8FDE\u63A5\u72B6\u6001",void 0,500)}catch(o){return this.logger.error("\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25:",o),e.fail("ENDPOINT_CONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u8FDE\u63A5\u5931\u8D25",void 0,500)}}async disconnectEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_DISCONNECT_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u65AD\u5F00\u8BF7\u6C42: ${r}`);try{if(!this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);await this.endpointManager.disconnect(r);let i=this.endpointManager.getConnectionStatus().find(l=>l.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"disconnect",success:!0,message:"\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u65AD\u5F00\u6210\u529F: ${r}`);let c={endpoint:r,connected:!1,initialized:!0};return e.success(i||c)}catch(o){return this.logger.error("\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25:",o),e.fail("ENDPOINT_DISCONNECT_ERROR",o instanceof Error?o.message:"\u63A5\u5165\u70B9\u65AD\u5F00\u5931\u8D25",void 0,500)}}async addEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_ADD_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u6DFB\u52A0\u8BF7\u6C42: ${r}`);try{let o=this.validateEndpoint(r);if(!o.isValid)return e.fail("INVALID_ENDPOINT_FORMAT",o.errors.join(", "),void 0,500);if(this.endpointManager.getEndpoint(r))return e.fail("ENDPOINT_ALREADY_EXISTS","\u7AEF\u70B9\u5DF2\u5B58\u5728",void 0,500);this.endpointManager.addEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`);let i=this.endpointManager.getEndpoint(r);if(!i)return e.fail("ENDPOINT_NOT_FOUND_AFTER_ADD","\u7AEF\u70B9\u6DFB\u52A0\u540E\u672A\u627E\u5230",void 0,500);try{await this.endpointManager.connect(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u8FDE\u63A5: ${r}`)}catch(p){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,p)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(p){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,p);try{await i.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(d){this.logger.warn(`\u56DE\u6EDA\u65F6\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u5C06\u7EE7\u7EED\u4ECE\u7BA1\u7406\u5668\u79FB\u9664\u7AEF\u70B9: ${r}`,d)}throw await this.endpointManager.removeEndpoint(i),p}let l=this.endpointManager.getConnectionStatus().find(p=>p.endpoint===r);this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:l?.connected??!1,operation:"add",success:!0,message:"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F: ${r}`);let u={endpoint:r,connected:!1,initialized:!0};return e.success(l||u,"\u63A5\u5165\u70B9\u6DFB\u52A0\u6210\u529F")}catch(o){return this.logger.error("\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25:",o),e.fail("ENDPOINT_ADD_ERROR",o instanceof Error?o.message:"\u6DFB\u52A0\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}async removeEndpoint(e){let t=await this.parseEndpointFromBody(e,"ENDPOINT_REMOVE_ERROR");if(!t.ok)return t.response;let r=t.endpoint;this.logger.info(`\u5904\u7406\u63A5\u5165\u70B9\u79FB\u9664\u8BF7\u6C42: ${r}`);try{let o=this.endpointManager.getEndpoint(r);if(!o)return e.fail("ENDPOINT_NOT_FOUND","\u7AEF\u70B9\u4E0D\u5B58\u5728",void 0,500);let s=o.isConnected();try{this.configManager.removeMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u4E2D\u79FB\u9664: ${r}`)}catch(i){throw this.logger.error(`\u4ECE\u914D\u7F6E\u6587\u4EF6\u79FB\u9664\u7AEF\u70B9\u5931\u8D25: ${r}`,i),i}return await this.endpointManager.removeEndpoint(o),this.logger.debug(`\u7AEF\u70B9\u5DF2\u4ECE\u7BA1\u7406\u5668\u4E2D\u79FB\u9664: ${r}`),this.eventBus.emitEvent("endpoint:status:changed",{endpoint:r,connected:!1,operation:"remove",success:!0,message:"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F",timestamp:Date.now(),source:"http-api"}),this.logger.info(`\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F: ${r}`),e.success({endpoint:r,operation:"removed",wasConnected:s},"\u63A5\u5165\u70B9\u79FB\u9664\u6210\u529F")}catch(o){return this.logger.error("\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25:",o),e.fail("ENDPOINT_REMOVE_ERROR",o instanceof Error?o.message:"\u79FB\u9664\u63A5\u5165\u70B9\u5931\u8D25",void 0,500)}}};import{EventEmitter as Gs}from"events";function Fs(n){return typeof n=="object"&&n!==null&&"type"in n&&n.type==="object"}a(Fs,"isValidToolJSONSchema");function rt(n){return Fs(n)?n:{type:"object",properties:{},required:[],additionalProperties:!0}}a(rt,"ensureToolJSONSchema");var Q=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{a(this,"ToolCallError")}};import{isModelScopeURL as qs}from"@xiaozhi-client/config";import{configManager as D}from"@xiaozhi-client/config";import{createHash as Vs}from"crypto";function q(n,e){let t=Vs("md5").update(JSON.stringify(e||{})).digest("hex");return`${n}_${t}`}a(q,"generateCacheKey");function Kt(n,e){let t=new Date(n).getTime();return Date.now()-t>e}a(Kt,"isCacheExpired");function Me(n){let e=Date.now(),t=new Date(n.timestamp).getTime();return!!(n.consumed&&e-t>Pe.CLEANUP_INTERVAL||e-t>n.ttl||n.status==="failed")}a(Me,"shouldCleanupCache");var Pe={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0};var ye=class n extends Error{static{a(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};function lo(n,e){return{content:[{type:"text",text:e?Us(e,n):go(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"}}a(lo,"createTimeoutResponse");function Us(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 Ju=Object.create;var Ks=Object.defineProperty;var Ku=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:
|
|
13
|
+
3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:go(e)};return t[n]||t.default}a(Us,"getToolSpecificTimeoutMessage");function go(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 Ju=Object.create;var Ks=Object.defineProperty;var Ku=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`}
|
|
24
|
-
`).filter(
|
|
25
|
-
`)+(
|
|
26
|
-
`:"");
|
|
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=`
|
|
23
|
+
3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}a(go,"getDefaultTimeoutMessage");import{configManager as uo}from"@xiaozhi-client/config";function zs(n){return n.type==="proxy"}a(zs,"isProxyHandler");var Ie=class{static{a(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=Pe.TIMEOUT;CACHE_TTL=Pe.CACHE_TTL;configUpdateListener=null;constructor(e,t){this.logger=g,this.cacheManager=e||new Z,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=uo.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new X(e)}setupEventListeners(){let e=R();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||uo.getCustomMCPTools();this.tools.clear();for(let r of t)zs(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:rt(e.inputSchema)}))}hasTool(e){return this.tools.has(e)}getToolCount(){return this.tools.size}getToolNames(){return Array.from(this.tools.keys())}getToolInfo(e){return this.tools.get(e)}reinitialize(){this.logger.debug("[CustomMCP] \u91CD\u65B0\u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668..."),this.initialize()}async callTool(e,t,r){let o=this.tools.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);let s=await this.getCompletedResult(e,t);if(s)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),s;try{let i=r?.timeout||this.TIMEOUT,c=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,c),c}catch(i){if(i instanceof ye){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}`),lo(c,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new ye(`\u5DE5\u5177\u8C03\u7528\u8D85\u65F6: ${e}`))},t)})}async getCompletedResult(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(!o.customMCPResults||!o.customMCPResults[r])return null;let s=o.customMCPResults[r];return s.status==="completed"&&!s.consumed&&!Kt(s.timestamp,s.ttl)?s.result:null}catch(r){return this.logger.warn(`[CustomMCP] \u83B7\u53D6\u7F13\u5B58\u5931\u8D25: ${r}`),null}}processWorkflowResponse(e,t){try{let r=t.data||t;return typeof r=="string"?{content:[{type:"text",text:r}],isError:!1}:{content:[{type:"text",text:JSON.stringify(r,null,2)}],isError:!1}}catch(r){return this.logger.error(`[CustomMCP] \u5904\u7406\u5DE5\u4F5C\u6D41\u54CD\u5E94\u5931\u8D25: ${e}`,r),{content:[{type:"text",text:`\u5904\u7406\u54CD\u5E94\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async callCozeWorkflow(e,t){let o=e.handler.config;this.logger.info(`[CustomMCP] \u8C03\u7528 Coze \u5DE5\u4F5C\u6D41: ${e.name}`,{workflow_id:o.workflow_id});try{let s=this.getCozeApiService();if(!o.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let i=await s.callWorkflow(o.workflow_id,t);return this.logger.info(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F: ${e.name}`),this.processWorkflowResponse(e.name,i)}catch(s){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,s),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}async clearConsumedCache(e,t){try{let r=this.generateCacheKey(e,t),o=await this.loadExtendedCache();if(o.customMCPResults?.[r]){o.customMCPResults[r].consumed=!0;let s=o.customMCPResults[r];Me(s)&&delete o.customMCPResults[r],await this.saveCache(o),this.logger.debug(`[CustomMCP] \u6E05\u7406\u5DF2\u6D88\u8D39\u7F13\u5B58: ${r}`)}}catch(r){this.logger.warn(`[CustomMCP] \u6E05\u7406\u7F13\u5B58\u5931\u8D25: ${r}`)}}async generateTaskId(e,t){return q(e,t)}generateCacheKey(e,t){return q(e,t)}async loadExtendedCache(){try{return await this.cacheManager.loadExistingCache()}catch{return{version:"1.0.0",mcpServers:{},metadata:{lastGlobalUpdate:new Date().toISOString(),totalWrites:0,createdAt:new Date().toISOString()},customMCPResults:{}}}}async updateCacheWithResult(e,t){try{let r=await this.loadExtendedCache();r.customMCPResults||(r.customMCPResults={}),r.customMCPResults[e]=t,await this.saveCache(r)}catch(r){this.logger.warn(`[CustomMCP] \u66F4\u65B0\u7F13\u5B58\u5931\u8D25: ${r}`)}}async cacheResult(e,t,r){try{let o=this.generateCacheKey(e,t),s={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(o,s),this.logger.debug(`[CustomMCP] \u7F13\u5B58\u5DE5\u5177\u7ED3\u679C: ${e}`)}catch(o){this.logger.warn(`[CustomMCP] \u7F13\u5B58\u7ED3\u679C\u5931\u8D25: ${o}`)}}async saveCache(e){try{await this.cacheManager.saveCache(e)}catch(t){this.logger.warn(`[CustomMCP] \u4FDD\u5B58\u7F13\u5B58\u5931\u8D25: ${t}`)}}cleanup(){this.logger.info("[CustomMCP] \u6E05\u7406 CustomMCP \u5904\u7406\u5668\u8D44\u6E90"),this.configUpdateListener&&(R().offEvent("config:updated",this.configUpdateListener),this.configUpdateListener=null),this.tools.clear(),this.cacheManager.cleanup()}};import*as ee from"fs";import*as se from"path";import{tmpdir as js}from"os";var Ae=class{static{a(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||js()}};import ot from"pino";var _e=class{static{a(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=se.resolve(se.normalize(e.logFilePath));else{let r=t||Ae.getTempDir();this.logFilePath=se.join(se.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath),g.info("ToolCallLogger \u521D\u59CB\u5316",{maxRecords:this.maxRecords,path:this.logFilePath})}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:a(r=>{try{let o=JSON.parse(r),s=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:ot.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch(r){g.error("\u65E0\u6CD5\u521B\u5EFA\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6",{error:r})}return ot({level:"info",timestamp:ot.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:a((r,o)=>({level:o}),"level")},base:null},ot.multistream(t,{dedupe:!0}))}formatConsoleMessage(e){let t=e.toolName||"\u672A\u77E5\u5DE5\u5177",r=e.success!==!1,o=e.duration?` (${e.duration}ms)`:"";return`${r?"\u2705":"\u274C"} ${t}${o}`}async cleanupOldRecords(){try{if(!ee.existsSync(this.logFilePath))return;let t=ee.readFileSync(this.logFilePath,"utf8").trim().split(`
|
|
24
|
+
`).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,o=t.slice(r),s=o.join(`
|
|
25
|
+
`)+(o.length>0?`
|
|
26
|
+
`:"");ee.writeFileSync(this.logFilePath,s,"utf8"),g.info("\u5DF2\u6E05\u7406\u65E7\u7684\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55",{recordsToRemove:r,maxRecords:this.maxRecords})}catch(e){g.error("\u6E05\u7406\u65E7\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u5931\u8D25",{error:e})}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch(t){g.error("\u8BB0\u5F55\u5DE5\u5177\u8C03\u7528\u5931\u8D25",{error:t})}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},nt=class{static{a(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||Ae.getConfigDir()}getLogFilePath(){return new _e({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!ee.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=ee.readFileSync(e,"utf8").trim().split(`
|
|
27
|
+
`).filter(s=>s.trim()!==""),o=[];for(let s of r)try{let i=JSON.parse(s);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp||g.warn("\u65E5\u5FD7\u8BB0\u5F55\u7F3A\u5C11\u65F6\u95F4\u6233",{line:s}),o.push(i)}catch{g.warn("\u8DF3\u8FC7\u65E0\u6548\u7684\u65E5\u5FD7\u884C",{line:s})}return o.sort((s,i)=>(i.timestamp||0)-(s.timestamp||0)),o}catch(t){throw g.error("\u8BFB\u53D6\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25",{error:t}),new Error("\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6")}}filterRecords(e,t){let r=[...e];if(t.toolName&&(r=r.filter(o=>o.toolName.toLowerCase().includes(t.toolName?.toLowerCase()??""))),t.serverName&&(r=r.filter(o=>o.serverName?.toLowerCase().includes(t.serverName?.toLowerCase()??""))),t.success!==void 0&&(r=r.filter(o=>o.success===t.success)),t.startDate||t.endDate){let o=t.startDate?new Date(t.startDate).getTime():0,s=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let c=i.timestamp||0;return c>=o&&c<=s})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),o=r.length,s=Math.min(e.limit||50,1e3),i=e.offset||0,c=r.slice(i,i+s),l=i+s<o;return g.info("\u8FD4\u56DE\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7",{count:c.length,total:o}),{records:c,total:o,hasMore:l}}};var de=class{static{a(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=g}async handleMessage(e){this.logger.debug(`\u5904\u7406 MCP \u6D88\u606F: ${e.method}`,e);try{let t=e.id===void 0;switch(e.method){case K.INITIALIZE:return await this.handleInitialize(e.params,e.id);case K.INITIALIZED:return await this.handleInitializedNotification(e.params);case K.TOOLS_LIST:return await this.handleToolsList(e.id);case K.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case K.RESOURCES_LIST:return await this.handleResourcesList(e.id);case K.PROMPTS_LIST:return await this.handlePromptsList(e.id);case K.PING:return await this.handlePing(e.id);default:if(t)return this.logger.warn(`\u6536\u5230\u672A\u77E5\u7684\u901A\u77E5\u6D88\u606F: ${e.method}`,e),null;throw new Error(`\u672A\u77E5\u7684\u65B9\u6CD5: ${e.method}`)}}catch(t){return this.logger.error(`\u5904\u7406\u6D88\u606F\u65F6\u51FA\u9519: ${e.method}`,t),e.id===void 0?null:this.createErrorResponse(t,e.id)}}async handleInitialize(e,t){this.logger.debug("\u5904\u7406 initialize \u8BF7\u6C42",e);let r=e.protocolVersion,o=Se.includes(r)?r:J.DEFAULT;return this.logger.debug(`\u534F\u8BAE\u7248\u672C\u534F\u5546: \u5BA2\u6237\u7AEF=${r}, \u670D\u52A1\u5668\u54CD\u5E94=${o}`),{jsonrpc:"2.0",result:{serverInfo:{name:Gt.NAME,version:Gt.VERSION},capabilities:{tools:{},logging:{}},protocolVersion:o},id:t!==void 0?t:1}}async handleInitializedNotification(e){return this.logger.debug("\u6536\u5230 initialized \u901A\u77E5\uFF0C\u5BA2\u6237\u7AEF\u521D\u59CB\u5316\u5B8C\u6210",e),null}async handleToolsList(e){this.logger.debug("\u5904\u7406 tools/list \u8BF7\u6C42");try{let r=this.serviceManager.getAllTools().map(o=>({name:o.name,description:o.description,inputSchema:o.inputSchema}));return{jsonrpc:"2.0",result:{tools:r},id:e!==void 0?e:1}}catch(t){throw this.logger.error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",t),t}}async handleToolCall(e,t){try{let r=po(e),o=await this.serviceManager.callTool(r.name,r.arguments||{});return{jsonrpc:"2.0",result:{content:o.content,isError:o.isError||!1},id:t!==void 0?t:1}}catch(r){throw this.logger.error(`\u5DE5\u5177\u8C03\u7528\u5931\u8D25: ${e.name}`,r),r}}async handlePing(e){return this.logger.debug("\u5904\u7406 ping \u8BF7\u6C42"),{jsonrpc:"2.0",result:{status:"ok",timestamp:new Date().toISOString()},id:e!==void 0?e:1}}async handleResourcesList(e){this.logger.debug("\u5904\u7406 resources/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u8D44\u6E90`),{jsonrpc:"2.0",result:{resources:t},id:e!==void 0?e:1}}async handlePromptsList(e){this.logger.debug("\u5904\u7406 prompts/list \u8BF7\u6C42");let t=[];return this.logger.debug(`\u8FD4\u56DE ${t.length} \u4E2A\u63D0\u793A\u6A21\u677F`),{jsonrpc:"2.0",result:{prompts:t},id:e!==void 0?e:1}}createErrorResponse(e,t){let r=-32603;return e.message.includes("\u672A\u627E\u5230\u5DE5\u5177")||e.message.includes("\u672A\u77E5\u7684\u65B9\u6CD5")?r=-32601:(e.message.includes("\u53C2\u6570")||e.message.includes("\u4E0D\u80FD\u4E3A\u7A7A"))&&(r=-32602),{jsonrpc:"2.0",error:{code:r,message:e.message,data:{stack:e.stack}},id:t!==void 0?t:1}}getServiceManager(){return this.serviceManager}};var Oe=class extends Gs{static{a(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=R();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 Z(r),this.customMCPHandler=new Ie(this.cacheManager,this);let o=D.getToolCallLogConfig(),s=D.getConfigDir();this.toolCallLogger=new _e(o,s),this.eventListeners={serviceConnected:a(async i=>{await this.handleServiceConnected(i)},"serviceConnected"),serviceDisconnected:a(async i=>{await this.handleServiceDisconnected(i)},"serviceDisconnected"),serviceConnectionFailed:a(async i=>{await this.handleServiceConnectionFailed(i)},"serviceConnectionFailed")},this.setupEventListeners(),this.messageHandler=new de(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.onEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.onEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}async handleServiceConnected(e){g.debug(`\u670D\u52A1 ${e.serviceName} \u8FDE\u63A5\u6210\u529F\uFF0C\u5F00\u59CB\u5237\u65B0\u5DE5\u5177\u7F13\u5B58`);try{this.services.get(e.serviceName)&&(await this.refreshCustomMCPHandlerPublic(),g.info(`\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5237\u65B0\u5B8C\u6210`))}catch(t){g.error(`\u5237\u65B0\u670D\u52A1 ${e.serviceName} \u5DE5\u5177\u7F13\u5B58\u5931\u8D25`,{error:t})}}async handleServiceDisconnected(e){g.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\uFF0C\u539F\u56E0: ${e.reason||"\u672A\u77E5"}`);try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic(),g.info(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5B8C\u6210`)}catch(t){g.error(`\u670D\u52A1 ${e.serviceName} \u65AD\u5F00\u8FDE\u63A5\u5904\u7406\u5931\u8D25`,{error:t})}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch(t){g.error("\u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}async startAllServices(){g.debug("[MCPManager] \u6B63\u5728\u542F\u52A8\u6240\u6709 MCP \u670D\u52A1...");try{this.customMCPHandler.initialize(),g.debug("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210")}catch(c){g.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25",{error:c})}let e=Object.entries(this.configs);if(e.length===0){g.warn("[MCPManager] \u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1\uFF0C\u8BF7\u4F7F\u7528 addServiceConfig() \u6DFB\u52A0\u670D\u52A1\u914D\u7F6E");return}g.info(`[MCPManager] \u5F00\u59CB\u5E76\u884C\u542F\u52A8 ${e.length} \u4E2A MCP \u670D\u52A1`);let t=e.map(async([c])=>{try{return await this.startService(c),{serviceName:c,success:!0,error:null}}catch(l){return{serviceName:c,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),o=0,s=0,i=[];for(let c of r)c.status==="fulfilled"?c.value.success?o++:(s++,i.push(c.value.serviceName)):s++;g.info(`[MCPManager] \u670D\u52A1\u542F\u52A8\u5B8C\u6210 - \u6210\u529F: ${o}, \u5931\u8D25: ${s}`),i.length>0&&(g.warn(`[MCPManager] \u4EE5\u4E0B\u670D\u52A1\u542F\u52A8\u5931\u8D25: ${i.join(", ")}`),s===e.length&&g.warn("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25\uFF0C\u4F46\u7CFB\u7EDF\u5C06\u7EE7\u7EED\u8FD0\u884C\u4EE5\u4FBF\u91CD\u8BD5")),i.length>0&&this.scheduleFailedServicesRetry(i)}async startService(e){let t=this.configs[e];if(!t)throw new Error(`\u672A\u627E\u5230\u670D\u52A1\u914D\u7F6E: ${e}`);try{this.services.has(e)&&await this.stopService(e);let r={name:e,...t},o=new st(r);await o.connect(),this.services.set(e,o),await this.refreshToolsCache();let s=o.getTools();g.debug(`[MCPManager] ${e} \u670D\u52A1\u542F\u52A8\u6210\u529F\uFF0C\u52A0\u8F7D\u4E86 ${s.length} \u4E2A\u5DE5\u5177:`,s.map(i=>i.name).join(", "))}catch(r){throw g.error(`[MCPManager] \u542F\u52A8 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),this.services.delete(e),r}}async stopService(e){g.info(`[MCPManager] \u505C\u6B62 MCP \u670D\u52A1: ${e}`);let t=this.services.get(e);if(!t){g.warn(`[MCPManager] \u670D\u52A1 ${e} \u4E0D\u5B58\u5728\u6216\u672A\u542F\u52A8`);return}try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache(),g.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){throw g.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message}),r}}async refreshToolsCache(){this.tools.clear();for(let[e,t]of this.services)if(t.isConnected()){let r=t.getTools(),o=this.configs[e];o&&this.cacheManager.writeCacheEntry(e,r,o).then(()=>{g.debug(`[MCPManager] \u5DF2\u5C06 ${e} \u5DE5\u5177\u5217\u8868\u5199\u5165\u7F13\u5B58`)}).catch(s=>{g.warn(`[MCPManager] \u5199\u5165\u7F13\u5B58\u5931\u8D25: ${e}, \u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)});for(let s of r){let i=`${e}__${s.name}`;this.tools.set(i,{serviceName:e,originalName:s.name,tool:s})}}await this.syncToolsConfigToFile()}getAllTools(e="all"){let t=[];for(let[o,s]of this.services)try{if(s.isConnected()){let i=s.getTools();for(let c of i)try{let l=D.isToolEnabled(o,c.name),u=D.getMcpServerConfig()[o].tools[c.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let p=`${o}__${c.name}`;t.push({name:p,description:c.description||"",inputSchema:c.inputSchema,serviceName:o,originalName:c.name,enabled:l,usageCount:u.usageCount??0,lastUsedTime:u.lastUsedTime??""})}catch(l){g.warn(`[MCPManager] \u68C0\u67E5\u5DE5\u5177 ${o}.${c.name} \u542F\u7528\u72B6\u6001\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:l})}}}catch(i){g.warn(`[MCPManager] \u83B7\u53D6\u670D\u52A1 ${o} \u7684\u5DE5\u5177\u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u670D\u52A1`,{error:i})}let r=[];try{r=this.customMCPHandler.getTools(),g.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${r.length} \u4E2A customMCP \u5DE5\u5177`)}catch(o){g.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5931\u8D25\uFF0C\u5C06\u53EA\u8FD4\u56DE\u6807\u51C6 MCP \u5DE5\u5177",{error:o}),r=[]}if(e!=="disabled")for(let o of r)try{t.push({name:o.name,description:o.description||"",inputSchema:o.inputSchema,serviceName:this.getServiceNameForTool(o),originalName:o.name,enabled:!0,usageCount:0,lastUsedTime:""})}catch(s){g.warn(`[MCPManager] \u5904\u7406 CustomMCP \u5DE5\u5177 ${o.name} \u5931\u8D25\uFF0C\u8DF3\u8FC7\u8BE5\u5DE5\u5177`,{error:s})}return g.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 ${t.length} \u4E2A\u53EF\u7528\u5DE5\u5177\uFF08status=${e}\uFF09`),t}getServiceNameForTool(e){return e.handler?.type==="mcp"&&e.handler.config?.serviceName||"customMCP"}getLogServerName(e){if(!e?.handler)return"custom";switch(e.handler.type){case"mcp":return e.handler.config?.serviceName||"customMCP";case"coze":return"coze";case"dify":return"dify";case"n8n":return"n8n";default:return"custom"}}getOriginalToolName(e,t,r){return t?t.handler?.type==="mcp"&&t.handler.config?.toolName||e:r?.originalName||e}async callTool(e,t,r){let o=Date.now(),s="unknown",i=e;try{let c;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(s=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(c=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(c=await this.customMCPHandler.callTool(e,t,r),g.info(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);s=l.serviceName,i=l.originalName;let u=this.services.get(l.serviceName);if(!u)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!u.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);c=await u.callTool(l.originalName,t||{}),g.debug("[MCPManager] \u5DE5\u5177\u8C03\u7528\u6210\u529F",{toolName:e,result:c}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:c,success:c.isError!==!0,duration:Date.now()-o}),c}catch(c){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:s,arguments:t,result:null,success:!1,duration:Date.now()-o,error:c instanceof Error?c.message:String(c)}),this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l?.handler?.type==="mcp"?this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!1):(this.updateToolStatsSafe(e,"customMCP",e,!1),g.error(`[MCPManager] CustomMCP \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}else{let l=this.tools.get(e);l&&(this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1),g.error(`[MCPManager] \u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}))}throw c}}async updateToolStats(e,t,r,o){try{let s=new Date().toISOString();o?(await this.updateCustomMCPToolStats(e,s),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,s),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177 ${e} \u7684\u7EDF\u8BA1\u4FE1\u606F`)):(await this.updateCustomMCPToolLastUsedTime(e,s),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,s),g.debug("[MCPManager] \u5DF2\u66F4\u65B0\u5DE5\u5177\u7684\u5931\u8D25\u8C03\u7528\u7EDF\u8BA1\u4FE1\u606F",{toolName:e}))}catch(s){throw g.error("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,error:s}),s}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch(s){let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F";g.warn("[MCPManager] \u66F4\u65B0\u5DE5\u5177\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25",{toolName:e,action:i,error:s})}}async updateCustomMCPToolStats(e,t){try{await D.updateToolUsageStatsWithLock(e,!0),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u4F7F\u7528\u7EDF\u8BA1`)}catch(r){throw g.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u7EDF\u8BA1\u5931\u8D25`,{error:r}),r}}async updateCustomMCPToolLastUsedTime(e,t){try{await D.updateToolUsageStatsWithLock(e,!1),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(r){throw g.error(`[MCPManager] \u66F4\u65B0 customMCP \u5DE5\u5177 ${e} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:r}),r}}async updateMCPServerToolStats(e,t,r){try{await D.updateMCPServerToolStatsWithLock(e,t,r,!0),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1`)}catch(o){throw g.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u7EDF\u8BA1\u5931\u8D25`,{error:o}),o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await D.updateMCPServerToolStatsWithLock(e,t,r,!1),g.debug(`[MCPManager] \u5DF2\u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4`)}catch(o){throw g.error(`[MCPManager] \u66F4\u65B0 MCP \u670D\u52A1\u5DE5\u5177 ${e}/${t} \u6700\u540E\u4F7F\u7528\u65F6\u95F4\u5931\u8D25`,{error:o}),o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:s}=t;g.debug(`[MCPManager] \u8C03\u7528 MCP \u540C\u6B65\u5DE5\u5177 ${e} -> ${o}.${s}`);let i=this.services.get(o);if(!i)throw new Error(`\u670D\u52A1 ${o} \u4E0D\u53EF\u7528`);if(!i.isConnected())throw new Error(`\u670D\u52A1 ${o} \u672A\u8FDE\u63A5`);try{let c=await i.callTool(s,r||{});return g.debug(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u6210\u529F`),c}catch(c){throw g.error(`[MCPManager] MCP \u540C\u6B65\u5DE5\u5177 ${e} \u8C03\u7528\u5931\u8D25`,{error:c.message}),c}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){g.info("[MCPManager] \u6B63\u5728\u505C\u6B62\u6240\u6709 MCP \u670D\u52A1..."),this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect(),g.info(`[MCPManager] ${e} \u670D\u52A1\u5DF2\u505C\u6B62`)}catch(r){g.error(`[MCPManager] \u505C\u6B62 ${e} \u670D\u52A1\u5931\u8D25`,{error:r.message})}try{this.customMCPHandler.cleanup(),g.info("[MCPManager] CustomMCP \u5904\u7406\u5668\u5DF2\u6E05\u7406")}catch(e){g.error("[MCPManager] CustomMCP \u5904\u7406\u5668\u6E05\u7406\u5931\u8D25",{error:e})}try{D.clearAllStatsUpdateLocks(),g.info("[MCPManager] \u7EDF\u8BA1\u66F4\u65B0\u9501\u5DF2\u6E05\u7406")}catch(e){g.error("[MCPManager] \u6E05\u7406\u7EDF\u8BA1\u66F4\u65B0\u9501\u5931\u8D25",{error:e})}this.services.clear(),this.tools.clear(),g.info("[MCPManager] \u6240\u6709 MCP \u670D\u52A1\u5DF2\u505C\u6B62")}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=D.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch(e){return g.warn("[MCPManager] \u83B7\u53D6\u7EDF\u8BA1\u66F4\u65B0\u76D1\u63A7\u4FE1\u606F\u5931\u8D25",{error:e}),{activeLocks:[],totalLocks:0}}}getService(e){return this.services.get(e)}getConnectedServices(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push(t);return e}async refreshCustomMCPHandler(){try{g.debug("\u91CD\u65B0\u521D\u59CB\u5316CustomMCPHandler"),this.customMCPHandler.initialize(),g.debug("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){throw g.error("CustomMCPHandler\u91CD\u65B0\u521D\u59CB\u5316\u5931\u8D25",{error:e}),e}}async refreshCustomMCPHandlerPublic(){return this.refreshCustomMCPHandler()}getAllServices(){return new Map(this.services)}getCustomMCPHandler(){return this.customMCPHandler}hasCustomMCPTool(e){try{return this.customMCPHandler.hasTool(e)}catch(t){return g.warn(`[MCPManager] \u68C0\u67E5 CustomMCP \u5DE5\u5177 ${e} \u662F\u5426\u5B58\u5728\u5931\u8D25`,{error:t}),!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch(e){return g.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u5DE5\u5177\u5217\u8868\u5931\u8D25\uFF0C\u8FD4\u56DE\u7A7A\u6570\u7EC4",{error:e}),[]}}isModelScopeService(e){return e.url?qs(e.url):!1}handleModelScopeAuth(e,t,r){if(t.headers?.Authorization){g.info(`[MCPManager] \u670D\u52A1 ${e} \u4F7F\u7528\u5DF2\u6709\u7684 Authorization header`);return}let s=D.getModelScopeApiKey();if(s){r.apiKey=s,g.info(`[MCPManager] \u4E3A ${e} \u670D\u52A1\u6DFB\u52A0 ModelScope API Key`);return}let i=t.url||"\u672A\u77E5";throw new Error(`ModelScope \u670D\u52A1 "${e}" \u9700\u8981\u8BA4\u8BC1\u4FE1\u606F\uFF0C\u4F46\u672A\u627E\u5230\u6709\u6548\u7684\u8BA4\u8BC1\u914D\u7F6E\u3002\u670D\u52A1 URL: ${i}\u8BF7\u9009\u62E9\u4EE5\u4E0B\u4EFB\u4E00\u65B9\u5F0F\u914D\u7F6E\u8BA4\u8BC1\uFF1A1. \u5728\u670D\u52A1\u914D\u7F6E\u4E2D\u6DFB\u52A0 headers.Authorization2. \u6216\u8005\u5728\u5168\u5C40\u914D\u7F6E\u4E2D\u8BBE\u7F6E modelscope.apiKey3. \u6216\u8005\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF MODELSCOPE_API_TOKEN\u83B7\u53D6 ModelScope API Key: https://modelscope.cn/my?myInfo=true`)}enhanceServiceConfig(e,t){let r={...t};try{return this.isModelScopeService(t)&&this.handleModelScopeAuth(e,t,r),r}catch(o){throw g.error(`[MCPManager] \u914D\u7F6E\u589E\u5F3A\u5931\u8D25: ${e}`,{error:o}),o}}addServiceConfig(e,t){let r,o;if(typeof e=="string"&&t)o=e,r=t;else if(typeof e=="object"){let i=e;o=i.name,r=i}else throw new Error("Invalid arguments for addServiceConfig");let s=this.enhanceServiceConfig(o,r);this.configs[o]=s,g.debug(`[MCPManager] \u5DF2\u6DFB\u52A0\u670D\u52A1\u914D\u7F6E: ${o}`)}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(e,t);this.configs[e]=r,g.debug(`[MCPManager] \u5DF2\u66F4\u65B0\u5E76\u589E\u5F3A\u670D\u52A1\u914D\u7F6E: ${e}`)}removeServiceConfig(e){delete this.configs[e],g.debug(`[MCPManager] \u5DF2\u79FB\u9664\u670D\u52A1\u914D\u7F6E: ${e}`)}async syncToolsConfigToFile(){try{g.debug("[MCPManager] \u5F00\u59CB\u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6");let e=D.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let o=r.getTools();if(o.length===0)continue;let s=e[t]?.tools||{},i={};for(let d of o){let E=s[d.name];E?i[d.name]={...E,description:d.description||E.description||""}:i[d.name]={description:d.description||"",enable:!0}}let c=o.map(d=>d.name),u=Object.keys(s).filter(d=>!c.includes(d));if(u.length>0&&g.info(`[MCPManager] \u68C0\u6D4B\u5230\u670D\u52A1 ${t} \u79FB\u9664\u4E86 ${u.length} \u4E2A\u5DE5\u5177: ${u.join(", ")}`),this.hasToolsConfigChanged(s,i)){D.updateServerToolsConfig(t,i);let d=Object.keys(i).filter(C=>!s[C]),E=Object.keys(i).filter(C=>{let x=s[C],Xe=i[C];return x&&x.description!==Xe.description});g.debug(`[MCPManager] \u5DF2\u540C\u6B65\u670D\u52A1 ${t} \u7684\u5DE5\u5177\u914D\u7F6E:`),d.length>0&&g.debug(` - \u65B0\u589E\u5DE5\u5177: ${d.join(", ")}`),E.length>0&&g.debug(` - \u66F4\u65B0\u5DE5\u5177: ${E.join(", ")}`),u.length>0&&g.debug(` - \u79FB\u9664\u5DE5\u5177: ${u.join(", ")}`)}}g.debug("[MCPManager] \u5DE5\u5177\u914D\u7F6E\u540C\u6B65\u5B8C\u6210")}catch(e){g.error("[MCPManager] \u540C\u6B65\u5DE5\u5177\u914D\u7F6E\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25",{error:e})}}hasToolsConfigChanged(e,t){let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!0;let s=o.filter(c=>!r.includes(c)),i=r.filter(c=>!o.includes(c));if(s.length>0||i.length>0)return!0;for(let c of r){let l=e[c],u=t[c];if(l.description!==u.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;g.info(`[MCPManager] \u5B89\u6392 ${e.length} \u4E2A\u5931\u8D25\u670D\u52A1\u7684\u91CD\u8BD5`);let t=3e4;for(let r of e)this.failedServices.add(r),this.scheduleServiceRetry(r,t)}scheduleServiceRetry(e,t){let r=this.retryTimers.get(e);r&&(clearTimeout(r),this.retryTimers.delete(e)),g.debug(`[MCPManager] \u5B89\u6392\u670D\u52A1 ${e} \u5728 ${t}ms \u540E\u91CD\u8BD5`);let o=setTimeout(async()=>{this.retryTimers.delete(e),await this.retryFailedService(e)},t);this.retryTimers.set(e,o)}async retryFailedService(e){if(this.failedServices.has(e))try{await this.startService(e),this.failedServices.delete(e),g.info(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u6210\u529F`);try{await this.refreshCustomMCPHandlerPublic()}catch(t){g.error("[MCPManager] \u5237\u65B0CustomMCPHandler\u5931\u8D25",{error:t})}}catch(t){g.error(`[MCPManager] \u670D\u52A1 ${e} \u91CD\u8BD5\u542F\u52A8\u5931\u8D25`,{error:t.message});let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);g.debug(`[MCPManager] \u670D\u52A1 ${e} \u4E0B\u6B21\u91CD\u8BD5\u5C06\u5728 ${o}ms \u540E\u8FDB\u884C`),this.scheduleServiceRetry(e,o)}}getRetryDelay(e){return 3e4+e.split("").reduce((r,o)=>r+o.charCodeAt(0),0)%6e4}stopServiceRetry(e){let t=this.retryTimers.get(e);t&&(clearTimeout(t),this.retryTimers.delete(e),g.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`)),this.failedServices.delete(e)}stopAllServiceRetries(){g.info("[MCPManager] \u505C\u6B62\u6240\u6709\u670D\u52A1\u91CD\u8BD5");for(let[e,t]of this.retryTimers)clearTimeout(t),g.debug(`[MCPManager] \u5DF2\u505C\u6B62\u670D\u52A1 ${e} \u7684\u91CD\u8BD5`);this.retryTimers.clear(),this.failedServices.clear()}getFailedServices(){return Array.from(this.failedServices)}isServiceFailed(e){return this.failedServices.has(e)}getRetryStats(){return{failedServices:Array.from(this.failedServices),activeRetries:Array.from(this.retryTimers.keys()),totalFailed:this.failedServices.size,totalActiveRetries:this.retryTimers.size}}getMessageHandler(){return this.messageHandler}async start(){if(this.isRunning)throw new Error("\u670D\u52A1\u5668\u5DF2\u5728\u8FD0\u884C");g.info("\u542F\u52A8 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.startAllServices(),this.isRunning=!0,g.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u6210\u529F"),this.emit("started")}catch(e){throw g.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u542F\u52A8\u5931\u8D25",{error:e}),e}}async stop(){if(this.isRunning){g.info("\u505C\u6B62 MCP \u670D\u52A1\u7BA1\u7406\u5668");try{await this.stopAllServices(),this.isRunning=!1,g.info("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u6210\u529F"),this.emit("stopped")}catch(e){throw g.error("MCP \u670D\u52A1\u7BA1\u7406\u5668\u505C\u6B62\u5931\u8D25",{error:e}),e}}}getAllConnections(){let e=[];for(let[t,r]of this.services)r.isConnected()&&e.push({id:`service-${t}`,name:t,state:"connected"});return e}getActiveConnectionCount(){return this.getAllConnections().filter(e=>e.state==="connected").length}getUnifiedStatus(){let e=this.getServiceManagerStatus();return{isRunning:this.isRunning,serviceStatus:e,activeConnections:this.getActiveConnectionCount(),config:this.config,services:e.services,totalTools:e.totalTools,availableTools:e.availableTools}}getServiceManagerStatus(){let e=0,t=[];try{e=this.customMCPHandler.getToolCount(),t=this.customMCPHandler.getToolNames(),g.debug(`[MCPManager] \u6210\u529F\u83B7\u53D6 customMCP \u72B6\u6001: ${e} \u4E2A\u5DE5\u5177`)}catch(c){g.warn("[MCPManager] \u83B7\u53D6 CustomMCP \u72B6\u6001\u5931\u8D25\uFF0C\u5C06\u53EA\u5305\u542B\u6807\u51C6 MCP \u5DE5\u5177",{error:c}),e=0,t=[]}let r=this.tools.size+e,s=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:s};for(let[c,l]of this.services){let u=l.getStatus();i.services[c]={connected:u.connected,clientName:`xiaozhi-${c}-client`}}return e>0&&(i.services.customMCP={connected:!0,clientName:"xiaozhi-customMCP-handler"}),i}isServerRunning(){return this.isRunning}isUnifiedServerConfig(e){return e!==null&&typeof e=="object"&&"configs"in e}async routeMessage(e){let t=await this.messageHandler.handleMessage(e);return t===null?null:{jsonrpc:"2.0",method:"response",params:t,id:t.id}}async initialize(){await this.start()}getToolRegistry(){return this}getConnectionManager(){return this}async cleanup(){await this.stopAllServices(),this.eventBus.offEvent("mcp:service:connected",this.eventListeners.serviceConnected),this.eventBus.offEvent("mcp:service:disconnected",this.eventListeners.serviceDisconnected),this.eventBus.offEvent("mcp:service:connection:failed",this.eventListeners.serviceConnectionFailed)}};import{MCPConnection as Ws}from"@xiaozhi-client/mcp-core";var st=class{static{a(this,"MCPService")}connection;eventBus=R();constructor(e){let{name:t,...r}=e,o={onConnected:a(s=>{this.eventBus.emitEvent(et.CONNECTED,s)},"onConnected"),onDisconnected:a(s=>{this.eventBus.emitEvent(et.DISCONNECTED,s)},"onDisconnected"),onConnectionFailed:a(s=>{this.eventBus.emitEvent(et.CONNECTION_FAILED,s)},"onConnectionFailed")};this.connection=new Ws(t,r,o)}async connect(){return this.connection.connect()}async disconnect(){return this.connection.disconnect()}async callTool(e,t){return this.connection.callTool(e,t)}getTools(){return this.connection.getTools()}getConfig(){return this.connection.getConfig()}getStatus(){return this.connection.getStatus()}isConnected(){return this.connection.isConnected()}};import{TypeFieldNormalizer as Uu}from"@xiaozhi-client/mcp-core";function po(n,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!n||typeof n!="object")throw new Q(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=n;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new Q(-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 Q(-32602,"\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");if(!t.allowEmptyArguments&&r.arguments!==void 0&&r.arguments!==null){let o=r.arguments;if(Object.keys(o).length===0)throw new Q(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new Q(-32602,o)}return{name:r.name,arguments:r.arguments}}a(po,"validateToolCallParams");import{createHash as Xs}from"crypto";import{existsSync as Ne,mkdirSync as Ys,readFileSync as ho,renameSync as Js,writeFileSync as fo}from"fs";import{dirname as Ks,resolve as Co}from"path";import{Hono as Bs}from"hono";var mo=a(()=>new Bs,"createApp");var it=a(n=>{let e=n.get("mcpServiceManager");if(!e)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u68C0\u67E5 mcpServiceManagerMiddleware \u662F\u5426\u6B63\u786E\u914D\u7F6E");return e},"requireMCPServiceManager");import Qs from"dayjs";var Z=class{static{a(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=qt.CACHE_VERSION;CACHE_ENTRY_VERSION=qt.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=oo.CLEANUP_INTERVAL;constructor(e){this.logger=g,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Qs().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return Co(e,Xt.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return Co(t,Xt.FILENAME)}}async ensureCacheFile(){try{if(!Ne(this.cachePath)){let e=Ks(this.cachePath);Ne(e)||(Ys(e,{recursive:!0}),this.logger.debug(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u76EE\u5F55: ${e}`)),this.logger.debug("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u521D\u59CB\u7F13\u5B58\u6587\u4EF6");let t=await this.createInitialCache();await this.saveCache(t),this.logger.info(`[CacheManager] \u5DF2\u521B\u5EFA\u7F13\u5B58\u6587\u4EF6: ${this.cachePath}`)}}catch(e){this.logger.warn(`[CacheManager] \u521B\u5EFA\u7F13\u5B58\u6587\u4EF6\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`)}}async createInitialCache(){let e=this.formatTimestamp();return{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:e,totalWrites:0,createdAt:e}}}async writeCacheEntry(e,t,r){try{this.logger.debug(`[CacheManager] \u5F00\u59CB\u5199\u5165\u7F13\u5B58: ${e}`),await this.ensureCacheFile();let o=await this.loadExistingCache(),s=this.generateConfigHash(r),i={tools:t.map(c=>({name:c.name,description:c.description||"",inputSchema:c.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:s,version:this.CACHE_ENTRY_VERSION};o.mcpServers[e]=i,o.metadata.lastGlobalUpdate=this.formatTimestamp(),o.metadata.totalWrites+=1,await this.saveCache(o),this.logger.debug(`[CacheManager] \u7F13\u5B58\u5199\u5165\u6210\u529F: ${e}, \u5DE5\u5177\u6570\u91CF: ${t.length}`)}catch(o){this.logger.warn(`[CacheManager] \u7F13\u5B58\u5199\u5165\u5931\u8D25: ${e}, \u9519\u8BEF: ${o instanceof Error?o.message:String(o)}`)}}async loadExistingCache(){try{if(!Ne(this.cachePath))return await this.createInitialCache();let e=ho(this.cachePath,"utf8"),t=JSON.parse(e);return this.validateCacheStructure(t)?t:(this.logger.warn("[CacheManager] \u7F13\u5B58\u6587\u4EF6\u7ED3\u6784\u65E0\u6548\uFF0C\u91CD\u65B0\u521B\u5EFA"),await this.createInitialCache())}catch(e){return this.logger.warn(`[CacheManager] \u52A0\u8F7D\u7F13\u5B58\u5931\u8D25\uFF0C\u521B\u5EFA\u65B0\u7F13\u5B58: ${e instanceof Error?e.message:String(e)}`),await this.createInitialCache()}}async saveCache(e){let t=JSON.stringify(e,null,2);await this.atomicWrite(this.cachePath,t)}async atomicWrite(e,t){let r=`${e}.tmp`;try{fo(r,t,"utf8"),Js(r,e)}catch(o){try{Ne(r)&&fo(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return Xs("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:Ne(this.cachePath)?ho(this.cachePath,"utf8").length:0}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),null}}getFilePath(){return this.cachePath}async getAllCachedTools(){try{let e=await this.loadExistingCache(),t=[];for(let[r,o]of Object.entries(e.mcpServers))for(let s of o.tools)t.push({...s,name:`${r}${io.SERVICE_TOOL_SEPARATOR}${s.name}`});return this.logger.debug(`[CacheManager] \u83B7\u53D6\u5230\u6240\u6709\u7F13\u5B58\u5DE5\u5177\uFF0C\u5171 ${t.length} \u4E2A`),t}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u5DE5\u5177\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),[]}}async writeCustomMCPResult(e,t,r,o="completed",s,i=3e5){try{let c=await this.loadExtendedCache(),l=q(e,t),u={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:s,retryCount:0};c.customMCPResults||(c.customMCPResults={}),c.customMCPResults[l]=u,await this.saveExtendedCache(c),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${o}`)}catch(c){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=q(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return null;let s=r.customMCPResults[o],i=Date.now(),c=new Date(s.timestamp).getTime();return i-c>s.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):s}catch(r){return this.logger.warn(`[CacheManager] \u8BFB\u53D6CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),null}}async updateCustomMCPStatus(e,t,r,o,s){try{let i=await this.loadExtendedCache(),c=q(e,t);if(!i.customMCPResults||!i.customMCPResults[c])return!1;let l=i.customMCPResults[c],u=l.status;return l.status=r,l.timestamp=new Date().toISOString(),o&&(l.result=o),s&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${s}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(i),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${u} -> ${r}`),!0}catch(i){return this.logger.warn(`[CacheManager] \u66F4\u65B0CustomMCP\u7F13\u5B58\u72B6\u6001\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`),!1}}async markCustomMCPAsConsumed(e,t){try{let r=await this.loadExtendedCache(),o=q(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return!1;let s=r.customMCPResults[o];return s.consumed||(s.consumed=!0,s.timestamp=new Date().toISOString(),await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u6807\u8BB0\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39: ${e}`)),!0}catch(r){return this.logger.warn(`[CacheManager] \u6807\u8BB0CustomMCP\u7F13\u5B58\u4E3A\u5DF2\u6D88\u8D39\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async deleteCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=q(e,t);return!r.customMCPResults||!r.customMCPResults[o]?!1:(delete r.customMCPResults[o],await this.saveExtendedCache(r),this.logger.debug(`[CacheManager] \u5220\u9664\u7F13\u5B58\u6761\u76EE: ${e}`),!0)}catch(r){return this.logger.warn(`[CacheManager] \u5220\u9664CustomMCP\u7F13\u5B58\u6761\u76EE\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),!1}}async cleanupCustomMCPResults(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{cleaned:0,total:0};let t=Object.entries(e.customMCPResults),r=0;for(let[o,s]of t)Me(s)&&(delete e.customMCPResults[o],r++);return r>0&&(await this.saveExtendedCache(e),this.logger.info(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58: ${r}/${t.length}`)),{cleaned:r,total:t.length}}catch(e){return this.logger.warn(`[CacheManager] \u6E05\u7406CustomMCP\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{cleaned:0,total:0}}}async getCustomMCPStatistics(){try{let e=await this.loadExtendedCache();if(!e.customMCPResults)return{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0};let t=Object.values(e.customMCPResults),r=t.length,o=t.filter(p=>p.status==="pending").length,s=t.filter(p=>p.status==="completed").length,i=t.filter(p=>p.status==="failed").length,c=t.filter(p=>p.consumed).length,l=s>0?c/s*100:0,u=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:s,failedTasks:i,consumedEntries:c,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:u}}catch(e){return this.logger.warn(`[CacheManager] \u83B7\u53D6CustomMCP\u7F13\u5B58\u7EDF\u8BA1\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{totalEntries:0,pendingTasks:0,completedTasks:0,failedTasks:0,consumedEntries:0,cacheHitRate:0,lastCleanupTime:new Date().toISOString(),memoryUsage:0}}}async loadExtendedCache(){try{return await this.loadExistingCache()}catch(e){return this.logger.warn(`[CacheManager] \u52A0\u8F7D\u6269\u5C55\u7F13\u5B58\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`),{version:this.CACHE_VERSION,mcpServers:{},metadata:{lastGlobalUpdate:this.formatTimestamp(),totalWrites:0,createdAt:this.formatTimestamp()},customMCPResults:{}}}}async saveExtendedCache(e){await this.saveCache(e)}startCleanupTimer(){this.cleanupInterval=setInterval(()=>{this.cleanupCustomMCPResults().catch(e=>{this.logger.warn(`[CacheManager] \u81EA\u52A8\u6E05\u7406\u5931\u8D25: ${e}`)})},this.CLEANUP_INTERVAL),this.logger.debug(`[CacheManager] \u542F\u52A8\u6E05\u7406\u5B9A\u65F6\u5668\uFF0C\u95F4\u9694: ${this.CLEANUP_INTERVAL}ms`)}stopCleanupTimer(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=void 0,this.logger.debug("[CacheManager] \u505C\u6B62\u6E05\u7406\u5B9A\u65F6\u5668"))}cleanup(){this.stopCleanupTimer(),this.logger.debug("[CacheManager] \u6E05\u7406\u8D44\u6E90\u5B8C\u6210")}};var at=class{static{a(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=g,this.config={maxMessageSize:e.maxMessageSize??so.DEFAULT,enableMetrics:e.enableMetrics??!0},this.metrics={totalMessages:0,errorCount:0,averageResponseTime:0},this.logger.debug("MCPRouteHandler \u521D\u59CB\u5316\u5B8C\u6210",{maxMessageSize:this.config.maxMessageSize,enableMetrics:this.config.enableMetrics})}getMCPServiceManager(e){let t=e.get("mcpServiceManager");if(t)return t;let r=e.get("webServer");if(!r)throw new Error("WebServer \u672A\u5728 Context \u4E2D\u627E\u5230\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u95F4\u4EF6\u914D\u7F6E");let o=r.getMCPServiceManager();return this.logger.debug("MCPServiceManager \u4ECE WebServer \u83B7\u53D6\uFF08Context \u4E2D\u672A\u627E\u5230\uFF09"),o}async initializeMessageHandler(e){if(!this.mcpMessageHandler)try{let t=this.getMCPServiceManager(e);this.mcpMessageHandler=new de(t),this.logger.debug("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u6210\u529F")}catch(t){throw this.logger.error("MCP \u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",t),this.metrics.errorCount++,t}}async handlePost(e){let t=Date.now(),r=null;try{this.logger.debug("\u5904\u7406 MCP POST \u8BF7\u6C42");let o=e.req.header(U.CONTENT_LENGTH);if(o&&Number.parseInt(o)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${ne.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(U.CONTENT_TYPE)?.includes(I.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${ne.INVALID_REQUEST}: ${ne.INVALID_CONTENT_TYPE}`);let i=e.req.header("mcp-protocol-version")||e.req.header(U.MCP_PROTOCOL_VERSION)||e.req.header("Mcp-Protocol-Version");i&&!Se.includes(i)&&this.logger.warn(`\u4E0D\u652F\u6301\u7684 MCP \u534F\u8BAE\u7248\u672C: ${i}\uFF0C\u652F\u6301\u7684\u7248\u672C: ${Se.join(", ")}`);let c;try{let p=await e.req.text();if(p.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);c=JSON.parse(p),r=c.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,ne.PARSE_ERROR)}if(!this.validateMessage(c))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${ne.INVALID_REQUEST}: Message does not conform to JSON-RPC ${"2.0"}`,r);if(await this.initializeMessageHandler(e),!this.mcpMessageHandler)throw new Error("\u6D88\u606F\u5904\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25");let l=await this.mcpMessageHandler.handleMessage(c);this.metrics.totalMessages++;let u=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+u)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:c.method,messageId:r,responseTime:u,isNotification:l===null}),l===null?new Response(null,{status:Y.NO_CONTENT,headers:{[U.MCP_PROTOCOL_VERSION]:J.DEFAULT,[U.X_RESPONSE_TIME]:u.toString()}}):e.json(l,Y.OK,{[U.CONTENT_TYPE]:I.APPLICATION_JSON,[U.MCP_PROTOCOL_VERSION]:J.DEFAULT,[U.X_RESPONSE_TIME]:u.toString()})}catch(o){this.metrics.errorCount++;let s=Date.now()-t;this.logger.error("\u5904\u7406 MCP POST \u8BF7\u6C42\u65F6\u51FA\u9519:",{error:o instanceof Error?o.message:String(o),messageId:r,responseTime:s,stack:o instanceof Error?o.stack:void 0});let i=o instanceof Error?o.message:String(o);return this.createErrorResponse(-32603,`${ne.INTERNAL_ERROR}: ${i}`,r)}}validateMessage(e){if(!e||typeof e!="object")return this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: \u4E0D\u662F\u5BF9\u8C61"),!1;let t=e;return t.jsonrpc!=="2.0"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: jsonrpc \u7248\u672C\u4E0D\u6B63\u786E",{jsonrpc:t.jsonrpc}),!1):!t.method||typeof t.method!="string"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: method \u5B57\u6BB5\u65E0\u6548",{method:t.method}),!1):t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"&&t.id!==null?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: id \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{id:t.id}),!1):t.params!==void 0&&typeof t.params!="object"?(this.logger.debug("\u6D88\u606F\u9A8C\u8BC1\u5931\u8D25: params \u5B57\u6BB5\u7C7B\u578B\u65E0\u6548",{params:t.params}),!1):!0}createErrorResponse(e,t,r){let o=r??`error-${Date.now()}`,s={jsonrpc:"2.0",error:{code:e,message:t},id:o};return new Response(JSON.stringify(s),{status:Y.BAD_REQUEST,headers:{[U.CONTENT_TYPE]:I.APPLICATION_JSON,[U.MCP_PROTOCOL_VERSION]:J.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 m=class n extends Error{static{a(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",o="system",s={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=o,this.timestamp=new Date().toISOString(),this.details={...s,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,n)}toJSON(){return{name:this.name,code:this.code,message:this.message,severity:this.severity,category:this.category,details:this.details,timestamp:this.timestamp}}static configError(e,t,r={}){return new n(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new n(e,t,"high","connection",r)}static operationError(e,t,r={}){return new n(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new n(e,t,"high","system",r)}static validationError(e,t,r={}){return new n(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new n(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},ct=class{static{a(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof m)}handle(e,t){return m.fromError(e,"INTERNAL_ERROR","system")}},Qt=class{static{a(this,"ConfigErrorHandler")}canHandle(e){return e.message.includes("\u914D\u7F6E")||e.message.includes("config")||e.message.includes("JSON")||e.message.includes("\u89E3\u6790")}handle(e,t){return m.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Zt=class{static{a(this,"ConnectionErrorHandler")}canHandle(e){return e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")||e.message.includes("timeout")||e.message.includes("ECONNREFUSED")||e.message.includes("ENOTFOUND")}handle(e,t){return m.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},er=class{static{a(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Qt),this.registerHandler(new Zt),this.registerHandler(new ct)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof m)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new ct().handle(e,t)}},Np=new er;import{normalizeServiceConfig as ti}from"@xiaozhi-client/config";import{TypeFieldNormalizer as tr}from"@xiaozhi-client/mcp-core";var be=class{static{a(this,"MCPHandler")}logger;mcpServiceManager;configManager;statusCache;constructor(e,t){this.logger=g,this.mcpServiceManager=e,this.configManager=t,this.statusCache=new Map}handleError(e,t,r){if(e instanceof m)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let s;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?s=m.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?s=m.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?s=m.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?s=m.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):s=m.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:s,operation:t,context:r}),s}let o=m.systemError("INTERNAL_ERROR",String(e),{operation:t,context:r});return this.logger.error("MCPError",{error:o,operation:t,context:r}),o}async addMCPServer(e){let t=Date.now(),r=await e.req.json();this.logger.info("addMCPServer",{requestData:r,method:"POST",path:"/api/mcp-servers"});try{if("mcpServers"in r){let u=r,p=await this.addMCPServersBatch(u),d=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:p.addedCount,failedCount:p.failedCount,duration:d}),e.success(p,p.message,201)}let o=r,{name:s,config:i}=o,c=await this.addMCPServerSingle(s,i),l=Date.now()-t;return this.logger.info("addMCPServer",{serverName:s,toolsCount:c.tools?.length||0,duration:l,status:c.status}),e.success(c,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F",201)}catch(o){let s=this.handleError(o,"addMCPServer",{requestData:r}),i=500;return s.category==="validation"?i=400:s.category==="configuration"?s.code==="SERVER_ALREADY_EXISTS"?i=409:i=400:s.category==="connection"&&(i=500),e.fail(s.code,s.message,{error:s.details},i)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=tr.normalizeTypeField(t);try{let o=j.validateServiceName(e);if(!o.isValid){let p=m.validationError("INVALID_SERVICE_NAME",o.errors.join(", "),{serverName:e,errors:o.errors});throw this.logger.error("addMCPServerSingle",{validationError:p,serverName:e,phase:"name_validation"}),p}if(j.checkServiceExists(e,this.configManager)){let p=m.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:p,serverName:e,phase:"existence_check"}),p}let s=j.validateConfig(r);if(!s.isValid){let p=m.configError("INVALID_CONFIG",s.errors.join(", "),{serverName:e,config:r,errors:s.errors});throw this.logger.error("addMCPServerSingle",{configError:p,serverName:e,phase:"config_validation"}),p}this.configManager.updateMcpServer(e,r),this.logger.debug("\u670D\u52A1\u914D\u7F6E\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u7BA1\u7406\u5668",{serverName:e});let i=ti(r);this.mcpServiceManager.addServiceConfig(e,i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let c=this.getServiceStatus(e),u=this.getServiceTools(e).map(p=>p.name);return R().emitEvent("mcp:server:added",{serverName:e,config:r,tools:u,timestamp:new Date}),{...c,tools:u}}catch(o){let s=this.handleError(o,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:s,serverName:e}),s}}getServiceStatus(e){let r=this.configManager.getConfig().mcpServers[e];if(!r)return{name:e,status:"disconnected",connected:!1,tools:[],config:{}};try{let i=this.mcpServiceManager.services.get(e);if(i?.isConnected?.()){let c=i.getTools().map(u=>u.name),l={name:e,status:"connected",connected:!0,tools:c,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(s){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,s)}let o={name:e,status:"disconnected",connected:!1,tools:[],config:r};return this.checkAndEmitStatusChange(e,o),o}checkAndEmitStatusChange(e,t){let r=this.getPreviousStatus(e);if(r&&r.status!==t.status&&(this.logger.info(`\u670D\u52A1 ${e} \u72B6\u6001\u53D8\u5316: ${r.status} -> ${t.status}`),R().emitEvent("mcp:server:status_changed",{serverName:e,oldStatus:r.status,newStatus:t.status,timestamp:new Date,reason:t.status==="connected"?"connection_established":"connection_lost"}),r.tools!==t.tools)){let o=t.tools.filter(i=>!r.tools.includes(i)),s=r.tools.filter(i=>!t.tools.includes(i));(o.length>0||s.length>0)&&R().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:o,removedTools:s,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){return this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=j.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!j.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let o=this.getServiceTools(t).map(s=>s.name);try{await this.mcpServiceManager.stopService(t)}catch(s){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,s)}return this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),R().emitEvent("mcp:server:removed",{serverName:t,affectedTools:o,timestamp:new Date}),e.success({name:t,operation:"removed",affectedTools:o},"MCP \u670D\u52A1\u79FB\u9664\u6210\u529F")}catch(t){if(this.logger.error("\u79FB\u9664 MCP \u670D\u52A1\u5931\u8D25:",t),t instanceof Error){if(t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728"))return e.fail("SERVER_NOT_FOUND",t.message,void 0,404);if(t.message.includes("\u914D\u7F6E\u66F4\u65B0"))return e.fail("CONFIG_UPDATE_FAILED",t.message,void 0,500)}return e.fail("REMOVE_FAILED","\u79FB\u9664 MCP \u670D\u52A1\u65F6\u53D1\u751F\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async getMCPServerStatus(e){try{let t=e.req.param("serverName");if(!t)return e.fail("INVALID_SERVICE_NAME","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{},400);let r=j.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!j.checkServiceExists(t,this.configManager))return e.fail("SERVER_NOT_FOUND","MCP \u670D\u52A1\u4E0D\u5B58\u5728",{serverName:t},404);let o=this.getServiceStatus(t);return e.success(o,"MCP \u670D\u52A1\u72B6\u6001\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),t instanceof Error&&t.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")?e.fail("SERVER_NOT_FOUND",t.message,void 0,404):e.fail("INTERNAL_ERROR","\u83B7\u53D6 MCP \u670D\u52A1\u72B6\u6001\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async listMCPServers(e){try{let r=this.configManager.getConfig().mcpServers||{},o=[];for(let[i,c]of Object.entries(r)){let l=this.getServiceStatus(i);o.push(l)}let s={servers:o,total:o.length};return e.success(s,"MCP \u670D\u52A1\u5217\u8868\u83B7\u53D6\u6210\u529F")}catch(t){return this.logger.error("\u5217\u51FA MCP \u670D\u52A1\u5931\u8D25:",t),e.fail("INTERNAL_ERROR","\u5217\u51FA MCP \u670D\u52A1\u65F6\u53D1\u751F\u5185\u90E8\u9519\u8BEF",{error:t instanceof Error?t.message:String(t)},500)}}async addMCPServersBatch(e){let{mcpServers:t}=e,r=Object.keys(t);if(this.logger.info("addMCPServersBatch",{serverCount:r.length,serverNames:r}),r.length===0)throw m.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let o=[],s=[],i=this.validateBatchServers(t);if(!i.isValid)throw m.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[p,d]of Object.entries(t)){let E=tr.normalizeTypeField(d);try{let C=await this.addMCPServerSingle(p,E);o.push({name:p,success:!0,config:E,tools:C.tools,status:C.status}),s.push(p),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:p,toolsCount:C.tools?.length||0})}catch(C){let x=this.handleError(C,"addMCPServersBatch",{serverName:p,serverConfig:E});o.push({name:p,success:!1,error:x.message,config:E}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:p,error:x.message})}}let c=s.length,l=r.length-c;if(c===0)throw m.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");R().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:c,failedCount:l,successfullyAddedServers:s,results:o,timestamp:new Date});let u={success:c>0,message:c===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${c} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:o,addedCount:c,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:c,failedCount:l}),u}catch(c){throw s.length>0&&await this.rollbackBatchAdd(s),c instanceof m?c:m.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`)}}validateBatchServers(e){let t=[];if(!e||typeof e!="object")return t.push("mcpServers \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:t};let r=Object.keys(e);if(r.length===0)return t.push("mcpServers \u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A"),{isValid:!1,errors:t};if(r.length>50)return t.push("\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7 50 \u4E2A"),{isValid:!1,errors:t};for(let[o,s]of Object.entries(e)){let i=j.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(j.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let c=tr.normalizeTypeField(s),l=j.validateConfig(c);l.isValid||t.push(`\u670D\u52A1 "${o}" \u914D\u7F6E\u65E0\u6548: ${l.errors.join(", ")}`)}return{isValid:t.length===0,errors:t}}async rollbackBatchAdd(e){this.logger.info("\u5F00\u59CB\u56DE\u6EDA\u6279\u91CF\u6DFB\u52A0\u7684\u670D\u52A1",{serverNames:e});let t=[],r=[];for(let o of e)try{try{await this.mcpServiceManager.stopService(o)}catch(s){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${o} \u5931\u8D25:`,s)}this.mcpServiceManager.removeServiceConfig(o),this.configManager.removeMcpServer(o),t.push(o),R().emitEvent("mcp:server:rollback",{serverName:o,timestamp:new Date})}catch(s){let i=this.handleError(s,"rollbackBatchAdd",{serverName:o});r.push(o),this.logger.error(`\u56DE\u6EDA\u670D\u52A1 ${o} \u5931\u8D25:`,i.message)}r.length>0?this.logger.warn("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u90E8\u5206\u5931\u8D25",{totalServers:e.length,rollbackedCount:t.length,failedCount:r.length,failedServers:r}):this.logger.info("\u6279\u91CF\u6DFB\u52A0\u56DE\u6EDA\u6210\u529F",{totalServers:e.length,rollbackedCount:t.length})}},j;(r=>{function n(o){let s=[];if(!o||typeof o!="object")return s.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:s};if("command"in o)(!o.command||typeof o.command!="string")&&s.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),o.args&&!Array.isArray(o.args)&&s.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),o.env&&typeof o.env!="object"&&s.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in o){(!o.url||typeof o.url!="string")&&s.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(o.url)}catch{s.push("URL \u683C\u5F0F\u65E0\u6548")}}else s.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:s.length===0,errors:s}}r.validateConfig=n,a(n,"validateConfig");function e(o){let s=[];return!o||typeof o!="string"?(s.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:s}):((o.length<1||o.length>50)&&s.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(o)||s.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:s.length===0,errors:s})}r.validateServiceName=e,a(e,"validateServiceName");function t(o,s){let i=s.getConfig();return i.mcpServers&&o in i.mcpServers}r.checkServiceExists=t,a(t,"checkServiceExists")})(j||={});import{configManager as we}from"@xiaozhi-client/config";var lt=class{static{a(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=g,this.notificationService=e,this.statusService=t,this.eventBus=R()}async handleMessage(e,t,r){try{switch(this.logger.debug(`\u5904\u7406 WebSocket \u6D88\u606F: ${t.type}`,{clientId:r}),this.eventBus.emitEvent("websocket:message:received",{type:t.type,data:t.data,clientId:r}),t.type){case"getConfig":await this.handleGetConfig(e,r);break;case"updateConfig":await this.handleUpdateConfig(e,t.data,r);break;case"getStatus":await this.handleGetStatus(e,r);break;case"restartService":await this.handleRestartService(e,r);break;default:this.logger.warn(`\u672A\u77E5\u7684 WebSocket \u6D88\u606F\u7C7B\u578B: ${t.type}`,{clientId:r}),G(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`,this.logger)}}catch(o){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,o),G(e,"MESSAGE_PROCESSING_ERROR",o instanceof Error?o.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25",this.logger)}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=we.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),G(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(we.validateConfig(t),we.updateConfig(t),t.mcpServerConfig)for(let[o,s]of Object.entries(t.mcpServerConfig))for(let[i,c]of Object.entries(s.tools))we.setToolEnabled(o,i,c.enable);this.logger.debug("WebSocket: \u914D\u7F6E\u66F4\u65B0\u6210\u529F",{clientId:r}),e.send(JSON.stringify({type:"config:updated",success:!0}))}catch(o){this.logger.error("WebSocket: \u914D\u7F6E\u66F4\u65B0\u5931\u8D25",o),G(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o),this.logger)}}async handleGetStatus(e,t){this.logDeprecationWarning("WebSocket getStatus","GET /api/status");try{let r=this.statusService.getFullStatus();e.send(JSON.stringify({type:"status",data:r.client})),this.logger.debug("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u6210\u529F",{clientId:t})}catch(r){this.logger.error("WebSocket: getStatus \u8BF7\u6C42\u5904\u7406\u5931\u8D25",r),G(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),G(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=we.getConfig();e.send(JSON.stringify({type:"configUpdate",data:r}));let o=this.statusService.getFullStatus();e.send(JSON.stringify({type:"statusUpdate",data:o.client})),o.restart&&e.send(JSON.stringify({type:"restartStatus",data:o.restart})),this.logger.debug("\u521D\u59CB\u6570\u636E\u53D1\u9001\u5B8C\u6210",{clientId:t})}catch(r){this.logger.error("\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25:",r),G(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 ri}from"child_process";var gt=class{static{a(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=g,this.statusService=e,this.eventBus=R()}spawnXiaozhiProcess(e){let t=ri("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=it(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},Bt.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")}},Bt.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=it(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 ut}from"fs";import{readFile as oi}from"fs/promises";import{dirname as ni,join as A}from"path";import{fileURLToPath as si}from"url";var Le=class extends y{static{a(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=g,this.initializeWebPath()}initializeWebPath(){try{let e=ni(si(import.meta.url));g.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[A(e,"..","..","..","frontend"),A(e,"..","..","frontend"),A(e,"..","frontend"),A(e,"..","..","apps","frontend","dist"),A(e,"..","apps","frontend","dist"),A(e,"..","..","apps","frontend"),A(e,"..","apps","frontend"),A(e,"..","..","web","dist"),A(e,"..","web","dist"),A(e,"..","..","web"),A(e,"..","web"),A(e,"..","..","..","apps","frontend","dist"),A(e,"..","..","..","apps","frontend"),A(e,"..","..","..","web","dist"),A(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=ut(r);return g.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?g.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(g.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),g.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){g.error("\u521D\u59CB\u5316\u9759\u6001\u6587\u4EF6\u8DEF\u5F84\u5931\u8D25:",e)}}async handleStaticFile(e){let t=new URL(e.req.url).pathname;try{if(e.logger.debug(`\u5904\u7406\u9759\u6001\u6587\u4EF6\u8BF7\u6C42: ${t}`),!this.webPath)return this.createErrorPage(e,"\u627E\u4E0D\u5230\u524D\u7AEF\u8D44\u6E90\u6587\u4EF6");let r=t;if(r==="/"&&(r="/index.html"),r.includes(".."))return e.logger.warn(`\u8DEF\u5F84\u904D\u5386\u653B\u51FB\u5C1D\u8BD5: ${r}`),e.text("Forbidden",Y.FORBIDDEN);let o=A(this.webPath,r);if(!ut(o)){let i=A(this.webPath,"index.html");return ut(i)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,I.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",Y.NOT_FOUND))}let s=this.getContentType(o);return e.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${s}`),this.serveFile(e,o,s)}catch(r){return e.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",Y.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let o=await oi(t);return r.startsWith("text/")||r.includes("javascript")||r.includes("json")?e.text(o.toString(),200,{"Content-Type":r}):e.body(new Uint8Array(o),200,{"Content-Type":r})}catch(o){throw g.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,o),o}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:I.TEXT_HTML,htm:I.TEXT_HTML,js:I.APPLICATION_JAVASCRIPT,mjs:I.APPLICATION_JAVASCRIPT,css:I.TEXT_CSS,json:I.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:I.APPLICATION_PDF,txt:I.TEXT_PLAIN,xml:I.APPLICATION_XML,zip:I.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||I.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
|
|
28
28
|
<!DOCTYPE html>
|
|
29
29
|
<html>
|
|
30
30
|
<head>
|
|
@@ -81,32 +81,10 @@ var Ju=Object.create;var Ks=Object.defineProperty;var Ku=Object.getOwnPropertyDe
|
|
|
81
81
|
</div>
|
|
82
82
|
</body>
|
|
83
83
|
</html>
|
|
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
|
-
`)}
|
|
91
|
-
${a}
|
|
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
|
-
|
|
99
|
-
This is disabled by default, as it risks exposing your secret API credentials to attackers.
|
|
100
|
-
If you understand the risks and have appropriate mitigations in place,
|
|
101
|
-
you can set the \`dangerouslyAllowBrowser\` option to \`true\`, e.g.,
|
|
102
|
-
|
|
103
|
-
new OpenAI({ apiKey, dangerouslyAllowBrowser: true });
|
|
104
|
-
|
|
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=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
|
|
84
|
+
`;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&ut(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}};var pt=class extends y{static{a(this,"StatusApiHandler")}statusService;constructor(e){super(),this.statusService=e}async getStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getFullStatus();return e.get("logger").debug("\u83B7\u53D6\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u72B6\u6001","STATUS_READ_ERROR")}}async getClientStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getClientStatus();return e.get("logger").debug("\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u5BA2\u6237\u7AEF\u72B6\u6001","CLIENT_STATUS_READ_ERROR")}}async getRestartStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u8BF7\u6C42");let t=this.statusService.getRestartStatus();return e.get("logger").debug("\u83B7\u53D6\u91CD\u542F\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u91CD\u542F\u72B6\u6001","RESTART_STATUS_READ_ERROR")}}async checkClientConnected(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5\u8BF7\u6C42");let t=this.statusService.isClientConnected();return e.get("logger").debug(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u72B6\u6001: ${t}`),e.success({connected:t})}catch(t){return this.handleError(e,t,"\u68C0\u67E5\u5BA2\u6237\u7AEF\u8FDE\u63A5","CLIENT_CONNECTION_CHECK_ERROR")}}async getLastHeartbeat(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u8BF7\u6C42");let t=this.statusService.getLastHeartbeat();return e.get("logger").debug("\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4\u6210\u529F"),e.success({lastHeartbeat:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u6700\u540E\u5FC3\u8DF3\u65F6\u95F4","HEARTBEAT_READ_ERROR")}}async getActiveMCPServers(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let t=this.statusService.getActiveMCPServers();return e.get("logger").debug("\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u6210\u529F"),e.success({servers:t})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u6D3B\u8DC3 MCP \u670D\u52A1\u5668","ACTIVE_MCP_SERVERS_READ_ERROR")}}async updateClientStatus(e){try{e.get("logger").debug("\u5904\u7406\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u8BF7\u6C42");let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61");return!t||typeof t!="object"?e.fail("INVALID_REQUEST_BODY","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u7684\u72B6\u6001\u5BF9\u8C61",void 0,400):(this.statusService.updateClientInfo(t,"http-api"),e.get("logger").info("\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"),e.success(void 0,"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u6210\u529F"))}catch(t){return this.handleError(e,t,"\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001","CLIENT_STATUS_UPDATE_ERROR","\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25",400)}}async setActiveMCPServers(e){try{e.get("logger").debug("\u5904\u7406\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BF7\u6C42");let{servers:t}=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF");return Array.isArray(t)?(this.statusService.setActiveMCPServers(t),e.get("logger").info("\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F"),e.success(void 0,"\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u8BBE\u7F6E\u6210\u529F")):e.fail("INVALID_REQUEST_BODY","servers \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4",void 0,400)}catch(t){return this.handleError(e,t,"\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668","ACTIVE_MCP_SERVERS_UPDATE_ERROR","\u8BBE\u7F6E\u6D3B\u8DC3 MCP \u670D\u52A1\u5668\u5931\u8D25",400)}}async resetStatus(e){try{return e.get("logger").info("\u5904\u7406\u91CD\u7F6E\u72B6\u6001\u8BF7\u6C42"),this.statusService.reset(),e.get("logger").info("\u72B6\u6001\u91CD\u7F6E\u6210\u529F"),e.success(void 0,"\u72B6\u6001\u91CD\u7F6E\u6210\u529F")}catch(t){return this.handleError(e,t,"\u91CD\u7F6E\u72B6\u6001","STATUS_RESET_ERROR")}}};var rr=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(rr||{});var ii={name:a((n,e)=>n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN"),"name"),enabled:a((n,e)=>{let t=Number(e.enabled)-Number(n.enabled);return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"enabled"),usageCount:a((n,e)=>{let t=e.usageCount-n.usageCount;return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"usageCount"),lastUsedTime:a((n,e)=>{if(!n.lastUsedTime)return 1;if(!e.lastUsedTime)return-1;let t=new Date(e.lastUsedTime).getTime()-new Date(n.lastUsedTime).getTime();return t!==0?t:n.serviceName!==e.serviceName?n.serviceName.localeCompare(e.serviceName,"zh-CN"):n.originalName.localeCompare(e.originalName,"zh-CN")},"lastUsedTime")};function Eo(n,e){let t=ii[e.field];return t?[...n].sort(t):(g.warn(`[sortTools] \u672A\u77E5\u7684\u6392\u5E8F\u5B57\u6BB5: ${e.field}`),n)}a(Eo,"sortTools");import{configManager as S}from"@xiaozhi-client/config";import ai from"ajv";import dt from"dayjs";var mt=class n{static{a(this,"MCPToolHandler")}static UNDERSCORE_TRIM_REGEX=/^_+|_+$/g;static LETTER_START_REGEX=/^[a-zA-Z]/;static CHINESE_CHAR_REGEX=/[\u4e00-\u9fa5]/;static DIGITS_ONLY_REGEX=/^\d+$/;static ALPHANUMERIC_UNDERSCORE_REGEX=/^[a-zA-Z0-9_-]+$/;static IDENTIFIER_REGEX=/^[a-zA-Z_][a-zA-Z0-9_]*$/;logger;ajv;static TOOL_TYPE_VALUES=Object.values(rr);constructor(){this.logger=g,this.ajv=new ai({allErrors:!0,verbose:!0})}async callTool(e){try{e.get("logger").info("\u5904\u7406\u5DE5\u5177\u8C03\u7528\u8BF7\u6C42");let t=await e.req.json(),{serviceName:r,toolName:o,args:s}=t;if(!r||!o)return e.fail("INVALID_REQUEST","serviceName \u548C toolName \u662F\u5FC5\u9700\u7684\u53C2\u6570",void 0,400);e.get("logger").info(`\u51C6\u5907\u8C03\u7528\u5DE5\u5177: ${r}/${o}\uFF0C\u53C2\u6570:`,JSON.stringify(s));let i=e.get("mcpServiceManager");if(!i)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);await this.validateServiceAndTool(i,r,o),r==="customMCP"&&await this.validateCustomMCPArguments(i,o,s||{});let c;if(r==="customMCP")c=await i.callTool(o,s||{},{timeout:no.LONG_RUNNING});else{let l=`${r}__${o}`;c=await i.callTool(l,s||{})}return e.success(c,"\u5DE5\u5177\u8C03\u7528\u6210\u529F")}catch(t){e.get("logger").error("\u5DE5\u5177\u8C03\u7528\u5931\u8D25:",t);let r=t instanceof Error?t.message:String(t),o="TOOL_CALL_ERROR";return r.includes("\u4E0D\u5B58\u5728")?o="SERVICE_OR_TOOL_NOT_FOUND":r.includes("\u672A\u542F\u52A8")||r.includes("\u672A\u8FDE\u63A5")?o="SERVICE_NOT_AVAILABLE":r.includes("\u5DF2\u88AB\u7981\u7528")?o="TOOL_DISABLED":r.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o="INVALID_ARGUMENTS":r.includes("CustomMCP")||r.includes("customMCP")?o="CUSTOM_MCP_ERROR":r.includes("\u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25")||r.includes("API \u8BF7\u6C42\u5931\u8D25")?o="EXTERNAL_API_ERROR":r.includes("\u8D85\u65F6")&&(o="TIMEOUT_ERROR"),e.fail(o,r,void 0,500)}}async getCustomTools(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u8BF7\u6C42"),!S.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=S.getCustomMCPTools(),r=S.getConfigPath()}catch(s){return e.get("logger").error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",s),e.fail("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:"\u672A\u77E5\u9519\u8BEF"}`,void 0,500)}return!t||t.length===0?(e.get("logger").info("\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177"),e.success({tools:[],totalTools:0,configPath:r},"\u672A\u914D\u7F6E\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177")):S.validateCustomMCPTools(t)?(e.get("logger").info(`\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F\uFF0C\u5171 ${t.length} \u4E2A\u5DE5\u5177`),e.success({tools:t,totalTools:t.length,configPath:r},"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u6210\u529F")):(e.get("logger").warn("\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),e.fail("INVALID_TOOL_CONFIG","\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49",void 0,400))}catch(t){return e.get("logger").error("\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_CUSTOM_TOOLS_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async listTools(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u8BF7\u6C42");let t=e.req.query("status")||"all",r=e.req.query("sortBy"),o=["name","enabled","usageCount","lastUsedTime"],s=o.includes(r)?r:"name";if(r&&!o.includes(r))return e.fail("INVALID_SORT_FIELD",`\u65E0\u6548\u7684\u6392\u5E8F\u5B57\u6BB5: ${r}\u3002\u652F\u6301\u7684\u6392\u5E8F\u5B57\u6BB5: ${o.join(", ")}`,void 0,400);let i=e.get("mcpServiceManager");if(!i)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);let c=i.getAllTools(t);c=Eo(c,{field:s});let l=c.map(p=>({name:p.name,description:p.description,inputSchema:p.inputSchema,handler:{type:"mcp",config:{serviceName:p.serviceName,toolName:p.originalName}},enabled:p.enabled,usageCount:p.usageCount,lastUsedTime:p.lastUsedTime})),u={list:l,total:l.length};return e.success(u,`\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F\uFF08${t}\uFF09`)}catch(t){return e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_TOOLS_FAILED","\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async validateServiceAndTool(e,t,r){if(t==="customMCP"){if(!e.hasCustomMCPTool(r)){let o=e.getCustomMCPTools().map(s=>s.name);throw o.length===0?m.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`):m.validationError("TOOL_NOT_FOUND",`customMCP \u5DE5\u5177 '${r}' \u4E0D\u5B58\u5728\u3002\u53EF\u7528\u7684 customMCP \u5DE5\u5177: ${o.join(", ")}\u3002\u8BF7\u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u5DE5\u5177\u3002`)}try{let s=e.getCustomMCPTools().find(i=>i.name===r);s&&!s.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),s&&!s.inputSchema&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u8F93\u5165\u53C2\u6570\u5B9A\u4E49`)}catch(o){throw this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u65F6\u51FA\u9519:`,o),m.validationError("TOOL_VALIDATION_FAILED",`customMCP \u5DE5\u5177 '${r}' \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u5DE5\u5177\u5B9A\u4E49\u3002`)}return}}async validateCustomMCPArguments(e,t,r){try{let s=e.getCustomMCPTools().find(l=>l.name===t);if(!s)throw m.validationError("TOOL_NOT_FOUND",`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!s.inputSchema){this.logger.warn(`customMCP \u5DE5\u5177 '${t}' \u6CA1\u6709\u5B9A\u4E49 inputSchema\uFF0C\u8DF3\u8FC7\u53C2\u6570\u9A8C\u8BC1`);return}let i=this.ajv.compile(s.inputSchema);if(!i(r)){let p=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(d=>{let E=d.instancePath||d.schemaPath||"",C=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 x=d.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${E} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${x}`}if(d.keyword==="enum"){let x=d.params?.allowedValues||[];return`\u53C2\u6570 ${E} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${x.join(", ")}`}return`\u53C2\u6570 ${E} ${C}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,p),m.validationError("TOOL_VALIDATION_FAILED",p)}this.logger.debug(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u901A\u8FC7`)}catch(o){throw o instanceof Error&&o.message.includes("\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25")?o:(this.logger.error(`\u9A8C\u8BC1 customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u65F6\u51FA\u9519:`,o),m.validationError("TOOL_VALIDATION_FAILED",`\u53C2\u6570\u9A8C\u8BC1\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${o instanceof Error?o.message:"\u672A\u77E5\u9519\u8BEF"}`))}}async addCustomTool(e){try{e.get("logger").info("\u5904\u7406\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u8BF7\u6C42");let t=await e.req.json();return this.isNewFormatRequest(t)?await this.handleNewFormatAddTool(e,t):await this.handleLegacyFormatAddTool(e,t)}catch(t){e.get("logger").error("\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{code:r,message:o,status:s}=this.handleAddToolError(t);return e.fail(r,o,void 0,s)}}isNewFormatRequest(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"type"in e&&"data"in e}async handleNewFormatAddTool(e,t){let{type:r,data:o}=t;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${r}`),!n.TOOL_TYPE_VALUES.includes(r))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${n.TOOL_TYPE_VALUES.join(", ")}`,void 0,400);switch(r){case"mcp":return await this.handleAddMCPTool(e,o);case"coze":return await this.handleAddCozeTool(e,o);case"http":case"function":return e.fail("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${r} \u6682\u672A\u5B9E\u73B0\uFF0C\u8BF7\u4F7F\u7528 MCP \u6216 Coze \u7C7B\u578B`,void 0,501);default:return e.fail("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${r}`,void 0,400)}}async handleLegacyFormatAddTool(e,t){e.get("logger").info("\u5904\u7406\u65E7\u683C\u5F0F\u5DE5\u5177\u6DFB\u52A0\u8BF7\u6C42\uFF08\u5411\u540E\u517C\u5BB9\uFF09");let{workflow:r,customName:o,customDescription:s,parameterConfig:i}=t,c=this.performPreChecks(r,o,s);if(c)return e.fail(c.code,c.message,void 0,c.status);let l=this.convertWorkflowToTool(r,o,s,i);return S.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177: ${l.name}`),e.success({tool:l},`\u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`)}async handleAddMCPTool(e,t){let{serviceName:r,toolName:o,customName:s,customDescription:i}=t;if(e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 MCP \u5DE5\u5177: ${r}/${o}`),!r||!o)return e.fail("MISSING_REQUIRED_FIELD","serviceName \u548C toolName \u662F\u5FC5\u9700\u5B57\u6BB5",void 0,400);let c=e.get("mcpServiceManager");if(!c)return e.fail("SERVICE_NOT_INITIALIZED","MCP \u670D\u52A1\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\u3002\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u3002",void 0,503);try{await this.validateServiceAndTool(c,r,o)}catch(oe){let Cs=oe instanceof Error?oe.message:String(oe);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",Cs,void 0,404)}let u=await new Z().getAllCachedTools(),p=`${r}__${o}`,d=u.find(oe=>oe.name===p);if(!d)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`,void 0,404);let E=s||p,C=S.getCustomMCPTools();if(new Set(C.map(oe=>oe.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 Xe={name:E,description:i||d.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:d.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:dt().format("YYYY-MM-DD HH:mm:ss")}};S.addCustomMCPTool(Xe),e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u6DFB\u52A0\uFF0C\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`);let Dt=S.getServerToolsConfig(r);Dt?.toolName&&(Dt[o].enable=!0,S.updateServerToolsConfig(r,Dt),e.get("logger").info(`\u5DF2\u540C\u6B65\u542F\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${r}/${o}`)),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 MCP \u5DE5\u5177: ${E}`);let fs={tool:Xe,toolName:E,toolType:"mcp",addedAt:dt().format("YYYY-MM-DD HH:mm:ss")};return e.success(fs,`MCP \u5DE5\u5177 "${E}" \u6DFB\u52A0\u6210\u529F`)}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:s,parameterConfig:i}=t;e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let c=this.performPreChecks(r,o,s);if(c)return e.fail(c.code,c.message,void 0,c.status);let l=this.convertWorkflowToTool(r,o,s,i);S.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let u={tool:l,toolName:l.name,toolType:"coze",addedAt:dt().format("YYYY-MM-DD HH:mm:ss")};return e.success(u,`Coze \u5DE5\u5177 "${l.name}" \u6DFB\u52A0\u6210\u529F`)}async updateCustomTool(e){try{let t=e.req.param("toolName");if(!t)return e.fail("INVALID_REQUEST","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",void 0,400);e.get("logger").info(`\u5904\u7406\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u8BF7\u6C42: ${t}`);let r=await e.req.json();return!r||typeof r!="object"?e.fail("INVALID_REQUEST","\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u6709\u6548\u5BF9\u8C61",void 0,400):this.isNewFormatRequest(r)?await this.handleNewFormatUpdateTool(e,t,r):e.fail("INVALID_REQUEST","\u66F4\u65B0\u64CD\u4F5C\u53EA\u652F\u6301\u65B0\u683C\u5F0F\u7684\u8BF7\u6C42",void 0,400)}catch(t){e.get("logger").error("\u66F4\u65B0\u81EA\u5B9A\u4E49\u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",t);let{code:r,message:o,status:s}=this.handleUpdateToolError(t);return e.fail(r,o,void 0,s)}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:s}=r;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!n.TOOL_TYPE_VALUES.includes(o))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${n.TOOL_TYPE_VALUES.join(", ")}`,void 0,400);switch(o){case"coze":return await this.handleUpdateCozeTool(e,t,s);case"mcp":case"http":case"function":return e.fail("TOOL_TYPE_NOT_IMPLEMENTED",`\u5DE5\u5177\u7C7B\u578B ${o} \u6682\u4E0D\u652F\u6301\u66F4\u65B0\u64CD\u4F5C\uFF0C\u76EE\u524D\u4EC5\u652F\u6301 Coze \u7C7B\u578B`,void 0,501);default:return e.fail("UNKNOWN_TOOL_TYPE",`\u672A\u77E5\u7684\u5DE5\u5177\u7C7B\u578B: ${o}`,void 0,400)}}async handleUpdateCozeTool(e,t,r){let{workflow:o,customName:s,customDescription:i,parameterConfig:c}=r;e.get("logger").info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let u=S.getCustomMCPTools().find(C=>C.name===t);if(!u)return e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`,void 0,404);if(u.handler.type!=="proxy"||u.handler.platform!=="coze")return e.fail("INVALID_TOOL_TYPE",`\u5DE5\u5177 "${t}" \u4E0D\u662F Coze \u5DE5\u4F5C\u6D41\u5DE5\u5177\uFF0C\u4E0D\u652F\u6301\u53C2\u6570\u914D\u7F6E\u66F4\u65B0`,void 0,400);!o.workflow_id&&u.handler?.config?.workflow_id&&(o.workflow_id=u.handler.config.workflow_id),!o.workflow_id&&o.app_id&&e.get("logger").warn(`\u5DE5\u4F5C\u6D41 ${t} \u7F3A\u5C11 workflow_id\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u67D0\u4E9B\u529F\u80FD`),this.validateWorkflowUpdateData(o);let p=this.generateInputSchema(o,c),d={...u,description:i||u.description,inputSchema:p};S.updateCustomMCPTool(t,d),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let E={tool:d,toolName:t,toolType:"coze",updatedAt:dt().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 o=S.getCustomMCPTools().find(s=>s.name===t);if(o&&o.handler.type==="mcp"){let s=o.handler.config;if(s.serviceName&&s.toolName){e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`);let i=S.getServerToolsConfig(s.serviceName);i?.[s.toolName]&&(i[s.toolName].enable=!1,S.updateServerToolsConfig(s.serviceName,i),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${s.serviceName}/${s.toolName}`))}}return S.removeCustomMCPTool(t),e.get("logger").info(`\u6210\u529F\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177: ${t}`),e.success(null,`\u5DE5\u5177 "${t}" \u5220\u9664\u6210\u529F`)}catch(t){e.get("logger").error("\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25:",t);let{code:r,message:o,status:s}=this.handleRemoveToolError(t);return e.fail(r,o,void 0,s)}}convertWorkflowToTool(e,t,r,o){this.validateWorkflowData(e);let s=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(s),c=this.generateToolDescription(e,r),l=this.generateInputSchema(e,o),u=this.createHttpHandler(e),p={name:i,description:c,inputSchema:l,handler:u};return this.validateGeneratedTool(p),p}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(n.UNDERSCORE_TRIM_REGEX,""),n.LETTER_START_REGEX.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[o,s]of Object.entries(t))r=r.replace(new RegExp(o,"g"),s);return n.CHINESE_CHAR_REGEX.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw m.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 m.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 m.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 m.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 m.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw m.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 m.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e.app_id))throw m.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 m.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26")}}validateRequiredFields(e){let t=[{field:"workflow_id",name:"\u5DE5\u4F5C\u6D41ID"},{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0"},{field:"app_id",name:"\u5E94\u7528ID"}];for(let{field:r,name:o}of t){let s=e[r];if(!s||typeof s!="string"||s.trim()==="")throw m.validationError("TOOL_VALIDATION_FAILED",`${o}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!n.DIGITS_ONLY_REGEX.test(e.workflow_id))throw m.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 m.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 m.validationError("TOOL_VALIDATION_FAILED","\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw m.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 m.validationError("TOOL_VALIDATION_FAILED","\u66F4\u65B0\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6B63\u6574\u6570\u65F6\u95F4\u6233")}validateFieldLengths(e){let t=[{field:"workflow_name",name:"\u5DE5\u4F5C\u6D41\u540D\u79F0",max:100},{field:"description",name:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0",max:500},{field:"app_id",name:"\u5E94\u7528ID",max:50}];for(let{field:r,name:o,max:s}of t){let i=e[r];if(i&&i.length>s)throw m.validationError("TOOL_VALIDATION_FAILED",`${o}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${s}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw m.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 m.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 m.validationError("TOOL_VALIDATION_FAILED","\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4");let t=["admin","root","system","config","password","token"],r=e.workflow_name.toLowerCase();for(let o of t)if(r.includes(o))throw m.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u5305\u542B\u654F\u611F\u8BCD: ${o}`)}resolveToolNameConflict(e){let t=S.getCustomMCPTools(),r=new Set(t.map(i=>i.name)),o=e,s=1;for(;r.has(o);)if(o=`${e}_${s}`,s++,s>999)throw m.operationError("OPERATION_FAILED",`\u65E0\u6CD5\u4E3A\u5DE5\u5177\u751F\u6210\u552F\u4E00\u540D\u79F0\uFF0C\u57FA\u7840\u540D\u79F0: ${e}`);return o}generateToolDescription(e,t){return t||(e.description?.trim()?e.description.trim():`\u6263\u5B50\u5DE5\u4F5C\u6D41\u5DE5\u5177: ${e.workflow_name}`)}createHttpHandler(e){return this.validateCozeApiConfig(),{type:"proxy",platform:"coze",config:{workflow_id:e.workflow_id}}}validateCozeApiConfig(){let e=S.getCozePlatformConfig();if(!e||!e.token)throw m.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),!S.validateCustomMCPTools([e]))throw m.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 m.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 m.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw m.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 m.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw m.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw m.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw m.validationError("TOOL_VALIDATION_FAILED","HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw m.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw m.validationError("TOOL_VALIDATION_FAILED","Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw m.configError("INVALID_CONFIG","\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw m.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw m.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw m.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 m.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 m.validationError("TOOL_VALIDATION_FAILED","Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw m.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw m.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u6709\u6548\u7684JSON\u683C\u5F0F")}let t=e.match(/\{\{[^}]+\}\}/g);if(t)for(let r of t){let o=r.slice(2,-2).trim();if(!o||!n.IDENTIFIER_REGEX.test(o))throw m.validationError("TOOL_VALIDATION_FAILED",`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw m.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 m.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw m.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw m.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684required\u5B57\u6BB5\u5FC5\u987B\u662F\u6570\u7EC4")}generateInputSchema(e,t){return t&&t.parameters.length>0?this.generateInputSchemaFromConfig(t):{type:"object",properties:{input:{type:"string",description:"\u8F93\u5165\u5185\u5BB9"}},required:["input"],additionalProperties:!1}}generateInputSchemaFromConfig(e){let t={},r=[];for(let o of e.parameters)t[o.fieldName]={type:o.type,description:o.description},o.required&&r.push(o.fieldName);return{type:"object",properties:t,required:r.length>0?r:void 0,additionalProperties:!1}}handleAddToolError(e){let t=e instanceof Error?e.message:"\u6DFB\u52A0\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u5DE5\u5177\u7C7B\u578B")||t.includes("TOOL_TYPE")?{code:"INVALID_TOOL_TYPE",message:t,status:400}:t.includes("\u5FC5\u9700\u5B57\u6BB5")||t.includes("MISSING_REQUIRED_FIELD")?{code:"MISSING_REQUIRED_FIELD",message:t,status:400}:t.includes("\u4E0D\u5B58\u5728")||t.includes("NOT_FOUND")||t.includes("\u672A\u627E\u5230")?{code:"SERVICE_OR_TOOL_NOT_FOUND",message:t,status:404}:t.includes("\u672A\u521D\u59CB\u5316")||t.includes("SERVICE_NOT_INITIALIZED")?{code:"SERVICE_NOT_INITIALIZED",message:t,status:503}:t.includes("\u5DF2\u5B58\u5728")||t.includes("\u51B2\u7A81")||t.includes("TOOL_NAME_CONFLICT")?{code:"TOOL_NAME_CONFLICT",message:`${t}\u3002\u5EFA\u8BAE\uFF1A1) \u4F7F\u7528\u81EA\u5B9A\u4E49\u540D\u79F0\uFF1B2) \u5220\u9664\u73B0\u6709\u540C\u540D\u5DE5\u5177\u540E\u91CD\u8BD5`,status:409}:this.isValidationError(t)?{code:"VALIDATION_ERROR",message:this.formatValidationError(t),status:400}:t.includes("\u914D\u7F6E")||t.includes("token")||t.includes("API")||t.includes("CONFIGURATION_ERROR")?{code:"CONFIGURATION_ERROR",message:`${t}\u3002\u8BF7\u68C0\u67E5\uFF1A1) \u76F8\u5173\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1B2) \u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38\uFF1B3) \u914D\u7F6E\u6587\u4EF6\u6743\u9650\u662F\u5426\u6B63\u786E`,status:422}:t.includes("\u8D44\u6E90\u9650\u5236")||t.includes("RESOURCE_LIMIT_EXCEEDED")?{code:"RESOURCE_LIMIT_EXCEEDED",message:t,status:429}:t.includes("\u672A\u5B9E\u73B0")||t.includes("NOT_IMPLEMENTED")?{code:"TOOL_TYPE_NOT_IMPLEMENTED",message:t,status:501}:{code:"ADD_CUSTOM_TOOL_ERROR",message:`\u6DFB\u52A0\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`,status:500}}handleRemoveToolError(e){let t=e instanceof Error?e.message:"\u5220\u9664\u81EA\u5B9A\u4E49\u5DE5\u5177\u5931\u8D25";return t.includes("\u4E0D\u5B58\u5728")||t.includes("\u672A\u627E\u5230")?{code:"TOOL_NOT_FOUND",message:`${t}\u3002\u8BF7\u68C0\u67E5\u5DE5\u5177\u540D\u79F0\u662F\u5426\u6B63\u786E\uFF0C\u6216\u5237\u65B0\u9875\u9762\u67E5\u770B\u6700\u65B0\u7684\u5DE5\u5177\u5217\u8868`,status:404}:t.includes("\u4E0D\u80FD\u4E3A\u7A7A")||t.includes("\u65E0\u6548")?{code:"INVALID_REQUEST",message:`${t}\u3002\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u5177\u540D\u79F0`,status:400}:t.includes("\u914D\u7F6E")||t.includes("\u6743\u9650")?{code:"CONFIGURATION_ERROR",message:`${t}\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u548C\u683C\u5F0F\u662F\u5426\u6B63\u786E`,status:422}:{code:"REMOVE_CUSTOM_TOOL_ERROR",message:`\u5220\u9664\u5DE5\u5177\u5931\u8D25\uFF1A${t}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u5982\u95EE\u9898\u6301\u7EED\u5B58\u5728\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`,status:500}}isValidationError(e){return["\u4E0D\u80FD\u4E3A\u7A7A","\u5FC5\u987B\u662F","\u683C\u5F0F\u65E0\u6548","\u8FC7\u957F","\u8FC7\u77ED","\u9A8C\u8BC1\u5931\u8D25","\u65E0\u6548","\u4E0D\u7B26\u5408","\u8D85\u8FC7","\u5C11\u4E8E","\u654F\u611F\u8BCD","\u65F6\u95F4","URL"].some(r=>e.includes(r))}formatValidationError(e){let t={\u5DE5\u4F5C\u6D41ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41ID",\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5DE5\u4F5C\u6D41\u540D\u79F0",\u5E94\u7528ID\u4E0D\u80FD\u4E3A\u7A7A:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u5E94\u7528ID",\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548:"\u5DE5\u4F5C\u6D41ID\u5E94\u4E3A\u6570\u5B57\u683C\u5F0F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u914D\u7F6E",\u5E94\u7528ID\u683C\u5F0F\u65E0\u6548:"\u5E94\u7528ID\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26",\u5DE5\u4F5C\u6D41\u540D\u79F0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7100\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u540D\u79F0",\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u8FC7\u957F:"\u5DE5\u4F5C\u6D41\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7500\u4E2A\u5B57\u7B26\uFF0C\u8BF7\u7F29\u77ED\u63CF\u8FF0",\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548:"\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u56FE\u6807URL\u5730\u5740",\u66F4\u65B0\u65F6\u95F4\u4E0D\u80FD\u65E9\u4E8E\u521B\u5EFA\u65F6\u95F4:"\u5DE5\u4F5C\u6D41\u7684\u65F6\u95F4\u4FE1\u606F\u6709\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u4F5C\u6D41\u6570\u636E",\u654F\u611F\u8BCD:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u5305\u542B\u654F\u611F\u8BCD\u6C47\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5"};for(let[r,o]of Object.entries(t))if(e.includes(r))return o;return e}performPreChecks(e,t,r){let o=this.checkBasicParameters(e,t,r);if(o)return o;let s=this.checkSystemStatus();if(s)return s;let i=this.checkResourceLimits();return i||null}checkBasicParameters(e,t,r){if(!e)return{code:"INVALID_REQUEST",message:"\u8BF7\u6C42\u4F53\u4E2D\u7F3A\u5C11 workflow \u53C2\u6570",status:400};if(typeof e!="object")return{code:"INVALID_REQUEST",message:"workflow \u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61\u7C7B\u578B",status:400};if(!Array.isArray(e)){let o=e;if(!o.workflow_id||typeof o.workflow_id!="string"||!o.workflow_id.trim())return{code:"INVALID_REQUEST",message:"workflow_id \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32",status:400};if(!o.workflow_name||typeof o.workflow_name!="string"||!o.workflow_name.trim())return{code:"INVALID_REQUEST",message:"workflow_name \u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32",status:400}}if(t!==void 0){if(typeof t!="string")return{code:"INVALID_REQUEST",message:"customName \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B",status:400};if(t.trim()==="")return{code:"INVALID_REQUEST",message:"customName \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32",status:400};if(t.length>50)return{code:"INVALID_REQUEST",message:"customName \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26",status:400}}if(r!==void 0){if(typeof r!="string")return{code:"INVALID_REQUEST",message:"customDescription \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B",status:400};if(r.length>200)return{code:"INVALID_REQUEST",message:"customDescription \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7200\u4E2A\u5B57\u7B26",status:400}}return null}checkSystemStatus(){try{let e=S.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=S.getCustomMCPTools(),t=100;if(e.length>=t)return{code:"RESOURCE_LIMIT_EXCEEDED",message:`\u5DF2\u8FBE\u5230\u6700\u5927\u5DE5\u5177\u6570\u91CF\u9650\u5236 (${t})\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u540E\u91CD\u8BD5`,status:429};let r=JSON.stringify(e).length,o=1024*1024;if(r>o)return{code:"PAYLOAD_TOO_LARGE",message:"\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\u3002\u8BF7\u5220\u9664\u4E00\u4E9B\u4E0D\u9700\u8981\u7684\u5DE5\u5177\u4EE5\u91CA\u653E\u7A7A\u95F4",status:413}}catch(e){this.logger.warn("\u8D44\u6E90\u9650\u5236\u68C0\u67E5\u5931\u8D25:",e)}return null}async manageMCPTool(e){try{let t=await e.req.json(),{action:r,serverName:o,toolName:s,description:i}=t;if(!r||typeof r!="string")return e.fail("INVALID_REQUEST","action \u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",void 0,400);let c=["enable","disable","status","toggle"];if(!c.includes(r))return e.fail("INVALID_ACTION",`\u65E0\u6548\u7684 action: ${r}\u3002\u652F\u6301\u7684 action: ${c.join(", ")}`,void 0,400);switch(this.validateToolIdentifier(o,s),r){case"enable":return this.handleEnableTool(e,o,s,i);case"disable":return this.handleDisableTool(e,o,s);case"status":return this.handleGetToolStatus(e,o,s);case"toggle":return this.handleToggleTool(e,o,s);default:return e.fail("INVALID_ACTION",`\u672A\u5B9E\u73B0\u7684 action: ${r}`,void 0,400)}}catch(t){e.get("logger").error("\u7BA1\u7406 MCP \u5DE5\u5177\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u7BA1\u7406 MCP \u5DE5\u5177\u5931\u8D25";return e.fail("TOOL_MANAGE_ERROR",r,void 0,500)}}async listMCPTools(e){try{let t=await e.req.json(),{serverName:r,includeUsageStats:o}=t;return r?this.handleListServerTools(e,r,o):this.handleListAllTools(e,o)}catch(t){return e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:",t),e.fail("GET_TOOL_LIST_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25",void 0,500)}}async handleEnableTool(e,t,r,o){await this.validateServiceAndToolExistence(t,r),S.setToolEnabled(t,r,!0,o);let i=S.getServerToolsConfig(t)[r];return e.get("logger").info(`\u5DE5\u5177\u5DF2\u542F\u7528: ${t}/${r}`),e.success({serverName:t,toolName:r,enabled:!0,description:i?.description||o||""},`\u5DE5\u5177 "${t}__${r}" \u542F\u7528\u6210\u529F`)}async handleDisableTool(e,t,r){return await this.validateServiceAndToolExistence(t,r),S.setToolEnabled(t,r,!1),e.get("logger").info(`\u5DE5\u5177\u5DF2\u7981\u7528: ${t}/${r}`),e.success({serverName:t,toolName:r,enabled:!1},`\u5DE5\u5177 "${t}__${r}" \u7981\u7528\u6210\u529F`)}async handleGetToolStatus(e,t,r){let s=S.getServerToolsConfig(t)[r];return s?e.success({serverName:t,toolName:r,enabled:s.enable!==!1,description:s.description||"",usageCount:s.usageCount,lastUsedTime:s.lastUsedTime},"\u5DE5\u5177\u72B6\u6001\u83B7\u53D6\u6210\u529F"):e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}__${r}" \u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`,void 0,404)}async handleToggleTool(e,t,r){await this.validateServiceAndToolExistence(t,r);let s=!S.isToolEnabled(t,r);return S.setToolEnabled(t,r,s),e.get("logger").info(`\u5DE5\u5177\u72B6\u6001\u5DF2\u5207\u6362: ${t}/${r} -> ${s}`),e.success({serverName:t,toolName:r,enabled:s},`\u5DE5\u5177 "${t}__${r}" \u5DF2${s?"\u542F\u7528":"\u7981\u7528"}`)}async handleListServerTools(e,t,r){if(!S.getMcpServers()[t])return e.fail("SERVICE_NOT_FOUND",`MCP \u670D\u52A1 "${t}" \u4E0D\u5B58\u5728`,void 0,404);let s=S.getServerToolsConfig(t),i=Object.entries(s).map(([u,p])=>{let d={toolName:u,enabled:p.enable!==!1,description:p.description||""};return r&&(d.usageCount=p.usageCount,d.lastUsedTime=p.lastUsedTime),d}),c=i.filter(u=>u.enabled).length,l=i.length-c;return e.success({serverName:t,tools:i,total:i.length,enabledCount:c,disabledCount:l},"\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u6210\u529F")}async handleListAllTools(e,t){let r=S.getMcpServerConfig(),o={servers:[],totalTools:0,totalEnabled:0,totalDisabled:0};for(let[s,i]of Object.entries(r)){let c=Object.entries(i.tools||{}).map(([u,p])=>{let d={toolName:u,enabled:p.enable!==!1,description:p.description||""};return t&&(d.usageCount=p.usageCount,d.lastUsedTime=p.lastUsedTime),d}),l=c.filter(u=>u.enabled).length;o.servers.push({serverName:s,tools:c,total:c.length,enabledCount:l,disabledCount:c.length-l}),o.totalTools+=c.length,o.totalEnabled+=l,o.totalDisabled+=c.length-l}return e.success(o,"\u83B7\u53D6\u6240\u6709\u5DE5\u5177\u5217\u8868\u6210\u529F")}validateToolIdentifier(e,t){if(!e||typeof e!="string"||e.trim()==="")throw m.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw m.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!n.ALPHANUMERIC_UNDERSCORE_REGEX.test(e))throw m.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 m.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(!S.getMcpServers()[e])throw m.validationError("SERVER_NOT_FOUND",`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!S.getServerToolsConfig(e)[t])throw m.validationError("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}};import{z as te}from"zod";var ci=te.object({limit:te.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=1&&n<=jt.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${jt.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:te.string().optional().transform(n=>n?Number.parseInt(n,10):void 0).refine(n=>n===void 0||n>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:te.string().optional(),serverName:te.string().optional(),success:te.string().optional().transform(n=>n?n.toLowerCase()==="true":void 0),startDate:te.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:te.string().optional().refine(n=>{if(!n)return!0;let e=Date.parse(n);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(n=>!n.startDate||!n.endDate?!0:new Date(n.startDate)<=new Date(n.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),ht=class extends y{static{a(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new nt}parseAndValidateQueryParams(e){let t=e.req.query(),r=ci.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.issues.map(o=>({field:o.path.join("."),message:o.message}))}}async getToolCallLogs(e){try{let t=this.parseAndValidateQueryParams(e);if(!t.success)return e.fail("INVALID_QUERY_PARAMETERS","\u67E5\u8BE2\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",t.error,400);let r=await this.toolCallLogService.getToolCallLogs(t.data);return e.get("logger").debug(`API: \u8FD4\u56DE ${r.records.length} \u6761\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u8BB0\u5F55`),e.success(r)}catch(t){e.get("logger").error("\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25:",t);let r=t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF";return r.includes("\u4E0D\u5B58\u5728")?e.fail("LOG_FILE_NOT_FOUND",r,void 0,404):r.includes("\u65E0\u6CD5\u8BFB\u53D6")?e.fail("LOG_FILE_READ_ERROR",r,void 0,500):e.fail("INTERNAL_ERROR","\u83B7\u53D6\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u5931\u8D25",{details:r},500)}}};import{exec as nl,spawn as sl}from"child_process";import{promisify as il}from"util";var Ue=Ps(cs(),1);var ls=il(nl),ae=class{static{a(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||R()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();g.info("\u5F00\u59CB\u5B89\u88C5",{version:e,installId:t}),this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=sl("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]),s=a(()=>{o.removeAllListeners("error"),o.removeAllListeners("close"),o.stdout?.removeAllListeners("data"),o.stderr?.removeAllListeners("data"),o.stdout?.destroy(),o.stderr?.destroy()},"cleanup");return new Promise((i,c)=>{o.on("error",l=>{let u=`\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${l.message}`;s(),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:u,duration:Date.now()-r,timestamp:Date.now()}),c(l)}),o.stdout.on("data",l=>{let u=l.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:u,timestamp:Date.now()})}),o.stderr.on("data",l=>{let u=l.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:u,timestamp:Date.now()})}),o.on("close",l=>{let u=Date.now()-r;if(s(),l===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:u,timestamp:Date.now()}),i();else{let p=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${l}`;g.error("\u5B89\u88C5\u5931\u8D25",{code:l}),this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:p,duration:u,timestamp:Date.now()}),c(new Error(p))}})})}async getCurrentVersion(){let{stdout:e}=await ls("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 ls("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(s=>s&&typeof s=="string"&&Ue.default.valid(s));return e!=="all"&&(o=o.filter(s=>{let i=Ue.default.prerelease(s);return e==="stable"?i===null:e==="rc"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("rc")===!0:e==="beta"?i!==null&&i[0]?.toString()?.toLowerCase()?.startsWith("beta")===!0:!0})),o.sort((s,i)=>Ue.default.rcompare(s,i))}catch(t){return g.error("\u83B7\u53D6\u7248\u672C\u5217\u8868\u5931\u8D25",{error:t}),[]}}async checkForLatestVersion(){try{let e=await this.getCurrentVersion();if(!e||e==="unknown")return{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u7248\u672C\u4FE1\u606F"};let t=await this.getAvailableVersions("stable");if(t.length===0)return{currentVersion:e,latestVersion:null,hasUpdate:!1,error:"\u65E0\u6CD5\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868"};let r=t[0],o=!1;try{o=Ue.default.gt(r,e)}catch(s){g.warn("\u7248\u672C\u6BD4\u8F83\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u5B57\u7B26\u4E32\u6BD4\u8F83",{error:s}),o=r!==e}return g.debug("\u7248\u672C\u68C0\u67E5\u5B8C\u6210",{currentVersion:e,latestVersion:r,hasUpdate:o}),{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return g.error("\u68C0\u67E5\u6700\u65B0\u7248\u672C\u5931\u8D25",{error:e}),{currentVersion:"unknown",latestVersion:null,hasUpdate:!1,error:e instanceof Error?e.message:"\u68C0\u67E5\u66F4\u65B0\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"}}}};import{z as gs}from"zod";var al=gs.object({version:gs.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),_t=class extends y{static{a(this,"UpdateApiHandler")}npmManager;eventBus=R();activeInstalls=new Map;constructor(){super(),this.npmManager=new ae(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=al.safeParse(t);if(!r.success)return e.fail("INVALID_VERSION","\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",r.error.issues.map(c=>({field:c.path.join("."),message:c.message})),400);let{version:o}=r.data;if(Array.from(this.activeInstalls.values()).some(c=>c))return e.fail("INSTALL_IN_PROGRESS","\u5DF2\u6709\u5B89\u88C5\u8FDB\u7A0B\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u540E\u518D\u8BD5",void 0,409);let i=e.get("logger");return this.npmManager.installVersion(o).catch(c=>{i.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",c)}),e.success({version:o,message:"\u5B89\u88C5\u5DF2\u542F\u52A8\uFF0C\u8BF7\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7"},"\u5B89\u88C5\u8BF7\u6C42\u5DF2\u63A5\u53D7")}catch(t){return this.handleError(e,t,"\u5904\u7406\u5B89\u88C5\u8BF7\u6C42","REQUEST_FAILED")}}};import{VersionUtils as Rr}from"@xiaozhi-client/version";var Ot=class extends y{static{a(this,"VersionApiHandler")}async getVersion(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=Rr.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=Rr.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"),Rr.clearCache(),e.get("logger").info("\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664"),e.success(void 0,"\u7248\u672C\u7F13\u5B58\u5DF2\u6E05\u9664")}catch(t){return this.handleError(e,t,"\u6E05\u9664\u7248\u672C\u7F13\u5B58","CACHE_CLEAR_ERROR")}}async getAvailableVersions(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868\u8BF7\u6C42");let t=e.req.query("type")||"stable",r=["stable","rc","beta","all"];if(!r.includes(t))return e.fail("INVALID_VERSION_TYPE",`\u65E0\u6548\u7684\u7248\u672C\u7C7B\u578B: ${t}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${r.join(", ")}`,void 0,400);let s=await new ae().getAvailableVersions(t);return e.get("logger").debug(`\u83B7\u53D6\u5230 ${s.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.success({versions:s,type:t,total:s.length})}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u53EF\u7528\u7248\u672C\u5217\u8868","VERSIONS_FETCH_ERROR")}}async checkLatestVersion(e){try{e.get("logger").debug("\u5904\u7406\u68C0\u67E5\u6700\u65B0\u7248\u672C\u8BF7\u6C42");let r=await new ae().checkForLatestVersion();return e.get("logger").debug("\u7248\u672C\u68C0\u67E5\u7ED3\u679C:",r),r.error?e.success({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate,error:r.error}):e.success({currentVersion:r.currentVersion,latestVersion:r.latestVersion,hasUpdate:r.hasUpdate})}catch(t){return this.handleError(e,t,"\u68C0\u67E5\u6700\u65B0\u7248\u672C","LATEST_VERSION_CHECK_ERROR")}}};import{configManager as cl}from"@xiaozhi-client/config";import{mapClusterToResourceId as ll}from"@xiaozhi-client/esp32";import{createTTS as gl}from"univoice";var us=["mp3","wav","ogg","flac","pcm","opus","ogg_opus"],ul={mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",flac:"audio/flac",pcm:"audio/pcm",opus:"audio/opus",ogg_opus:"audio/ogg"},pl={mp3:"mp3",wav:"wav",ogg:"ogg",flac:"flac",pcm:"pcm",opus:"opus",ogg_opus:"ogg"},ze=class extends y{static{a(this,"TTSApiHandler")}constructor(){super()}async synthesize(e){try{e.get("logger").info("\u5904\u7406\u8BED\u97F3\u5408\u6210\u8BF7\u6C42");let t=await this.parseJsonBody(e);if(!t.text)return e.get("logger").warn("\u7F3A\u5C11 text \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: text",void 0,400);let r=cl.getTTSConfig(),o=t.appid||r.appid,s=t.accessToken||r.accessToken,i=t.voice_type||r.voice_type,c=t.cluster||r.cluster,l=t.endpoint||r.endpoint,u=t.encoding||r.encoding||"wav";if(!us.includes(u))return e.get("logger").warn(`\u4E0D\u652F\u6301\u7684 encoding \u53C2\u6570: ${u}`),e.fail("INVALID_PARAMETER",`\u4E0D\u652F\u6301\u7684 encoding \u53C2\u6570: ${u}\uFF0C\u5141\u8BB8\u503C: ${us.join(", ")}`,void 0,400);let p=u;if(!o)return e.get("logger").warn("\u7F3A\u5C11 appid \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 appid \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.appid",void 0,400);if(!s)return e.get("logger").warn("\u7F3A\u5C11 accessToken \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 accessToken \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.accessToken",void 0,400);if(!i)return e.get("logger").warn("\u7F3A\u5C11 voice_type \u53C2\u6570"),e.fail("MISSING_PARAMETER","\u7F3A\u5C11 voice_type \u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u6216\u914D\u7F6E tts.voice_type",void 0,400);let d=gl({provider:"doubao",appId:o,accessToken:s,voice:i,format:p,resourceId:ll(c),sampleRate:24e3,...l&&{baseUrl:l}});e.get("logger").info(`\u5F00\u59CB\u8BED\u97F3\u5408\u6210: text=${t.text.substring(0,20)}..., voice_type=${i}`);let C=(await d.synthesize({text:t.text})).audio;return e.get("logger").info(`\u8BED\u97F3\u5408\u6210\u6210\u529F: audioSize=${C.length} bytes`),new Response(Buffer.from(C),{headers:{"Content-Type":ul[p],"Content-Disposition":`attachment; filename="tts_${Date.now()}.${pl[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=Yt,r=ao(),o={voices:t,total:t.length,scenes:r};return e.success(o)}catch(t){return this.handleError(e,t,"\u83B7\u53D6\u97F3\u8272\u5217\u8868")}}};import{ESP32ErrorCode as ps}from"@xiaozhi-client/esp32";var je=class extends y{static{a(this,"ESP32Handler")}esp32Manager;constructor(e){super(),this.esp32Manager=e}async handleOTA(e){let t=e.get("logger");try{let r=e.req.header("Device-Id")||e.req.header("device-id"),o=e.req.header("Client-Id")||e.req.header("client-id");if(!r)return e.fail(ps.MISSING_DEVICE_ID,"\u7F3A\u5C11 Device-Id \u8BF7\u6C42\u5934",void 0,400);if(!o)return e.fail(ps.MISSING_DEVICE_ID,"\u7F3A\u5C11 Client-Id \u8BF7\u6C42\u5934",void 0,400);let s=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF");t.debug(`\u6536\u5230OTA\u8BF7\u6C42: deviceId=${r}, clientId=${o}`);let i=await this.esp32Manager.handleOTARequest(r,o,s,{deviceModel:e.req.header("device-model")||e.req.header("Device-Model")||void 0,deviceVersion:e.req.header("device-version")||e.req.header("Device-Version")||void 0},e.req.header("host"));return t.debug("OTA\u54CD\u5E94",{response:i}),e.json(i)}catch(r){return this.handleError(e,r,"\u5904\u7406OTA\u8BF7\u6C42")}}};var Mr=a(async(n,e)=>{n.set("logger",g),n.logger=g,await e()},"loggerMiddleware");import{cors as dl}from"hono/cors";var Pr=dl({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(n=>n.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]});var yr=a((n,e)=>(e.logger.error("HTTP request error:",n),process.env.NODE_ENV,e.fail("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?n.stack:void 0,500)),"errorHandlerMiddleware"),Ir=a(n=>n.req.path.startsWith("/api/")?n.fail("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method},404):n.fail("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:n.req.path,method:n.req.method},404),"notFoundHandlerMiddleware");var Ar=a(async(n,e)=>{n.success=(t,r,o=200)=>{let s={success:!0,message:r};return t!==void 0&&(s.data=t),n.json(s,o)},n.fail=(t,r,o,s=400)=>{let i={success:!1,error:{code:t,message:r}};return o!==void 0&&(i.error.details=o),n.json(i,s)},n.paginate=(t,r,o)=>{let s={success:!0,data:t,pagination:r,message:o};return n.json(s,200)},await e()},"responseEnhancerMiddleware");var he=class extends Error{static{a(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},Ge=class extends Error{static{a(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}};var _r=a(async(n,e)=>{if(!n.get("mcpServiceManager"))try{n.logger.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let t=n.get("webServer");if(!t)throw new Ge("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 he)n.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof Ge?(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 Or=a(()=>async(n,e)=>{let t=n.get("webServer");if(!t)throw new Error("WebServer \u5B9E\u4F8B\u672A\u6CE8\u5165\u5230\u4E0A\u4E0B\u6587\u4E2D\uFF0C\u8BF7\u786E\u4FDD webServerMiddleware \u5DF2\u6B63\u786E\u914D\u7F6E");if(!t.getEndpointManager)throw new Error("WebServer \u5B9E\u4F8B\u7F3A\u5C11 getEndpointManager \u65B9\u6CD5");try{let r=t.getEndpointManager();n.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))n.logger.warn("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u4F7F\u7528 null \u503C:",r.message),n.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware");import{configManager as ml}from"@xiaozhi-client/config";var Nr=a(()=>{let n=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?n=new Re(o,ml):n=null),t.set("endpointHandler",n),await r()}},"endpointsMiddleware");var Nt=class{static{a(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=g,this.eventBus=R()}getClientStatus(){return{...this.clientInfo}}updateClientInfo(e,t="unknown"){try{let r={...this.clientInfo};this.clientInfo={...this.clientInfo,...e},e.lastHeartbeat&&(this.clientInfo.lastHeartbeat=Date.now()),e.status==="connected"&&this.resetHeartbeatTimeout(),this.logger.debug(`\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\uFF0C\u6765\u6E90: ${t}`,{old:r,new:this.clientInfo}),this.eventBus.emitEvent("status:updated",{status:this.clientInfo,source:t})}catch(r){this.logger.error("\u66F4\u65B0\u5BA2\u6237\u7AEF\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateClientInfo"})}}getRestartStatus(){return this.restartStatus?{...this.restartStatus}:void 0}updateRestartStatus(e,t){try{switch(this.restartStatus={status:e,error:t,timestamp:Date.now()},this.logger.info(`\u91CD\u542F\u72B6\u6001\u66F4\u65B0: ${e}`,{error:t}),e){case"restarting":this.eventBus.emitEvent("service:restart:started",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"completed":this.eventBus.emitEvent("service:restart:completed",{serviceName:this.restartStatus.serviceName||"",attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break;case"failed":this.eventBus.emitEvent("service:restart:failed",{serviceName:this.restartStatus.serviceName||"",error:new Error(t||"\u91CD\u542F\u5931\u8D25"),attempt:this.restartStatus.attempt||1,timestamp:this.restartStatus.timestamp});break}}catch(r){this.logger.error("\u66F4\u65B0\u91CD\u542F\u72B6\u6001\u5931\u8D25:",r),this.eventBus.emitEvent("status:error",{error:r instanceof Error?r:new Error(String(r)),operation:"updateRestartStatus"})}}getFullStatus(){return{client:this.getClientStatus(),restart:this.getRestartStatus(),timestamp:Date.now()}}resetHeartbeatTimeout(){this.heartbeatTimeout&&clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(()=>{this.logger.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 hl}from"@xiaozhi-client/config";var bt=class{static{a(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=g,this.eventBus=R(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=hl.getConfig();this.broadcastConfigUpdate(t)}),this.eventBus.onEvent("status:updated",e=>{this.broadcastStatusUpdate(e.status)}),this.eventBus.onEvent("service:restart:started",e=>{this.broadcastRestartStatus("restarting",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:completed",e=>{this.broadcastRestartStatus("completed",void 0,e.timestamp)}),this.eventBus.onEvent("service:restart:failed",e=>{this.broadcastRestartStatus("failed",e.error.message,e.timestamp)}),this.eventBus.onEvent("npm:install:started",e=>{this.broadcast("npm:install:started",e)}),this.eventBus.onEvent("npm:install:log",e=>{this.broadcast("npm:install:log",e)}),this.eventBus.onEvent("npm:install:completed",e=>{this.broadcast("npm:install:completed",e)}),this.eventBus.onEvent("npm:install:failed",e=>{this.broadcast("npm:install:failed",e)}),this.eventBus.onEvent("notification:broadcast",e=>{e.target?this.sendToClient(e.target,e.type,e.data):this.broadcast(e.type,e.data)})}registerClient(e,t){try{let r={id:e,ws:t,readyState:t.readyState,send:a(o=>{t.readyState===1&&t.send(o)},"send")};this.clients.set(e,r),this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u518C: ${e}`),this.logger.debug(`\u5F53\u524D\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.sendQueuedMessages(e),this.eventBus.emitEvent("websocket:client:connected",{clientId:e,timestamp:Date.now()})}catch(r){this.logger.error(`\u6CE8\u518C\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,r),this.eventBus.emitEvent("notification:error",{error:r instanceof Error?r:new Error(String(r)),type:"client:register"})}}unregisterClient(e){try{this.clients.has(e)&&(this.clients.delete(e),this.messageQueue.delete(e),this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u6CE8\u9500: ${e}`),this.logger.debug(`\u5269\u4F59\u5BA2\u6237\u7AEF\u6570\u91CF: ${this.clients.size}`),this.eventBus.emitEvent("websocket:client:disconnected",{clientId:e,timestamp:Date.now()}))}catch(t){this.logger.error(`\u6CE8\u9500\u5BA2\u6237\u7AEF\u5931\u8D25: ${e}`,t)}}broadcast(e,t){let r={type:e,data:t,timestamp:Date.now()};this.logger.debug(`\u5E7F\u64AD\u6D88\u606F: ${e}`,{clientCount:this.clients.size});for(let[o,s]of this.clients)this.sendMessageToClient(s,r,o)}sendToClient(e,t,r){let o={type:t,data:r,timestamp:Date.now()},s=this.clients.get(e);s?this.sendMessageToClient(s,o,e):this.queueMessage(e,o)}sendMessageToClient(e,t,r){try{if(e.ws.readyState===1){let o=JSON.stringify(t);e.send(o),this.logger.debug(`\u6D88\u606F\u5DF2\u53D1\u9001\u7ED9\u5BA2\u6237\u7AEF ${r}: ${t.type}`)}else this.queueMessage(r,t),this.logger.warn(`\u5BA2\u6237\u7AEF ${r} \u8FDE\u63A5\u4E0D\u53EF\u7528\uFF0C\u6D88\u606F\u5DF2\u52A0\u5165\u961F\u5217`)}catch(o){this.logger.error(`\u53D1\u9001\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${r} \u5931\u8D25:`,o),this.queueMessage(r,t),this.eventBus.emitEvent("notification:error",{error:o instanceof Error?o:new Error(String(o)),type:"message:send"})}}queueMessage(e,t){this.messageQueue.has(e)||this.messageQueue.set(e,[]);let r=this.messageQueue.get(e);r.push(t),r.length>this.maxQueueSize&&(r.shift(),this.logger.warn(`\u5BA2\u6237\u7AEF ${e} \u6D88\u606F\u961F\u5217\u5DF2\u6EE1\uFF0C\u79FB\u9664\u6700\u65E7\u6D88\u606F`))}sendQueuedMessages(e){let t=this.messageQueue.get(e);if(!t||t.length===0)return;let r=this.clients.get(e);if(r){this.logger.debug(`\u53D1\u9001 ${t.length} \u6761\u6392\u961F\u6D88\u606F\u7ED9\u5BA2\u6237\u7AEF ${e}`);for(let o of t)this.sendMessageToClient(r,o,e);this.messageQueue.delete(e)}}broadcastConfigUpdate(e){this.broadcast("configUpdate",e)}broadcastStatusUpdate(e){this.broadcast("statusUpdate",e)}broadcastRestartStatus(e,t,r){let o={status:e,error:t,timestamp:r||Date.now()};this.broadcast("restartStatus",o)}getClientStats(){let e=Array.from(this.clients.values()).filter(r=>r.ws.readyState===1).length,t=Array.from(this.messageQueue.values()).reduce((r,o)=>r+o.length,0);return{totalClients:this.clients.size,connectedClients:e,queuedMessages:t}}cleanupDisconnectedClients(){let e=[];for(let[t,r]of this.clients)r.ws.readyState!==1&&e.push(t);for(let t of e)this.unregisterClient(t);e.length>0&&this.logger.debug(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.debug("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}};import{serve as Ml}from"@hono/node-server";import{normalizeServiceConfig as Pl}from"@xiaozhi-client/config";import{configManager as B}from"@xiaozhi-client/config";import{EndpointManager as yl}from"@xiaozhi-client/endpoint";import{ESP32DeviceManager as Il}from"@xiaozhi-client/esp32";import{WebSocketServer as Al}from"ws";function fl(n){return Array.isArray(n.routes)}a(fl,"isRouteGroup");function ds(n){if(fl(n)){let{routes:e,middleware:t}=n;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return n}a(ds,"normalizeRoutes");function M(n){return e=>t=>{let o=t.get("dependencies")[n];return e(o,t)}}a(M,"createHandler");var qe=class{constructor(e){this.logger=e}static{a(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=ds(t);this.routes.has(e)&&this.logger.warn(`\u8DEF\u7531\u7EC4 '${e}' \u5DF2\u5B58\u5728\uFF0C\u5C06\u88AB\u8986\u76D6`),this.routes.set(e,r),this.logger.info(`\u5DF2\u6CE8\u518C\u8DEF\u7531\u7EC4: ${e} (${r.length} \u4E2A\u8DEF\u7531)`)}registerRoutes(e){this.logger.info(`\u5F00\u59CB\u6279\u91CF\u6CE8\u518C ${Object.keys(e).length} \u4E2A\u8DEF\u7531\u7EC4...`);for(let[t,r]of Object.entries(e))this.registerRoute(t,r);this.logger.info(`\u6279\u91CF\u6CE8\u518C\u5B8C\u6210\uFF0C\u5171\u6CE8\u518C ${this.routes.size} \u4E2A\u8DEF\u7531\u7EC4`)}getAllRoutes(){return new Map(this.routes)}getRoute(e){return this.routes.get(e)}applyToApp(e){let t=Array.from(this.routes.entries());t.sort(([o],[s])=>o==="static"?1:s==="static"?-1:0);let r=0;for(let[o,s]of t)try{for(let i of s)this.applyRouteDefinition(e,i,o),r++}catch(i){this.logger.error(`\u2717 \u5E94\u7528\u8DEF\u7531\u7EC4\u5931\u8D25: ${o}`,i)}this.logger.info(`\u8DEF\u7531\u5E94\u7528\u5B8C\u6210\uFF0C\u5171 ${r} \u4E2A\u8DEF\u7531`)}applyRouteDefinition(e,t,r){let{method:o,path:s,handler:i,middleware:c=[]}=t,l=a(async(u,p)=>{try{return await i(u)}catch(d){return this.logger.error(`\u8DEF\u7531\u5904\u7406\u9519\u8BEF [${o} ${s}]:`,d),u.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",d instanceof Error?d.message:String(d),500)}},"wrappedHandler");switch(o){case"GET":c.length>0?e.get(s,...c,l):e.get(s,l);break;case"POST":c.length>0?e.post(s,...c,l):e.post(s,l);break;case"PUT":c.length>0?e.put(s,...c,l):e.put(s,l);break;case"DELETE":c.length>0?e.delete(s,...c,l):e.delete(s,l);break;case"PATCH":c.length>0?e.patch(s,...c,l):e.patch(s,l);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${o}`)}}clear(){this.routes.clear(),this.logger.info("\u5DF2\u6E05\u9664\u6240\u6709\u8DEF\u7531\u914D\u7F6E")}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}};var L=M("configApiHandler"),br=[{method:"GET",path:"/api/config",handler:L((n,e)=>n.getConfig(e))},{method:"PUT",path:"/api/config",handler:L((n,e)=>n.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:L((n,e)=>n.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:L((n,e)=>n.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:L((n,e)=>n.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:L((n,e)=>n.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:L((n,e)=>n.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:L((n,e)=>n.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:L((n,e)=>n.checkConfigExists(e))},{method:"GET",path:"/api/config/prompts",handler:L((n,e)=>n.getPromptFiles(e))},{method:"GET",path:"/api/config/prompts/content",handler:L((n,e)=>n.getPromptFileContent(e))},{method:"PUT",path:"/api/config/prompts/content",handler:L((n,e)=>n.updatePromptFileContent(e))},{method:"POST",path:"/api/config/prompts/content",handler:L((n,e)=>n.createPromptFileContent(e))},{method:"DELETE",path:"/api/config/prompts/content",handler:L((n,e)=>n.deletePromptFileContent(e))}];var fe=M("statusApiHandler"),wr=[{method:"GET",path:"/api/status",handler:fe((n,e)=>n.getStatus(e))},{method:"GET",path:"/api/status/client",handler:fe((n,e)=>n.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:fe((n,e)=>n.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:fe((n,e)=>n.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:fe((n,e)=>n.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:fe((n,e)=>n.setActiveMCPServers(e))}];var re=M("mcpToolHandler"),Lr=[{method:"POST",path:"/api/tools/call",handler:re((n,e)=>n.callTool(e))},{method:"GET",path:"/api/tools/list",handler:re((n,e)=>n.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:re((n,e)=>n.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:re((n,e)=>n.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:re((n,e)=>n.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:re((n,e)=>n.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:re((n,e)=>n.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:re((n,e)=>n.listMCPTools(e))}];var Cl=M("mcpRouteHandler"),xr=[{method:"POST",path:"/mcp",handler:Cl((n,e)=>n.handlePost(e))}];var wt=M("versionApiHandler"),Dr=[{method:"GET",path:"/api/version",handler:wt((n,e)=>n.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:wt((n,e)=>n.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:wt((n,e)=>n.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:wt((n,e)=>n.checkLatestVersion(e))}];var We=M("serviceApiHandler"),$r=[{method:"POST",path:"/api/services/restart",handler:We((n,e)=>n.restartService(e))},{method:"POST",path:"/api/services/stop",handler:We((n,e)=>n.stopService(e))},{method:"POST",path:"/api/services/start",handler:We((n,e)=>n.startService(e))},{method:"GET",path:"/api/services/status",handler:We((n,e)=>n.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:We((n,e)=>n.getServiceHealth(e))}];var El=M("updateApiHandler"),kr=[{method:"POST",path:"/api/update",handler:El((n,e)=>n.performUpdate(e))}];var vl=M("staticFileHandler"),Hr=[{method:"GET",path:"/*",handler:vl(async(n,e)=>e.req.path.startsWith("/api/")?e.notFound():await n.handleStaticFile(e))}];var Lt=M("cozeHandler"),Fr=[{method:"GET",path:"/api/coze/workspaces",handler:Lt((n,e)=>n.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:Lt((n,e)=>n.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:Lt((n,e)=>n.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:Lt((n,e)=>n.getCacheStats(e))}];var Tl=M("mcpToolLogHandler"),Vr=[{method:"GET",path:"/api/tool-calls/logs",handler:Tl((n,e)=>n.getToolCallLogs(e))}];var xt=a(async(n,e)=>{let r=n.get("dependencies").mcpHandler;return r?await e(r):n.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),Ur=[{method:"POST",path:"/api/mcp-servers",handler:a(n=>xt(n,e=>e.addMCPServer(n)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:a(n=>xt(n,e=>e.removeMCPServer(n)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:a(n=>xt(n,e=>e.getMCPServerStatus(n)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:a(n=>xt(n,e=>e.listMCPServers(n)),"handler")}];var Be=a(async(n,e)=>{let t=n.get("endpointHandler");if(!t)return n.fail("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",void 0,503);try{return await t[e](n)}catch(r){return n.fail("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25",void 0,500)}},"withEndpointHandler"),zr=[{method:"POST",path:"/api/endpoint/status",handler:a(n=>Be(n,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:a(n=>Be(n,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:a(n=>Be(n,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:a(n=>Be(n,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:a(n=>Be(n,"removeEndpoint"),"handler")}];var Sl=M("serviceApiHandler"),jr=[{method:"POST",path:"/api/restart",handler:Sl((n,e)=>n.restartService(e))}];var ms=M("ttsApiHandler"),Gr=[{method:"POST",path:"/api/tts",handler:ms((n,e)=>n.synthesize(e))},{method:"GET",path:"/api/tts/voices",handler:ms((n,e)=>n.getVoices(e))}];var wC=M("esp32Handler"),qr=a(n=>async e=>{let r=e.get("dependencies").esp32Handler;return r?n(r,e):e.json({error:"ESP32 service not available"},503)},"createESP32Handler"),Wr=[{method:"POST",path:"/",handler:qr((n,e)=>n.handleOTA(e))},{method:"POST",path:"/xiaozhi/ota/",handler:qr((n,e)=>n.handleOTA(e))},{method:"GET",path:"/ws",handler:qr(async(n,e)=>(e.get("logger").debug("ESP32 WebSocket\u7AEF\u70B9\u8BBF\u95EE"),e.text("WebSocket Upgrade Required",426)))}];var hs=class{static{a(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;esp32Manager;configApiHandler;statusApiHandler;serviceApiHandler;mcpToolHandler;mcpToolLogHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpHandler;updateApiHandler;cozeHandler;ttsApiHandler;esp32Handler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointManager=null;mcpServiceManager=null;eventListenerUnsubscribers=[];constructor(e){try{this.port=e??B.getWebUIPort()??ue.DEFAULT_PORT}catch{this.port=e??ue.DEFAULT_PORT}this.logger=g,this.eventBus=R(),this.statusService=new Nt,this.notificationService=new bt;let t={getASRConfig:a(()=>B.getASRConfig(),"getASRConfig"),getTTSConfig:a(()=>B.getTTSConfig(),"getTTSConfig"),getLLMConfig:a(()=>B.getLLMConfig(),"getLLMConfig"),isLLMConfigValid:a(()=>B.isLLMConfigValid(),"isLLMConfigValid")};this.esp32Manager=new Il({logger:g,configProvider:t}),this.configApiHandler=new Ke,this.statusApiHandler=new pt(this.statusService),this.serviceApiHandler=new gt(this.statusService),this.mcpToolHandler=new mt,this.mcpToolLogHandler=new ht,this.versionApiHandler=new Ot,this.staticFileHandler=new Le,this.mcpRouteHandler=new at,this.updateApiHandler=new _t,this.cozeHandler=new Te,this.ttsApiHandler=new ze,this.esp32Handler=new je(this.esp32Manager),this.realtimeNotificationHandler=new lt(this.notificationService,this.statusService),this.heartbeatHandler=new tt(this.statusService,this.notificationService),this.app=mo(),this.setupMiddleware(),this.app.notFound(Ir),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 Oe,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new be(this.mcpServiceManager,B),await this.loadMCPServicesFromConfig(e.mcpServers);let t=this.mcpServiceManager.getAllTools();this.logger.debug(`\u5DF2\u52A0\u8F7D ${t.length} \u4E2A\u5DE5\u5177`);let r=t.map(o=>({name:o.name,description:o.description||"",inputSchema:rt(o.inputSchema)}));await this.initializeXiaozhiConnection(e.mcpEndpoint),this.logger.debug("\u6240\u6709\u8FDE\u63A5\u521D\u59CB\u5316\u5B8C\u6210")}catch(e){this.logger.error("\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25:",e),this.mcpServiceManager||(this.logger.warn(`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u8FDB\u5165\u964D\u7EA7\u6A21\u5F0F\u3002\u5728\u964D\u7EA7\u6A21\u5F0F\u4E0B\uFF1A
|
|
107
85
|
1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
|
|
108
86
|
2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
|
|
109
87
|
3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
|
|
110
88
|
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 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};
|
|
89
|
+
5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new Oe,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(!B.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");B.cleanupInvalidServerToolsConfig();let e=B.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??ue.DEFAULT_PORT}}async loadMCPServicesFromConfig(e){if(!this.mcpServiceManager)throw new Error("MCPServiceManager \u672A\u521D\u59CB\u5316");for(let[t,r]of Object.entries(e)){this.logger.debug(`\u6DFB\u52A0 MCP \u670D\u52A1\u914D\u7F6E: ${t}`);let o=Pl(r);this.mcpServiceManager.addServiceConfig(t,o)}await this.mcpServiceManager.startAllServices()}async initializeXiaozhiConnection(e){let r=(Array.isArray(e)?e:[e]).filter(o=>o&&!o.includes("<\u8BF7\u586B\u5199"));this.logger.debug(`\u521D\u59CB\u5316\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\uFF0C\u7AEF\u70B9\u6570\u91CF: ${r.length}`);try{if(this.endpointManager||(this.endpointManager=new yl({defaultReconnectDelay:2e3}),this.endpointManager.setMcpManager(this.mcpServiceManager),this.logger.debug("\u2705 \u65B0\u5EFA\u8FDE\u63A5\u7BA1\u7406\u5668\u5B9E\u4F8B")),this.logger.debug("\u2705 \u8FDE\u63A5\u7BA1\u7406\u5668\u8BBE\u7F6E\u5B8C\u6210"),r.length>0){this.logger.debug("\u6709\u6548\u7AEF\u70B9\u5217\u8868:",r);for(let o of r)this.endpointManager.addEndpoint(o),this.logger.debug(`\u2705 \u5DF2\u6DFB\u52A0\u7AEF\u70B9: ${o}`);await this.endpointManager.connect(),this.endpointManager.on("endpointAdded",o=>{this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0: ${o.endpoint}`)}),this.endpointManager.on("endpointRemoved",o=>{this.logger.debug(`\u7AEF\u70B9\u5DF2\u79FB\u9664: ${o.endpoint}`)}),this.logger.debug(`\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7BA1\u7406 ${r.length} \u4E2A\u7AEF\u70B9`)}else this.logger.debug("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5B8C\u6210\uFF08\u65E0\u7AEF\u70B9\uFF09")}catch(o){throw this.logger.error("\u5C0F\u667A\u63A5\u5165\u70B9\u8FDE\u63A5\u7BA1\u7406\u5668\u521D\u59CB\u5316\u5931\u8D25:",o),o}}setXiaozhiConnectionManager(e){this.endpointManager=e}getEndpointManager(){if(!this.endpointManager)throw new Error("\u5C0F\u667A\u8FDE\u63A5\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.endpointManager}setMCPServiceManager(e){this.mcpServiceManager&&this.mcpServiceManager!==e&&this.logger.warn("\u66FF\u6362\u73B0\u6709\u7684 MCPServiceManager \u5B9E\u4F8B\uFF0C\u6CE8\u610F\u6E05\u7406\u539F\u6709\u5B9E\u4F8B\u7684\u8D44\u6E90"),this.mcpServiceManager=e,this.logger.debug("MCPServiceManager \u5B9E\u4F8B\u5DF2\u66F4\u65B0")}getMCPServiceManager(){if(!this.mcpServiceManager)throw new he("MCPServiceManager \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u786E\u4FDD WebServer \u5DF2\u8C03\u7528 start() \u65B9\u6CD5\u5B8C\u6210\u521D\u59CB\u5316");return this.mcpServiceManager}getEndpointConnectionStatus(){if(this.endpointManager){let e=this.endpointManager.getConnectionStatus();return{type:"multi-endpoint",manager:{connectedConnections:e.filter(t=>t.connected).length,totalConnections:e.length,healthCheckStats:{}},connections:e}}return{type:"none",connected:!1}}async connectWithRetry(e,t,r=5,o=1e3,s=3e4,i=2){let c=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(u){if(c=u,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,u),l<r){let p=Math.min(o*i**(l-1),s);this.logger.info(`${t} - ${p}ms \u540E\u91CD\u8BD5...`),await this.sleep(p)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${c?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",Mr),this.app?.use("*",Ar),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",_r),this.app?.use("*",Or()),this.app?.use("*",Nr()),this.app?.use("*",Pr),this.app?.onError(yr),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 qe(this.logger)}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:br,status:wr,tools:Lr,mcp:xr,version:Dr,services:$r,update:kr,coze:Fr,"tool-logs":Vr,mcpserver:Ur,endpoint:zr,misc:jr,tts:Gr,esp32:Wr,static:Hr}),this.routeManager.applyToApp(this.app),this.logger.info("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5B8C\u6210")}catch(e){this.logger.error("\u8DEF\u7531\u7CFB\u7EDF\u6CE8\u518C\u5931\u8D25:",e)}}setupWebSocket(){this.wss&&this.wss.on("connection",(e,t)=>{if((t.url?new URL(t.url,`http://${t.headers.host}`):null)?.pathname==="/ws"){this.handleESP32DeviceConnection(e,t);return}this.handleWebClientConnection(e,t)})}handleESP32DeviceConnection(e,t){let r=t.headers["device-id"],o=t.headers["client-id"],i=t.headers.authorization?.replace("Bearer ","");if(this.logger.info(`[WS-ESP32] \u6536\u5230ESP32\u8BBE\u5907\u8FDE\u63A5\u8BF7\u6C42: deviceId=${r}, clientId=${o}, url=${t.url}`),!r||!o){this.logger.warn(`[WS-ESP32] \u8FDE\u63A5\u7F3A\u5C11\u5FC5\u8981\u7684\u8BF7\u6C42\u5934: device-id="${r}", client-id="${o}"`),e.close(1008,"Missing required headers");return}this.logger.info(`[WS-ESP32] ESP32\u8BBE\u5907WebSocket\u8FDE\u63A5: deviceId=${r}, clientId=${o}`),this.esp32Manager.handleWebSocketConnection(e,r,o,i).then(()=>{this.logger.info(`[WS-ESP32] ESP32\u8BBE\u5907\u8FDE\u63A5\u5904\u7406\u6210\u529F: deviceId=${r}`)}).catch(c=>{this.logger.error(`[WS-ESP32] ESP32\u8BBE\u5907\u8FDE\u63A5\u5904\u7406\u5931\u8D25: deviceId=${r}`,c),(e.readyState===1||e.readyState===0)&&e.close(1011,"Connection handling failed")})}handleWebClientConnection(e,t){let r=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${r}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,r),this.heartbeatHandler.handleClientConnect(r),e.on("message",async o=>{try{let s=JSON.parse(o.toString());s.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,s,r):await this.realtimeNotificationHandler.handleMessage(e,s,r)}catch(s){this.logger.error("WebSocket message error:",s);let i={type:"error",error:{code:"MESSAGE_PARSE_ERROR",message:s instanceof Error?s.message:"\u6D88\u606F\u89E3\u6790\u5931\u8D25",timestamp:Date.now()}};e.send(JSON.stringify(i))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${r}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(r),this.heartbeatHandler.handleClientDisconnect(r)}),e.on("error",o=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${r}):`,o)}),this.realtimeNotificationHandler.sendInitialData(e,r)}setupEndpointStatusListener(){let e=a(t=>{let r={type:"endpoint_status_changed",data:{endpoint:t.endpoint,connected:t.connected,operation:t.operation,success:t.success,message:t.message,timestamp:t.timestamp}};this.notificationService.broadcast("endpoint_status_changed",r),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${t.endpoint} - ${t.operation}`)},"listener");this.eventBus.onEvent("endpoint:status:changed",e),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("endpoint:status:changed",e)})}setupMCPServerAddedListener(){let e=a(async r=>{if(this.logger.info(`\u68C0\u6D4B\u5230 MCP \u670D\u52A1\u6DFB\u52A0: ${r.serverName}\uFF0C\u5DE5\u5177\u6570\u91CF: ${r.tools.length}`),!this.endpointManager){this.logger.warn("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}try{let s=this.endpointManager.getConnectionStatus().filter(i=>i.connected).length;if(s===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${s} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u65B0\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_added",serverName:r.serverName,endpointCount:s,timestamp:Date.now()})}catch(o){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",o),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_added",serverName:r.serverName,error:o instanceof Error?o.message:String(o),timestamp:Date.now()})}},"singleServerListener");this.eventBus.onEvent("mcp:server:added",e),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("mcp:server:added",e)});let t=a(async r=>{if(this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CF MCP \u670D\u52A1\u6DFB\u52A0: ${r.addedCount} \u4E2A\u6210\u529F\uFF0C${r.failedCount} \u4E2A\u5931\u8D25`),!(!this.endpointManager||r.addedCount===0))try{let s=this.endpointManager.getConnectionStatus().filter(i=>i.connected).length;if(s===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${s} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u6279\u91CF\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_batch_added",serverName:void 0,endpointCount:s,timestamp:Date.now()})}catch(o){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",o),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_batch_added",serverName:void 0,error:o instanceof Error?o.message:String(o),timestamp:Date.now()})}},"batchServerListener");this.eventBus.onEvent("mcp:server:batch_added",t),this.eventListenerUnsubscribers.push(()=>{this.eventBus.offEvent("mcp:server:batch_added",t)})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=Ml({fetch:this.app.fetch,port:this.port,hostname:ue.DEFAULT_BIND_ADDRESS,createServer:Rl});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Al({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${ue.DEFAULT_BIND_ADDRESS}:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`)}stop(){return new Promise(e=>{let t=!1,r=a(()=>{t||(t=!0,e())},"doResolve");(async()=>{try{this.endpointManager&&(await this.endpointManager.cleanup(),this.logger.debug("\u8FDE\u63A5\u7BA1\u7406\u5668\u5DF2\u6E05\u7406"))}catch(o){this.logger.error("\u8FDE\u63A5\u7BA1\u7406\u5668\u6E05\u7406\u5931\u8D25:",o)}try{this.mcpServiceManager&&(await this.mcpServiceManager.stopAllServices(),this.mcpServiceManager=null,this.logger.debug("MCPServiceManager \u5DF2\u6E05\u7406"))}catch(o){this.logger.error("MCPServiceManager \u6E05\u7406\u5931\u8D25:",o)}if(this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.wss){for(let o of this.wss.clients)o.terminate();this.wss.close(()=>{let o,s=a(()=>{o&&(clearTimeout(o),o=void 0),r()},"cleanupAndResolve");this.httpServer?(this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),s()}),o=setTimeout(()=>{o=void 0,this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),s())})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0);for(let e of this.eventListenerUnsubscribers)e();this.eventListenerUnsubscribers=[],this.logger.debug("\u5DF2\u79FB\u9664\u6240\u6709\u4E8B\u4EF6\u603B\u7EBF\u76D1\u542C\u5668"),this.statusService.destroy(),this.notificationService.destroy(),this.esp32Manager.destroy(),co(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}};export{hs as WebServer};
|
|
112
90
|
//# sourceMappingURL=WebServer.js.map
|