xiaozhi-client 1.9.8-beta.2 → 1.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/backend/WebServer.js +8 -8
  2. package/dist/backend/WebServer.js.map +1 -1
  3. package/dist/backend/WebServerLauncher.js +8 -8
  4. package/dist/backend/WebServerLauncher.js.map +1 -1
  5. package/dist/backend/package.json +2 -1
  6. package/dist/cli/index.js +2 -2
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/config/index.js +1 -1
  9. package/dist/config/index.js.map +1 -1
  10. package/dist/frontend/assets/form-utils-Cv2Jj8YZ.js +2 -0
  11. package/dist/frontend/assets/form-utils-Cv2Jj8YZ.js.map +1 -0
  12. package/dist/frontend/assets/index-DUevyQ6o.js +81 -0
  13. package/dist/frontend/assets/index-DUevyQ6o.js.map +1 -0
  14. package/dist/frontend/assets/index-DWj2UcGy.css +1 -0
  15. package/dist/frontend/assets/radix-ui-BQCqNqg0.js +2 -0
  16. package/dist/frontend/assets/radix-ui-BQCqNqg0.js.map +1 -0
  17. package/dist/frontend/assets/react-vendor-CVccHTnD.js +67 -0
  18. package/dist/frontend/assets/react-vendor-CVccHTnD.js.map +1 -0
  19. package/dist/frontend/assets/{utils-Crq9xNoI.js → utils-C1vn-5fB.js} +2 -2
  20. package/dist/frontend/assets/{utils-Crq9xNoI.js.map → utils-C1vn-5fB.js.map} +1 -1
  21. package/dist/frontend/index.html +6 -7
  22. package/package.json +5 -5
  23. package/dist/frontend/assets/form-utils-dDdoGG-X.js +0 -2
  24. package/dist/frontend/assets/form-utils-dDdoGG-X.js.map +0 -1
  25. package/dist/frontend/assets/index-BffERQZW.js +0 -81
  26. package/dist/frontend/assets/index-BffERQZW.js.map +0 -1
  27. package/dist/frontend/assets/index-TxHhSaeL.css +0 -1
  28. package/dist/frontend/assets/radix-ui-e1yigncZ.js +0 -2
  29. package/dist/frontend/assets/radix-ui-e1yigncZ.js.map +0 -1
  30. package/dist/frontend/assets/react-vendor-Dg4-ftYx.js +0 -67
  31. package/dist/frontend/assets/react-vendor-Dg4-ftYx.js.map +0 -1
  32. package/dist/frontend/assets/vendor-CGhClqYn.js +0 -2
  33. package/dist/frontend/assets/vendor-CGhClqYn.js.map +0 -1
@@ -1,5 +1,5 @@
1
- var Gs=Object.create;var Be=Object.defineProperty;var Bs=Object.getOwnPropertyDescriptor;var Ws=Object.getOwnPropertyNames;var Xs=Object.getPrototypeOf,Ys=Object.prototype.hasOwnProperty;var c=(s,e)=>Be(s,"name",{value:e,configurable:!0});var C=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),Js=(s,e)=>{for(var t in e)Be(s,t,{get:e[t],enumerable:!0})},Lt=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ws(e))!Ys.call(s,o)&&o!==t&&Be(s,o,{get:()=>e[o],enumerable:!(r=Bs(e,o))||r.enumerable});return s},fe=(s,e,t)=>(Lt(s,e,"default"),t&&Lt(t,e,"default")),Ks=(s,e,t)=>(t=s!=null?Gs(Xs(s)):{},Lt(e||!s||!s.__esModule?Be(t,"default",{value:s,enumerable:!0}):t,s));var _e=C((Mp,Xr)=>{"use strict";var wn="2.0.0",An=Number.MAX_SAFE_INTEGER||9007199254740991,bn=16,On=250,_n=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Xr.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:bn,MAX_SAFE_BUILD_LENGTH:On,MAX_SAFE_INTEGER:An,RELEASE_TYPES:_n,SEMVER_SPEC_VERSION:wn,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var xe=C((Pp,Yr)=>{"use strict";var xn=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...s)=>{}:()=>{};Yr.exports=xn});var de=C((q,Jr)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Xt,MAX_SAFE_BUILD_LENGTH:Ln,MAX_LENGTH:Dn}=_e(),$n=xe();q=Jr.exports={};var Hn=q.re=[],kn=q.safeRe=[],d=q.src=[],Fn=q.safeSrc=[],m=q.t={},Un=0,Yt="[a-zA-Z0-9-]",Vn=[["\\s",1],["\\d",Dn],[Yt,Ln]],zn=c(s=>{for(let[e,t]of Vn)s=s.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return s},"makeSafeRegex"),E=c((s,e,t)=>{let r=zn(e),o=Un++;$n(s,o,e),m[s]=o,d[o]=e,Fn[o]=r,Hn[o]=new RegExp(e,t?"g":void 0),kn[o]=new RegExp(r,t?"g":void 0)},"createToken");E("NUMERICIDENTIFIER","0|[1-9]\\d*");E("NUMERICIDENTIFIERLOOSE","\\d+");E("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Yt}*`);E("MAINVERSION",`(${d[m.NUMERICIDENTIFIER]})\\.(${d[m.NUMERICIDENTIFIER]})\\.(${d[m.NUMERICIDENTIFIER]})`);E("MAINVERSIONLOOSE",`(${d[m.NUMERICIDENTIFIERLOOSE]})\\.(${d[m.NUMERICIDENTIFIERLOOSE]})\\.(${d[m.NUMERICIDENTIFIERLOOSE]})`);E("PRERELEASEIDENTIFIER",`(?:${d[m.NONNUMERICIDENTIFIER]}|${d[m.NUMERICIDENTIFIER]})`);E("PRERELEASEIDENTIFIERLOOSE",`(?:${d[m.NONNUMERICIDENTIFIER]}|${d[m.NUMERICIDENTIFIERLOOSE]})`);E("PRERELEASE",`(?:-(${d[m.PRERELEASEIDENTIFIER]}(?:\\.${d[m.PRERELEASEIDENTIFIER]})*))`);E("PRERELEASELOOSE",`(?:-?(${d[m.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${d[m.PRERELEASEIDENTIFIERLOOSE]})*))`);E("BUILDIDENTIFIER",`${Yt}+`);E("BUILD",`(?:\\+(${d[m.BUILDIDENTIFIER]}(?:\\.${d[m.BUILDIDENTIFIER]})*))`);E("FULLPLAIN",`v?${d[m.MAINVERSION]}${d[m.PRERELEASE]}?${d[m.BUILD]}?`);E("FULL",`^${d[m.FULLPLAIN]}$`);E("LOOSEPLAIN",`[v=\\s]*${d[m.MAINVERSIONLOOSE]}${d[m.PRERELEASELOOSE]}?${d[m.BUILD]}?`);E("LOOSE",`^${d[m.LOOSEPLAIN]}$`);E("GTLT","((?:<|>)?=?)");E("XRANGEIDENTIFIERLOOSE",`${d[m.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);E("XRANGEIDENTIFIER",`${d[m.NUMERICIDENTIFIER]}|x|X|\\*`);E("XRANGEPLAIN",`[v=\\s]*(${d[m.XRANGEIDENTIFIER]})(?:\\.(${d[m.XRANGEIDENTIFIER]})(?:\\.(${d[m.XRANGEIDENTIFIER]})(?:${d[m.PRERELEASE]})?${d[m.BUILD]}?)?)?`);E("XRANGEPLAINLOOSE",`[v=\\s]*(${d[m.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[m.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[m.XRANGEIDENTIFIERLOOSE]})(?:${d[m.PRERELEASELOOSE]})?${d[m.BUILD]}?)?)?`);E("XRANGE",`^${d[m.GTLT]}\\s*${d[m.XRANGEPLAIN]}$`);E("XRANGELOOSE",`^${d[m.GTLT]}\\s*${d[m.XRANGEPLAINLOOSE]}$`);E("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Xt}})(?:\\.(\\d{1,${Xt}}))?(?:\\.(\\d{1,${Xt}}))?`);E("COERCE",`${d[m.COERCEPLAIN]}(?:$|[^\\d])`);E("COERCEFULL",d[m.COERCEPLAIN]+`(?:${d[m.PRERELEASE]})?(?:${d[m.BUILD]})?(?:$|[^\\d])`);E("COERCERTL",d[m.COERCE],!0);E("COERCERTLFULL",d[m.COERCEFULL],!0);E("LONETILDE","(?:~>?)");E("TILDETRIM",`(\\s*)${d[m.LONETILDE]}\\s+`,!0);q.tildeTrimReplace="$1~";E("TILDE",`^${d[m.LONETILDE]}${d[m.XRANGEPLAIN]}$`);E("TILDELOOSE",`^${d[m.LONETILDE]}${d[m.XRANGEPLAINLOOSE]}$`);E("LONECARET","(?:\\^)");E("CARETTRIM",`(\\s*)${d[m.LONECARET]}\\s+`,!0);q.caretTrimReplace="$1^";E("CARET",`^${d[m.LONECARET]}${d[m.XRANGEPLAIN]}$`);E("CARETLOOSE",`^${d[m.LONECARET]}${d[m.XRANGEPLAINLOOSE]}$`);E("COMPARATORLOOSE",`^${d[m.GTLT]}\\s*(${d[m.LOOSEPLAIN]})$|^$`);E("COMPARATOR",`^${d[m.GTLT]}\\s*(${d[m.FULLPLAIN]})$|^$`);E("COMPARATORTRIM",`(\\s*)${d[m.GTLT]}\\s*(${d[m.LOOSEPLAIN]}|${d[m.XRANGEPLAIN]})`,!0);q.comparatorTrimReplace="$1$2$3";E("HYPHENRANGE",`^\\s*(${d[m.XRANGEPLAIN]})\\s+-\\s+(${d[m.XRANGEPLAIN]})\\s*$`);E("HYPHENRANGELOOSE",`^\\s*(${d[m.XRANGEPLAINLOOSE]})\\s+-\\s+(${d[m.XRANGEPLAINLOOSE]})\\s*$`);E("STAR","(<|>)?=?\\s*\\*");E("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");E("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var mt=C((Np,Kr)=>{"use strict";var jn=Object.freeze({loose:!0}),qn=Object.freeze({}),Gn=c(s=>s?typeof s!="object"?jn:s:qn,"parseOptions");Kr.exports=Gn});var Jt=C((wp,eo)=>{"use strict";var Qr=/^[0-9]+$/,Zr=c((s,e)=>{if(typeof s=="number"&&typeof e=="number")return s===e?0:s<e?-1:1;let t=Qr.test(s),r=Qr.test(e);return t&&r&&(s=+s,e=+e),s===e?0:t&&!r?-1:r&&!t?1:s<e?-1:1},"compareIdentifiers"),Bn=c((s,e)=>Zr(e,s),"rcompareIdentifiers");eo.exports={compareIdentifiers:Zr,rcompareIdentifiers:Bn}});var w=C((bp,ro)=>{"use strict";var ht=xe(),{MAX_LENGTH:to,MAX_SAFE_INTEGER:ft}=_e(),{safeRe:Ct,t:Et}=de(),Wn=mt(),{compareIdentifiers:Kt}=Jt(),Qt=class s{static{c(this,"SemVer")}constructor(e,t){if(t=Wn(t),e instanceof s){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>to)throw new TypeError(`version is longer than ${to} characters`);ht("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Ct[Et.LOOSE]:Ct[Et.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>ft||this.major<0)throw new TypeError("Invalid major version");if(this.minor>ft||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>ft||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(o=>{if(/^[0-9]+$/.test(o)){let n=+o;if(n>=0&&n<ft)return n}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(ht("SemVer.compare",this.version,this.options,e),!(e instanceof s)){if(typeof e=="string"&&e===this.version)return 0;e=new s(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof s||(e=new s(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 s||(e=new s(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(ht("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 Kt(r,o)}while(++t)}compareBuild(e){e instanceof s||(e=new s(e,this.options));let t=0;do{let r=this.build[t],o=e.build[t];if(ht("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 Kt(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?Ct[Et.PRERELEASELOOSE]:Ct[Et.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 n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(o)}}if(t){let n=[t,o];r===!1&&(n=[t]),Kt(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};ro.exports=Qt});var se=C((_p,so)=>{"use strict";var oo=w(),Xn=c((s,e,t=!1)=>{if(s instanceof oo)return s;try{return new oo(s,e)}catch(r){if(!t)return null;throw r}},"parse");so.exports=Xn});var io=C((Lp,no)=>{"use strict";var Yn=se(),Jn=c((s,e)=>{let t=Yn(s,e);return t?t.version:null},"valid");no.exports=Jn});var co=C(($p,ao)=>{"use strict";var Kn=se(),Qn=c((s,e)=>{let t=Kn(s.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");ao.exports=Qn});var uo=C((kp,go)=>{"use strict";var lo=w(),Zn=c((s,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new lo(s instanceof lo?s.version:s,t).inc(e,r,o).version}catch{return null}},"inc");go.exports=Zn});var ho=C((Up,mo)=>{"use strict";var po=se(),ei=c((s,e)=>{let t=po(s,null,!0),r=po(e,null,!0),o=t.compare(r);if(o===0)return null;let n=o>0,i=n?t:r,a=n?r:t,l=!!i.prerelease.length;if(!!a.prerelease.length&&!l){if(!a.patch&&!a.minor)return"major";if(a.compareMain(i)===0)return a.minor&&!a.patch?"minor":"patch"}let u=l?"pre":"";return t.major!==r.major?u+"major":t.minor!==r.minor?u+"minor":t.patch!==r.patch?u+"patch":"prerelease"},"diff");mo.exports=ei});var Co=C((zp,fo)=>{"use strict";var ti=w(),ri=c((s,e)=>new ti(s,e).major,"major");fo.exports=ri});var vo=C((qp,Eo)=>{"use strict";var oi=w(),si=c((s,e)=>new oi(s,e).minor,"minor");Eo.exports=si});var To=C((Bp,So)=>{"use strict";var ni=w(),ii=c((s,e)=>new ni(s,e).patch,"patch");So.exports=ii});var Mo=C((Xp,Ro)=>{"use strict";var ai=se(),ci=c((s,e)=>{let t=ai(s,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Ro.exports=ci});var H=C((Jp,yo)=>{"use strict";var Po=w(),li=c((s,e,t)=>new Po(s,t).compare(new Po(e,t)),"compare");yo.exports=li});var Io=C((Qp,No)=>{"use strict";var gi=H(),ui=c((s,e,t)=>gi(e,s,t),"rcompare");No.exports=ui});var Ao=C((ed,wo)=>{"use strict";var pi=H(),di=c((s,e)=>pi(s,e,!0),"compareLoose");wo.exports=di});var vt=C((rd,Oo)=>{"use strict";var bo=w(),mi=c((s,e,t)=>{let r=new bo(s,t),o=new bo(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");Oo.exports=mi});var xo=C((sd,_o)=>{"use strict";var hi=vt(),fi=c((s,e)=>s.sort((t,r)=>hi(t,r,e)),"sort");_o.exports=fi});var Do=C((id,Lo)=>{"use strict";var Ci=vt(),Ei=c((s,e)=>s.sort((t,r)=>Ci(r,t,e)),"rsort");Lo.exports=Ei});var Le=C((cd,$o)=>{"use strict";var vi=H(),Si=c((s,e,t)=>vi(s,e,t)>0,"gt");$o.exports=Si});var St=C((gd,Ho)=>{"use strict";var Ti=H(),Ri=c((s,e,t)=>Ti(s,e,t)<0,"lt");Ho.exports=Ri});var Zt=C((pd,ko)=>{"use strict";var Mi=H(),Pi=c((s,e,t)=>Mi(s,e,t)===0,"eq");ko.exports=Pi});var er=C((md,Fo)=>{"use strict";var yi=H(),Ni=c((s,e,t)=>yi(s,e,t)!==0,"neq");Fo.exports=Ni});var Tt=C((fd,Uo)=>{"use strict";var Ii=H(),wi=c((s,e,t)=>Ii(s,e,t)>=0,"gte");Uo.exports=wi});var Rt=C((Ed,Vo)=>{"use strict";var Ai=H(),bi=c((s,e,t)=>Ai(s,e,t)<=0,"lte");Vo.exports=bi});var tr=C((Sd,zo)=>{"use strict";var Oi=Zt(),_i=er(),xi=Le(),Li=Tt(),Di=St(),$i=Rt(),Hi=c((s,e,t,r)=>{switch(e){case"===":return typeof s=="object"&&(s=s.version),typeof t=="object"&&(t=t.version),s===t;case"!==":return typeof s=="object"&&(s=s.version),typeof t=="object"&&(t=t.version),s!==t;case"":case"=":case"==":return Oi(s,t,r);case"!=":return _i(s,t,r);case">":return xi(s,t,r);case">=":return Li(s,t,r);case"<":return Di(s,t,r);case"<=":return $i(s,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");zo.exports=Hi});var qo=C((Rd,jo)=>{"use strict";var ki=w(),Fi=se(),{safeRe:Mt,t:Pt}=de(),Ui=c((s,e)=>{if(s instanceof ki)return s;if(typeof s=="number"&&(s=String(s)),typeof s!="string")return null;e=e||{};let t=null;if(!e.rtl)t=s.match(e.includePrerelease?Mt[Pt.COERCEFULL]:Mt[Pt.COERCE]);else{let l=e.includePrerelease?Mt[Pt.COERCERTLFULL]:Mt[Pt.COERCERTL],g;for(;(g=l.exec(s))&&(!t||t.index+t[0].length!==s.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],o=t[3]||"0",n=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Fi(`${r}.${o}.${n}${i}${a}`,e)},"coerce");jo.exports=Ui});var Bo=C((Pd,Go)=>{"use strict";var rr=class{static{c(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}};Go.exports=rr});var k=C((Nd,Jo)=>{"use strict";var Vi=/\s+/g,or=class s{static{c(this,"Range")}constructor(e,t){if(t=ji(t),e instanceof s)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new s(e.raw,t);if(e instanceof sr)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(Vi," "),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=>!Xo(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&&Ji(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&&Xi)|(this.options.loose&&Yi))+":"+e,o=Wo.get(r);if(o)return o;let n=this.options.loose,i=n?O[A.HYPHENRANGELOOSE]:O[A.HYPHENRANGE];e=e.replace(i,ia(this.options.includePrerelease)),R("hyphen replace",e),e=e.replace(O[A.COMPARATORTRIM],Gi),R("comparator trim",e),e=e.replace(O[A.TILDETRIM],Bi),R("tilde trim",e),e=e.replace(O[A.CARETTRIM],Wi),R("caret trim",e);let a=e.split(" ").map(p=>Ki(p,this.options)).join(" ").split(/\s+/).map(p=>na(p,this.options));n&&(a=a.filter(p=>(R("loose invalid filter",p,this.options),!!p.match(O[A.COMPARATORLOOSE])))),R("range list",a);let l=new Map,g=a.map(p=>new sr(p,this.options));for(let p of g){if(Xo(p))return[p];l.set(p.value,p)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return Wo.set(r,u),u}intersects(e,t){if(!(e instanceof s))throw new TypeError("a Range is required");return this.set.some(r=>Yo(r,t)&&e.set.some(o=>Yo(o,t)&&r.every(n=>o.every(i=>n.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new qi(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(aa(this.set[t],e,this.options))return!0;return!1}};Jo.exports=or;var zi=Bo(),Wo=new zi,ji=mt(),sr=De(),R=xe(),qi=w(),{safeRe:O,t:A,comparatorTrimReplace:Gi,tildeTrimReplace:Bi,caretTrimReplace:Wi}=de(),{FLAG_INCLUDE_PRERELEASE:Xi,FLAG_LOOSE:Yi}=_e(),Xo=c(s=>s.value==="<0.0.0-0","isNullSet"),Ji=c(s=>s.value==="","isAny"),Yo=c((s,e)=>{let t=!0,r=s.slice(),o=r.pop();for(;t&&r.length;)t=r.every(n=>o.intersects(n,e)),o=r.pop();return t},"isSatisfiable"),Ki=c((s,e)=>(s=s.replace(O[A.BUILD],""),R("comp",s,e),s=ea(s,e),R("caret",s),s=Qi(s,e),R("tildes",s),s=ra(s,e),R("xrange",s),s=sa(s,e),R("stars",s),s),"parseComparator"),_=c(s=>!s||s.toLowerCase()==="x"||s==="*","isX"),Qi=c((s,e)=>s.trim().split(/\s+/).map(t=>Zi(t,e)).join(" "),"replaceTildes"),Zi=c((s,e)=>{let t=e.loose?O[A.TILDELOOSE]:O[A.TILDE];return s.replace(t,(r,o,n,i,a)=>{R("tilde",s,r,o,n,i,a);let l;return _(o)?l="":_(n)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:_(i)?l=`>=${o}.${n}.0 <${o}.${+n+1}.0-0`:a?(R("replaceTilde pr",a),l=`>=${o}.${n}.${i}-${a} <${o}.${+n+1}.0-0`):l=`>=${o}.${n}.${i} <${o}.${+n+1}.0-0`,R("tilde return",l),l})},"replaceTilde"),ea=c((s,e)=>s.trim().split(/\s+/).map(t=>ta(t,e)).join(" "),"replaceCarets"),ta=c((s,e)=>{R("caret",s,e);let t=e.loose?O[A.CARETLOOSE]:O[A.CARET],r=e.includePrerelease?"-0":"";return s.replace(t,(o,n,i,a,l)=>{R("caret",s,o,n,i,a,l);let g;return _(n)?g="":_(i)?g=`>=${n}.0.0${r} <${+n+1}.0.0-0`:_(a)?n==="0"?g=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:l?(R("replaceCaret pr",l),n==="0"?i==="0"?g=`>=${n}.${i}.${a}-${l} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}-${l} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a}-${l} <${+n+1}.0.0-0`):(R("no pr"),n==="0"?i==="0"?g=`>=${n}.${i}.${a}${r} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a} <${+n+1}.0.0-0`),R("caret return",g),g})},"replaceCaret"),ra=c((s,e)=>(R("replaceXRanges",s,e),s.split(/\s+/).map(t=>oa(t,e)).join(" ")),"replaceXRanges"),oa=c((s,e)=>{s=s.trim();let t=e.loose?O[A.XRANGELOOSE]:O[A.XRANGE];return s.replace(t,(r,o,n,i,a,l)=>{R("xRange",s,r,o,n,i,a,l);let g=_(n),u=g||_(i),p=u||_(a),f=p;return o==="="&&f&&(o=""),l=e.includePrerelease?"-0":"",g?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&f?(u&&(i=0),a=0,o===">"?(o=">=",u?(n=+n+1,i=0,a=0):(i=+i+1,a=0)):o==="<="&&(o="<",u?n=+n+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+n}.${i}.${a}${l}`):u?r=`>=${n}.0.0${l} <${+n+1}.0.0-0`:p&&(r=`>=${n}.${i}.0${l} <${n}.${+i+1}.0-0`),R("xRange return",r),r})},"replaceXRange"),sa=c((s,e)=>(R("replaceStars",s,e),s.trim().replace(O[A.STAR],"")),"replaceStars"),na=c((s,e)=>(R("replaceGTE0",s,e),s.trim().replace(O[e.includePrerelease?A.GTE0PRE:A.GTE0],"")),"replaceGTE0"),ia=c(s=>(e,t,r,o,n,i,a,l,g,u,p,f)=>(_(r)?t="":_(o)?t=`>=${r}.0.0${s?"-0":""}`:_(n)?t=`>=${r}.${o}.0${s?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${s?"-0":""}`,_(g)?l="":_(u)?l=`<${+g+1}.0.0-0`:_(p)?l=`<${g}.${+u+1}.0-0`:f?l=`<=${g}.${u}.${p}-${f}`:s?l=`<${g}.${u}.${+p+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),aa=c((s,e,t)=>{for(let r=0;r<s.length;r++)if(!s[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<s.length;r++)if(R(s[r].semver),s[r].semver!==sr.ANY&&s[r].semver.prerelease.length>0){let o=s[r].semver;if(o.major===e.major&&o.minor===e.minor&&o.patch===e.patch)return!0}return!1}return!0},"testSet")});var De=C((wd,rs)=>{"use strict";var $e=Symbol("SemVer ANY"),ar=class s{static{c(this,"Comparator")}static get ANY(){return $e}constructor(e,t){if(t=Ko(t),e instanceof s){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),ir("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===$e?this.value="":this.value=this.operator+this.semver.version,ir("comp",this)}parse(e){let t=this.options.loose?Qo[Zo.COMPARATORLOOSE]:Qo[Zo.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 es(r[2],this.options.loose):this.semver=$e}toString(){return this.value}test(e){if(ir("Comparator.test",e,this.options.loose),this.semver===$e||e===$e)return!0;if(typeof e=="string")try{e=new es(e,this.options)}catch{return!1}return nr(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new ts(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new ts(this.value,t).test(e.semver):(t=Ko(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("=")||nr(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||nr(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};rs.exports=ar;var Ko=mt(),{safeRe:Qo,t:Zo}=de(),nr=tr(),ir=xe(),es=w(),ts=k()});var He=C((bd,os)=>{"use strict";var ca=k(),la=c((s,e,t)=>{try{e=new ca(e,t)}catch{return!1}return e.test(s)},"satisfies");os.exports=la});var ns=C((_d,ss)=>{"use strict";var ga=k(),ua=c((s,e)=>new ga(s,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");ss.exports=ua});var as=C((Ld,is)=>{"use strict";var pa=w(),da=k(),ma=c((s,e,t)=>{let r=null,o=null,n=null;try{n=new da(e,t)}catch{return null}return s.forEach(i=>{n.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new pa(r,t))}),r},"maxSatisfying");is.exports=ma});var ls=C(($d,cs)=>{"use strict";var ha=w(),fa=k(),Ca=c((s,e,t)=>{let r=null,o=null,n=null;try{n=new fa(e,t)}catch{return null}return s.forEach(i=>{n.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new ha(r,t))}),r},"minSatisfying");cs.exports=Ca});var ps=C((kd,us)=>{"use strict";var cr=w(),Ea=k(),gs=Le(),va=c((s,e)=>{s=new Ea(s,e);let t=new cr("0.0.0");if(s.test(t)||(t=new cr("0.0.0-0"),s.test(t)))return t;t=null;for(let r=0;r<s.set.length;++r){let o=s.set[r],n=null;o.forEach(i=>{let a=new cr(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!n||gs(a,n))&&(n=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),n&&(!t||gs(t,n))&&(t=n)}return t&&s.test(t)?t:null},"minVersion");us.exports=va});var ms=C((Ud,ds)=>{"use strict";var Sa=k(),Ta=c((s,e)=>{try{return new Sa(s,e).range||"*"}catch{return null}},"validRange");ds.exports=Ta});var yt=C((zd,Es)=>{"use strict";var Ra=w(),Cs=De(),{ANY:Ma}=Cs,Pa=k(),ya=He(),hs=Le(),fs=St(),Na=Rt(),Ia=Tt(),wa=c((s,e,t,r)=>{s=new Ra(s,r),e=new Pa(e,r);let o,n,i,a,l;switch(t){case">":o=hs,n=Na,i=fs,a=">",l=">=";break;case"<":o=fs,n=Ia,i=hs,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ya(s,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],p=null,f=null;if(u.forEach(h=>{h.semver===Ma&&(h=new Cs(">=0.0.0")),p=p||h,f=f||h,o(h.semver,p.semver,r)?p=h:i(h.semver,f.semver,r)&&(f=h)}),p.operator===a||p.operator===l||(!f.operator||f.operator===a)&&n(s,f.semver))return!1;if(f.operator===l&&i(s,f.semver))return!1}return!0},"outside");Es.exports=wa});var Ss=C((qd,vs)=>{"use strict";var Aa=yt(),ba=c((s,e,t)=>Aa(s,e,">",t),"gtr");vs.exports=ba});var Rs=C((Bd,Ts)=>{"use strict";var Oa=yt(),_a=c((s,e,t)=>Oa(s,e,"<",t),"ltr");Ts.exports=_a});var ys=C((Xd,Ps)=>{"use strict";var Ms=k(),xa=c((s,e,t)=>(s=new Ms(s,t),e=new Ms(e,t),s.intersects(e,t)),"intersects");Ps.exports=xa});var Is=C((Jd,Ns)=>{"use strict";var La=He(),Da=H();Ns.exports=(s,e,t)=>{let r=[],o=null,n=null,i=s.sort((u,p)=>Da(u,p,t));for(let u of i)La(u,e,t)?(n=u,o||(o=u)):(n&&r.push([o,n]),n=null,o=null);o&&r.push([o,null]);let a=[];for(let[u,p]of r)u===p?a.push(u):!p&&u===i[0]?a.push("*"):p?u===i[0]?a.push(`<=${p}`):a.push(`${u} - ${p}`):a.push(`>=${u}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var xs=C((Kd,_s)=>{"use strict";var ws=k(),gr=De(),{ANY:lr}=gr,ke=He(),ur=H(),$a=c((s,e,t={})=>{if(s===e)return!0;s=new ws(s,t),e=new ws(e,t);let r=!1;e:for(let o of s.set){for(let n of e.set){let i=ka(o,n,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Ha=[new gr(">=0.0.0-0")],As=[new gr(">=0.0.0")],ka=c((s,e,t)=>{if(s===e)return!0;if(s.length===1&&s[0].semver===lr){if(e.length===1&&e[0].semver===lr)return!0;t.includePrerelease?s=Ha:s=As}if(e.length===1&&e[0].semver===lr){if(t.includePrerelease)return!0;e=As}let r=new Set,o,n;for(let h of s)h.operator===">"||h.operator===">="?o=bs(o,h,t):h.operator==="<"||h.operator==="<="?n=Os(n,h,t):r.add(h.semver);if(r.size>1)return null;let i;if(o&&n){if(i=ur(o.semver,n.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||n.operator!=="<="))return null}for(let h of r){if(o&&!ke(h,String(o),t)||n&&!ke(h,String(n),t))return null;for(let x of e)if(!ke(h,String(x),t))return!1;return!0}let a,l,g,u,p=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1,f=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;p&&p.prerelease.length===1&&n.operator==="<"&&p.prerelease[0]===0&&(p=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",g=g||h.operator==="<"||h.operator==="<=",o){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=bs(o,h,t),a===h&&a!==o)return!1}else if(o.operator===">="&&!ke(o.semver,String(h),t))return!1}if(n){if(p&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===p.major&&h.semver.minor===p.minor&&h.semver.patch===p.patch&&(p=!1),h.operator==="<"||h.operator==="<="){if(l=Os(n,h,t),l===h&&l!==n)return!1}else if(n.operator==="<="&&!ke(n.semver,String(h),t))return!1}if(!h.operator&&(n||o)&&i!==0)return!1}return!(o&&g&&!n&&i!==0||n&&u&&!o&&i!==0||f||p)},"simpleSubset"),bs=c((s,e,t)=>{if(!s)return e;let r=ur(s.semver,e.semver,t);return r>0?s:r<0||e.operator===">"&&s.operator===">="?e:s},"higherGT"),Os=c((s,e,t)=>{if(!s)return e;let r=ur(s.semver,e.semver,t);return r<0?s:r>0||e.operator==="<"&&s.operator==="<="?e:s},"lowerLT");_s.exports=$a});var Hs=C((Zd,$s)=>{"use strict";var pr=de(),Ls=_e(),Fa=w(),Ds=Jt(),Ua=se(),Va=io(),za=co(),ja=uo(),qa=ho(),Ga=Co(),Ba=vo(),Wa=To(),Xa=Mo(),Ya=H(),Ja=Io(),Ka=Ao(),Qa=vt(),Za=xo(),ec=Do(),tc=Le(),rc=St(),oc=Zt(),sc=er(),nc=Tt(),ic=Rt(),ac=tr(),cc=qo(),lc=De(),gc=k(),uc=He(),pc=ns(),dc=as(),mc=ls(),hc=ps(),fc=ms(),Cc=yt(),Ec=Ss(),vc=Rs(),Sc=ys(),Tc=Is(),Rc=xs();$s.exports={parse:Ua,valid:Va,clean:za,inc:ja,diff:qa,major:Ga,minor:Ba,patch:Wa,prerelease:Xa,compare:Ya,rcompare:Ja,compareLoose:Ka,compareBuild:Qa,sort:Za,rsort:ec,gt:tc,lt:rc,eq:oc,neq:sc,gte:nc,lte:ic,cmp:ac,coerce:cc,Comparator:lc,Range:gc,satisfies:uc,toComparators:pc,maxSatisfying:dc,minSatisfying:mc,minVersion:hc,validRange:fc,outside:Cc,gtr:Ec,ltr:vc,intersects:Sc,simplifyRange:Tc,subset:Rc,SemVer:Fa,re:pr.re,src:pr.src,tokens:pr.t,SEMVER_SPEC_VERSION:Ls.SEMVER_SPEC_VERSION,RELEASE_TYPES:Ls.RELEASE_TYPES,compareIdentifiers:Ds.compareIdentifiers,rcompareIdentifiers:Ds.rcompareIdentifiers}});import{createServer as $c}from"http";import*as b from"fs";import*as D from"path";import Ce from"chalk";import ie from"pino";import{z as Qs}from"zod";var Zs=Qs.enum(["fatal","error","warn","info","debug","trace"]);function en(s){let e=s.getFullYear(),t=String(s.getMonth()+1).padStart(2,"0"),r=String(s.getDate()).padStart(2,"0"),o=String(s.getHours()).padStart(2,"0"),n=String(s.getMinutes()).padStart(2,"0"),i=String(s.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${o}:${n}:${i}`}c(en,"formatDateTime");var $t=class{static{c(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=Zs.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:ie.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:ie.destination({dest:"/dev/null"})}),ie({level:this.logLevel,timestamp:ie.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:ie.stdSerializers?.err||(t=>t)}},ie.multistream(e,{dedupe:!0}))}createOptimizedConsoleStream(){let e=new Map([[20,{name:"DEBUG",color:Ce.gray}],[30,{name:"INFO",color:Ce.blue}],[40,{name:"WARN",color:Ce.yellow}],[50,{name:"ERROR",color:Ce.red}],[60,{name:"FATAL",color:Ce.red}]]);return{write:c(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=en(new Date),o=t.get(e.level)||{name:"UNKNOWN",color:c(a=>a,"color")},n=o.color(`[${o.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let a=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${a}`}return`[${r}] ${n} ${i}`}initLogFile(e){this.logFilePath=D.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),b.existsSync(this.logFilePath)||b.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(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){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}enhanceErrorObject(e){let t={...e};for(let[r,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||!b.existsSync(this.logFilePath)))try{b.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=D.dirname(this.logFilePath),t=D.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let n=D.join(e,`${t}.${o}.log`),i=D.join(e,`${t}.${o+1}.log`);b.existsSync(n)&&(o===this.maxLogFiles-1?b.unlinkSync(n):b.renameSync(n,i))}let r=D.join(e,`${t}.1.log`);b.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=D.dirname(this.logFilePath),t=D.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=D.join(e,`${t}.${r}.log`);b.existsSync(o)&&b.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}},Dt=null,tn="info";function rn(){return Dt||(Dt=new $t(tn)),Dt}c(rn,"getLogger");var v=rn();import{configManager as $}from"@xiaozhi-client/config";var I=class{static{c(this,"BaseHandler")}handleError(e,t,r,o="OPERATION_FAILED",n="\u64CD\u4F5C\u5931\u8D25",i=500){let a=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,a||n,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 We=class extends I{static{c(this,"ConfigApiHandler")}constructor(){super()}async getConfig(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u914D\u7F6E\u8BF7\u6C42");let t=$.getConfig();return e.get("logger").info("\u83B7\u53D6\u914D\u7F6E\u6210\u529F"),e.success(t)}catch(t){return e.get("logger").error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25:",t),e.fail("CONFIG_READ_ERROR",t instanceof Error?t.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($.validateConfig(t),$.updateConfig(t),t.mcpServerConfig)for(let[r,o]of Object.entries(t.mcpServerConfig))for(let[n,i]of Object.entries(o.tools))$.setToolEnabled(r,n,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=$.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=$.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=$.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=$.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"),$.reloadConfig();let t=$.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=$.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=$.configExists();return e.get("logger").debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.success({exists:t})}catch(t){return e.get("logger").error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t),e.fail("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25",void 0,500)}}};var F={};Js(F,{CozeApiService:()=>B,config:()=>Ee,createCozeClient:()=>Xe});var Ee={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"}};fe(F,ll);import*as ll from"@coze/api";function Xe(s,e="zh"){if(!s||typeof s!="string"||s.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=Ee[e]||Ee.zh;return new F.CozeAPI({baseURL:t.COZE_BASE_URL,token:s.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}c(Xe,"createCozeClient");import on from"node-cache";var B=class{static{c(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Xe(this.token),this.cache=new on({stdTTL:300})}async getWorkspaces(){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}async getWorkflows(e){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 n=`workflows:${t}:${r}:${o}`,i=this.cache.get(n);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(n,l),l}callWorkflow(e,t){return this.client.workflows.runs.create({workflow_id:e,parameters:t})}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 ce}from"@xiaozhi-client/config";function ae(s){if(!(s instanceof Error&&"code"in s))return!1;let e=s.code;return typeof e=="string"&&["AUTH_FAILED","RATE_LIMITED","TIMEOUT","API_ERROR","NETWORK_ERROR"].includes(e)}c(ae,"isErrorWithCode");function Ye(){let s=ce.getCozeToken();if(!s)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 B(s)}c(Ye,"getCozeApiService");var ve=class extends I{static{c(this,"CozeHandler")}constructor(){super()}async getWorkspaces(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!ce.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=Ye();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){if(e.get("logger").error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),ae(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(ae(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(ae(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);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\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25",r,500)}}async getWorkflows(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!ce.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 n={workspace_id:t,page_num:r,page_size:o},i=Ye();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 a=await i.getWorkflows(n);e.get("logger").info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${a.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=ce.getCustomMCPTools(),g=a.items.map(u=>{let p=l.find(f=>f.handler.type==="proxy"&&f.handler.platform==="coze"&&f.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!p,toolName:p?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${g.filter(u=>u.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.success({items:g,has_more:a.has_more,page_num:r,page_size:o,total_count:a.items.length},`\u6210\u529F\u83B7\u53D6 ${g.length} \u4E2A\u5DE5\u4F5C\u6D41`)}catch(t){if(e.get("logger").error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),ae(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(ae(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(ae(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);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\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25",r,500)}}async clearCache(e){try{if(e.get("logger").info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!ce.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=Ye(),o=r.getCacheStats();e.get("logger").info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let n=r.getCacheStats();return e.get("logger").info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${n.size} \u9879`),e.success({cleared:o.size-n.size,remaining:n.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"),!ce.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=Ye().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 Ht={DEFAULT_LIMIT:50,MAX_LIMIT:200};var y={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"},W={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},le={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},re={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 X={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},Se=[X.V2024_11_05,X.V2025_06_18],kt={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},Y={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"};var Ft={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"};var Je={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"};var Dr={TTL:3e5,CLEANUP_INTERVAL:6e4};var Ut={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3};var $r={DEFAULT:1024*1024,MAX:10*1024*1024};var Vt={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},Hr={SERVICE_TOOL_SEPARATOR:"__"};import{configManager as sn}from"@xiaozhi-client/config";var Ke=class{static{c(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=v,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),this.sendError(e,"CLIENT_STATUS_ERROR",o instanceof Error?o.message:"\u5BA2\u6237\u7AEF\u72B6\u6001\u66F4\u65B0\u5931\u8D25")}}async sendLatestConfig(e,t){try{let o={type:"configUpdate",data:sn.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)}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}checkHeartbeatTimeout(){let e=this.statusService.getLastHeartbeat(),t=Date.now();e&&t-e>Ut.TIMEOUT_THRESHOLD&&(this.logger.warn("\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()},Ut.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.info("\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.info(`\u5BA2\u6237\u7AEF\u8FDE\u63A5\u5EFA\u7ACB: ${e}`),this.statusService.updateClientInfo({status:"connected",lastHeartbeat:Date.now()},`websocket-connect-${e}`)}handleClientDisconnect(e){this.logger.info(`\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 nn}from"events";var zt=class extends nn{static{c(this,"EventBus")}logger;eventStats=new Map;maxListeners=50;constructor(){super(),this.logger=v,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=c(o=>{try{t(o)}catch(n){throw this.emit("error",n),n}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")}},ge=null;function T(){return ge||(ge=new zt),ge}c(T,"getEventBus");function kr(){ge&&(ge.destroy(),ge=null)}c(kr,"destroyEventBus");var Te=class{static{c(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=v,this.endpointManager=e,this.configManager=t,this.eventBus=T()}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(n){return this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",n),{ok:!1,response:e.fail(t,"JSON\u89E3\u6790\u5931\u8D25",n instanceof Error?n.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 n=this.endpointManager.getConnectionStatus().find(i=>i.endpoint===r);return n?(this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.success(n)):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(a=>a.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 a={endpoint:r,connected:!1,initialized:!0};return e.success(i||a)}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(u){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,u)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(u){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,u);try{await i.disconnect(),this.logger.debug(`\u56DE\u6EDA\u65F6\u5DF2\u65AD\u5F00\u7AEF\u70B9\u8FDE\u63A5: ${r}`)}catch(p){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}`,p)}throw this.endpointManager.removeEndpoint(i),u}let l=this.endpointManager.getConnectionStatus().find(u=>u.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 g={endpoint:r,connected:!1,initialized:!0};return e.success(l||g,"\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 n=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 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:n},"\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 pn}from"events";function an(s){return typeof s=="object"&&s!==null&&"type"in s&&s.type==="object"}c(an,"isValidToolJSONSchema");function Qe(s){return an(s)?s:{type:"object",properties:{},required:[],additionalProperties:!0}}c(Qe,"ensureToolJSONSchema");var J=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{c(this,"ToolCallError")}};import{isModelScopeURL as dn}from"@xiaozhi-client/config";import{configManager as L}from"@xiaozhi-client/config";import{createHash as cn}from"crypto";function j(s,e){let t=cn("md5").update(JSON.stringify(e||{})).digest("hex");return`${s}_${t}`}c(j,"generateCacheKey");function jt(s,e){let t=new Date(s).getTime();return Date.now()-t>e}c(jt,"isCacheExpired");function Re(s){let e=Date.now(),t=new Date(s.timestamp).getTime();return!!(s.consumed&&e-t>6e4||e-t>s.ttl||s.status==="failed")}c(Re,"shouldCleanupCache");var Ze={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0};var Me=class s extends Error{static{c(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,s)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};function Fr(s,e){return{content:[{type:"text",text:e?ln(e,s):Ur(s)}],isError:!1,taskId:s,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"}}c(Fr,"createTimeoutResponse");function ln(s,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 Bs=Object.create;var We=Object.defineProperty;var Ws=Object.getOwnPropertyDescriptor;var Xs=Object.getOwnPropertyNames;var Ys=Object.getPrototypeOf,Js=Object.prototype.hasOwnProperty;var c=(s,e)=>We(s,"name",{value:e,configurable:!0});var E=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),Ks=(s,e)=>{for(var t in e)We(s,t,{get:e[t],enumerable:!0})},Dt=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Xs(e))!Js.call(s,o)&&o!==t&&We(s,o,{get:()=>e[o],enumerable:!(r=Ws(e,o))||r.enumerable});return s},Ce=(s,e,t)=>(Dt(s,e,"default"),t&&Dt(t,e,"default")),Qs=(s,e,t)=>(t=s!=null?Bs(Ys(s)):{},Dt(e||!s||!s.__esModule?We(t,"default",{value:s,enumerable:!0}):t,s));var Le=E((Od,Yr)=>{"use strict";var _n="2.0.0",wn=Number.MAX_SAFE_INTEGER||9007199254740991,bn=16,Ln=250,xn=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Yr.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:bn,MAX_SAFE_BUILD_LENGTH:Ln,MAX_SAFE_INTEGER:wn,RELEASE_TYPES:xn,SEMVER_SPEC_VERSION:_n,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var xe=E((_d,Jr)=>{"use strict";var Dn=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...s)=>{}:()=>{};Jr.exports=Dn});var me=E((G,Kr)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Yt,MAX_SAFE_BUILD_LENGTH:$n,MAX_LENGTH:kn}=Le(),Hn=xe();G=Kr.exports={};var Fn=G.re=[],Vn=G.safeRe=[],m=G.src=[],Un=G.safeSrc=[],h=G.t={},zn=0,Jt="[a-zA-Z0-9-]",jn=[["\\s",1],["\\d",kn],[Jt,$n]],qn=c(s=>{for(let[e,t]of jn)s=s.split(`${e}*`).join(`${e}{0,${t}}`).split(`${e}+`).join(`${e}{1,${t}}`);return s},"makeSafeRegex"),v=c((s,e,t)=>{let r=qn(e),o=zn++;Hn(s,o,e),h[s]=o,m[o]=e,Un[o]=r,Fn[o]=new RegExp(e,t?"g":void 0),Vn[o]=new RegExp(r,t?"g":void 0)},"createToken");v("NUMERICIDENTIFIER","0|[1-9]\\d*");v("NUMERICIDENTIFIERLOOSE","\\d+");v("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Jt}*`);v("MAINVERSION",`(${m[h.NUMERICIDENTIFIER]})\\.(${m[h.NUMERICIDENTIFIER]})\\.(${m[h.NUMERICIDENTIFIER]})`);v("MAINVERSIONLOOSE",`(${m[h.NUMERICIDENTIFIERLOOSE]})\\.(${m[h.NUMERICIDENTIFIERLOOSE]})\\.(${m[h.NUMERICIDENTIFIERLOOSE]})`);v("PRERELEASEIDENTIFIER",`(?:${m[h.NONNUMERICIDENTIFIER]}|${m[h.NUMERICIDENTIFIER]})`);v("PRERELEASEIDENTIFIERLOOSE",`(?:${m[h.NONNUMERICIDENTIFIER]}|${m[h.NUMERICIDENTIFIERLOOSE]})`);v("PRERELEASE",`(?:-(${m[h.PRERELEASEIDENTIFIER]}(?:\\.${m[h.PRERELEASEIDENTIFIER]})*))`);v("PRERELEASELOOSE",`(?:-?(${m[h.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${m[h.PRERELEASEIDENTIFIERLOOSE]})*))`);v("BUILDIDENTIFIER",`${Jt}+`);v("BUILD",`(?:\\+(${m[h.BUILDIDENTIFIER]}(?:\\.${m[h.BUILDIDENTIFIER]})*))`);v("FULLPLAIN",`v?${m[h.MAINVERSION]}${m[h.PRERELEASE]}?${m[h.BUILD]}?`);v("FULL",`^${m[h.FULLPLAIN]}$`);v("LOOSEPLAIN",`[v=\\s]*${m[h.MAINVERSIONLOOSE]}${m[h.PRERELEASELOOSE]}?${m[h.BUILD]}?`);v("LOOSE",`^${m[h.LOOSEPLAIN]}$`);v("GTLT","((?:<|>)?=?)");v("XRANGEIDENTIFIERLOOSE",`${m[h.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);v("XRANGEIDENTIFIER",`${m[h.NUMERICIDENTIFIER]}|x|X|\\*`);v("XRANGEPLAIN",`[v=\\s]*(${m[h.XRANGEIDENTIFIER]})(?:\\.(${m[h.XRANGEIDENTIFIER]})(?:\\.(${m[h.XRANGEIDENTIFIER]})(?:${m[h.PRERELEASE]})?${m[h.BUILD]}?)?)?`);v("XRANGEPLAINLOOSE",`[v=\\s]*(${m[h.XRANGEIDENTIFIERLOOSE]})(?:\\.(${m[h.XRANGEIDENTIFIERLOOSE]})(?:\\.(${m[h.XRANGEIDENTIFIERLOOSE]})(?:${m[h.PRERELEASELOOSE]})?${m[h.BUILD]}?)?)?`);v("XRANGE",`^${m[h.GTLT]}\\s*${m[h.XRANGEPLAIN]}$`);v("XRANGELOOSE",`^${m[h.GTLT]}\\s*${m[h.XRANGEPLAINLOOSE]}$`);v("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Yt}})(?:\\.(\\d{1,${Yt}}))?(?:\\.(\\d{1,${Yt}}))?`);v("COERCE",`${m[h.COERCEPLAIN]}(?:$|[^\\d])`);v("COERCEFULL",m[h.COERCEPLAIN]+`(?:${m[h.PRERELEASE]})?(?:${m[h.BUILD]})?(?:$|[^\\d])`);v("COERCERTL",m[h.COERCE],!0);v("COERCERTLFULL",m[h.COERCEFULL],!0);v("LONETILDE","(?:~>?)");v("TILDETRIM",`(\\s*)${m[h.LONETILDE]}\\s+`,!0);G.tildeTrimReplace="$1~";v("TILDE",`^${m[h.LONETILDE]}${m[h.XRANGEPLAIN]}$`);v("TILDELOOSE",`^${m[h.LONETILDE]}${m[h.XRANGEPLAINLOOSE]}$`);v("LONECARET","(?:\\^)");v("CARETTRIM",`(\\s*)${m[h.LONECARET]}\\s+`,!0);G.caretTrimReplace="$1^";v("CARET",`^${m[h.LONECARET]}${m[h.XRANGEPLAIN]}$`);v("CARETLOOSE",`^${m[h.LONECARET]}${m[h.XRANGEPLAINLOOSE]}$`);v("COMPARATORLOOSE",`^${m[h.GTLT]}\\s*(${m[h.LOOSEPLAIN]})$|^$`);v("COMPARATOR",`^${m[h.GTLT]}\\s*(${m[h.FULLPLAIN]})$|^$`);v("COMPARATORTRIM",`(\\s*)${m[h.GTLT]}\\s*(${m[h.LOOSEPLAIN]}|${m[h.XRANGEPLAIN]})`,!0);G.comparatorTrimReplace="$1$2$3";v("HYPHENRANGE",`^\\s*(${m[h.XRANGEPLAIN]})\\s+-\\s+(${m[h.XRANGEPLAIN]})\\s*$`);v("HYPHENRANGELOOSE",`^\\s*(${m[h.XRANGEPLAINLOOSE]})\\s+-\\s+(${m[h.XRANGEPLAINLOOSE]})\\s*$`);v("STAR","(<|>)?=?\\s*\\*");v("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");v("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var ht=E((bd,Qr)=>{"use strict";var Gn=Object.freeze({loose:!0}),Bn=Object.freeze({}),Wn=c(s=>s?typeof s!="object"?Gn:s:Bn,"parseOptions");Qr.exports=Wn});var Kt=E((xd,to)=>{"use strict";var Zr=/^[0-9]+$/,eo=c((s,e)=>{if(typeof s=="number"&&typeof e=="number")return s===e?0:s<e?-1:1;let t=Zr.test(s),r=Zr.test(e);return t&&r&&(s=+s,e=+e),s===e?0:t&&!r?-1:r&&!t?1:s<e?-1:1},"compareIdentifiers"),Xn=c((s,e)=>eo(e,s),"rcompareIdentifiers");to.exports={compareIdentifiers:eo,rcompareIdentifiers:Xn}});var N=E(($d,oo)=>{"use strict";var ft=xe(),{MAX_LENGTH:ro,MAX_SAFE_INTEGER:Ct}=Le(),{safeRe:Et,t:vt}=me(),Yn=ht(),{compareIdentifiers:Qt}=Kt(),Zt=class s{static{c(this,"SemVer")}constructor(e,t){if(t=Yn(t),e instanceof s){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>ro)throw new TypeError(`version is longer than ${ro} characters`);ft("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let r=e.trim().match(t.loose?Et[vt.LOOSE]:Et[vt.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>Ct||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Ct||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Ct||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(o=>{if(/^[0-9]+$/.test(o)){let n=+o;if(n>=0&&n<Ct)return n}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(ft("SemVer.compare",this.version,this.options,e),!(e instanceof s)){if(typeof e=="string"&&e===this.version)return 0;e=new s(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof s||(e=new s(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 s||(e=new s(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(ft("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 Qt(r,o)}while(++t)}compareBuild(e){e instanceof s||(e=new s(e,this.options));let t=0;do{let r=this.build[t],o=e.build[t];if(ft("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 Qt(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?Et[vt.PRERELEASELOOSE]:Et[vt.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 n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(t===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(o)}}if(t){let n=[t,o];r===!1&&(n=[t]),Qt(this.prerelease[0],t)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};oo.exports=Zt});var ne=E((Hd,no)=>{"use strict";var so=N(),Jn=c((s,e,t=!1)=>{if(s instanceof so)return s;try{return new so(s,e)}catch(r){if(!t)return null;throw r}},"parse");no.exports=Jn});var ao=E((Vd,io)=>{"use strict";var Kn=ne(),Qn=c((s,e)=>{let t=Kn(s,e);return t?t.version:null},"valid");io.exports=Qn});var lo=E((zd,co)=>{"use strict";var Zn=ne(),ei=c((s,e)=>{let t=Zn(s.trim().replace(/^[=v]+/,""),e);return t?t.version:null},"clean");co.exports=ei});var po=E((qd,uo)=>{"use strict";var go=N(),ti=c((s,e,t,r,o)=>{typeof t=="string"&&(o=r,r=t,t=void 0);try{return new go(s instanceof go?s.version:s,t).inc(e,r,o).version}catch{return null}},"inc");uo.exports=ti});var fo=E((Bd,ho)=>{"use strict";var mo=ne(),ri=c((s,e)=>{let t=mo(s,null,!0),r=mo(e,null,!0),o=t.compare(r);if(o===0)return null;let n=o>0,i=n?t:r,a=n?r:t,l=!!i.prerelease.length;if(!!a.prerelease.length&&!l){if(!a.patch&&!a.minor)return"major";if(a.compareMain(i)===0)return a.minor&&!a.patch?"minor":"patch"}let u=l?"pre":"";return t.major!==r.major?u+"major":t.minor!==r.minor?u+"minor":t.patch!==r.patch?u+"patch":"prerelease"},"diff");ho.exports=ri});var Eo=E((Xd,Co)=>{"use strict";var oi=N(),si=c((s,e)=>new oi(s,e).major,"major");Co.exports=si});var To=E((Jd,vo)=>{"use strict";var ni=N(),ii=c((s,e)=>new ni(s,e).minor,"minor");vo.exports=ii});var Ro=E((Qd,So)=>{"use strict";var ai=N(),ci=c((s,e)=>new ai(s,e).patch,"patch");So.exports=ci});var Po=E((ep,Mo)=>{"use strict";var li=ne(),gi=c((s,e)=>{let t=li(s,e);return t&&t.prerelease.length?t.prerelease:null},"prerelease");Mo.exports=gi});var k=E((rp,Io)=>{"use strict";var yo=N(),ui=c((s,e,t)=>new yo(s,t).compare(new yo(e,t)),"compare");Io.exports=ui});var No=E((sp,Ao)=>{"use strict";var di=k(),pi=c((s,e,t)=>di(e,s,t),"rcompare");Ao.exports=pi});var _o=E((ip,Oo)=>{"use strict";var mi=k(),hi=c((s,e)=>mi(s,e,!0),"compareLoose");Oo.exports=hi});var Tt=E((cp,bo)=>{"use strict";var wo=N(),fi=c((s,e,t)=>{let r=new wo(s,t),o=new wo(e,t);return r.compare(o)||r.compareBuild(o)},"compareBuild");bo.exports=fi});var xo=E((gp,Lo)=>{"use strict";var Ci=Tt(),Ei=c((s,e)=>s.sort((t,r)=>Ci(t,r,e)),"sort");Lo.exports=Ei});var $o=E((dp,Do)=>{"use strict";var vi=Tt(),Ti=c((s,e)=>s.sort((t,r)=>vi(r,t,e)),"rsort");Do.exports=Ti});var De=E((mp,ko)=>{"use strict";var Si=k(),Ri=c((s,e,t)=>Si(s,e,t)>0,"gt");ko.exports=Ri});var St=E((fp,Ho)=>{"use strict";var Mi=k(),Pi=c((s,e,t)=>Mi(s,e,t)<0,"lt");Ho.exports=Pi});var er=E((Ep,Fo)=>{"use strict";var yi=k(),Ii=c((s,e,t)=>yi(s,e,t)===0,"eq");Fo.exports=Ii});var tr=E((Tp,Vo)=>{"use strict";var Ai=k(),Ni=c((s,e,t)=>Ai(s,e,t)!==0,"neq");Vo.exports=Ni});var Rt=E((Rp,Uo)=>{"use strict";var Oi=k(),_i=c((s,e,t)=>Oi(s,e,t)>=0,"gte");Uo.exports=_i});var Mt=E((Pp,zo)=>{"use strict";var wi=k(),bi=c((s,e,t)=>wi(s,e,t)<=0,"lte");zo.exports=bi});var rr=E((Ip,jo)=>{"use strict";var Li=er(),xi=tr(),Di=De(),$i=Rt(),ki=St(),Hi=Mt(),Fi=c((s,e,t,r)=>{switch(e){case"===":return typeof s=="object"&&(s=s.version),typeof t=="object"&&(t=t.version),s===t;case"!==":return typeof s=="object"&&(s=s.version),typeof t=="object"&&(t=t.version),s!==t;case"":case"=":case"==":return Li(s,t,r);case"!=":return xi(s,t,r);case">":return Di(s,t,r);case">=":return $i(s,t,r);case"<":return ki(s,t,r);case"<=":return Hi(s,t,r);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");jo.exports=Fi});var Go=E((Np,qo)=>{"use strict";var Vi=N(),Ui=ne(),{safeRe:Pt,t:yt}=me(),zi=c((s,e)=>{if(s instanceof Vi)return s;if(typeof s=="number"&&(s=String(s)),typeof s!="string")return null;e=e||{};let t=null;if(!e.rtl)t=s.match(e.includePrerelease?Pt[yt.COERCEFULL]:Pt[yt.COERCE]);else{let l=e.includePrerelease?Pt[yt.COERCERTLFULL]:Pt[yt.COERCERTL],g;for(;(g=l.exec(s))&&(!t||t.index+t[0].length!==s.length);)(!t||g.index+g[0].length!==t.index+t[0].length)&&(t=g),l.lastIndex=g.index+g[1].length+g[2].length;l.lastIndex=-1}if(t===null)return null;let r=t[2],o=t[3]||"0",n=t[4]||"0",i=e.includePrerelease&&t[5]?`-${t[5]}`:"",a=e.includePrerelease&&t[6]?`+${t[6]}`:"";return Ui(`${r}.${o}.${n}${i}${a}`,e)},"coerce");qo.exports=zi});var Wo=E((_p,Bo)=>{"use strict";var or=class{static{c(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}};Bo.exports=or});var H=E((bp,Ko)=>{"use strict";var ji=/\s+/g,sr=class s{static{c(this,"Range")}constructor(e,t){if(t=Gi(t),e instanceof s)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new s(e.raw,t);if(e instanceof nr)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(ji," "),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=>!Yo(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&&Qi(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&&Ji)|(this.options.loose&&Ki))+":"+e,o=Xo.get(r);if(o)return o;let n=this.options.loose,i=n?w[O.HYPHENRANGELOOSE]:w[O.HYPHENRANGE];e=e.replace(i,ca(this.options.includePrerelease)),M("hyphen replace",e),e=e.replace(w[O.COMPARATORTRIM],Wi),M("comparator trim",e),e=e.replace(w[O.TILDETRIM],Xi),M("tilde trim",e),e=e.replace(w[O.CARETTRIM],Yi),M("caret trim",e);let a=e.split(" ").map(d=>Zi(d,this.options)).join(" ").split(/\s+/).map(d=>aa(d,this.options));n&&(a=a.filter(d=>(M("loose invalid filter",d,this.options),!!d.match(w[O.COMPARATORLOOSE])))),M("range list",a);let l=new Map,g=a.map(d=>new nr(d,this.options));for(let d of g){if(Yo(d))return[d];l.set(d.value,d)}l.size>1&&l.has("")&&l.delete("");let u=[...l.values()];return Xo.set(r,u),u}intersects(e,t){if(!(e instanceof s))throw new TypeError("a Range is required");return this.set.some(r=>Jo(r,t)&&e.set.some(o=>Jo(o,t)&&r.every(n=>o.every(i=>n.intersects(i,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Bi(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(la(this.set[t],e,this.options))return!0;return!1}};Ko.exports=sr;var qi=Wo(),Xo=new qi,Gi=ht(),nr=$e(),M=xe(),Bi=N(),{safeRe:w,t:O,comparatorTrimReplace:Wi,tildeTrimReplace:Xi,caretTrimReplace:Yi}=me(),{FLAG_INCLUDE_PRERELEASE:Ji,FLAG_LOOSE:Ki}=Le(),Yo=c(s=>s.value==="<0.0.0-0","isNullSet"),Qi=c(s=>s.value==="","isAny"),Jo=c((s,e)=>{let t=!0,r=s.slice(),o=r.pop();for(;t&&r.length;)t=r.every(n=>o.intersects(n,e)),o=r.pop();return t},"isSatisfiable"),Zi=c((s,e)=>(s=s.replace(w[O.BUILD],""),M("comp",s,e),s=ra(s,e),M("caret",s),s=ea(s,e),M("tildes",s),s=sa(s,e),M("xrange",s),s=ia(s,e),M("stars",s),s),"parseComparator"),b=c(s=>!s||s.toLowerCase()==="x"||s==="*","isX"),ea=c((s,e)=>s.trim().split(/\s+/).map(t=>ta(t,e)).join(" "),"replaceTildes"),ta=c((s,e)=>{let t=e.loose?w[O.TILDELOOSE]:w[O.TILDE];return s.replace(t,(r,o,n,i,a)=>{M("tilde",s,r,o,n,i,a);let l;return b(o)?l="":b(n)?l=`>=${o}.0.0 <${+o+1}.0.0-0`:b(i)?l=`>=${o}.${n}.0 <${o}.${+n+1}.0-0`:a?(M("replaceTilde pr",a),l=`>=${o}.${n}.${i}-${a} <${o}.${+n+1}.0-0`):l=`>=${o}.${n}.${i} <${o}.${+n+1}.0-0`,M("tilde return",l),l})},"replaceTilde"),ra=c((s,e)=>s.trim().split(/\s+/).map(t=>oa(t,e)).join(" "),"replaceCarets"),oa=c((s,e)=>{M("caret",s,e);let t=e.loose?w[O.CARETLOOSE]:w[O.CARET],r=e.includePrerelease?"-0":"";return s.replace(t,(o,n,i,a,l)=>{M("caret",s,o,n,i,a,l);let g;return b(n)?g="":b(i)?g=`>=${n}.0.0${r} <${+n+1}.0.0-0`:b(a)?n==="0"?g=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:l?(M("replaceCaret pr",l),n==="0"?i==="0"?g=`>=${n}.${i}.${a}-${l} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}-${l} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a}-${l} <${+n+1}.0.0-0`):(M("no pr"),n==="0"?i==="0"?g=`>=${n}.${i}.${a}${r} <${n}.${i}.${+a+1}-0`:g=`>=${n}.${i}.${a}${r} <${n}.${+i+1}.0-0`:g=`>=${n}.${i}.${a} <${+n+1}.0.0-0`),M("caret return",g),g})},"replaceCaret"),sa=c((s,e)=>(M("replaceXRanges",s,e),s.split(/\s+/).map(t=>na(t,e)).join(" ")),"replaceXRanges"),na=c((s,e)=>{s=s.trim();let t=e.loose?w[O.XRANGELOOSE]:w[O.XRANGE];return s.replace(t,(r,o,n,i,a,l)=>{M("xRange",s,r,o,n,i,a,l);let g=b(n),u=g||b(i),d=u||b(a),C=d;return o==="="&&C&&(o=""),l=e.includePrerelease?"-0":"",g?o===">"||o==="<"?r="<0.0.0-0":r="*":o&&C?(u&&(i=0),a=0,o===">"?(o=">=",u?(n=+n+1,i=0,a=0):(i=+i+1,a=0)):o==="<="&&(o="<",u?n=+n+1:i=+i+1),o==="<"&&(l="-0"),r=`${o+n}.${i}.${a}${l}`):u?r=`>=${n}.0.0${l} <${+n+1}.0.0-0`:d&&(r=`>=${n}.${i}.0${l} <${n}.${+i+1}.0-0`),M("xRange return",r),r})},"replaceXRange"),ia=c((s,e)=>(M("replaceStars",s,e),s.trim().replace(w[O.STAR],"")),"replaceStars"),aa=c((s,e)=>(M("replaceGTE0",s,e),s.trim().replace(w[e.includePrerelease?O.GTE0PRE:O.GTE0],"")),"replaceGTE0"),ca=c(s=>(e,t,r,o,n,i,a,l,g,u,d,C)=>(b(r)?t="":b(o)?t=`>=${r}.0.0${s?"-0":""}`:b(n)?t=`>=${r}.${o}.0${s?"-0":""}`:i?t=`>=${t}`:t=`>=${t}${s?"-0":""}`,b(g)?l="":b(u)?l=`<${+g+1}.0.0-0`:b(d)?l=`<${g}.${+u+1}.0-0`:C?l=`<=${g}.${u}.${d}-${C}`:s?l=`<${g}.${u}.${+d+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),"hyphenReplace"),la=c((s,e,t)=>{for(let r=0;r<s.length;r++)if(!s[r].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let r=0;r<s.length;r++)if(M(s[r].semver),s[r].semver!==nr.ANY&&s[r].semver.prerelease.length>0){let o=s[r].semver;if(o.major===e.major&&o.minor===e.minor&&o.patch===e.patch)return!0}return!1}return!0},"testSet")});var $e=E((xp,os)=>{"use strict";var ke=Symbol("SemVer ANY"),cr=class s{static{c(this,"Comparator")}static get ANY(){return ke}constructor(e,t){if(t=Qo(t),e instanceof s){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),ar("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ke?this.value="":this.value=this.operator+this.semver.version,ar("comp",this)}parse(e){let t=this.options.loose?Zo[es.COMPARATORLOOSE]:Zo[es.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 ts(r[2],this.options.loose):this.semver=ke}toString(){return this.value}test(e){if(ar("Comparator.test",e,this.options.loose),this.semver===ke||e===ke)return!0;if(typeof e=="string")try{e=new ts(e,this.options)}catch{return!1}return ir(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof s))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new rs(e.value,t).test(this.value):e.operator===""?e.value===""?!0:new rs(this.value,t).test(e.semver):(t=Qo(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("=")||ir(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||ir(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};os.exports=cr;var Qo=ht(),{safeRe:Zo,t:es}=me(),ir=rr(),ar=xe(),ts=N(),rs=H()});var He=E(($p,ss)=>{"use strict";var ga=H(),ua=c((s,e,t)=>{try{e=new ga(e,t)}catch{return!1}return e.test(s)},"satisfies");ss.exports=ua});var is=E((Hp,ns)=>{"use strict";var da=H(),pa=c((s,e)=>new da(s,e).set.map(t=>t.map(r=>r.value).join(" ").trim().split(" ")),"toComparators");ns.exports=pa});var cs=E((Vp,as)=>{"use strict";var ma=N(),ha=H(),fa=c((s,e,t)=>{let r=null,o=null,n=null;try{n=new ha(e,t)}catch{return null}return s.forEach(i=>{n.test(i)&&(!r||o.compare(i)===-1)&&(r=i,o=new ma(r,t))}),r},"maxSatisfying");as.exports=fa});var gs=E((zp,ls)=>{"use strict";var Ca=N(),Ea=H(),va=c((s,e,t)=>{let r=null,o=null,n=null;try{n=new Ea(e,t)}catch{return null}return s.forEach(i=>{n.test(i)&&(!r||o.compare(i)===1)&&(r=i,o=new Ca(r,t))}),r},"minSatisfying");ls.exports=va});var ps=E((qp,ds)=>{"use strict";var lr=N(),Ta=H(),us=De(),Sa=c((s,e)=>{s=new Ta(s,e);let t=new lr("0.0.0");if(s.test(t)||(t=new lr("0.0.0-0"),s.test(t)))return t;t=null;for(let r=0;r<s.set.length;++r){let o=s.set[r],n=null;o.forEach(i=>{let a=new lr(i.semver.version);switch(i.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!n||us(a,n))&&(n=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${i.operator}`)}}),n&&(!t||us(t,n))&&(t=n)}return t&&s.test(t)?t:null},"minVersion");ds.exports=Sa});var hs=E((Bp,ms)=>{"use strict";var Ra=H(),Ma=c((s,e)=>{try{return new Ra(s,e).range||"*"}catch{return null}},"validRange");ms.exports=Ma});var It=E((Xp,vs)=>{"use strict";var Pa=N(),Es=$e(),{ANY:ya}=Es,Ia=H(),Aa=He(),fs=De(),Cs=St(),Na=Mt(),Oa=Rt(),_a=c((s,e,t,r)=>{s=new Pa(s,r),e=new Ia(e,r);let o,n,i,a,l;switch(t){case">":o=fs,n=Na,i=Cs,a=">",l=">=";break;case"<":o=Cs,n=Oa,i=fs,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Aa(s,e,r))return!1;for(let g=0;g<e.set.length;++g){let u=e.set[g],d=null,C=null;if(u.forEach(f=>{f.semver===ya&&(f=new Es(">=0.0.0")),d=d||f,C=C||f,o(f.semver,d.semver,r)?d=f:i(f.semver,C.semver,r)&&(C=f)}),d.operator===a||d.operator===l||(!C.operator||C.operator===a)&&n(s,C.semver))return!1;if(C.operator===l&&i(s,C.semver))return!1}return!0},"outside");vs.exports=_a});var Ss=E((Jp,Ts)=>{"use strict";var wa=It(),ba=c((s,e,t)=>wa(s,e,">",t),"gtr");Ts.exports=ba});var Ms=E((Qp,Rs)=>{"use strict";var La=It(),xa=c((s,e,t)=>La(s,e,"<",t),"ltr");Rs.exports=xa});var Is=E((em,ys)=>{"use strict";var Ps=H(),Da=c((s,e,t)=>(s=new Ps(s,t),e=new Ps(e,t),s.intersects(e,t)),"intersects");ys.exports=Da});var Ns=E((rm,As)=>{"use strict";var $a=He(),ka=k();As.exports=(s,e,t)=>{let r=[],o=null,n=null,i=s.sort((u,d)=>ka(u,d,t));for(let u of i)$a(u,e,t)?(n=u,o||(o=u)):(n&&r.push([o,n]),n=null,o=null);o&&r.push([o,null]);let a=[];for(let[u,d]of r)u===d?a.push(u):!d&&u===i[0]?a.push("*"):d?u===i[0]?a.push(`<=${d}`):a.push(`${u} - ${d}`):a.push(`>=${u}`);let l=a.join(" || "),g=typeof e.raw=="string"?e.raw:String(e);return l.length<g.length?l:e}});var xs=E((om,Ls)=>{"use strict";var Os=H(),ur=$e(),{ANY:gr}=ur,Fe=He(),dr=k(),Ha=c((s,e,t={})=>{if(s===e)return!0;s=new Os(s,t),e=new Os(e,t);let r=!1;e:for(let o of s.set){for(let n of e.set){let i=Va(o,n,t);if(r=r||i!==null,i)continue e}if(r)return!1}return!0},"subset"),Fa=[new ur(">=0.0.0-0")],_s=[new ur(">=0.0.0")],Va=c((s,e,t)=>{if(s===e)return!0;if(s.length===1&&s[0].semver===gr){if(e.length===1&&e[0].semver===gr)return!0;t.includePrerelease?s=Fa:s=_s}if(e.length===1&&e[0].semver===gr){if(t.includePrerelease)return!0;e=_s}let r=new Set,o,n;for(let f of s)f.operator===">"||f.operator===">="?o=ws(o,f,t):f.operator==="<"||f.operator==="<="?n=bs(n,f,t):r.add(f.semver);if(r.size>1)return null;let i;if(o&&n){if(i=dr(o.semver,n.semver,t),i>0)return null;if(i===0&&(o.operator!==">="||n.operator!=="<="))return null}for(let f of r){if(o&&!Fe(f,String(o),t)||n&&!Fe(f,String(n),t))return null;for(let L of e)if(!Fe(f,String(L),t))return!1;return!0}let a,l,g,u,d=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1,C=o&&!t.includePrerelease&&o.semver.prerelease.length?o.semver:!1;d&&d.prerelease.length===1&&n.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let f of e){if(u=u||f.operator===">"||f.operator===">=",g=g||f.operator==="<"||f.operator==="<=",o){if(C&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===C.major&&f.semver.minor===C.minor&&f.semver.patch===C.patch&&(C=!1),f.operator===">"||f.operator===">="){if(a=ws(o,f,t),a===f&&a!==o)return!1}else if(o.operator===">="&&!Fe(o.semver,String(f),t))return!1}if(n){if(d&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===d.major&&f.semver.minor===d.minor&&f.semver.patch===d.patch&&(d=!1),f.operator==="<"||f.operator==="<="){if(l=bs(n,f,t),l===f&&l!==n)return!1}else if(n.operator==="<="&&!Fe(n.semver,String(f),t))return!1}if(!f.operator&&(n||o)&&i!==0)return!1}return!(o&&g&&!n&&i!==0||n&&u&&!o&&i!==0||C||d)},"simpleSubset"),ws=c((s,e,t)=>{if(!s)return e;let r=dr(s.semver,e.semver,t);return r>0?s:r<0||e.operator===">"&&s.operator===">="?e:s},"higherGT"),bs=c((s,e,t)=>{if(!s)return e;let r=dr(s.semver,e.semver,t);return r<0?s:r>0||e.operator==="<"&&s.operator==="<="?e:s},"lowerLT");Ls.exports=Ha});var Hs=E((nm,ks)=>{"use strict";var pr=me(),Ds=Le(),Ua=N(),$s=Kt(),za=ne(),ja=ao(),qa=lo(),Ga=po(),Ba=fo(),Wa=Eo(),Xa=To(),Ya=Ro(),Ja=Po(),Ka=k(),Qa=No(),Za=_o(),ec=Tt(),tc=xo(),rc=$o(),oc=De(),sc=St(),nc=er(),ic=tr(),ac=Rt(),cc=Mt(),lc=rr(),gc=Go(),uc=$e(),dc=H(),pc=He(),mc=is(),hc=cs(),fc=gs(),Cc=ps(),Ec=hs(),vc=It(),Tc=Ss(),Sc=Ms(),Rc=Is(),Mc=Ns(),Pc=xs();ks.exports={parse:za,valid:ja,clean:qa,inc:Ga,diff:Ba,major:Wa,minor:Xa,patch:Ya,prerelease:Ja,compare:Ka,rcompare:Qa,compareLoose:Za,compareBuild:ec,sort:tc,rsort:rc,gt:oc,lt:sc,eq:nc,neq:ic,gte:ac,lte:cc,cmp:lc,coerce:gc,Comparator:uc,Range:dc,satisfies:pc,toComparators:mc,maxSatisfying:hc,minSatisfying:fc,minVersion:Cc,validRange:Ec,outside:vc,gtr:Tc,ltr:Sc,intersects:Rc,simplifyRange:Mc,subset:Pc,SemVer:Ua,re:pr.re,src:pr.src,tokens:pr.t,SEMVER_SPEC_VERSION:Ds.SEMVER_SPEC_VERSION,RELEASE_TYPES:Ds.RELEASE_TYPES,compareIdentifiers:$s.compareIdentifiers,rcompareIdentifiers:$s.rcompareIdentifiers}});import{createServer as Hc}from"http";import*as _ from"fs";import*as D from"path";import Ee from"chalk";import ae from"pino";import{z as Zs}from"zod";var en=Zs.enum(["fatal","error","warn","info","debug","trace"]);function tn(s){let e=s.getFullYear(),t=String(s.getMonth()+1).padStart(2,"0"),r=String(s.getDate()).padStart(2,"0"),o=String(s.getHours()).padStart(2,"0"),n=String(s.getMinutes()).padStart(2,"0"),i=String(s.getSeconds()).padStart(2,"0");return`${e}-${t}-${r} ${o}:${n}:${i}`}c(tn,"formatDateTime");var kt=class{static{c(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=en.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:ae.destination({dest:this.logFilePath,sync:!1,append:!0,mkdir:!0})}),e.length===0&&e.push({level:this.logLevel,stream:ae.destination({dest:"/dev/null"})}),ae({level:this.logLevel,timestamp:ae.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((t,r)=>({level:r}),"level")},base:null,serializers:{err:ae.stdSerializers?.err||(t=>t)}},ae.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:c(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=tn(new Date),o=t.get(e.level)||{name:"UNKNOWN",color:c(a=>a,"color")},n=o.color(`[${o.name}]`),i=e.msg;if(e.args&&Array.isArray(e.args)){let a=e.args.map(l=>typeof l=="object"?JSON.stringify(l):String(l)).join(" ");i=`${i} ${a}`}return`[${r}] ${n} ${i}`}initLogFile(e){this.logFilePath=D.join(e,"xiaozhi.log"),this.rotateLogFileIfNeeded(),_.existsSync(this.logFilePath)||_.writeFileSync(this.logFilePath,""),this.pinoInstance=this.createPinoInstance()}enableFileLogging(e){e&&this.logFilePath&&(this.pinoInstance=this.createPinoInstance())}info(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}success(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}warn(e,...t){typeof e=="string"?t.length===0?this.pinoInstance.warn(e):this.pinoInstance.warn({args:t},e):this.pinoInstance.warn(e,t[0]||"")}error(e,...t){if(typeof e=="string")if(t.length===0)this.pinoInstance.error(e);else{let r=t.map(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){typeof e=="string"?t.length===0?this.pinoInstance.info(e):this.pinoInstance.info({args:t},e):this.pinoInstance.info(e,t[0]||"")}enhanceErrorObject(e){let t={...e};for(let[r,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||!_.existsSync(this.logFilePath)))try{_.statSync(this.logFilePath).size>this.maxLogFileSize&&this.rotateLogFile()}catch{}}rotateLogFile(){if(this.logFilePath)try{let e=D.dirname(this.logFilePath),t=D.basename(this.logFilePath,".log");for(let o=this.maxLogFiles-1;o>=1;o--){let n=D.join(e,`${t}.${o}.log`),i=D.join(e,`${t}.${o+1}.log`);_.existsSync(n)&&(o===this.maxLogFiles-1?_.unlinkSync(n):_.renameSync(n,i))}let r=D.join(e,`${t}.1.log`);_.renameSync(this.logFilePath,r)}catch{}}cleanupOldLogs(){if(this.logFilePath)try{let e=D.dirname(this.logFilePath),t=D.basename(this.logFilePath,".log");for(let r=this.maxLogFiles+1;r<=this.maxLogFiles+10;r++){let o=D.join(e,`${t}.${r}.log`);_.existsSync(o)&&_.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}},$t=null,rn="info";function on(){return $t||($t=new kt(rn)),$t}c(on,"getLogger");var T=on();import{configManager as $}from"@xiaozhi-client/config";var A=class{static{c(this,"BaseHandler")}handleError(e,t,r,o="OPERATION_FAILED",n="\u64CD\u4F5C\u5931\u8D25",i=500){let a=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,a||n,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 Xe=class extends A{static{c(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=$.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($.validateConfig(t),$.updateConfig(t),t.mcpServerConfig)for(let[r,o]of Object.entries(t.mcpServerConfig))for(let[n,i]of Object.entries(o.tools))$.setToolEnabled(r,n,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=$.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=$.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=$.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=$.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"),$.reloadConfig();let t=$.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=$.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=$.configExists();return e.get("logger").debug(`\u914D\u7F6E\u5B58\u5728\u68C0\u67E5\u7ED3\u679C: ${t}`),e.success({exists:t})}catch(t){return e.get("logger").error("\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25:",t),e.fail("CONFIG_EXISTS_CHECK_ERROR",t instanceof Error?t.message:"\u68C0\u67E5\u914D\u7F6E\u662F\u5426\u5B58\u5728\u5931\u8D25",void 0,500)}}};var F={};Ks(F,{CozeApiService:()=>W,config:()=>ve,createCozeClient:()=>Ye});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(F,ul);import*as ul from"@coze/api";function Ye(s,e="zh"){if(!s||typeof s!="string"||s.trim()==="")throw new Error("\u6263\u5B50 API Token \u4E0D\u80FD\u4E3A\u7A7A");let t=ve[e]||ve.zh;return new F.CozeAPI({baseURL:t.COZE_BASE_URL,token:s.trim(),baseWsURL:t.COZE_BASE_WS_URL,debug:!1})}c(Ye,"createCozeClient");import sn from"node-cache";var W=class{static{c(this,"CozeApiService")}cache;token;client;constructor(e){this.token=e.trim(),this.client=Ye(this.token),this.cache=new sn({stdTTL:300})}async getWorkspaces(){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}async getWorkflows(e){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 n=`workflows:${t}:${r}:${o}`,i=this.cache.get(n);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(n,l),l}callWorkflow(e,t){return this.client.workflows.runs.create({workflow_id:e,parameters:t})}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 le}from"@xiaozhi-client/config";function ce(s){if(!(s instanceof Error&&"code"in s))return!1;let e=s.code;return typeof e=="string"&&["AUTH_FAILED","RATE_LIMITED","TIMEOUT","API_ERROR","NETWORK_ERROR"].includes(e)}c(ce,"isErrorWithCode");function Je(){let s=le.getCozeToken();if(!s)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 W(s)}c(Je,"getCozeApiService");var Te=class extends A{static{c(this,"CozeHandler")}constructor(){super()}async getWorkspaces(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u8BF7\u6C42"),!le.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=Je();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){if(e.get("logger").error("\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25:",t),ce(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(ce(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(ce(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);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\u5DE5\u4F5C\u7A7A\u95F4\u5217\u8868\u5931\u8D25",r,500)}}async getWorkflows(e){try{if(e.get("logger").info("\u5904\u7406\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u8BF7\u6C42"),!le.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 n={workspace_id:t,page_num:r,page_size:o},i=Je();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 a=await i.getWorkflows(n);e.get("logger").info(`\u6210\u529F\u83B7\u53D6\u5DE5\u4F5C\u7A7A\u95F4 ${t} \u7684 ${a.items.length} \u4E2A\u5DE5\u4F5C\u6D41`);let l=le.getCustomMCPTools(),g=a.items.map(u=>{let d=l.find(C=>C.handler.type==="proxy"&&C.handler.platform==="coze"&&C.handler.config.workflow_id===u.workflow_id);return{...u,isAddedAsTool:!!d,toolName:d?.name||null}});return e.get("logger").info(`\u5DE5\u4F5C\u6D41\u5DE5\u5177\u72B6\u6001\u68C0\u67E5\u5B8C\u6210\uFF0C\u5171 ${g.filter(u=>u.isAddedAsTool).length} \u4E2A\u5DE5\u4F5C\u6D41\u5DF2\u6DFB\u52A0\u4E3A\u5DE5\u5177`),e.success({items:g,has_more:a.has_more,page_num:r,page_size:o,total_count:a.items.length},`\u6210\u529F\u83B7\u53D6 ${g.length} \u4E2A\u5DE5\u4F5C\u6D41`)}catch(t){if(e.get("logger").error("\u83B7\u53D6\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25:",t),ce(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(ce(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(ce(t)&&t.code==="TIMEOUT")return e.fail("TIMEOUT","\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",void 0,408);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\u5DE5\u4F5C\u6D41\u5217\u8868\u5931\u8D25",r,500)}}async clearCache(e){try{if(e.get("logger").info("\u5904\u7406\u6E05\u9664\u6263\u5B50 API \u7F13\u5B58\u8BF7\u6C42"),!le.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=Je(),o=r.getCacheStats();e.get("logger").info(`\u5F00\u59CB\u6E05\u9664\u7F13\u5B58${t?` (\u6A21\u5F0F: ${t})`:""}`),r.clearCache(t);let n=r.getCacheStats();return e.get("logger").info(`\u7F13\u5B58\u6E05\u9664\u5B8C\u6210\uFF0C\u6E05\u9664\u524D: ${o.size} \u9879\uFF0C\u6E05\u9664\u540E: ${n.size} \u9879`),e.success({cleared:o.size-n.size,remaining:n.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"),!le.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=Je().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 Ht={DEFAULT_LIMIT:50,MAX_LIMIT:200};var y={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"},V={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"content-length",MCP_PROTOCOL_VERSION:"MCP-Protocol-Version",X_RESPONSE_TIME:"X-Response-Time"},X={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},ge={DEFAULT_BIND_ADDRESS:"0.0.0.0",DEFAULT_PORT:9999},oe={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 Y={V2024_11_05:"2024-11-05",V2025_06_18:"2025-06-18",DEFAULT:"2024-11-05"},Se=[Y.V2024_11_05,Y.V2025_06_18],Ft={NAME:"xiaozhi-mcp-server",VERSION:"1.0.0"},J={INITIALIZE:"initialize",INITIALIZED:"notifications/initialized",TOOLS_LIST:"tools/list",TOOLS_CALL:"tools/call",RESOURCES_LIST:"resources/list",PROMPTS_LIST:"prompts/list",PING:"ping"};var Vt={CACHE_VERSION:"1.0.0",CACHE_ENTRY_VERSION:"1.0.0"};var Ke={CONNECTED:"mcp:service:connected",DISCONNECTED:"mcp:service:disconnected",CONNECTION_FAILED:"mcp:service:connection:failed"};var $r={TTL:3e5,CLEANUP_INTERVAL:6e4};var Ut={MONITOR_INTERVAL:1e4,TIMEOUT_THRESHOLD:35e3};var kr={DEFAULT:1024*1024,MAX:10*1024*1024};var zt={FILENAME:"xiaozhi.cache.json",TEMP_SUFFIX:".tmp"},Hr={SERVICE_TOOL_SEPARATOR:"__"};function j(s,e,t,r){try{let o={type:"error",error:{code:e,message:t,timestamp:Date.now()}};s.send(JSON.stringify(o))}catch(o){r.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}c(j,"sendWebSocketError");import{configManager as nn}from"@xiaozhi-client/config";var Qe=class{static{c(this,"HeartbeatHandler")}logger;statusService;notificationService;constructor(e,t){this.logger=T,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),j(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:nn.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>Ut.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()},Ut.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 an}from"events";var jt=class extends an{static{c(this,"EventBus")}logger;eventStats=new Map;maxListeners;constructor(){super(),this.logger=T;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=c(o=>{try{t(o)}catch(n){throw this.emit("error",n),n}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")}},ue=null;function R(){return ue||(ue=new jt),ue}c(R,"getEventBus");function Fr(){ue&&(ue.destroy(),ue=null)}c(Fr,"destroyEventBus");var Re=class{static{c(this,"EndpointHandler")}logger;endpointManager;configManager;eventBus;constructor(e,t){this.logger=T,this.endpointManager=e,this.configManager=t,this.eventBus=R()}async parseEndpointFromBody(e,t){let r;try{r=await e.req.json()}catch(n){return this.logger.error("JSON\u89E3\u6790\u5931\u8D25:",n),{ok:!1,response:e.fail(t,"JSON\u89E3\u6790\u5931\u8D25",n instanceof Error?n.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 n=this.endpointManager.getConnectionStatus().find(i=>i.endpoint===r);return n?(this.logger.debug(`\u83B7\u53D6\u63A5\u5165\u70B9\u72B6\u6001\u6210\u529F: ${r}`),e.success(n)):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(a=>a.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 a={endpoint:r,connected:!1,initialized:!0};return e.success(i||a)}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(u){this.logger.warn(`\u7AEF\u70B9\u8FDE\u63A5\u5931\u8D25\uFF0C\u4F46\u5DF2\u6DFB\u52A0\u5230\u7BA1\u7406\u5668: ${r}`,u)}try{this.configManager.addMcpEndpoint(r),this.logger.debug(`\u7AEF\u70B9\u5DF2\u6DFB\u52A0\u5230\u914D\u7F6E\u6587\u4EF6: ${r}`)}catch(u){this.logger.error(`\u6DFB\u52A0\u7AEF\u70B9\u5230\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${r}`,u);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 this.endpointManager.removeEndpoint(i),u}let l=this.endpointManager.getConnectionStatus().find(u=>u.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 g={endpoint:r,connected:!1,initialized:!0};return e.success(l||g,"\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 n=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 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:n},"\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 pn}from"events";function cn(s){return typeof s=="object"&&s!==null&&"type"in s&&s.type==="object"}c(cn,"isValidToolJSONSchema");function Ze(s){return cn(s)?s:{type:"object",properties:{},required:[],additionalProperties:!0}}c(Ze,"ensureToolJSONSchema");var K=class extends Error{constructor(t,r,o){super(r);this.code=t;this.data=o;this.name="ToolCallError"}static{c(this,"ToolCallError")}};import{isModelScopeURL as mn}from"@xiaozhi-client/config";import{configManager as x}from"@xiaozhi-client/config";import{createHash as ln}from"crypto";function q(s,e){let t=ln("md5").update(JSON.stringify(e||{})).digest("hex");return`${s}_${t}`}c(q,"generateCacheKey");function qt(s,e){let t=new Date(s).getTime();return Date.now()-t>e}c(qt,"isCacheExpired");function Me(s){let e=Date.now(),t=new Date(s.timestamp).getTime();return!!(s.consumed&&e-t>6e4||e-t>s.ttl||s.status==="failed")}c(Me,"shouldCleanupCache");var et={TIMEOUT:8e3,CACHE_TTL:3e5,CLEANUP_INTERVAL:6e4,MAX_CACHE_SIZE:1e3,ENABLE_ONE_TIME_CACHE:!0};var Pe=class s extends Error{static{c(this,"TimeoutError")}name="TimeoutError";constructor(e){super(e),this.name="TimeoutError",Error.captureStackTrace(this,s)}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}};function Vr(s,e){return{content:[{type:"text",text:e?gn(e,s):Ur(s)}],isError:!1,taskId:s,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"}}c(Vr,"createTimeoutResponse");function gn(s,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 Gs=Object.create;var Be=Object.defineProperty;var Bs=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:Ur(e)};return t[s]||t.default}c(ln,"getToolSpecificTimeoutMessage");function Ur(s){return`\u23F1\uFE0F \u5DE5\u5177\u8C03\u7528\u8D85\u65F6\uFF0C\u6B63\u5728\u540E\u53F0\u5904\u7406\u4E2D...
13
+ 3. \u590D\u6742\u5DE5\u4F5C\u6D41\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u5904\u7406`,default:Ur(e)};return t[s]||t.default}c(gn,"getToolSpecificTimeoutMessage");function Ur(s){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: ${s}
@@ -20,11 +20,11 @@ var Gs=Object.create;var Be=Object.defineProperty;var Bs=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`}c(Ur,"getDefaultTimeoutMessage");import{configManager as Vr}from"@xiaozhi-client/config";function gn(s){return s.type==="proxy"}c(gn,"isProxyHandler");var Pe=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=Ze.TIMEOUT;CACHE_TTL=Ze.CACHE_TTL;constructor(e,t){this.logger=v,this.cacheManager=e||new K,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=Vr.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new B(e)}setupEventListeners(){T().onEvent("config:updated",async t=>{if(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)}}})}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||Vr.getCustomMCPTools();this.tools.clear();for(let r of t)gn(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:Qe(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 n=await this.getCompletedResult(e,t);if(n)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),n;try{let i=r?.timeout||this.TIMEOUT,a=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,a),a}catch(i){if(i instanceof Me){let a=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${a}`),Fr(a,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new Me(`\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 n=o.customMCPResults[r];return n.status==="completed"&&!n.consumed&&!jt(n.timestamp,n.ttl)?n.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 n=this.getCozeApiService();if(!o.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let i=await n.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(n){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,n),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`}],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 n=o.customMCPResults[r];Re(n)&&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 j(e,t)}generateCacheKey(e,t){return j(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),n={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(o,n),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.tools.clear(),this.cacheManager.cleanup()}};import*as Q from"fs";import*as oe from"path";import{tmpdir as un}from"os";var ye=class{static{c(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||un()}};import et from"pino";var Ne=class{static{c(this,"ToolCallLogger")}pinoLogger;maxRecords;logFilePath;constructor(e,t){if(this.maxRecords=e?.maxRecords??100,e?.logFilePath)this.logFilePath=oe.resolve(oe.normalize(e.logFilePath));else{let r=t||ye.getTempDir();this.logFilePath=oe.join(oe.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:c(r=>{try{let o=JSON.parse(r),n=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:et.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch{}return et({level:"info",timestamp:et.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((r,o)=>({level:o}),"level")},base:null},et.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(!Q.existsSync(this.logFilePath))return;let t=Q.readFileSync(this.logFilePath,"utf8").trim().split(`
23
+ 3. \u5982\u679C\u957F\u65F6\u95F4\u672A\u5B8C\u6210\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458`}c(Ur,"getDefaultTimeoutMessage");import{configManager as zr}from"@xiaozhi-client/config";function un(s){return s.type==="proxy"}c(un,"isProxyHandler");var ye=class{static{c(this,"CustomMCPHandler")}logger;tools=new Map;cacheManager;mcpServiceManager;TIMEOUT=et.TIMEOUT;CACHE_TTL=et.CACHE_TTL;constructor(e,t){this.logger=T,this.cacheManager=e||new Q,this.mcpServiceManager=t,this.setupEventListeners()}getCozeApiService(){let e=zr.getConfig().platforms?.coze?.token;if(!e)throw new Error("Coze Token \u914D\u7F6E\u4E0D\u5B58\u5728");return new W(e)}setupEventListeners(){R().onEvent("config:updated",async t=>{if(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)}}})}initialize(e){this.logger.debug("[CustomMCP] \u521D\u59CB\u5316 CustomMCP \u5904\u7406\u5668...");try{let t=e||zr.getCustomMCPTools();this.tools.clear();for(let r of t)un(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:Ze(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 n=await this.getCompletedResult(e,t);if(n)return this.logger.debug(`[CustomMCP] \u8FD4\u56DE\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u7ED3\u679C: ${e}`),await this.clearConsumedCache(e,t),n;try{let i=r?.timeout||this.TIMEOUT,a=await Promise.race([this.callCozeWorkflow(o,t),this.createTimeoutPromise(e,i)]);return await this.cacheResult(e,t,a),a}catch(i){if(i instanceof Pe){let a=await this.generateTaskId(e,t);return this.logger.info(`[CustomMCP] \u5DE5\u5177\u8D85\u65F6\uFF0C\u8FD4\u56DE\u53CB\u597D\u63D0\u793A: ${e}, taskId: ${a}`),Vr(a,e)}throw i}}async createTimeoutPromise(e,t){return new Promise((r,o)=>{setTimeout(()=>{o(new Pe(`\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 n=o.customMCPResults[r];return n.status==="completed"&&!n.consumed&&!qt(n.timestamp,n.ttl)?n.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 n=this.getCozeApiService();if(!o.workflow_id)throw new Error("\u5DE5\u4F5C\u6D41ID\u672A\u914D\u7F6E");let i=await n.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(n){return this.logger.error(`[CustomMCP] Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${e.name}`,n),{content:[{type:"text",text:`Coze \u5DE5\u4F5C\u6D41\u8C03\u7528\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`}],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 n=o.customMCPResults[r];Me(n)&&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),n={result:r,timestamp:new Date().toISOString(),ttl:this.CACHE_TTL,status:"completed",consumed:!1,retryCount:0};await this.updateCacheWithResult(o,n),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.tools.clear(),this.cacheManager.cleanup()}};import*as Z from"fs";import*as se from"path";import{tmpdir as dn}from"os";var Ie=class{static{c(this,"PathUtils")}static getConfigDir(){return process.env.XIAOZHI_CONFIG_DIR||process.cwd()}static getTempDir(){return process.env.TMPDIR||process.env.TEMP||dn()}};import tt from"pino";var Ae=class{static{c(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||Ie.getTempDir();this.logFilePath=se.join(se.normalize(r),"tool-calls.jsonl")}this.pinoLogger=this.createPinoLogger(this.logFilePath)}createPinoLogger(e){let t=[];t.push({level:"info",stream:{write:c(r=>{try{let o=JSON.parse(r),n=this.formatConsoleMessage(o)}catch{}},"write")}});try{t.push({level:"info",stream:tt.destination({dest:e,sync:!0,append:!0,mkdir:!0})})}catch{}return tt({level:"info",timestamp:tt.stdTimeFunctions?.isoTime||(()=>`,"time":${Date.now()}`),formatters:{level:c((r,o)=>({level:o}),"level")},base:null},tt.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(!Z.existsSync(this.logFilePath))return;let t=Z.readFileSync(this.logFilePath,"utf8").trim().split(`
24
24
  `).filter(i=>i.trim()!=="");if(t.length<=this.maxRecords)return;let r=t.length-this.maxRecords+1,o=t.slice(r),n=o.join(`
25
25
  `)+(o.length>0?`
26
- `:"");Q.writeFileSync(this.logFilePath,n,"utf8")}catch{}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch{}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},tt=class{static{c(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||ye.getConfigDir()}getLogFilePath(){return new Ne({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!Q.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=Q.readFileSync(e,"utf8").trim().split(`
27
- `).filter(n=>n.trim()!==""),o=[];for(let n of r)try{let i=JSON.parse(n);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp,o.push(i)}catch{}return o.sort((n,i)=>(i.timestamp||0)-(n.timestamp||0)),o}catch{throw 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,n=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let a=i.timestamp||0;return a>=o&&a<=n})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),o=r.length,n=Math.min(e.limit||50,1e3),i=e.offset||0,a=r.slice(i,i+n),l=i+n<o;return{records:a,total:o,hasMore:l}}};var ue=class{static{c(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=v}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 Y.INITIALIZE:return await this.handleInitialize(e.params,e.id);case Y.INITIALIZED:return await this.handleInitializedNotification(e.params);case Y.TOOLS_LIST:return await this.handleToolsList(e.id);case Y.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case Y.RESOURCES_LIST:return await this.handleResourcesList(e.id);case Y.PROMPTS_LIST:return await this.handlePromptsList(e.id);case Y.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:X.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:kt.NAME,version:kt.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=zr(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 Ie=class extends pn{static{c(this,"MCPServiceManager")}services=new Map;configs={};tools=new Map;customMCPHandler;cacheManager;eventBus=T();toolCallLogger;retryTimers=new Map;failedServices=new Set;messageHandler;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 K(r),this.customMCPHandler=new Pe(this.cacheManager,this);let o=L.getToolCallLogConfig(),n=L.getConfigDir();this.toolCallLogger=new Ne(o,n),this.setupEventListeners(),this.messageHandler=new ue(this)}setupEventListeners(){this.eventBus.onEvent("mcp:service:connected",async e=>{await this.handleServiceConnected(e)}),this.eventBus.onEvent("mcp:service:disconnected",async e=>{await this.handleServiceDisconnected(e)}),this.eventBus.onEvent("mcp:service:connection:failed",async e=>{await this.handleServiceConnectionFailed(e)})}async handleServiceConnected(e){try{this.services.get(e.serviceName)&&await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceDisconnected(e){try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch{}}async startAllServices(){try{this.customMCPHandler.initialize()}catch{}let e=Object.entries(this.configs);if(e.length===0)return;let t=e.map(async([a])=>{try{return await this.startService(a),{serviceName:a,success:!0,error:null}}catch(l){return{serviceName:a,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),o=0,n=0,i=[];for(let a of r)a.status==="fulfilled"?a.value.success?o++:(n++,i.push(a.value.serviceName)):n++;i.length>0&&e.length,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 rt(r);await o.connect(),this.services.set(e,o),await this.refreshToolsCache();let n=o.getTools()}catch(r){throw this.services.delete(e),r}}async stopService(e){let t=this.services.get(e);if(t)try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache()}catch(r){throw 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(()=>{}).catch(n=>{});for(let n of r){let i=`${e}__${n.name}`;this.tools.set(i,{serviceName:e,originalName:n.name,tool:n})}}await this.syncToolsConfigToFile()}getAllTools(e="all"){let t=[];for(let[o,n]of this.services)try{if(n.isConnected()){let i=n.getTools();for(let a of i)try{let l=L.isToolEnabled(o,a.name),g=L.getMcpServerConfig()[o].tools[a.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let u=`${o}__${a.name}`;t.push({name:u,description:a.description||"",inputSchema:a.inputSchema,serviceName:o,originalName:a.name,enabled:l,usageCount:g.usageCount??0,lastUsedTime:g.lastUsedTime??""})}catch{}}}catch{}let r=[];try{r=this.customMCPHandler.getTools()}catch{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{}return 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(),n="unknown",i=e;try{let a;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(n=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(a=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(a=await this.customMCPHandler.callTool(e,t,r),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);n=l.serviceName,i=l.originalName;let g=this.services.get(l.serviceName);if(!g)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!g.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);a=await g.callTool(l.originalName,t||{}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:n,arguments:t,result:a,success:a.isError!==!0,duration:Date.now()-o}),a}catch(a){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:n,arguments:t,result:null,success:!1,duration:Date.now()-o,error:a instanceof Error?a.message:String(a)}),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)}else{let l=this.tools.get(e);l&&this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1)}throw a}}async updateToolStats(e,t,r,o){try{let n=new Date().toISOString();o?(await this.updateCustomMCPToolStats(e,n),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,n)):(await this.updateCustomMCPToolLastUsedTime(e,n),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,n))}catch(n){throw n}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch{let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F"}}async updateCustomMCPToolStats(e,t){try{await L.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await L.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await L.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await L.updateMCPServerToolStatsWithLock(e,t,r,!1)}catch(o){throw o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:n}=t,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{return await i.callTool(n,r||{})}catch(a){throw a}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect()}catch{}try{this.customMCPHandler.cleanup()}catch{}try{L.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=L.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch{return{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{this.customMCPHandler.initialize()}catch(e){throw 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{return!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch{return[]}}isModelScopeService(e){return e.url?dn(e.url):!1}handleModelScopeAuth(e,t,r){if(t.headers?.Authorization)return;let n=L.getModelScopeApiKey();if(n){r.apiKey=n;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 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 n=this.enhanceServiceConfig(o,r);this.configs[o]=n}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(e,t);this.configs[e]=r}removeServiceConfig(e){delete this.configs[e]}async syncToolsConfigToFile(){try{let e=L.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let o=r.getTools();if(o.length===0)continue;let n=e[t]?.tools||{},i={};for(let p of o){let f=n[p.name];f?i[p.name]={...f,description:p.description||f.description||""}:i[p.name]={description:p.description||"",enable:!0}}let a=o.map(p=>p.name),g=Object.keys(n).filter(p=>!a.includes(p));if(g.length>0,this.hasToolsConfigChanged(n,i)){L.updateServerToolsConfig(t,i);let p=Object.keys(i).filter(h=>!n[h]),f=Object.keys(i).filter(h=>{let x=n[h],Ge=i[h];return x&&x.description!==Ge.description});p.length>0,f.length>0,g.length>0}}}catch{}}hasToolsConfigChanged(e,t){let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!0;let n=o.filter(a=>!r.includes(a)),i=r.filter(a=>!o.includes(a));if(n.length>0||i.length>0)return!0;for(let a of r){let l=e[a],g=t[a];if(l.description!==g.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;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));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);try{await this.refreshCustomMCPHandlerPublic()}catch{}}catch{let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);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)),this.failedServices.delete(e)}stopAllServiceRetries(){for(let[e,t]of this.retryTimers)clearTimeout(t);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");try{await this.startAllServices(),this.isRunning=!0,this.emit("started")}catch(e){throw e}}async stop(){if(this.isRunning)try{await this.stopAllServices(),this.isRunning=!1,this.emit("stopped")}catch(e){throw 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()}catch{e=0,t=[]}let r=this.tools.size+e,n=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:n};for(let[a,l]of this.services){let g=l.getStatus();i.services[a]={connected:g.connected,clientName:`xiaozhi-${a}-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()}};import{MCPConnection as mn}from"@xiaozhi-client/mcp-core";var rt=class{static{c(this,"MCPService")}connection;eventBus=T();constructor(e){let{name:t,...r}=e,o={onConnected:c(n=>{this.eventBus.emitEvent(Je.CONNECTED,n)},"onConnected"),onDisconnected:c(n=>{this.eventBus.emitEvent(Je.DISCONNECTED,n)},"onDisconnected"),onConnectionFailed:c(n=>{this.eventBus.emitEvent(Je.CONNECTION_FAILED,n)},"onConnectionFailed")};this.connection=new mn(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 Fg}from"@xiaozhi-client/mcp-core";function zr(s,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!s||typeof s!="object")throw new J(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=s;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new J(-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 J(-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 J(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new J(-32602,o)}return{name:r.name,arguments:r.arguments}}c(zr,"validateToolCallParams");import{createHash as fn}from"crypto";import{existsSync as we,mkdirSync as Cn,readFileSync as qr,renameSync as En,writeFileSync as Gr}from"fs";import{dirname as vn,resolve as Br}from"path";import{Hono as hn}from"hono";var jr=c(()=>new hn,"createApp");var ot=c(s=>{let e=s.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 Sn from"dayjs";var K=class{static{c(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=Ft.CACHE_VERSION;CACHE_ENTRY_VERSION=Ft.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=Dr.CLEANUP_INTERVAL;constructor(e){this.logger=v,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Sn().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return Br(e,Vt.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return Br(t,Vt.FILENAME)}}async ensureCacheFile(){try{if(!we(this.cachePath)){let e=vn(this.cachePath);we(e)||(Cn(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(),n=this.generateConfigHash(r),i={tools:t.map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:n,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(!we(this.cachePath))return await this.createInitialCache();let e=qr(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{Gr(r,t,"utf8"),En(r,e)}catch(o){try{we(r)&&Gr(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return fn("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:we(this.cachePath)?qr(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 n of o.tools)t.push({...n,name:`${r}${Hr.SERVICE_TOOL_SEPARATOR}${n.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",n,i=3e5){try{let a=await this.loadExtendedCache(),l=j(e,t),g={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:n,retryCount:0};a.customMCPResults||(a.customMCPResults={}),a.customMCPResults[l]=g,await this.saveExtendedCache(a),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${o}`)}catch(a){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=j(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return null;let n=r.customMCPResults[o],i=Date.now(),a=new Date(n.timestamp).getTime();return i-a>n.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):n}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,n){try{let i=await this.loadExtendedCache(),a=j(e,t);if(!i.customMCPResults||!i.customMCPResults[a])return!1;let l=i.customMCPResults[a],g=l.status;return l.status=r,l.timestamp=new Date().toISOString(),o&&(l.result=o),n&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(i),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${g} -> ${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=j(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return!1;let n=r.customMCPResults[o];return n.consumed||(n.consumed=!0,n.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=j(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,n]of t)Re(n)&&(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(u=>u.status==="pending").length,n=t.filter(u=>u.status==="completed").length,i=t.filter(u=>u.status==="failed").length,a=t.filter(u=>u.consumed).length,l=n>0?a/n*100:0,g=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:n,failedTasks:i,consumedEntries:a,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:g}}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 st=class{static{c(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=v,this.config={maxMessageSize:e.maxMessageSize??$r.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 ue(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,`${re.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(U.CONTENT_TYPE)?.includes(y.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${re.INVALID_REQUEST}: ${re.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 a;try{let u=await e.req.text();if(u.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);a=JSON.parse(u),r=a.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,re.PARSE_ERROR)}if(!this.validateMessage(a))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${re.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(a);this.metrics.totalMessages++;let g=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+g)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:a.method,messageId:r,responseTime:g,isNotification:l===null}),l===null?new Response(null,{status:W.NO_CONTENT,headers:{[U.MCP_PROTOCOL_VERSION]:X.DEFAULT,[U.X_RESPONSE_TIME]:g.toString()}}):e.json(l,W.OK,{[U.CONTENT_TYPE]:y.APPLICATION_JSON,[U.MCP_PROTOCOL_VERSION]:X.DEFAULT,[U.X_RESPONSE_TIME]:g.toString()})}catch(o){this.metrics.errorCount++;let n=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:n,stack:o instanceof Error?o.stack:void 0});let i=o instanceof Error?o.message:String(o);return this.createErrorResponse(-32603,`${re.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()}`,n={jsonrpc:"2.0",error:{code:e,message:t},id:o};return new Response(JSON.stringify(n),{status:W.BAD_REQUEST,headers:{[U.CONTENT_TYPE]:y.APPLICATION_JSON,[U.MCP_PROTOCOL_VERSION]:X.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 s extends Error{static{c(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",o="system",n={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=o,this.timestamp=new Date().toISOString(),this.details={...n,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,s)}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 s(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new s(e,t,"high","connection",r)}static operationError(e,t,r={}){return new s(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new s(e,t,"high","system",r)}static validationError(e,t,r={}){return new s(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new s(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},nt=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof M)}handle(e,t){return M.fromError(e,"INTERNAL_ERROR","system")}},qt=class{static{c(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})}},Gt=class{static{c(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})}},Bt=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new qt),this.registerHandler(new Gt),this.registerHandler(new nt)}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 nt().handle(e,t)}},Pu=new Bt;import{normalizeServiceConfig as Tn}from"@xiaozhi-client/config";import{TypeFieldNormalizer as Wt}from"@xiaozhi-client/mcp-core";var Ae=class{static{c(this,"MCPHandler")}logger;mcpServiceManager;configManager;constructor(e,t){this.logger=v,this.mcpServiceManager=e,this.configManager=t}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 n;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?n=M.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?n=M.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?n=M.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?n=M.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):n=M.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:n,operation:t,context:r}),n}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 g=r,u=await this.addMCPServersBatch(g),p=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:u.addedCount,failedCount:u.failedCount,duration:p}),e.success(u,u.message,201)}let o=r,{name:n,config:i}=o,a=await this.addMCPServerSingle(n,i),l=Date.now()-t;return this.logger.info("addMCPServer",{serverName:n,toolsCount:a.tools?.length||0,duration:l,status:a.status}),e.success(a,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F",201)}catch(o){let n=this.handleError(o,"addMCPServer",{requestData:r}),i=500;return n.category==="validation"?i=400:n.category==="configuration"?n.code==="SERVER_ALREADY_EXISTS"?i=409:i=400:n.category==="connection"&&(i=500),e.fail(n.code,n.message,{error:n.details},i)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=Wt.normalizeTypeField(t);try{let o=z.validateServiceName(e);if(!o.isValid){let g=M.validationError("INVALID_SERVICE_NAME",o.errors.join(", "),{serverName:e,errors:o.errors});throw this.logger.error("addMCPServerSingle",{validationError:g,serverName:e,phase:"name_validation"}),g}if(z.checkServiceExists(e,this.configManager)){let g=M.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:g,serverName:e,phase:"existence_check"}),g}let n=z.validateConfig(r);if(!n.isValid){let g=M.configError("INVALID_CONFIG",n.errors.join(", "),{serverName:e,config:r,errors:n.errors});throw this.logger.error("addMCPServerSingle",{configError:g,serverName:e,phase:"config_validation"}),g}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=Tn(r);this.mcpServiceManager.addServiceConfig(e,i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let a=this.getServiceStatus(e),l=this.getServiceTools(e);return T().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(g=>g.name),timestamp:new Date}),{...a,tools:l.map(g=>g.name)}}catch(o){let n=this.handleError(o,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:n,serverName:e}),n}}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 a=i.getTools().map(g=>g.name),l={name:e,status:"connected",connected:!0,tools:a,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(n){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,n)}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}`),T().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)),n=r.tools.filter(i=>!t.tools.includes(i));(o.length>0||n.length>0)&&T().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:o,removedTools:n,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){let t=this;return t.statusCache||(t.statusCache=new Map),t.statusCache.get(e)||null}updateStatusCache(e,t){let r=this;r.statusCache||(r.statusCache=new Map),r.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName"),r=z.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!z.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(n=>n.name);try{await this.mcpServiceManager.stopService(t)}catch(n){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,n)}return this.mcpServiceManager.removeServiceConfig(t),this.configManager.removeMcpServer(t),T().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"),r=z.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!z.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,a]of Object.entries(r)){let l=this.getServiceStatus(i);o.push(l)}let n={servers:o,total:o.length};return e.success(n,"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=[],n=[],i=this.validateBatchServers(t);if(!i.isValid)throw M.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,p]of Object.entries(t)){let f=Wt.normalizeTypeField(p);try{let h=await this.addMCPServerSingle(u,f);o.push({name:u,success:!0,config:f,tools:h.tools,status:h.status}),n.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:h.tools?.length||0})}catch(h){let x=this.handleError(h,"addMCPServersBatch",{serverName:u,serverConfig:f});o.push({name:u,success:!1,error:x.message,config:f}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:x.message})}}let a=n.length,l=r.length-a;if(a===0)throw M.configError("ADD_FAILED","\u6279\u91CF\u6DFB\u52A0\u5931\u8D25\uFF1A\u6240\u6709\u670D\u52A1\u90FD\u65E0\u6CD5\u6DFB\u52A0");T().emitEvent("mcp:server:batch_added",{totalServers:r.length,addedCount:a,failedCount:l,successfullyAddedServers:n,results:o,timestamp:new Date});let g={success:a>0,message:a===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:o,addedCount:a,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:a,failedCount:l}),g}catch(a){throw n.length>0&&await this.rollbackBatchAdd(n),a instanceof M?a:M.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${a instanceof Error?a.message:String(a)}`)}}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,n]of Object.entries(e)){let i=z.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(z.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let a=Wt.normalizeTypeField(n),l=z.validateConfig(a);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(n){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${o} \u5931\u8D25:`,n)}this.mcpServiceManager.removeServiceConfig(o),this.configManager.removeMcpServer(o),t.push(o),T().emitEvent("mcp:server:rollback",{serverName:o,timestamp:new Date})}catch(n){let i=this.handleError(n,"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})}},z;(r=>{function s(o){let n=[];if(!o||typeof o!="object")return n.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:n};if("command"in o)(!o.command||typeof o.command!="string")&&n.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),o.args&&!Array.isArray(o.args)&&n.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),o.env&&typeof o.env!="object"&&n.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in o){(!o.url||typeof o.url!="string")&&n.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(o.url)}catch{n.push("URL \u683C\u5F0F\u65E0\u6548")}}else n.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:n.length===0,errors:n}}r.validateConfig=s,c(s,"validateConfig");function e(o){let n=[];return!o||typeof o!="string"?(n.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:n}):((o.length<1||o.length>50)&&n.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(o)||n.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:n.length===0,errors:n})}r.validateServiceName=e,c(e,"validateServiceName");function t(o,n){let i=n.getConfig();return i.mcpServers&&o in i.mcpServers}r.checkServiceExists=t,c(t,"checkServiceExists")})(z||={});import{configManager as be}from"@xiaozhi-client/config";var it=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=v,this.notificationService=e,this.statusService=t,this.eventBus=T()}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}),this.sendError(e,"UNKNOWN_MESSAGE_TYPE",`\u672A\u77E5\u7684\u6D88\u606F\u7C7B\u578B: ${t.type}`)}}catch(o){this.logger.error(`\u5904\u7406 WebSocket \u6D88\u606F\u5931\u8D25: ${t.type}`,o),this.sendError(e,"MESSAGE_PROCESSING_ERROR",o instanceof Error?o.message:"\u6D88\u606F\u5904\u7406\u5931\u8D25")}}async handleGetConfig(e,t){this.logDeprecationWarning("WebSocket getConfig","GET /api/config");try{let r=be.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),this.sendError(e,"CONFIG_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u914D\u7F6E\u5931\u8D25")}}async handleUpdateConfig(e,t,r){this.logDeprecationWarning("WebSocket updateConfig","PUT /api/config");try{if(be.validateConfig(t),be.updateConfig(t),t.mcpServerConfig)for(let[o,n]of Object.entries(t.mcpServerConfig))for(let[i,a]of Object.entries(n.tools))be.setToolEnabled(o,i,a.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),this.sendError(e,"CONFIG_UPDATE_ERROR",o instanceof Error?o.message:String(o))}}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),this.sendError(e,"STATUS_READ_ERROR",r instanceof Error?r.message:"\u83B7\u53D6\u72B6\u6001\u5931\u8D25")}}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),this.sendError(e,"RESTART_REQUEST_ERROR",r instanceof Error?r.message:"\u5904\u7406\u91CD\u542F\u8BF7\u6C42\u5931\u8D25")}}sendError(e,t,r){try{let o={type:"error",error:{code:t,message:r,timestamp:Date.now()}};e.send(JSON.stringify(o))}catch(o){this.logger.error("\u53D1\u9001\u9519\u8BEF\u6D88\u606F\u5931\u8D25:",o)}}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=be.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),this.sendError(e,"INITIAL_DATA_ERROR",r instanceof Error?r.message:"\u53D1\u9001\u521D\u59CB\u6570\u636E\u5931\u8D25")}}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 at}from"child_process";var ct=class{static{c(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=v,this.statusService=e,this.eventBus=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=ot(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},5e3)}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")}},500),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"),at("xiaozhi",["start","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u542F\u52A8\u547D\u4EE4\u5DF2\u53D1\u9001");return}at("xiaozhi",["restart","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u91CD\u542F\u547D\u4EE4\u5DF2\u53D1\u9001")}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"),at("xiaozhi",["stop"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),e.get("logger").info("MCP \u670D\u52A1\u505C\u6B62\u547D\u4EE4\u5DF2\u53D1\u9001"),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"),at("xiaozhi",["start","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),e.get("logger").info("MCP \u670D\u52A1\u542F\u52A8\u547D\u4EE4\u5DF2\u53D1\u9001"),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=ot(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 lt}from"fs";import{readFile as Rn}from"fs/promises";import{dirname as Mn,join as N}from"path";import{fileURLToPath as Pn}from"url";var Oe=class extends I{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=v,this.initializeWebPath()}initializeWebPath(){try{let e=Mn(Pn(import.meta.url));v.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[N(e,"..","..","..","frontend"),N(e,"..","..","frontend"),N(e,"..","frontend"),N(e,"..","..","apps","frontend","dist"),N(e,"..","apps","frontend","dist"),N(e,"..","..","apps","frontend"),N(e,"..","apps","frontend"),N(e,"..","..","web","dist"),N(e,"..","web","dist"),N(e,"..","..","web"),N(e,"..","web"),N(e,"..","..","..","apps","frontend","dist"),N(e,"..","..","..","apps","frontend"),N(e,"..","..","..","web","dist"),N(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=lt(r);return v.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?v.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(v.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),v.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){v.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",W.FORBIDDEN);let o=N(this.webPath,r);if(!lt(o)){let i=N(this.webPath,"index.html");return lt(i)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,y.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",W.NOT_FOUND))}let n=this.getContentType(o);return e.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${n}`),this.serveFile(e,o,n)}catch(r){return e.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",W.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let o=await Rn(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 v.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,o),o}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:y.TEXT_HTML,htm:y.TEXT_HTML,js:y.APPLICATION_JAVASCRIPT,mjs:y.APPLICATION_JAVASCRIPT,css:y.TEXT_CSS,json:y.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:y.APPLICATION_PDF,txt:y.TEXT_PLAIN,xml:y.APPLICATION_XML,zip:y.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||y.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
26
+ `:"");Z.writeFileSync(this.logFilePath,n,"utf8")}catch{}}async recordToolCall(e){try{await this.cleanupOldRecords(),this.pinoLogger.info(e,e.toolName)}catch{}}getLogFilePath(){return this.logFilePath}getMaxRecords(){return this.maxRecords}},rt=class{static{c(this,"ToolCallLogService")}configDir;constructor(e){this.configDir=e||Ie.getConfigDir()}getLogFilePath(){return new Ae({},this.configDir).getLogFilePath()}checkLogFile(){let e=this.getLogFilePath();if(!Z.existsSync(e))throw new Error("\u5DE5\u5177\u8C03\u7528\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728")}parseLogFile(){let e=this.getLogFilePath();try{let r=Z.readFileSync(e,"utf8").trim().split(`
27
+ `).filter(n=>n.trim()!==""),o=[];for(let n of r)try{let i=JSON.parse(n);i.time&&(i.timestamp=new Date(i.time).getTime()),i.timestamp,o.push(i)}catch{}return o.sort((n,i)=>(i.timestamp||0)-(n.timestamp||0)),o}catch{throw 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,n=t.endDate?new Date(t.endDate).getTime():Date.now();r=r.filter(i=>{let a=i.timestamp||0;return a>=o&&a<=n})}return r}async getToolCallLogs(e={}){this.checkLogFile();let t=this.parseLogFile(),r=this.filterRecords(t,e),o=r.length,n=Math.min(e.limit||50,1e3),i=e.offset||0,a=r.slice(i,i+n),l=i+n<o;return{records:a,total:o,hasMore:l}}};var de=class{static{c(this,"MCPMessageHandler")}logger;serviceManager;constructor(e){this.serviceManager=e,this.logger=T}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 J.INITIALIZE:return await this.handleInitialize(e.params,e.id);case J.INITIALIZED:return await this.handleInitializedNotification(e.params);case J.TOOLS_LIST:return await this.handleToolsList(e.id);case J.TOOLS_CALL:return await this.handleToolCall(e.params,e.id);case J.RESOURCES_LIST:return await this.handleResourcesList(e.id);case J.PROMPTS_LIST:return await this.handlePromptsList(e.id);case J.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:Y.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:Ft.NAME,version:Ft.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=jr(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 Ne=class extends pn{static{c(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 Q(r),this.customMCPHandler=new ye(this.cacheManager,this);let o=x.getToolCallLogConfig(),n=x.getConfigDir();this.toolCallLogger=new Ae(o,n),this.eventListeners={serviceConnected:c(async i=>{await this.handleServiceConnected(i)},"serviceConnected"),serviceDisconnected:c(async i=>{await this.handleServiceDisconnected(i)},"serviceDisconnected"),serviceConnectionFailed:c(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){try{this.services.get(e.serviceName)&&await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceDisconnected(e){try{await this.refreshToolsCache(),await this.refreshCustomMCPHandlerPublic()}catch{}}async handleServiceConnectionFailed(e){try{await this.refreshCustomMCPHandlerPublic()}catch{}}async startAllServices(){try{this.customMCPHandler.initialize()}catch{}let e=Object.entries(this.configs);if(e.length===0)return;let t=e.map(async([a])=>{try{return await this.startService(a),{serviceName:a,success:!0,error:null}}catch(l){return{serviceName:a,success:!1,error:l instanceof Error?l.message:String(l)}}}),r=await Promise.allSettled(t),o=0,n=0,i=[];for(let a of r)a.status==="fulfilled"?a.value.success?o++:(n++,i.push(a.value.serviceName)):n++;i.length>0&&e.length,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 ot(r);await o.connect(),this.services.set(e,o),await this.refreshToolsCache();let n=o.getTools()}catch(r){throw this.services.delete(e),r}}async stopService(e){let t=this.services.get(e);if(t)try{await t.disconnect(),this.services.delete(e),await this.refreshToolsCache()}catch(r){throw 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(()=>{}).catch(n=>{});for(let n of r){let i=`${e}__${n.name}`;this.tools.set(i,{serviceName:e,originalName:n.name,tool:n})}}await this.syncToolsConfigToFile()}getAllTools(e="all"){let t=[];for(let[o,n]of this.services)try{if(n.isConnected()){let i=n.getTools();for(let a of i)try{let l=x.isToolEnabled(o,a.name),g=x.getMcpServerConfig()[o].tools[a.name];if(e==="enabled"&&!l||e==="disabled"&&l)continue;let u=`${o}__${a.name}`;t.push({name:u,description:a.description||"",inputSchema:a.inputSchema,serviceName:o,originalName:a.name,enabled:l,usageCount:g.usageCount??0,lastUsedTime:g.lastUsedTime??""})}catch{}}}catch{}let r=[];try{r=this.customMCPHandler.getTools()}catch{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{}return 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(),n="unknown",i=e;try{let a;if(this.customMCPHandler.hasTool(e)){let l=this.customMCPHandler.getToolInfo(e);l&&(n=this.getLogServerName(l),i=this.getOriginalToolName(e,l)),l?.handler?.type==="mcp"?(a=await this.callMCPTool(e,l.handler.config,t),this.updateToolStatsSafe(e,l.handler.config.serviceName,l.handler.config.toolName,!0)):(a=await this.customMCPHandler.callTool(e,t,r),this.updateToolStatsSafe(e,"customMCP",e,!0))}else{let l=this.tools.get(e);if(!l)throw new Error(`\u672A\u627E\u5230\u5DE5\u5177: ${e}`);n=l.serviceName,i=l.originalName;let g=this.services.get(l.serviceName);if(!g)throw new Error(`\u670D\u52A1 ${l.serviceName} \u4E0D\u53EF\u7528`);if(!g.isConnected())throw new Error(`\u670D\u52A1 ${l.serviceName} \u672A\u8FDE\u63A5`);a=await g.callTool(l.originalName,t||{}),this.updateToolStatsSafe(e,l.serviceName,l.originalName,!0)}return this.toolCallLogger.recordToolCall({toolName:i,serverName:n,arguments:t,result:a,success:a.isError!==!0,duration:Date.now()-o}),a}catch(a){if(this.toolCallLogger.recordToolCall({toolName:i,serverName:n,arguments:t,result:null,success:!1,duration:Date.now()-o,error:a instanceof Error?a.message:String(a)}),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)}else{let l=this.tools.get(e);l&&this.updateToolStatsSafe(e,l.serviceName,l.originalName,!1)}throw a}}async updateToolStats(e,t,r,o){try{let n=new Date().toISOString();o?(await this.updateCustomMCPToolStats(e,n),t!=="customMCP"&&await this.updateMCPServerToolStats(t,r,n)):(await this.updateCustomMCPToolLastUsedTime(e,n),t!=="customMCP"&&await this.updateMCPServerToolLastUsedTime(t,r,n))}catch(n){throw n}}async updateToolStatsSafe(e,t,r,o){try{await this.updateToolStats(e,t,r,o)}catch{let i=o?"\u7EDF\u8BA1\u4FE1\u606F":"\u5931\u8D25\u7EDF\u8BA1\u4FE1\u606F"}}async updateCustomMCPToolStats(e,t){try{await x.updateToolUsageStatsWithLock(e,!0)}catch(r){throw r}}async updateCustomMCPToolLastUsedTime(e,t){try{await x.updateToolUsageStatsWithLock(e,!1)}catch(r){throw r}}async updateMCPServerToolStats(e,t,r){try{await x.updateMCPServerToolStatsWithLock(e,t,r,!0)}catch(o){throw o}}async updateMCPServerToolLastUsedTime(e,t,r){try{await x.updateMCPServerToolStatsWithLock(e,t,r,!1)}catch(o){throw o}}async callMCPTool(e,t,r){let{serviceName:o,toolName:n}=t,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{return await i.callTool(n,r||{})}catch(a){throw a}}hasTool(e){return this.customMCPHandler.hasTool(e)?!0:this.tools.has(e)}async stopAllServices(){this.stopAllServiceRetries();for(let[e,t]of this.services)try{await t.disconnect()}catch{}try{this.customMCPHandler.cleanup()}catch{}try{x.clearAllStatsUpdateLocks()}catch{}this.services.clear(),this.tools.clear()}getStatus(){return this.getUnifiedStatus()}getStatsUpdateInfo(){try{let e=x.getStatsUpdateLocks();return{activeLocks:e,totalLocks:e.length}}catch{return{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{this.customMCPHandler.initialize()}catch(e){throw 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{return!1}}getCustomMCPTools(){try{return this.customMCPHandler.getTools()}catch{return[]}}isModelScopeService(e){return e.url?mn(e.url):!1}handleModelScopeAuth(e,t,r){if(t.headers?.Authorization)return;let n=x.getModelScopeApiKey();if(n){r.apiKey=n;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 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 n=this.enhanceServiceConfig(o,r);this.configs[o]=n}updateServiceConfig(e,t){let r=this.enhanceServiceConfig(e,t);this.configs[e]=r}removeServiceConfig(e){delete this.configs[e]}async syncToolsConfigToFile(){try{let e=x.getMcpServerConfig();for(let[t,r]of this.services){if(!r.isConnected())continue;let o=r.getTools();if(o.length===0)continue;let n=e[t]?.tools||{},i={};for(let d of o){let C=n[d.name];C?i[d.name]={...C,description:d.description||C.description||""}:i[d.name]={description:d.description||"",enable:!0}}let a=o.map(d=>d.name),g=Object.keys(n).filter(d=>!a.includes(d));if(g.length>0,this.hasToolsConfigChanged(n,i)){x.updateServerToolsConfig(t,i);let d=Object.keys(i).filter(f=>!n[f]),C=Object.keys(i).filter(f=>{let L=n[f],Be=i[f];return L&&L.description!==Be.description});d.length>0,C.length>0,g.length>0}}}catch{}}hasToolsConfigChanged(e,t){let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!0;let n=o.filter(a=>!r.includes(a)),i=r.filter(a=>!o.includes(a));if(n.length>0||i.length>0)return!0;for(let a of r){let l=e[a],g=t[a];if(l.description!==g.description)return!0}return!1}scheduleFailedServicesRetry(e){if(e.length===0)return;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));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);try{await this.refreshCustomMCPHandlerPublic()}catch{}}catch{let r=this.getRetryDelay(e),o=Math.min(r*2,3e5);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)),this.failedServices.delete(e)}stopAllServiceRetries(){for(let[e,t]of this.retryTimers)clearTimeout(t);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");try{await this.startAllServices(),this.isRunning=!0,this.emit("started")}catch(e){throw e}}async stop(){if(this.isRunning)try{await this.stopAllServices(),this.isRunning=!1,this.emit("stopped")}catch(e){throw 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()}catch{e=0,t=[]}let r=this.tools.size+e,n=[...Array.from(this.tools.keys()),...t],i={services:{},totalTools:r,availableTools:n};for(let[a,l]of this.services){let g=l.getStatus();i.services[a]={connected:g.connected,clientName:`xiaozhi-${a}-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 hn}from"@xiaozhi-client/mcp-core";var ot=class{static{c(this,"MCPService")}connection;eventBus=R();constructor(e){let{name:t,...r}=e,o={onConnected:c(n=>{this.eventBus.emitEvent(Ke.CONNECTED,n)},"onConnected"),onDisconnected:c(n=>{this.eventBus.emitEvent(Ke.DISCONNECTED,n)},"onDisconnected"),onConnectionFailed:c(n=>{this.eventBus.emitEvent(Ke.CONNECTION_FAILED,n)},"onConnectionFailed")};this.connection=new hn(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 qg}from"@xiaozhi-client/mcp-core";function jr(s,e){let t={validateName:!0,validateArguments:!0,allowEmptyArguments:!0,...e};if(!s||typeof s!="object")throw new K(-32602,"\u8BF7\u6C42\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61");let r=s;if(t.validateName&&(!r.name||typeof r.name!="string"))throw new K(-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 K(-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 K(-32602,"\u5DE5\u5177\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A")}if(t.customValidator){let o=t.customValidator(r);if(o)throw new K(-32602,o)}return{name:r.name,arguments:r.arguments}}c(jr,"validateToolCallParams");import{createHash as Cn}from"crypto";import{existsSync as Oe,mkdirSync as En,readFileSync as Gr,renameSync as vn,writeFileSync as Br}from"fs";import{dirname as Tn,resolve as Wr}from"path";import{Hono as fn}from"hono";var qr=c(()=>new fn,"createApp");var st=c(s=>{let e=s.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 Sn from"dayjs";var Q=class{static{c(this,"MCPCacheManager")}cachePath;logger;CACHE_VERSION=Vt.CACHE_VERSION;CACHE_ENTRY_VERSION=Vt.CACHE_ENTRY_VERSION;cleanupInterval;CLEANUP_INTERVAL=$r.CLEANUP_INTERVAL;constructor(e){this.logger=T,this.cachePath=e||this.getCacheFilePath(),this.startCleanupTimer()}formatTimestamp(){return Sn().format("YYYY-MM-DD HH:mm:ss")}getCacheFilePath(){try{let e=process.env.XIAOZHI_CONFIG_DIR||process.cwd();return Wr(e,zt.FILENAME)}catch{let t=process.env.XIAOZHI_CONFIG_DIR||"/tmp";return Wr(t,zt.FILENAME)}}async ensureCacheFile(){try{if(!Oe(this.cachePath)){let e=Tn(this.cachePath);Oe(e)||(En(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(),n=this.generateConfigHash(r),i={tools:t.map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema})),lastUpdated:this.formatTimestamp(),serverConfig:{...r},configHash:n,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(!Oe(this.cachePath))return await this.createInitialCache();let e=Gr(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{Br(r,t,"utf8"),vn(r,e)}catch(o){try{Oe(r)&&Br(r,"","utf8")}catch{}throw o}}generateConfigHash(e){try{return Cn("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:Oe(this.cachePath)?Gr(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 n of o.tools)t.push({...n,name:`${r}${Hr.SERVICE_TOOL_SEPARATOR}${n.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",n,i=3e5){try{let a=await this.loadExtendedCache(),l=q(e,t),g={result:r,timestamp:new Date().toISOString(),ttl:i,status:o,consumed:!1,taskId:n,retryCount:0};a.customMCPResults||(a.customMCPResults={}),a.customMCPResults[l]=g,await this.saveExtendedCache(a),this.logger.debug(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58: ${e}, \u72B6\u6001: ${o}`)}catch(a){this.logger.warn(`[CacheManager] \u5199\u5165CustomMCP\u7ED3\u679C\u7F13\u5B58\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`)}}async readCustomMCPResult(e,t){try{let r=await this.loadExtendedCache(),o=q(e,t);if(!r.customMCPResults||!r.customMCPResults[o])return null;let n=r.customMCPResults[o],i=Date.now(),a=new Date(n.timestamp).getTime();return i-a>n.ttl?(this.logger.debug(`[CacheManager] \u7F13\u5B58\u5DF2\u8FC7\u671F: ${e}`),null):n}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,n){try{let i=await this.loadExtendedCache(),a=q(e,t);if(!i.customMCPResults||!i.customMCPResults[a])return!1;let l=i.customMCPResults[a],g=l.status;return l.status=r,l.timestamp=new Date().toISOString(),o&&(l.result=o),n&&r==="failed"&&(l.result={content:[{type:"text",text:`\u4EFB\u52A1\u5931\u8D25: ${n}`}]},l.consumed=!0),r==="completed"&&(l.consumed=!1),await this.saveExtendedCache(i),this.logger.debug(`[CacheManager] \u66F4\u65B0\u7F13\u5B58\u72B6\u6001: ${e} ${g} -> ${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 n=r.customMCPResults[o];return n.consumed||(n.consumed=!0,n.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,n]of t)Me(n)&&(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(u=>u.status==="pending").length,n=t.filter(u=>u.status==="completed").length,i=t.filter(u=>u.status==="failed").length,a=t.filter(u=>u.consumed).length,l=n>0?a/n*100:0,g=JSON.stringify(e.customMCPResults).length;return{totalEntries:r,pendingTasks:o,completedTasks:n,failedTasks:i,consumedEntries:a,cacheHitRate:l,lastCleanupTime:new Date().toISOString(),memoryUsage:g}}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 nt=class{static{c(this,"MCPRouteHandler")}logger;mcpMessageHandler=null;config;metrics;constructor(e={}){this.logger=T,this.config={maxMessageSize:e.maxMessageSize??kr.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(V.CONTENT_LENGTH);if(o&&Number.parseInt(o)>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`${oe.REQUEST_TOO_LARGE}: Maximum size is ${this.config.maxMessageSize} bytes`);if(!e.req.header(V.CONTENT_TYPE)?.includes(y.APPLICATION_JSON))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${oe.INVALID_REQUEST}: ${oe.INVALID_CONTENT_TYPE}`);let i=e.req.header("mcp-protocol-version")||e.req.header(V.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 a;try{let u=await e.req.text();if(u.length>this.config.maxMessageSize)return this.metrics.errorCount++,this.createErrorResponse(-32600,`Message too large: Maximum size is ${this.config.maxMessageSize} bytes`,null);a=JSON.parse(u),r=a.id||null}catch{return this.metrics.errorCount++,this.createErrorResponse(-32700,oe.PARSE_ERROR)}if(!this.validateMessage(a))return this.metrics.errorCount++,this.createErrorResponse(-32600,`${oe.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(a);this.metrics.totalMessages++;let g=Date.now()-t;return this.metrics.averageResponseTime=(this.metrics.averageResponseTime*(this.metrics.totalMessages-1)+g)/this.metrics.totalMessages,this.logger.debug("MCP POST \u8BF7\u6C42\u5904\u7406\u6210\u529F",{method:a.method,messageId:r,responseTime:g,isNotification:l===null}),l===null?new Response(null,{status:X.NO_CONTENT,headers:{[V.MCP_PROTOCOL_VERSION]:Y.DEFAULT,[V.X_RESPONSE_TIME]:g.toString()}}):e.json(l,X.OK,{[V.CONTENT_TYPE]:y.APPLICATION_JSON,[V.MCP_PROTOCOL_VERSION]:Y.DEFAULT,[V.X_RESPONSE_TIME]:g.toString()})}catch(o){this.metrics.errorCount++;let n=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:n,stack:o instanceof Error?o.stack:void 0});let i=o instanceof Error?o.message:String(o);return this.createErrorResponse(-32603,`${oe.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()}`,n={jsonrpc:"2.0",error:{code:e,message:t},id:o};return new Response(JSON.stringify(n),{status:X.BAD_REQUEST,headers:{[V.CONTENT_TYPE]:y.APPLICATION_JSON,[V.MCP_PROTOCOL_VERSION]:Y.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 p=class s extends Error{static{c(this,"MCPError")}code;severity;category;details;timestamp;constructor(e,t,r="medium",o="system",n={}){super(t),this.name="MCPError",this.code=e,this.severity=r,this.category=o,this.timestamp=new Date().toISOString(),this.details={...n,timestamp:this.timestamp,severity:this.severity,category:this.category,stack:this.stack},Error.captureStackTrace&&Error.captureStackTrace(this,s)}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 s(e,t,"medium","configuration",r)}static connectionError(e,t,r={}){return new s(e,t,"high","connection",r)}static operationError(e,t,r={}){return new s(e,t,"medium","operation",r)}static systemError(e,t,r={}){return new s(e,t,"high","system",r)}static validationError(e,t,r={}){return new s(e,t,"low","validation",r)}static fromError(e,t="INTERNAL_ERROR",r="system"){return new s(t,e.message,"medium",r,{stack:e.stack,context:{originalError:e.name}})}},it=class{static{c(this,"DefaultErrorHandler")}canHandle(e){return!(e instanceof p)}handle(e,t){return p.fromError(e,"INTERNAL_ERROR","system")}},Gt=class{static{c(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 p.configError("INVALID_CONFIG",`\u914D\u7F6E\u9519\u8BEF: ${e.message}`,{context:t})}},Bt=class{static{c(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 p.connectionError("CONNECTION_FAILED",`\u8FDE\u63A5\u5931\u8D25: ${e.message}`,{context:t})}},Wt=class{static{c(this,"ErrorHandlerRegistry")}handlers=[];constructor(){this.registerHandler(new Gt),this.registerHandler(new Bt),this.registerHandler(new it)}registerHandler(e){this.handlers.unshift(e)}handleError(e,t){if(e instanceof p)return e;for(let r of this.handlers)if(r.canHandle(e)){let o=r.handle(e,t);if(o)return o}return new it().handle(e,t)}},Ou=new Wt;import{normalizeServiceConfig as Mn}from"@xiaozhi-client/config";import{TypeFieldNormalizer as Xt}from"@xiaozhi-client/mcp-core";var _e=class{static{c(this,"MCPHandler")}logger;mcpServiceManager;configManager;statusCache;constructor(e,t){this.logger=T,this.mcpServiceManager=e,this.configManager=t,this.statusCache=new Map}handleError(e,t,r){if(e instanceof p)return this.logger.error("MCPError",{error:e,operation:t,context:r}),e;if(e instanceof Error){let n;return e.message.includes("\u670D\u52A1\u4E0D\u5B58\u5728")||e.message.includes("not found")?n=p.configError("SERVER_NOT_FOUND",e.message,{operation:t,context:r}):e.message.includes("\u5DF2\u5B58\u5728")||e.message.includes("already exists")?n=p.configError("SERVER_ALREADY_EXISTS",e.message,{operation:t,context:r}):e.message.includes("\u914D\u7F6E")||e.message.includes("config")?n=p.configError("INVALID_CONFIG",e.message,{operation:t,context:r}):e.message.includes("\u8FDE\u63A5")||e.message.includes("connection")?n=p.connectionError("CONNECTION_FAILED",e.message,{operation:t,context:r}):n=p.systemError("INTERNAL_ERROR",e.message,{operation:t,context:r,stack:e.stack}),this.logger.error("MCPError",{error:n,operation:t,context:r}),n}let o=p.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 g=r,u=await this.addMCPServersBatch(g),d=Date.now()-t;return this.logger.info("addMCPServer",{batch:!0,addedCount:u.addedCount,failedCount:u.failedCount,duration:d}),e.success(u,u.message,201)}let o=r,{name:n,config:i}=o,a=await this.addMCPServerSingle(n,i),l=Date.now()-t;return this.logger.info("addMCPServer",{serverName:n,toolsCount:a.tools?.length||0,duration:l,status:a.status}),e.success(a,"MCP \u670D\u52A1\u6DFB\u52A0\u6210\u529F",201)}catch(o){let n=this.handleError(o,"addMCPServer",{requestData:r}),i=500;return n.category==="validation"?i=400:n.category==="configuration"?n.code==="SERVER_ALREADY_EXISTS"?i=409:i=400:n.category==="connection"&&(i=500),e.fail(n.code,n.message,{error:n.details},i)}}async addMCPServerSingle(e,t){this.logger.info("addMCPServerSingle",{serverName:e});let r=Xt.normalizeTypeField(t);try{let o=z.validateServiceName(e);if(!o.isValid){let g=p.validationError("INVALID_SERVICE_NAME",o.errors.join(", "),{serverName:e,errors:o.errors});throw this.logger.error("addMCPServerSingle",{validationError:g,serverName:e,phase:"name_validation"}),g}if(z.checkServiceExists(e,this.configManager)){let g=p.configError("SERVER_ALREADY_EXISTS","MCP \u670D\u52A1\u5DF2\u5B58\u5728",{serverName:e});throw this.logger.error("addMCPServerSingle",{existsError:g,serverName:e,phase:"existence_check"}),g}let n=z.validateConfig(r);if(!n.isValid){let g=p.configError("INVALID_CONFIG",n.errors.join(", "),{serverName:e,config:r,errors:n.errors});throw this.logger.error("addMCPServerSingle",{configError:g,serverName:e,phase:"config_validation"}),g}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=Mn(r);this.mcpServiceManager.addServiceConfig(e,i),await this.mcpServiceManager.startService(e),this.logger.debug("\u670D\u52A1\u5DF2\u542F\u52A8",{serverName:e});let a=this.getServiceStatus(e),l=this.getServiceTools(e);return R().emitEvent("mcp:server:added",{serverName:e,config:r,tools:l.map(g=>g.name),timestamp:new Date}),{...a,tools:l.map(g=>g.name)}}catch(o){let n=this.handleError(o,"addMCPServerSingle",{serverName:e,config:r});throw this.logger.error("addMCPServerSingle",{mcpError:n,serverName:e}),n}}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 a=i.getTools().map(g=>g.name),l={name:e,status:"connected",connected:!0,tools:a,lastUpdated:new Date().toISOString(),config:r};return this.checkAndEmitStatusChange(e,l),l}}catch(n){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u72B6\u6001\u65F6\u51FA\u9519:`,n)}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)),n=r.tools.filter(i=>!t.tools.includes(i));(o.length>0||n.length>0)&&R().emitEvent("mcp:server:tools:updated",{serverName:e,tools:t.tools,addedTools:o,removedTools:n,timestamp:new Date})}this.updateStatusCache(e,t)}getPreviousStatus(e){return this.statusCache.get(e)||null}updateStatusCache(e,t){this.statusCache.set(e,t)}getServiceTools(e){try{let r=this.mcpServiceManager.services.get(e);if(r?.getTools)return r.getTools()}catch(t){this.logger.debug(`\u83B7\u53D6\u670D\u52A1 ${e} \u5DE5\u5177\u5217\u8868\u65F6\u51FA\u9519:`,t)}return[]}async removeMCPServer(e){try{let t=e.req.param("serverName"),r=z.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!z.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(n=>n.name);try{await this.mcpServiceManager.stopService(t)}catch(n){this.logger.warn(`\u505C\u6B62\u670D\u52A1 ${t} \u5931\u8D25:`,n)}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"),r=z.validateServiceName(t);if(!r.isValid)return e.fail("INVALID_SERVICE_NAME",r.errors.join(", "),{serverName:t},400);if(!z.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,a]of Object.entries(r)){let l=this.getServiceStatus(i);o.push(l)}let n={servers:o,total:o.length};return e.success(n,"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 p.validationError("INVALID_CONFIG","\u6279\u91CF\u6DFB\u52A0\u8BF7\u6C42\u4E2D\u7684\u670D\u52A1\u5217\u8868\u4E3A\u7A7A");let o=[],n=[],i=this.validateBatchServers(t);if(!i.isValid)throw p.validationError("INVALID_CONFIG",i.errors.join(", "));try{for(let[u,d]of Object.entries(t)){let C=Xt.normalizeTypeField(d);try{let f=await this.addMCPServerSingle(u,C);o.push({name:u,success:!0,config:C,tools:f.tools,status:f.status}),n.push(u),this.logger.debug("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u6210\u529F",{serverName:u,toolsCount:f.tools?.length||0})}catch(f){let L=this.handleError(f,"addMCPServersBatch",{serverName:u,serverConfig:C});o.push({name:u,success:!1,error:L.message,config:C}),this.logger.warn("\u6279\u91CF\u6DFB\u52A0\uFF1A\u670D\u52A1\u6DFB\u52A0\u5931\u8D25",{serverName:u,error:L.message})}}let a=n.length,l=r.length-a;if(a===0)throw p.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:a,failedCount:l,successfullyAddedServers:n,results:o,timestamp:new Date});let g={success:a>0,message:a===r.length?`\u6279\u91CF\u6DFB\u52A0\u6210\u529F\uFF1A\u5DF2\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1`:`\u6279\u91CF\u6DFB\u52A0\u90E8\u5206\u6210\u529F\uFF1A\u6210\u529F\u6DFB\u52A0 ${a} \u4E2A\u670D\u52A1\uFF0C\u5931\u8D25 ${l} \u4E2A\u670D\u52A1`,results:o,addedCount:a,failedCount:l};return this.logger.info("addMCPServersBatch",{totalServers:r.length,addedCount:a,failedCount:l}),g}catch(a){throw n.length>0&&await this.rollbackBatchAdd(n),a instanceof p?a:p.systemError("INTERNAL_ERROR",`\u6279\u91CF\u6DFB\u52A0\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF: ${a instanceof Error?a.message:String(a)}`)}}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,n]of Object.entries(e)){let i=z.validateServiceName(o);if(!i.isValid){t.push(`\u670D\u52A1 "${o}" \u540D\u79F0\u65E0\u6548: ${i.errors.join(", ")}`);continue}if(z.checkServiceExists(o,this.configManager)){t.push(`\u670D\u52A1 "${o}" \u5DF2\u5B58\u5728`);continue}let a=Xt.normalizeTypeField(n),l=z.validateConfig(a);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(n){this.logger.warn(`\u56DE\u6EDA\u65F6\u505C\u6B62\u670D\u52A1 ${o} \u5931\u8D25:`,n)}this.mcpServiceManager.removeServiceConfig(o),this.configManager.removeMcpServer(o),t.push(o),R().emitEvent("mcp:server:rollback",{serverName:o,timestamp:new Date})}catch(n){let i=this.handleError(n,"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})}},z;(r=>{function s(o){let n=[];if(!o||typeof o!="object")return n.push("\u914D\u7F6E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{isValid:!1,errors:n};if("command"in o)(!o.command||typeof o.command!="string")&&n.push("\u672C\u5730\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684\u547D\u4EE4"),o.args&&!Array.isArray(o.args)&&n.push("\u53C2\u6570\u5FC5\u987B\u662F\u6570\u7EC4"),o.env&&typeof o.env!="object"&&n.push("\u73AF\u5883\u53D8\u91CF\u5FC5\u987B\u662F\u5BF9\u8C61");else if("url"in o){(!o.url||typeof o.url!="string")&&n.push("\u8FDC\u7A0B\u670D\u52A1\u5FC5\u987B\u63D0\u4F9B\u6709\u6548\u7684 URL");try{new URL(o.url)}catch{n.push("URL \u683C\u5F0F\u65E0\u6548")}}else n.push("\u914D\u7F6E\u5FC5\u987B\u5305\u542B command \u6216 url \u5B57\u6BB5");return{isValid:n.length===0,errors:n}}r.validateConfig=s,c(s,"validateConfig");function e(o){let n=[];return!o||typeof o!="string"?(n.push("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32"),{isValid:!1,errors:n}):((o.length<1||o.length>50)&&n.push("\u670D\u52A1\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728 1-50 \u4E2A\u5B57\u7B26\u4E4B\u95F4"),/^[a-zA-Z0-9_-]+$/.test(o)||n.push("\u670D\u52A1\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"),{isValid:n.length===0,errors:n})}r.validateServiceName=e,c(e,"validateServiceName");function t(o,n){let i=n.getConfig();return i.mcpServers&&o in i.mcpServers}r.checkServiceExists=t,c(t,"checkServiceExists")})(z||={});import{configManager as we}from"@xiaozhi-client/config";var at=class{static{c(this,"RealtimeNotificationHandler")}logger;notificationService;statusService;eventBus;constructor(e,t){this.logger=T,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}),j(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),j(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),j(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,n]of Object.entries(t.mcpServerConfig))for(let[i,a]of Object.entries(n.tools))we.setToolEnabled(o,i,a.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),j(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),j(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),j(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),j(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 ct}from"child_process";var lt=class{static{c(this,"ServiceApiHandler")}logger;statusService;eventBus;constructor(e){this.logger=T,this.statusService=e,this.eventBus=R()}async restartService(e){try{e.get("logger").info("\u5904\u7406\u670D\u52A1\u91CD\u542F\u8BF7\u6C42"),this.eventBus.emitEvent("service:restart:requested",{serviceName:"unknown",source:"http-api",delay:0,attempt:1,timestamp:Date.now()}),this.statusService.updateRestartStatus("restarting");let t=st(e);return setTimeout(async()=>{try{await this.executeRestart(t),setTimeout(()=>{this.statusService.updateRestartStatus("completed")},5e3)}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")}},500),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"),ct("xiaozhi",["start","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u542F\u52A8\u547D\u4EE4\u5DF2\u53D1\u9001");return}ct("xiaozhi",["restart","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),this.logger.info("MCP \u670D\u52A1\u91CD\u542F\u547D\u4EE4\u5DF2\u53D1\u9001")}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"),ct("xiaozhi",["stop"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),e.get("logger").info("MCP \u670D\u52A1\u505C\u6B62\u547D\u4EE4\u5DF2\u53D1\u9001"),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"),ct("xiaozhi",["start","--daemon"],{detached:!0,stdio:"ignore",env:{...process.env,XIAOZHI_CONFIG_DIR:process.env.XIAOZHI_CONFIG_DIR||process.cwd()}}).unref(),e.get("logger").info("MCP \u670D\u52A1\u542F\u52A8\u547D\u4EE4\u5DF2\u53D1\u9001"),e.success(null,"\u542F\u52A8\u8BF7\u6C42\u5DF2\u63A5\u6536")}catch(t){return e.get("logger").error("\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25:",t),e.fail("START_REQUEST_ERROR",t instanceof Error?t.message:"\u5904\u7406\u542F\u52A8\u8BF7\u6C42\u5931\u8D25",void 0,500)}}async getServiceStatus(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u8BF7\u6C42");let r=st(e).getStatus();return e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u6210\u529F"),e.success(r)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_STATUS_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u72B6\u6001\u5931\u8D25",void 0,500)}}async getServiceHealth(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u8BF7\u6C42");let t={status:"healthy",timestamp:Date.now(),uptime:process.uptime(),memory:process.memoryUsage(),version:process.version};return e.get("logger").debug("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u6210\u529F"),e.success(t)}catch(t){return e.get("logger").error("\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25:",t),e.fail("SERVICE_HEALTH_READ_ERROR",t instanceof Error?t.message:"\u83B7\u53D6\u670D\u52A1\u5065\u5EB7\u72B6\u6001\u5931\u8D25",void 0,500)}}};import{existsSync as gt}from"fs";import{readFile as Pn}from"fs/promises";import{dirname as yn,join as I}from"path";import{fileURLToPath as In}from"url";var be=class extends A{static{c(this,"StaticFileHandler")}logger;webPath=null;constructor(){super(),this.logger=T,this.initializeWebPath()}initializeWebPath(){try{let e=yn(In(import.meta.url));T.debug(`\u5F53\u524D\u6587\u4EF6\u76EE\u5F55: ${e}`);let t=[I(e,"..","..","..","frontend"),I(e,"..","..","frontend"),I(e,"..","frontend"),I(e,"..","..","apps","frontend","dist"),I(e,"..","apps","frontend","dist"),I(e,"..","..","apps","frontend"),I(e,"..","apps","frontend"),I(e,"..","..","web","dist"),I(e,"..","web","dist"),I(e,"..","..","web"),I(e,"..","web"),I(e,"..","..","..","apps","frontend","dist"),I(e,"..","..","..","apps","frontend"),I(e,"..","..","..","web","dist"),I(e,"..","..","..","web")];this.webPath=t.find(r=>{let o=gt(r);return T.debug(`\u68C0\u67E5\u8DEF\u5F84 ${r}: ${o?"\u5B58\u5728":"\u4E0D\u5B58\u5728"}`),o})||null,this.webPath?T.debug(`\u9759\u6001\u6587\u4EF6\u670D\u52A1\u8DEF\u5F84: ${this.webPath}`):(T.warn("\u672A\u627E\u5230\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),T.debug("\u5C1D\u8BD5\u7684\u8DEF\u5F84:",t))}catch(e){T.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",X.FORBIDDEN);let o=I(this.webPath,r);if(!gt(o)){let i=I(this.webPath,"index.html");return gt(i)?(e.logger.debug(`SPA \u56DE\u9000\u5230 index.html: ${t}`),this.serveFile(e,i,y.TEXT_HTML)):(e.logger.debug(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${o}`),e.text("Not Found",X.NOT_FOUND))}let n=this.getContentType(o);return e.logger.debug(`\u670D\u52A1\u9759\u6001\u6587\u4EF6: ${o}, Content-Type: ${n}`),this.serveFile(e,o,n)}catch(r){return e.logger.error(`\u670D\u52A1\u9759\u6001\u6587\u4EF6\u9519\u8BEF (${t}):`,r),e.text("Internal Server Error",X.INTERNAL_SERVER_ERROR)}}async serveFile(e,t,r){try{let o=await Pn(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 T.error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${t}`,o),o}}getContentType(e){let t=e.split(".").pop()?.toLowerCase();return{html:y.TEXT_HTML,htm:y.TEXT_HTML,js:y.APPLICATION_JAVASCRIPT,mjs:y.APPLICATION_JAVASCRIPT,css:y.TEXT_CSS,json:y.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:y.APPLICATION_PDF,txt:y.TEXT_PLAIN,xml:y.APPLICATION_XML,zip:y.APPLICATION_ZIP,tar:"application/x-tar",gz:"application/gzip"}[t||""]||y.APPLICATION_OCTET_STREAM}createErrorPage(e,t){let r=`
28
28
  <!DOCTYPE html>
29
29
  <html>
30
30
  <head>
@@ -81,10 +81,10 @@ var Gs=Object.create;var Be=Object.defineProperty;var Bs=Object.getOwnPropertyDe
81
81
  </div>
82
82
  </body>
83
83
  </html>
84
- `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&lt(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}};var gt=class extends I{static{c(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 pe=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(pe||{});var yn={name:c((s,e)=>s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN"),"name"),enabled:c((s,e)=>{let t=Number(e.enabled)-Number(s.enabled);return t!==0?t:s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN")},"enabled"),usageCount:c((s,e)=>{let t=e.usageCount-s.usageCount;return t!==0?t:s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN")},"usageCount"),lastUsedTime:c((s,e)=>{if(!s.lastUsedTime)return 1;if(!e.lastUsedTime)return-1;let t=new Date(e.lastUsedTime).getTime()-new Date(s.lastUsedTime).getTime();return t!==0?t:s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN")},"lastUsedTime")};function Wr(s,e){let t=yn[e.field];return t?[...s].sort(t):s}c(Wr,"sortTools");import{configManager as S}from"@xiaozhi-client/config";import Nn from"ajv";import ut from"dayjs";var pt=class{static{c(this,"MCPToolHandler")}logger;ajv;constructor(){this.logger=v,this.ajv=new Nn({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:n}=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(n));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,n||{});let a;if(r==="customMCP")a=await i.callTool(o,n||{},{timeout:6e4});else{let l=`${r}__${o}`;a=await i.callTool(l,n||{})}return e.success(a,"\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(n){return e.get("logger").error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",n),e.fail("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.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"],n=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 a=i.getAllTools(t);a=Wr(a,{field:n});let l=a.map(u=>({name:u.name,description:u.description,inputSchema:u.inputSchema,handler:{type:"mcp",config:{serviceName:u.serviceName,toolName:u.originalName}},enabled:u.enabled,usageCount:u.usageCount,lastUsedTime:u.lastUsedTime})),g={list:l,total:l.length};return e.success(g,`\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(n=>n.name);throw o.length===0?new Error(`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`):new Error(`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 n=e.getCustomMCPTools().find(i=>i.name===r);n&&!n.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),n&&!n.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),new Error(`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 n=e.getCustomMCPTools().find(l=>l.name===t);if(!n)throw new Error(`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!n.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(n.inputSchema);if(!i(r)){let u=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(p=>{let f=p.instancePath||p.schemaPath||"",h=p.message||"\u672A\u77E5\u9519\u8BEF";if(p.keyword==="required")return`\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: ${p.params?.missingProperty||"\u672A\u77E5\u5B57\u6BB5"}`;if(p.keyword==="type"){let x=p.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${f} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${x}`}if(p.keyword==="enum"){let x=p.params?.allowedValues||[];return`\u53C2\u6570 ${f} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${x.join(", ")}`}return`\u53C2\u6570 ${f} ${h}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,u),new Error(u)}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),new Error(`\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:n}=this.handleAddToolError(t);return e.fail(r,o,void 0,n)}}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}`),!Object.values(pe).includes(r))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(pe).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:n,parameterConfig:i}=t,a=this.performPreChecks(r,o,n);if(a)return e.fail(a.code,a.message,void 0,a.status);let l=this.convertWorkflowToTool(r,o,n,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:n,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 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);try{await this.validateServiceAndTool(a,r,o)}catch(te){let qs=te instanceof Error?te.message:String(te);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",qs,void 0,404)}let g=await new K().getAllCachedTools(),u=`${r}__${o}`,p=g.find(te=>te.name===u);if(!p)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`,void 0,404);let f=n||u,h=S.getCustomMCPTools();if(new Set(h.map(te=>te.name)).has(f))return e.fail("TOOL_NAME_CONFLICT",`\u5DE5\u5177\u540D\u79F0 "${f}" \u5DF2\u5B58\u5728\uFF0C\u8BF7\u4F7F\u7528\u4E0D\u540C\u7684\u81EA\u5B9A\u4E49\u540D\u79F0`,void 0,409);let Ge={name:f,description:i||p.description||`MCP \u5DE5\u5177: ${r}/${o}`,inputSchema:p.inputSchema||{},handler:{type:"mcp",config:{serviceName:r,toolName:o}},stats:{usageCount:0,lastUsedTime:ut().format("YYYY-MM-DD HH:mm:ss")}};S.addCustomMCPTool(Ge),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 xt=S.getServerToolsConfig(r);xt?.toolName&&(xt[o].enable=!0,S.updateServerToolsConfig(r,xt),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: ${f}`);let js={tool:Ge,toolName:f,toolType:"mcp",addedAt:ut().format("YYYY-MM-DD HH:mm:ss")};return e.success(js,`MCP \u5DE5\u5177 "${f}" \u6DFB\u52A0\u6210\u529F`)}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:n,parameterConfig:i}=t;e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,o,n);if(a)return e.fail(a.code,a.message,void 0,a.status);let l=this.convertWorkflowToTool(r,o,n,i);S.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:ut().format("YYYY-MM-DD HH:mm:ss")};return e.success(g,`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:n}=this.handleUpdateToolError(t);return e.fail(r,o,void 0,n)}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:n}=r;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!Object.values(pe).includes(o))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(pe).join(", ")}`,void 0,400);switch(o){case"coze":return await this.handleUpdateCozeTool(e,t,n);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:n,customDescription:i,parameterConfig:a}=r;e.get("logger").info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=S.getCustomMCPTools().find(h=>h.name===t);if(!g)return e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`,void 0,404);if(g.handler.type!=="proxy"||g.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&&g.handler?.config?.workflow_id&&(o.workflow_id=g.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 u=this.generateInputSchema(o,a),p={...g,description:i||g.description,inputSchema:u};S.updateCustomMCPTool(t,p),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let f={tool:p,toolName:t,toolType:"coze",updatedAt:ut().format("YYYY-MM-DD HH:mm:ss")};return e.success(f,`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(n=>n.name===t);if(o&&o.handler.type==="mcp"){let n=o.handler.config;if(n.serviceName&&n.toolName){e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`);let i=S.getServerToolsConfig(n.serviceName);i?.[n.toolName]&&(i[n.toolName].enable=!1,S.updateServerToolsConfig(n.serviceName,i),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.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:n}=this.handleRemoveToolError(t);return e.fail(r,o,void 0,n)}}convertWorkflowToTool(e,t,r,o){this.validateWorkflowData(e);let n=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(n),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,o),g=this.createHttpHandler(e),u={name:i,description:a,inputSchema:l,handler:g};return this.validateGeneratedTool(u),u}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[o,n]of Object.entries(t))r=r.replace(new RegExp(o,"g"),n);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw new Error("\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 new Error("\u5DE5\u4F5C\u6D41\u6570\u636E\u4E0D\u80FD\u4E3A\u7A7A");if(e.workflow_id){if(typeof e.workflow_id!="string"||e.workflow_id.trim()==="")throw new Error("\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw new Error("\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 new Error("\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw new Error("\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 new Error("\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\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 new Error("\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 n=e[r];if(!n||typeof n!="string"||n.trim()==="")throw new Error(`${o}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!/^\d+$/.test(e.workflow_id))throw new Error("\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw new Error("\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 new Error("\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw new Error("\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 new Error("\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:n}of t){let i=e[r];if(i&&i.length>n)throw new Error(`${o}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${n}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw new Error("\u521B\u5EFA\u8005ID\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");if(!e.creator.name||typeof e.creator.name!="string")throw new Error("\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 new Error("\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 new Error(`\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,n=1;for(;r.has(o);)if(o=`${e}_${n}`,n++,n>999)throw new Error(`\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 new Error("\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 new Error("\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 new Error("\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 new Error(`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.description!="string"||e.description.trim()==="")throw new Error("\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw new Error("\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw new Error("HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw new Error("\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw new Error("Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw new Error("\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw new Error("\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw new Error("\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw new Error(`\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 new Error("Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw new Error("Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw new Error("\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw new Error("\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||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(o))throw new Error(`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u6709\u6548\u7684\u5BF9\u8C61");if(!e.type||e.type!=="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw new Error("\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw new Error("\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 n=this.checkSystemStatus();if(n)return n;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:n,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 a=["enable","disable","status","toggle"];if(!a.includes(r))return e.fail("INVALID_ACTION",`\u65E0\u6548\u7684 action: ${r}\u3002\u652F\u6301\u7684 action: ${a.join(", ")}`,void 0,400);switch(this.validateToolIdentifier(o,n),r){case"enable":return this.handleEnableTool(e,o,n,i);case"disable":return this.handleDisableTool(e,o,n);case"status":return this.handleGetToolStatus(e,o,n);case"toggle":return this.handleToggleTool(e,o,n);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 n=S.getServerToolsConfig(t)[r];return n?e.success({serverName:t,toolName:r,enabled:n.enable!==!1,description:n.description||"",usageCount:n.usageCount,lastUsedTime:n.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 n=!S.isToolEnabled(t,r);return S.setToolEnabled(t,r,n),e.get("logger").info(`\u5DE5\u5177\u72B6\u6001\u5DF2\u5207\u6362: ${t}/${r} -> ${n}`),e.success({serverName:t,toolName:r,enabled:n},`\u5DE5\u5177 "${t}__${r}" \u5DF2${n?"\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 n=S.getServerToolsConfig(t),i=Object.entries(n).map(([g,u])=>{let p={toolName:g,enabled:u.enable!==!1,description:u.description||""};return r&&(p.usageCount=u.usageCount,p.lastUsedTime=u.lastUsedTime),p}),a=i.filter(g=>g.enabled).length,l=i.length-a;return e.success({serverName:t,tools:i,total:i.length,enabledCount:a,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[n,i]of Object.entries(r)){let a=Object.entries(i.tools||{}).map(([g,u])=>{let p={toolName:g,enabled:u.enable!==!1,description:u.description||""};return t&&(p.usageCount=u.usageCount,p.lastUsedTime=u.lastUsedTime),p}),l=a.filter(g=>g.enabled).length;o.servers.push({serverName:n,tools:a,total:a.length,enabledCount:l,disabledCount:a.length-l}),o.totalTools+=a.length,o.totalEnabled+=l,o.totalDisabled+=a.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 new Error("\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw new Error("\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("\u670D\u52A1\u540D\u79F0\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(!/^[a-zA-Z0-9_-]+$/.test(t))throw new Error("\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 new Error(`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!S.getServerToolsConfig(e)[t])throw new Error(`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}};import{z as Z}from"zod";var In=Z.object({limit:Z.string().optional().transform(s=>s?Number.parseInt(s,10):void 0).refine(s=>s===void 0||s>=1&&s<=Ht.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Ht.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:Z.string().optional().transform(s=>s?Number.parseInt(s,10):void 0).refine(s=>s===void 0||s>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:Z.string().optional(),serverName:Z.string().optional(),success:Z.string().optional().transform(s=>s?s.toLowerCase()==="true":void 0),startDate:Z.string().optional().refine(s=>{if(!s)return!0;let e=Date.parse(s);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:Z.string().optional().refine(s=>{if(!s)return!0;let e=Date.parse(s);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(s=>!s.startDate||!s.endDate?!0:new Date(s.startDate)<=new Date(s.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),dt=class extends I{static{c(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new tt}parseAndValidateQueryParams(e){let t=e.req.query(),r=In.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.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 Mc,spawn as Pc}from"child_process";import{promisify as yc}from"util";var Fe=Ks(Hs(),1);var ks=yc(Mc),ne=class{static{c(this,"NPMManager")}eventBus;constructor(e){this.eventBus=e||T()}async installVersion(e){let t=`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,r=Date.now();this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=Pc("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((n,i)=>{o.stdout.on("data",a=>{let l=a.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),o.stderr.on("data",a=>{let l=a.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),o.on("close",a=>{let l=Date.now()-r;if(a===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),n();else{let g=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${a}`;this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:g,duration:l,timestamp:Date.now()}),i(new Error(g))}})})}async getCurrentVersion(){let{stdout:e}=await ks("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 ks("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(n=>n&&typeof n=="string"&&Fe.default.valid(n));return e!=="all"&&(o=o.filter(n=>{let i=Fe.default.prerelease(n);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((n,i)=>Fe.default.rcompare(n,i))}catch{return[]}}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=Fe.default.gt(r,e)}catch{o=r!==e}return{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return{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 Fs}from"zod";var Nc=Fs.object({version:Fs.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),Nt=class extends I{static{c(this,"UpdateApiHandler")}npmManager;eventBus=T();activeInstalls=new Map;constructor(){super(),this.npmManager=new ne(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=Nc.safeParse(t);if(!r.success)return e.fail("INVALID_VERSION","\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",r.error.errors.map(a=>({field:a.path.join("."),message:a.message})),400);let{version:o}=r.data;if(Array.from(this.activeInstalls.values()).some(a=>a))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(a=>{i.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",a)}),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 dr}from"@xiaozhi-client/version";var It=class extends I{static{c(this,"VersionApiHandler")}async getVersion(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=dr.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=dr.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"),dr.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 n=await new ne().getAvailableVersions(t);return e.get("logger").debug(`\u83B7\u53D6\u5230 ${n.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.success({versions:n,type:t,total:n.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 ne().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")}}};var mr=c(async(s,e)=>{s.set("logger",v),s.logger=v,await e()},"loggerMiddleware");import{cors as Ic}from"hono/cors";var hr=Ic({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(s=>s.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]});var fr=c((s,e)=>(e.logger.error("HTTP request error:",s),process.env.NODE_ENV,e.fail("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?s.stack:void 0,500)),"errorHandlerMiddleware"),Cr=c(s=>s.req.path.startsWith("/api/")?s.fail("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:s.req.path,method:s.req.method},404):s.fail("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:s.req.path,method:s.req.method},404),"notFoundHandlerMiddleware");var Er=c(async(s,e)=>{s.success=(t,r,o=200)=>{let n={success:!0,message:r};return t!==void 0&&(n.data=t),s.json(n,o)},s.fail=(t,r,o,n=400)=>{let i={success:!1,error:{code:t,message:r}};return o!==void 0&&(i.error.details=o),s.json(i,n)},s.paginate=(t,r,o)=>{let n={success:!0,data:t,pagination:r,message:o};return s.json(n,200)},await e()},"responseEnhancerMiddleware");var me=class extends Error{static{c(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},Ue=class extends Error{static{c(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}};var vr=c(async(s,e)=>{if(!s.get("mcpServiceManager"))try{s.logger.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let t=s.get("webServer");if(!t)throw new Ue("WebServer \u672A\u6CE8\u5165\u5230 Context");let r=t.getMCPServiceManager();s.set("mcpServiceManager",r),s.logger.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){if(t instanceof me)s.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof Ue?(s.logger.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(s.logger.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware");var Sr=c(()=>async(s,e)=>{let t=s.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();s.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))s.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware");import{configManager as wc}from"@xiaozhi-client/config";var Tr=c(()=>{let s=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?s=new Te(o,wc):s=null),t.set("endpointHandler",s),await r()}},"endpointsMiddleware");var wt=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=v,this.eventBus=T()}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.warn("\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 Ac}from"@xiaozhi-client/config";var At=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=v,this.eventBus=T(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=Ac.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:c(o=>{t.readyState===1&&t.send(o)},"send")};this.clients.set(e,r),this.logger.info(`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.info(`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,n]of this.clients)this.sendMessageToClient(n,r,o)}sendToClient(e,t,r){let o={type:t,data:r,timestamp:Date.now()},n=this.clients.get(e);n?this.sendMessageToClient(n,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.info(`\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.info(`\u6E05\u7406\u4E86 ${e.length} \u4E2A\u65AD\u5F00\u7684\u5BA2\u6237\u7AEF`)}destroy(){this.logger.info("\u9500\u6BC1\u901A\u77E5\u670D\u52A1"),this.clients.clear(),this.messageQueue.clear()}};import{serve as Hc}from"@hono/node-server";import{normalizeServiceConfig as kc}from"@xiaozhi-client/config";import{configManager as qe}from"@xiaozhi-client/config";import{EndpointManager as Fc}from"@xiaozhi-client/endpoint";import{WebSocketServer as Uc}from"ws";function bc(s){return Array.isArray(s.routes)}c(bc,"isRouteGroup");function Us(s){if(bc(s)){let{routes:e,middleware:t}=s;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return s}c(Us,"normalizeRoutes");function P(s){return e=>t=>{let o=t.get("dependencies")[s];return e(o,t)}}c(P,"createHandler");var Ve=class{static{c(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=Us(t);this.routes.has(e),this.routes.set(e,r)}registerRoutes(e){for(let[t,r]of Object.entries(e))this.registerRoute(t,r)}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],[n])=>o==="static"?1:n==="static"?-1:0);let r=0;for(let[o,n]of t)try{for(let i of n)this.applyRouteDefinition(e,i,o),r++}catch{}}applyRouteDefinition(e,t,r){let{method:o,path:n,handler:i,middleware:a=[]}=t,l=c(async(g,u)=>{try{return await i(g)}catch(p){return g.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",p instanceof Error?p.message:String(p),500)}},"wrappedHandler");switch(o){case"GET":a.length>0?e.get(n,...a,l):e.get(n,l);break;case"POST":a.length>0?e.post(n,...a,l):e.post(n,l);break;case"PUT":a.length>0?e.put(n,...a,l):e.put(n,l);break;case"DELETE":a.length>0?e.delete(n,...a,l):e.delete(n,l);break;case"PATCH":a.length>0?e.patch(n,...a,l):e.patch(n,l);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${o}`)}}clear(){this.routes.clear()}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}};var G=P("configApiHandler"),Rr=[{method:"GET",path:"/api/config",handler:G((s,e)=>s.getConfig(e))},{method:"PUT",path:"/api/config",handler:G((s,e)=>s.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:G((s,e)=>s.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:G((s,e)=>s.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:G((s,e)=>s.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:G((s,e)=>s.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:G((s,e)=>s.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:G((s,e)=>s.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:G((s,e)=>s.checkConfigExists(e))}];var he=P("statusApiHandler"),Mr=[{method:"GET",path:"/api/status",handler:he((s,e)=>s.getStatus(e))},{method:"GET",path:"/api/status/client",handler:he((s,e)=>s.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:he((s,e)=>s.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:he((s,e)=>s.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:he((s,e)=>s.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:he((s,e)=>s.setActiveMCPServers(e))}];var ee=P("mcpToolHandler"),Pr=[{method:"POST",path:"/api/tools/call",handler:ee((s,e)=>s.callTool(e))},{method:"GET",path:"/api/tools/list",handler:ee((s,e)=>s.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:ee((s,e)=>s.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:ee((s,e)=>s.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:ee((s,e)=>s.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:ee((s,e)=>s.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:ee((s,e)=>s.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:ee((s,e)=>s.listMCPTools(e))}];var Oc=P("mcpRouteHandler"),yr=[{method:"POST",path:"/mcp",handler:Oc((s,e)=>s.handlePost(e))}];var bt=P("versionApiHandler"),Nr=[{method:"GET",path:"/api/version",handler:bt((s,e)=>s.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:bt((s,e)=>s.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:bt((s,e)=>s.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:bt((s,e)=>s.checkLatestVersion(e))}];var ze=P("serviceApiHandler"),Ir=[{method:"POST",path:"/api/services/restart",handler:ze((s,e)=>s.restartService(e))},{method:"POST",path:"/api/services/stop",handler:ze((s,e)=>s.stopService(e))},{method:"POST",path:"/api/services/start",handler:ze((s,e)=>s.startService(e))},{method:"GET",path:"/api/services/status",handler:ze((s,e)=>s.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:ze((s,e)=>s.getServiceHealth(e))}];var _c=P("updateApiHandler"),wr=[{method:"POST",path:"/api/update",handler:_c((s,e)=>s.performUpdate(e))}];var xc=P("staticFileHandler"),Ar=[{method:"GET",path:"/*",handler:xc(async(s,e)=>e.req.path.startsWith("/api/")?e.notFound():await s.handleStaticFile(e))}];var Ot=P("cozeHandler"),br=[{method:"GET",path:"/api/coze/workspaces",handler:Ot((s,e)=>s.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:Ot((s,e)=>s.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:Ot((s,e)=>s.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:Ot((s,e)=>s.getCacheStats(e))}];var Lc=P("mcpToolLogHandler"),Or=[{method:"GET",path:"/api/tool-calls/logs",handler:Lc((s,e)=>s.getToolCallLogs(e))}];var _t=c(async(s,e)=>{let r=s.get("dependencies").mcpHandler;return r?await e(r):s.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),_r=[{method:"POST",path:"/api/mcp-servers",handler:c(s=>_t(s,e=>e.addMCPServer(s)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:c(s=>_t(s,e=>e.removeMCPServer(s)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:c(s=>_t(s,e=>e.getMCPServerStatus(s)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:c(s=>_t(s,e=>e.listMCPServers(s)),"handler")}];var Vs=c((s,e)=>({error:{code:s,message:e}}),"createErrorResponse"),je=c(async(s,e)=>{let t=s.get("endpointHandler");if(!t){let r=Vs("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");return s.json(r,503)}try{return await t[e](s)}catch(r){let o=Vs("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return s.json(o,500)}},"withEndpointHandler"),xr=[{method:"POST",path:"/api/endpoint/status",handler:c(s=>je(s,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:c(s=>je(s,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:c(s=>je(s,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:c(s=>je(s,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:c(s=>je(s,"removeEndpoint"),"handler")}];var Dc=P("serviceApiHandler"),Lr=[{method:"POST",path:"/api/restart",handler:Dc((s,e)=>s.restartService(e))}];var zs=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;mcpToolHandler;mcpToolLogHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpHandler;updateApiHandler;cozeHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointManager=null;mcpServiceManager=null;constructor(e){try{this.port=e??qe.getWebUIPort()??le.DEFAULT_PORT}catch{this.port=e??le.DEFAULT_PORT}this.logger=v,this.eventBus=T(),this.statusService=new wt,this.notificationService=new At,this.configApiHandler=new We,this.statusApiHandler=new gt(this.statusService),this.serviceApiHandler=new ct(this.statusService),this.mcpToolHandler=new pt,this.mcpToolLogHandler=new dt,this.versionApiHandler=new It,this.staticFileHandler=new Oe,this.mcpRouteHandler=new st,this.updateApiHandler=new Nt,this.cozeHandler=new ve,this.realtimeNotificationHandler=new it(this.notificationService,this.statusService),this.heartbeatHandler=new Ke(this.statusService,this.notificationService),this.app=jr(),this.setupMiddleware(),this.app.notFound(Cr),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 Ie,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new Ae(this.mcpServiceManager,qe),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:Qe(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
84
+ `;return e.html(r)}isWebPathAvailable(){return this.webPath!==null&&gt(this.webPath)}getWebPath(){return this.webPath}reinitializeWebPath(){this.initializeWebPath()}};var ut=class extends A{static{c(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 pe=(o=>(o.MCP="mcp",o.COZE="coze",o.HTTP="http",o.FUNCTION="function",o))(pe||{});var An={name:c((s,e)=>s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN"),"name"),enabled:c((s,e)=>{let t=Number(e.enabled)-Number(s.enabled);return t!==0?t:s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN")},"enabled"),usageCount:c((s,e)=>{let t=e.usageCount-s.usageCount;return t!==0?t:s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN")},"usageCount"),lastUsedTime:c((s,e)=>{if(!s.lastUsedTime)return 1;if(!e.lastUsedTime)return-1;let t=new Date(e.lastUsedTime).getTime()-new Date(s.lastUsedTime).getTime();return t!==0?t:s.serviceName!==e.serviceName?s.serviceName.localeCompare(e.serviceName,"zh-CN"):s.originalName.localeCompare(e.originalName,"zh-CN")},"lastUsedTime")};function Xr(s,e){let t=An[e.field];return t?[...s].sort(t):s}c(Xr,"sortTools");import{configManager as S}from"@xiaozhi-client/config";import Nn from"ajv";import dt from"dayjs";var pt=class{static{c(this,"MCPToolHandler")}logger;ajv;constructor(){this.logger=T,this.ajv=new Nn({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:n}=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(n));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,n||{});let a;if(r==="customMCP")a=await i.callTool(o,n||{},{timeout:6e4});else{let l=`${r}__${o}`;a=await i.callTool(l,n||{})}return e.success(a,"\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(n){return e.get("logger").error("\u8BFB\u53D6\u81EA\u5B9A\u4E49 MCP \u5DE5\u5177\u914D\u7F6E\u5931\u8D25:",n),e.fail("CONFIG_PARSE_ERROR",`\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.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"],n=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 a=i.getAllTools(t);a=Xr(a,{field:n});let l=a.map(u=>({name:u.name,description:u.description,inputSchema:u.inputSchema,handler:{type:"mcp",config:{serviceName:u.serviceName,toolName:u.originalName}},enabled:u.enabled,usageCount:u.usageCount,lastUsedTime:u.lastUsedTime})),g={list:l,total:l.length};return e.success(g,`\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(n=>n.name);throw o.length===0?p.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`):p.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 n=e.getCustomMCPTools().find(i=>i.name===r);n&&!n.description&&this.logger.warn(`customMCP \u5DE5\u5177 '${r}' \u7F3A\u5C11\u63CF\u8FF0\u4FE1\u606F`),n&&!n.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),p.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 n=e.getCustomMCPTools().find(l=>l.name===t);if(!n)throw p.validationError("TOOL_NOT_FOUND",`customMCP \u5DE5\u5177 '${t}' \u4E0D\u5B58\u5728`);if(!n.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(n.inputSchema);if(!i(r)){let u=`\u53C2\u6570\u9A8C\u8BC1\u5931\u8D25: ${(i.errors||[]).map(d=>{let C=d.instancePath||d.schemaPath||"",f=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 L=d.params?.type||"\u672A\u77E5\u7C7B\u578B";return`\u53C2\u6570 ${C} \u7C7B\u578B\u9519\u8BEF\uFF0C\u671F\u671B: ${L}`}if(d.keyword==="enum"){let L=d.params?.allowedValues||[];return`\u53C2\u6570 ${C} \u503C\u65E0\u6548\uFF0C\u5141\u8BB8\u7684\u503C: ${L.join(", ")}`}return`\u53C2\u6570 ${C} ${f}`}).join("; ")}`;throw this.logger.error(`customMCP \u5DE5\u5177 '${t}' \u53C2\u6570\u9A8C\u8BC1\u5931\u8D25:`,u),p.validationError("TOOL_VALIDATION_FAILED",u)}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),p.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:n}=this.handleAddToolError(t);return e.fail(r,o,void 0,n)}}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}`),!Object.values(pe).includes(r))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${r}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(pe).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:n,parameterConfig:i}=t,a=this.performPreChecks(r,o,n);if(a)return e.fail(a.code,a.message,void 0,a.status);let l=this.convertWorkflowToTool(r,o,n,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:n,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 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);try{await this.validateServiceAndTool(a,r,o)}catch(re){let Gs=re instanceof Error?re.message:String(re);return e.fail("SERVICE_OR_TOOL_NOT_FOUND",Gs,void 0,404)}let g=await new Q().getAllCachedTools(),u=`${r}__${o}`,d=g.find(re=>re.name===u);if(!d)return e.fail("TOOL_NOT_FOUND",`\u5728\u7F13\u5B58\u4E2D\u672A\u627E\u5230\u5DE5\u5177: ${r}/${o}`,void 0,404);let C=n||u,f=S.getCustomMCPTools();if(new Set(f.map(re=>re.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 Be={name:C,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(Be),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 xt=S.getServerToolsConfig(r);xt?.toolName&&(xt[o].enable=!0,S.updateServerToolsConfig(r,xt),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: ${C}`);let qs={tool:Be,toolName:C,toolType:"mcp",addedAt:dt().format("YYYY-MM-DD HH:mm:ss")};return e.success(qs,`MCP \u5DE5\u5177 "${C}" \u6DFB\u52A0\u6210\u529F`)}async handleAddCozeTool(e,t){let{workflow:r,customName:o,customDescription:n,parameterConfig:i}=t;e.get("logger").info(`\u5904\u7406\u6DFB\u52A0 Coze \u5DE5\u5177: ${r.workflow_name}`);let a=this.performPreChecks(r,o,n);if(a)return e.fail(a.code,a.message,void 0,a.status);let l=this.convertWorkflowToTool(r,o,n,i);S.addCustomMCPTool(l),e.get("logger").info(`\u6210\u529F\u6DFB\u52A0 Coze \u5DE5\u5177: ${l.name}`);let g={tool:l,toolName:l.name,toolType:"coze",addedAt:dt().format("YYYY-MM-DD HH:mm:ss")};return e.success(g,`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:n}=this.handleUpdateToolError(t);return e.fail(r,o,void 0,n)}}async handleNewFormatUpdateTool(e,t,r){let{type:o,data:n}=r;if(e.get("logger").info(`\u5904\u7406\u65B0\u683C\u5F0F\u5DE5\u5177\u66F4\u65B0\u8BF7\u6C42\uFF0C\u7C7B\u578B: ${o}`),!Object.values(pe).includes(o))return e.fail("INVALID_TOOL_TYPE",`\u4E0D\u652F\u6301\u7684\u5DE5\u5177\u7C7B\u578B: ${o}\u3002\u652F\u6301\u7684\u7C7B\u578B: ${Object.values(pe).join(", ")}`,void 0,400);switch(o){case"coze":return await this.handleUpdateCozeTool(e,t,n);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:n,customDescription:i,parameterConfig:a}=r;e.get("logger").info(`\u5904\u7406\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let g=S.getCustomMCPTools().find(f=>f.name===t);if(!g)return e.fail("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u4E0D\u5B58\u5728`,void 0,404);if(g.handler.type!=="proxy"||g.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&&g.handler?.config?.workflow_id&&(o.workflow_id=g.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 u=this.generateInputSchema(o,a),d={...g,description:i||g.description,inputSchema:u};S.updateCustomMCPTool(t,d),e.get("logger").info(`\u6210\u529F\u66F4\u65B0 Coze \u5DE5\u5177: ${t}`);let C={tool:d,toolName:t,toolType:"coze",updatedAt:dt().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 o=S.getCustomMCPTools().find(n=>n.name===t);if(o&&o.handler.type==="mcp"){let n=o.handler.config;if(n.serviceName&&n.toolName){e.get("logger").info(`\u68C0\u6D4B\u5230 MCP \u5DE5\u5177\u5220\u9664\uFF0C\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.toolName}`);let i=S.getServerToolsConfig(n.serviceName);i?.[n.toolName]&&(i[n.toolName].enable=!1,S.updateServerToolsConfig(n.serviceName,i),e.get("logger").info(`\u5DF2\u540C\u6B65\u7981\u7528 mcpServerConfig \u4E2D\u7684\u5DE5\u5177: ${n.serviceName}/${n.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:n}=this.handleRemoveToolError(t);return e.fail(r,o,void 0,n)}}convertWorkflowToTool(e,t,r,o){this.validateWorkflowData(e);let n=t||this.sanitizeToolName(e.workflow_name),i=this.resolveToolNameConflict(n),a=this.generateToolDescription(e,r),l=this.generateInputSchema(e,o),g=this.createHttpHandler(e),u={name:i,description:a,inputSchema:l,handler:g};return this.validateGeneratedTool(u),u}sanitizeToolName(e){if(!e||typeof e!="string")return"coze_workflow_unnamed";let t=e.trim();return t?(t=this.convertChineseToEnglish(t),t=t.replace(/[^a-zA-Z0-9_]/g,"_"),t=t.replace(/_+/g,"_"),t=t.replace(/^_+|_+$/g,""),/^[a-zA-Z]/.test(t)||(t=`coze_workflow_${t}`),t.length>45&&(t=t.substring(0,45)),t||(t="coze_workflow_tool"),t):"coze_workflow_empty"}convertChineseToEnglish(e){let t={\u5DE5\u4F5C\u6D41:"workflow",\u6D4B\u8BD5:"test",\u6570\u636E:"data",\u5904\u7406:"process",\u5206\u6790:"analysis",\u751F\u6210:"generate",\u67E5\u8BE2:"query",\u641C\u7D22:"search",\u8F6C\u6362:"convert",\u8BA1\u7B97:"calculate",\u7EDF\u8BA1:"statistics",\u62A5\u544A:"report",\u6587\u6863:"document",\u56FE\u7247:"image",\u89C6\u9891:"video",\u97F3\u9891:"audio",\u6587\u672C:"text",\u7FFB\u8BD1:"translate",\u8BC6\u522B:"recognize",\u68C0\u6D4B:"detect",\u76D1\u63A7:"monitor",\u7BA1\u7406:"manage",\u914D\u7F6E:"config",\u8BBE\u7F6E:"setting",\u7528\u6237:"user",\u7CFB\u7EDF:"system",\u670D\u52A1:"service",\u63A5\u53E3:"api",\u6570\u636E\u5E93:"database",\u7F51\u7EDC:"network",\u5B89\u5168:"security",\u5907\u4EFD:"backup",\u6062\u590D:"restore",\u540C\u6B65:"sync",\u5BFC\u5165:"import",\u5BFC\u51FA:"export",\u4E0A\u4F20:"upload",\u4E0B\u8F7D:"download"},r=e;for(let[o,n]of Object.entries(t))r=r.replace(new RegExp(o,"g"),n);return/[\u4e00-\u9fa5]/.test(r)&&(r=`chinese_${r}`),r}validateWorkflowData(e){if(!e)throw p.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 p.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 p.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^\d+$/.test(e.workflow_id))throw p.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 p.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(e.workflow_name.length>100)throw p.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 p.validationError("TOOL_VALIDATION_FAILED","\u5E94\u7528ID\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw p.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 p.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 n=e[r];if(!n||typeof n!="string"||n.trim()==="")throw p.validationError("TOOL_VALIDATION_FAILED",`${o}\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`)}}validateFieldFormats(e){if(!/^\d+$/.test(e.workflow_id))throw p.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u4F5C\u6D41ID\u683C\u5F0F\u65E0\u6548\uFF0C\u5E94\u4E3A\u6570\u5B57\u5B57\u7B26\u4E32");if(!/^[a-zA-Z0-9_-]+$/.test(e.app_id))throw p.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 p.validationError("TOOL_VALIDATION_FAILED","\u56FE\u6807URL\u683C\u5F0F\u65E0\u6548")}if(e.created_at&&(!Number.isInteger(e.created_at)||e.created_at<=0))throw p.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 p.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:n}of t){let i=e[r];if(i&&i.length>n)throw p.validationError("TOOL_VALIDATION_FAILED",`${o}\u8FC7\u957F\uFF0C\u4E0D\u80FD\u8D85\u8FC7${n}\u4E2A\u5B57\u7B26`)}}validateBusinessLogic(e){if(e.creator){if(!e.creator.id||typeof e.creator.id!="string")throw p.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 p.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 p.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 p.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,n=1;for(;r.has(o);)if(o=`${e}_${n}`,n++,n>999)throw p.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 p.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 p.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 p.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 p.validationError("TOOL_VALIDATION_FAILED",`\u5DE5\u5177\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5: ${r}`);if(typeof e.name!="string"||e.name.trim()==="")throw p.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 p.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u63CF\u8FF0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");if(typeof e.inputSchema!="object")throw p.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u662F\u5BF9\u8C61");if(typeof e.handler!="object")throw p.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}validateProxyHandler(e){if(!e||typeof e!="object")throw p.validationError("TOOL_VALIDATION_FAILED","HTTP\u5904\u7406\u5668\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A");if(e.type!=="proxy")throw p.validationError("TOOL_VALIDATION_FAILED","\u5904\u7406\u5668\u7C7B\u578B\u5FC5\u987B\u662F'proxy'");if(e.platform==="coze"){if(!e.config.workflow_id)throw p.validationError("TOOL_VALIDATION_FAILED","Coze\u5904\u7406\u5668\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684workflow_id")}else throw p.configError("INVALID_CONFIG","\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u6D41\u5E73\u53F0")}validateAuthConfig(e){if(!e||typeof e!="object")throw p.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61");if(!e.type||typeof e.type!="string")throw p.validationError("TOOL_VALIDATION_FAILED","\u8BA4\u8BC1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A");let t=["bearer","basic","api_key"];if(!t.includes(e.type))throw p.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 p.validationError("TOOL_VALIDATION_FAILED","Bearer\u8BA4\u8BC1\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684token");if(!e.token.startsWith("${")&&!e.token.match(/^[a-zA-Z0-9_-]+$/))throw p.validationError("TOOL_VALIDATION_FAILED","Bearer token\u683C\u5F0F\u65E0\u6548")}}validateBodyTemplate(e){if(typeof e!="string")throw p.validationError("TOOL_VALIDATION_FAILED","\u8BF7\u6C42\u4F53\u6A21\u677F\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");try{JSON.parse(e)}catch{throw p.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||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(o))throw p.validationError("TOOL_VALIDATION_FAILED",`\u6A21\u677F\u53D8\u91CF\u683C\u5F0F\u65E0\u6548: ${r}`)}}validateJsonSchema(e){if(!e||typeof e!="object")throw p.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 p.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u7684type\u5FC5\u987B\u662F'object'");if(!e.properties||typeof e.properties!="object")throw p.validationError("TOOL_VALIDATION_FAILED","\u8F93\u5165\u53C2\u6570\u7ED3\u6784\u5FC5\u987B\u5305\u542Bproperties\u5B57\u6BB5");if(e.required&&!Array.isArray(e.required))throw p.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 n=this.checkSystemStatus();if(n)return n;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:n,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 a=["enable","disable","status","toggle"];if(!a.includes(r))return e.fail("INVALID_ACTION",`\u65E0\u6548\u7684 action: ${r}\u3002\u652F\u6301\u7684 action: ${a.join(", ")}`,void 0,400);switch(this.validateToolIdentifier(o,n),r){case"enable":return this.handleEnableTool(e,o,n,i);case"disable":return this.handleDisableTool(e,o,n);case"status":return this.handleGetToolStatus(e,o,n);case"toggle":return this.handleToggleTool(e,o,n);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 n=S.getServerToolsConfig(t)[r];return n?e.success({serverName:t,toolName:r,enabled:n.enable!==!1,description:n.description||"",usageCount:n.usageCount,lastUsedTime:n.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 n=!S.isToolEnabled(t,r);return S.setToolEnabled(t,r,n),e.get("logger").info(`\u5DE5\u5177\u72B6\u6001\u5DF2\u5207\u6362: ${t}/${r} -> ${n}`),e.success({serverName:t,toolName:r,enabled:n},`\u5DE5\u5177 "${t}__${r}" \u5DF2${n?"\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 n=S.getServerToolsConfig(t),i=Object.entries(n).map(([g,u])=>{let d={toolName:g,enabled:u.enable!==!1,description:u.description||""};return r&&(d.usageCount=u.usageCount,d.lastUsedTime=u.lastUsedTime),d}),a=i.filter(g=>g.enabled).length,l=i.length-a;return e.success({serverName:t,tools:i,total:i.length,enabledCount:a,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[n,i]of Object.entries(r)){let a=Object.entries(i.tools||{}).map(([g,u])=>{let d={toolName:g,enabled:u.enable!==!1,description:u.description||""};return t&&(d.usageCount=u.usageCount,d.lastUsedTime=u.lastUsedTime),d}),l=a.filter(g=>g.enabled).length;o.servers.push({serverName:n,tools:a,total:a.length,enabledCount:l,disabledCount:a.length-l}),o.totalTools+=a.length,o.totalEnabled+=l,o.totalDisabled+=a.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 p.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!t||typeof t!="string"||t.trim()==="")throw p.validationError("TOOL_VALIDATION_FAILED","\u5DE5\u5177\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");if(!/^[a-zA-Z0-9_-]+$/.test(e))throw p.validationError("TOOL_VALIDATION_FAILED","\u670D\u52A1\u540D\u79F0\u683C\u5F0F\u65E0\u6548\uFF0C\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26");if(!/^[a-zA-Z0-9_-]+$/.test(t))throw p.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 p.validationError("SERVER_NOT_FOUND",`MCP \u670D\u52A1 "${e}" \u4E0D\u5B58\u5728`);if(!S.getServerToolsConfig(e)[t])throw p.validationError("TOOL_NOT_FOUND",`\u5DE5\u5177 "${t}" \u5728\u670D\u52A1 "${e}" \u4E2D\u4E0D\u5B58\u5728\u6216\u672A\u914D\u7F6E`)}};import{z as ee}from"zod";var On=ee.object({limit:ee.string().optional().transform(s=>s?Number.parseInt(s,10):void 0).refine(s=>s===void 0||s>=1&&s<=Ht.MAX_LIMIT,{message:`limit \u53C2\u6570\u5FC5\u987B\u662F 1-${Ht.MAX_LIMIT} \u4E4B\u95F4\u7684\u6570\u5B57`}),offset:ee.string().optional().transform(s=>s?Number.parseInt(s,10):void 0).refine(s=>s===void 0||s>=0,{message:"offset \u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6570"}),toolName:ee.string().optional(),serverName:ee.string().optional(),success:ee.string().optional().transform(s=>s?s.toLowerCase()==="true":void 0),startDate:ee.string().optional().refine(s=>{if(!s)return!0;let e=Date.parse(s);return!Number.isNaN(e)},{message:"startDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"}),endDate:ee.string().optional().refine(s=>{if(!s)return!0;let e=Date.parse(s);return!Number.isNaN(e)},{message:"endDate \u53C2\u6570\u683C\u5F0F\u65E0\u6548"})}).refine(s=>!s.startDate||!s.endDate?!0:new Date(s.startDate)<=new Date(s.endDate),{message:"startDate \u4E0D\u80FD\u665A\u4E8E endDate",path:["startDate"]}),mt=class extends A{static{c(this,"MCPToolLogHandler")}toolCallLogService;constructor(){super(),this.toolCallLogService=new rt}parseAndValidateQueryParams(e){let t=e.req.query(),r=On.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:r.error.errors.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 yc,spawn as Ic}from"child_process";import{promisify as Ac}from"util";var Ve=Qs(Hs(),1);var Fs=Ac(yc),ie=class{static{c(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();this.eventBus.emitEvent("npm:install:started",{version:e,installId:t,timestamp:Date.now()});let o=Ic("npm",["install","-g",`xiaozhi-client@${e}`,"--registry=https://registry.npmmirror.com"]);return new Promise((n,i)=>{o.stdout.on("data",a=>{let l=a.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stdout",message:l,timestamp:Date.now()})}),o.stderr.on("data",a=>{let l=a.toString();this.eventBus.emitEvent("npm:install:log",{version:e,installId:t,type:"stderr",message:l,timestamp:Date.now()})}),o.on("close",a=>{let l=Date.now()-r;if(a===0)this.eventBus.emitEvent("npm:install:completed",{version:e,installId:t,success:!0,duration:l,timestamp:Date.now()}),n();else{let g=`\u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${a}`;this.eventBus.emitEvent("npm:install:failed",{version:e,installId:t,error:g,duration:l,timestamp:Date.now()}),i(new Error(g))}})})}async getCurrentVersion(){let{stdout:e}=await Fs("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 Fs("npm view xiaozhi-client versions --json --registry=https://registry.npmmirror.com"),o=JSON.parse(t).filter(n=>n&&typeof n=="string"&&Ve.default.valid(n));return e!=="all"&&(o=o.filter(n=>{let i=Ve.default.prerelease(n);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((n,i)=>Ve.default.rcompare(n,i))}catch{return[]}}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=Ve.default.gt(r,e)}catch{o=r!==e}return{currentVersion:e,latestVersion:r,hasUpdate:o}}catch(e){return{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 Vs}from"zod";var Nc=Vs.object({version:Vs.string().min(1,"\u7248\u672C\u53F7\u4E0D\u80FD\u4E3A\u7A7A")}),At=class extends A{static{c(this,"UpdateApiHandler")}npmManager;eventBus=R();activeInstalls=new Map;constructor(){super(),this.npmManager=new ie(this.eventBus)}async performUpdate(e){try{let t=await this.parseJsonBody(e,"\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"),r=Nc.safeParse(t);if(!r.success)return e.fail("INVALID_VERSION","\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\u9519\u8BEF",r.error.errors.map(a=>({field:a.path.join("."),message:a.message})),400);let{version:o}=r.data;if(Array.from(this.activeInstalls.values()).some(a=>a))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(a=>{i.error("\u5B89\u88C5\u8FC7\u7A0B\u5931\u8D25:",a)}),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 mr}from"@xiaozhi-client/version";var Nt=class extends A{static{c(this,"VersionApiHandler")}async getVersion(e){try{e.get("logger").debug("\u5904\u7406\u83B7\u53D6\u7248\u672C\u4FE1\u606F\u8BF7\u6C42");let t=mr.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=mr.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"),mr.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 n=await new ie().getAvailableVersions(t);return e.get("logger").debug(`\u83B7\u53D6\u5230 ${n.length} \u4E2A\u53EF\u7528\u7248\u672C (\u7C7B\u578B: ${t})`),e.success({versions:n,type:t,total:n.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 ie().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")}}};var hr=c(async(s,e)=>{s.set("logger",T),s.logger=T,await e()},"loggerMiddleware");import{cors as Oc}from"hono/cors";var fr=Oc({origin:process.env.ALLOWED_ORIGINS?process.env.ALLOWED_ORIGINS.split(",").map(s=>s.trim()):"*",allowMethods:["GET","POST","PUT","OPTIONS"],allowHeaders:["Content-Type"]});var Cr=c((s,e)=>(e.logger.error("HTTP request error:",s),process.env.NODE_ENV,e.fail("INTERNAL_SERVER_ERROR","\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF",process.env.NODE_ENV==="development"?s.stack:void 0,500)),"errorHandlerMiddleware"),Er=c(s=>s.req.path.startsWith("/api/")?s.fail("API_NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:s.req.path,method:s.req.method},404):s.fail("NOT_FOUND","\u8BF7\u6C42\u7684\u8D44\u6E90\u4E0D\u5B58\u5728",{path:s.req.path,method:s.req.method},404),"notFoundHandlerMiddleware");var vr=c(async(s,e)=>{s.success=(t,r,o=200)=>{let n={success:!0,message:r};return t!==void 0&&(n.data=t),s.json(n,o)},s.fail=(t,r,o,n=400)=>{let i={success:!1,error:{code:t,message:r}};return o!==void 0&&(i.error.details=o),s.json(i,n)},s.paginate=(t,r,o)=>{let n={success:!0,data:t,pagination:r,message:o};return s.json(n,200)},await e()},"responseEnhancerMiddleware");var he=class extends Error{static{c(this,"MCPServiceManagerNotInitializedError")}constructor(e){super(e),this.name="MCPServiceManagerNotInitializedError"}},Ue=class extends Error{static{c(this,"WebServerNotAvailableError")}constructor(e){super(e),this.name="WebServerNotAvailableError"}};var Tr=c(async(s,e)=>{if(!s.get("mcpServiceManager"))try{s.logger.debug("[MCPMiddleware] \u6B63\u5728\u4ECE WebServer \u83B7\u53D6 MCPServiceManager \u5B9E\u4F8B");let t=s.get("webServer");if(!t)throw new Ue("WebServer \u672A\u6CE8\u5165\u5230 Context");let r=t.getMCPServiceManager();s.set("mcpServiceManager",r),s.logger.debug("[MCPMiddleware] MCPServiceManager \u5B9E\u4F8B\u5DF2\u6210\u529F\u6CE8\u5165\u5230 Context")}catch(t){if(t instanceof he)s.logger.debug("[MCPMiddleware] MCPServiceManager \u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u5141\u8BB8\u901A\u8FC7");else throw t instanceof Ue?(s.logger.error("[MCPMiddleware] WebServer \u914D\u7F6E\u9519\u8BEF:",t.message),t):(s.logger.error("[MCPMiddleware] \u83B7\u53D6 MCPServiceManager \u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF:",t),t)}await e()},"mcpServiceManagerMiddleware");var Sr=c(()=>async(s,e)=>{let t=s.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();s.set("endpointManager",r)}catch(r){if(r instanceof Error&&r.message.includes("\u672A\u521D\u59CB\u5316"))s.set("endpointManager",null);else throw r}await e()},"endpointManagerMiddleware");import{configManager as _c}from"@xiaozhi-client/config";var Rr=c(()=>{let s=null,e;return async(t,r)=>{let o=t.get("endpointManager");o!==e&&(e=o,o?s=new Re(o,_c):s=null),t.set("endpointHandler",s),await r()}},"endpointsMiddleware");var Ot=class{static{c(this,"StatusService")}logger;eventBus;clientInfo={status:"disconnected",mcpEndpoint:"",activeMCPServers:[]};restartStatus;heartbeatTimeout;HEARTBEAT_TIMEOUT=35e3;constructor(){this.logger=T,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 wc}from"@xiaozhi-client/config";var _t=class{static{c(this,"NotificationService")}logger;eventBus;clients=new Map;messageQueue=new Map;maxQueueSize=100;constructor(){this.logger=T,this.eventBus=R(),this.setupEventListeners()}setupEventListeners(){this.eventBus.onEvent("config:updated",e=>{let t=wc.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:c(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,n]of this.clients)this.sendMessageToClient(n,r,o)}sendToClient(e,t,r){let o={type:t,data:r,timestamp:Date.now()},n=this.clients.get(e);n?this.sendMessageToClient(n,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 Fc}from"@hono/node-server";import{normalizeServiceConfig as Vc}from"@xiaozhi-client/config";import{configManager as Ge}from"@xiaozhi-client/config";import{EndpointManager as Uc}from"@xiaozhi-client/endpoint";import{WebSocketServer as zc}from"ws";function bc(s){return Array.isArray(s.routes)}c(bc,"isRouteGroup");function Us(s){if(bc(s)){let{routes:e,middleware:t}=s;return t&&t.length>0?e.map(r=>({...r,middleware:[...t,...r.middleware||[]]})):e}return s}c(Us,"normalizeRoutes");function P(s){return e=>t=>{let o=t.get("dependencies")[s];return e(o,t)}}c(P,"createHandler");var ze=class{static{c(this,"RouteManager")}routes=new Map;registerRoute(e,t){let r=Us(t);this.routes.has(e),this.routes.set(e,r)}registerRoutes(e){for(let[t,r]of Object.entries(e))this.registerRoute(t,r)}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],[n])=>o==="static"?1:n==="static"?-1:0);let r=0;for(let[o,n]of t)try{for(let i of n)this.applyRouteDefinition(e,i,o),r++}catch{}}applyRouteDefinition(e,t,r){let{method:o,path:n,handler:i,middleware:a=[]}=t,l=c(async(g,u)=>{try{return await i(g)}catch(d){return g.fail("HANDLER_ERROR","\u5904\u7406\u5668\u6267\u884C\u5931\u8D25",d instanceof Error?d.message:String(d),500)}},"wrappedHandler");switch(o){case"GET":a.length>0?e.get(n,...a,l):e.get(n,l);break;case"POST":a.length>0?e.post(n,...a,l):e.post(n,l);break;case"PUT":a.length>0?e.put(n,...a,l):e.put(n,l);break;case"DELETE":a.length>0?e.delete(n,...a,l):e.delete(n,l);break;case"PATCH":a.length>0?e.patch(n,...a,l):e.patch(n,l);break;default:throw new Error(`\u4E0D\u652F\u6301\u7684 HTTP \u65B9\u6CD5: ${o}`)}}clear(){this.routes.clear()}hasRoute(e){return this.routes.has(e)}getRouteNames(){return Array.from(this.routes.keys())}};var B=P("configApiHandler"),Mr=[{method:"GET",path:"/api/config",handler:B((s,e)=>s.getConfig(e))},{method:"PUT",path:"/api/config",handler:B((s,e)=>s.updateConfig(e))},{method:"GET",path:"/api/config/mcp-endpoint",handler:B((s,e)=>s.getMcpEndpoint(e))},{method:"GET",path:"/api/config/mcp-endpoints",handler:B((s,e)=>s.getMcpEndpoints(e))},{method:"GET",path:"/api/config/mcp-servers",handler:B((s,e)=>s.getMcpServers(e))},{method:"GET",path:"/api/config/connection",handler:B((s,e)=>s.getConnectionConfig(e))},{method:"POST",path:"/api/config/reload",handler:B((s,e)=>s.reloadConfig(e))},{method:"GET",path:"/api/config/path",handler:B((s,e)=>s.getConfigPath(e))},{method:"GET",path:"/api/config/exists",handler:B((s,e)=>s.checkConfigExists(e))}];var fe=P("statusApiHandler"),Pr=[{method:"GET",path:"/api/status",handler:fe((s,e)=>s.getStatus(e))},{method:"GET",path:"/api/status/client",handler:fe((s,e)=>s.getClientStatus(e))},{method:"PUT",path:"/api/status/client",handler:fe((s,e)=>s.updateClientStatus(e))},{method:"POST",path:"/api/status/reset",handler:fe((s,e)=>s.resetStatus(e))},{method:"GET",path:"/api/status/mcp-servers",handler:fe((s,e)=>s.getActiveMCPServers(e))},{method:"PUT",path:"/api/status/mcp-servers",handler:fe((s,e)=>s.setActiveMCPServers(e))}];var te=P("mcpToolHandler"),yr=[{method:"POST",path:"/api/tools/call",handler:te((s,e)=>s.callTool(e))},{method:"GET",path:"/api/tools/list",handler:te((s,e)=>s.listTools(e))},{method:"GET",path:"/api/tools/custom",handler:te((s,e)=>s.getCustomTools(e))},{method:"POST",path:"/api/tools/custom",handler:te((s,e)=>s.addCustomTool(e))},{method:"PUT",path:"/api/tools/custom/:toolName",handler:te((s,e)=>s.updateCustomTool(e))},{method:"DELETE",path:"/api/tools/custom/:toolName",handler:te((s,e)=>s.removeCustomTool(e))},{method:"POST",path:"/api/tools/mcp/manage",handler:te((s,e)=>s.manageMCPTool(e))},{method:"POST",path:"/api/tools/mcp/list",handler:te((s,e)=>s.listMCPTools(e))}];var Lc=P("mcpRouteHandler"),Ir=[{method:"POST",path:"/mcp",handler:Lc((s,e)=>s.handlePost(e))}];var wt=P("versionApiHandler"),Ar=[{method:"GET",path:"/api/version",handler:wt((s,e)=>s.getVersion(e))},{method:"GET",path:"/api/version/simple",handler:wt((s,e)=>s.getVersionSimple(e))},{method:"DELETE",path:"/api/version/cache",handler:wt((s,e)=>s.clearVersionCache(e))},{method:"GET",path:"/api/version/latest",handler:wt((s,e)=>s.checkLatestVersion(e))}];var je=P("serviceApiHandler"),Nr=[{method:"POST",path:"/api/services/restart",handler:je((s,e)=>s.restartService(e))},{method:"POST",path:"/api/services/stop",handler:je((s,e)=>s.stopService(e))},{method:"POST",path:"/api/services/start",handler:je((s,e)=>s.startService(e))},{method:"GET",path:"/api/services/status",handler:je((s,e)=>s.getServiceStatus(e))},{method:"GET",path:"/api/services/health",handler:je((s,e)=>s.getServiceHealth(e))}];var xc=P("updateApiHandler"),Or=[{method:"POST",path:"/api/update",handler:xc((s,e)=>s.performUpdate(e))}];var Dc=P("staticFileHandler"),_r=[{method:"GET",path:"/*",handler:Dc(async(s,e)=>e.req.path.startsWith("/api/")?e.notFound():await s.handleStaticFile(e))}];var bt=P("cozeHandler"),wr=[{method:"GET",path:"/api/coze/workspaces",handler:bt((s,e)=>s.getWorkspaces(e))},{method:"GET",path:"/api/coze/workflows",handler:bt((s,e)=>s.getWorkflows(e))},{method:"POST",path:"/api/coze/cache/clear",handler:bt((s,e)=>s.clearCache(e))},{method:"GET",path:"/api/coze/cache/stats",handler:bt((s,e)=>s.getCacheStats(e))}];var $c=P("mcpToolLogHandler"),br=[{method:"GET",path:"/api/tool-calls/logs",handler:$c((s,e)=>s.getToolCallLogs(e))}];var Lt=c(async(s,e)=>{let r=s.get("dependencies").mcpHandler;return r?await e(r):s.json({error:"MCP Server API Handler not initialized"},503)},"withMCPServerHandler"),Lr=[{method:"POST",path:"/api/mcp-servers",handler:c(s=>Lt(s,e=>e.addMCPServer(s)),"handler")},{method:"DELETE",path:"/api/mcp-servers/:serverName",handler:c(s=>Lt(s,e=>e.removeMCPServer(s)),"handler")},{method:"GET",path:"/api/mcp-servers/:serverName/status",handler:c(s=>Lt(s,e=>e.getMCPServerStatus(s)),"handler")},{method:"GET",path:"/api/mcp-servers",handler:c(s=>Lt(s,e=>e.listMCPServers(s)),"handler")}];var zs=c((s,e)=>({error:{code:s,message:e}}),"createErrorResponse"),qe=c(async(s,e)=>{let t=s.get("endpointHandler");if(!t){let r=zs("ENDPOINT_HANDLER_NOT_AVAILABLE","\u7AEF\u70B9\u5904\u7406\u5668\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");return s.json(r,503)}try{return await t[e](s)}catch(r){let o=zs("ENDPOINT_HANDLER_ERROR",r instanceof Error?r.message:"\u7AEF\u70B9\u5904\u7406\u5931\u8D25");return s.json(o,500)}},"withEndpointHandler"),xr=[{method:"POST",path:"/api/endpoint/status",handler:c(s=>qe(s,"getEndpointStatus"),"handler")},{method:"POST",path:"/api/endpoint/connect",handler:c(s=>qe(s,"connectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/disconnect",handler:c(s=>qe(s,"disconnectEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/add",handler:c(s=>qe(s,"addEndpoint"),"handler")},{method:"POST",path:"/api/endpoint/remove",handler:c(s=>qe(s,"removeEndpoint"),"handler")}];var kc=P("serviceApiHandler"),Dr=[{method:"POST",path:"/api/restart",handler:kc((s,e)=>s.restartService(e))}];var js=class{static{c(this,"WebServer")}app;httpServer=null;wss=null;logger;port;eventBus;statusService;notificationService;configApiHandler;statusApiHandler;serviceApiHandler;mcpToolHandler;mcpToolLogHandler;versionApiHandler;staticFileHandler;mcpRouteHandler;mcpHandler;updateApiHandler;cozeHandler;realtimeNotificationHandler;heartbeatHandler;heartbeatMonitorInterval;routeManager;endpointManager=null;mcpServiceManager=null;constructor(e){try{this.port=e??Ge.getWebUIPort()??ge.DEFAULT_PORT}catch{this.port=e??ge.DEFAULT_PORT}this.logger=T,this.eventBus=R(),this.statusService=new Ot,this.notificationService=new _t,this.configApiHandler=new Xe,this.statusApiHandler=new ut(this.statusService),this.serviceApiHandler=new lt(this.statusService),this.mcpToolHandler=new pt,this.mcpToolLogHandler=new mt,this.versionApiHandler=new Nt,this.staticFileHandler=new be,this.mcpRouteHandler=new nt,this.updateApiHandler=new At,this.cozeHandler=new Te,this.realtimeNotificationHandler=new at(this.notificationService,this.statusService),this.heartbeatHandler=new Qe(this.statusService,this.notificationService),this.app=qr(),this.setupMiddleware(),this.app.notFound(Er),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 Ne,await this.mcpServiceManager.start());let e=await this.loadConfiguration();this.mcpHandler=new _e(this.mcpServiceManager,Ge),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:Ze(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
85
85
  1. \u5C06\u521B\u5EFA\u4E00\u4E2A\u7A7A\u914D\u7F6E\u7684 MCPServiceManager \u5B9E\u4F8B
86
86
  2. \u4E0D\u4F1A\u52A0\u8F7D\u4EFB\u4F55 MCP \u670D\u52A1\u5668\u6216\u7AEF\u70B9
87
87
  3. WebServer \u4ECD\u7136\u53EF\u4EE5\u542F\u52A8\u5E76\u63D0\u4F9B\u57FA\u7840 API \u670D\u52A1
88
88
  4. \u7528\u6237\u9700\u8981\u901A\u8FC7 API \u91CD\u65B0\u914D\u7F6E\u7AEF\u70B9\u6216\u670D\u52A1\u5668
89
- 5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new Ie,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(!qe.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");qe.cleanupInvalidServerToolsConfig();let e=qe.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??le.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=kc(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 Fc({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 me("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,n=3e4,i=2){let a=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(g){if(a=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let u=Math.min(o*i**(l-1),n);this.logger.info(`${t} - ${u}ms \u540E\u91CD\u8BD5...`),await this.sleep(u)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",mr),this.app?.use("*",Er),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",vr),this.app?.use("*",Sr()),this.app?.use("*",Tr()),this.app?.use("*",hr),this.app?.onError(fr),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}}setupRouteSystem(){this.routeManager=new Ve}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Rr,status:Mr,tools:Pr,mcp:yr,version:Nr,services:Ir,update:wr,coze:br,"tool-logs":Or,mcpserver:_r,endpoint:xr,misc:Lr,static:Ar}),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=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let o=JSON.parse(r.toString());o.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,o,t):await this.realtimeNotificationHandler.handleMessage(e,o,t)}catch(o){this.logger.error("WebSocket message error:",o);let n={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(n))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}setupMCPServerAddedListener(){this.eventBus.onEvent("mcp:server:added",async e=>{if(this.logger.info(`\u68C0\u6D4B\u5230 MCP \u670D\u52A1\u6DFB\u52A0: ${e.serverName}\uFF0C\u5DE5\u5177\u6570\u91CF: ${e.tools.length}`),!this.endpointManager){this.logger.warn("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}try{let r=this.endpointManager.getConnectionStatus().filter(o=>o.connected).length;if(r===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${r} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u65B0\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_added",serverName:e.serverName,endpointCount:r,timestamp:Date.now()})}catch(t){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",t),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_added",serverName:e.serverName,error:t instanceof Error?t.message:String(t),timestamp:Date.now()})}}),this.eventBus.onEvent("mcp:server:batch_added",async e=>{if(this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CF MCP \u670D\u52A1\u6DFB\u52A0: ${e.addedCount} \u4E2A\u6210\u529F\uFF0C${e.failedCount} \u4E2A\u5931\u8D25`),!(!this.endpointManager||e.addedCount===0))try{let r=this.endpointManager.getConnectionStatus().filter(o=>o.connected).length;if(r===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${r} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u6279\u91CF\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_batch_added",serverName:void 0,endpointCount:r,timestamp:Date.now()})}catch(t){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",t),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_batch_added",serverName:void 0,error:t instanceof Error?t.message:String(t),timestamp:Date.now()})}})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=Hc({fetch:this.app.fetch,port:this.port,hostname:le.DEFAULT_BIND_ADDRESS,createServer:$c});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new Uc({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${le.DEFAULT_BIND_ADDRESS}:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`)}stop(){return new Promise(e=>{let t=!1,r=c(()=>{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(()=>{this.httpServer?this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()}):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()),setTimeout(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.statusService.destroy(),this.notificationService.destroy(),kr(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}};export{zs as WebServer};
89
+ 5. \u5EFA\u8BAE\u5C3D\u5FEB\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6`),this.mcpServiceManager=new Ne,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(!Ge.configExists())throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u8FD0\u884C 'xiaozhi init' \u521D\u59CB\u5316\u914D\u7F6E");Ge.cleanupInvalidServerToolsConfig();let e=Ge.getConfig();return{mcpEndpoint:e.mcpEndpoint,mcpServers:e.mcpServers,webUIPort:e.webUI?.port??ge.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=Vc(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 Uc({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,n=3e4,i=2){let a=null;for(let l=1;l<=r;l++)try{return this.logger.info(`${t} - \u5C1D\u8BD5\u8FDE\u63A5 (${l}/${r})`),await e()}catch(g){if(a=g,this.logger.warn(`${t} - \u8FDE\u63A5\u5931\u8D25:`,g),l<r){let u=Math.min(o*i**(l-1),n);this.logger.info(`${t} - ${u}ms \u540E\u91CD\u8BD5...`),await this.sleep(u)}}throw new Error(`${t} - \u8FDE\u63A5\u5931\u8D25\uFF0C\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${a?.message}`)}sleep(e){return new Promise(t=>setTimeout(t,e))}setupMiddleware(){this.app?.use("*",hr),this.app?.use("*",vr),this.app?.use("*",async(e,t)=>{e.set("webServer",this),await t()}),this.app?.use("*",Tr),this.app?.use("*",Sr()),this.app?.use("*",Rr()),this.app?.use("*",fr),this.app?.onError(Cr),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}}setupRouteSystem(){this.routeManager=new ze}setupRoutesFromRegistry(){if(!this.routeManager||!this.app)throw new Error("\u8DEF\u7531\u7CFB\u7EDF\u672A\u521D\u59CB\u5316");try{this.routeManager.registerRoutes({config:Mr,status:Pr,tools:yr,mcp:Ir,version:Ar,services:Nr,update:Or,coze:wr,"tool-logs":br,mcpserver:Lr,endpoint:xr,misc:Dr,static:_r}),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=>{let t=`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5F53\u524D WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientConnect(e,t),this.heartbeatHandler.handleClientConnect(t),e.on("message",async r=>{try{let o=JSON.parse(r.toString());o.type==="clientStatus"?await this.heartbeatHandler.handleClientStatus(e,o,t):await this.realtimeNotificationHandler.handleMessage(e,o,t)}catch(o){this.logger.error("WebSocket message error:",o);let n={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(n))}}),e.on("close",()=>{this.logger.debug(`WebSocket \u5BA2\u6237\u7AEF\u5DF2\u65AD\u5F00\u8FDE\u63A5: ${t}`),this.logger.debug(`\u5269\u4F59 WebSocket \u8FDE\u63A5\u6570: ${this.wss?.clients.size||0}`),this.realtimeNotificationHandler.handleClientDisconnect(t),this.heartbeatHandler.handleClientDisconnect(t)}),e.on("error",r=>{this.logger.error(`WebSocket \u8FDE\u63A5\u9519\u8BEF (${t}):`,r)}),this.realtimeNotificationHandler.sendInitialData(e,t)})}setupEndpointStatusListener(){this.eventBus.onEvent("endpoint:status:changed",e=>{let t={type:"endpoint_status_changed",data:{endpoint:e.endpoint,connected:e.connected,operation:e.operation,success:e.success,message:e.message,timestamp:e.timestamp}};this.notificationService.broadcast("endpoint_status_changed",t),this.logger.debug(`\u5E7F\u64AD\u63A5\u5165\u70B9\u72B6\u6001\u53D8\u66F4\u4E8B\u4EF6: ${e.endpoint} - ${e.operation}`)})}setupMCPServerAddedListener(){this.eventBus.onEvent("mcp:server:added",async e=>{if(this.logger.info(`\u68C0\u6D4B\u5230 MCP \u670D\u52A1\u6DFB\u52A0: ${e.serverName}\uFF0C\u5DE5\u5177\u6570\u91CF: ${e.tools.length}`),!this.endpointManager){this.logger.warn("EndpointManager \u672A\u521D\u59CB\u5316\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}try{let r=this.endpointManager.getConnectionStatus().filter(o=>o.connected).length;if(r===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${r} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u65B0\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_added",serverName:e.serverName,endpointCount:r,timestamp:Date.now()})}catch(t){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",t),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_added",serverName:e.serverName,error:t instanceof Error?t.message:String(t),timestamp:Date.now()})}}),this.eventBus.onEvent("mcp:server:batch_added",async e=>{if(this.logger.info(`\u68C0\u6D4B\u5230\u6279\u91CF MCP \u670D\u52A1\u6DFB\u52A0: ${e.addedCount} \u4E2A\u6210\u529F\uFF0C${e.failedCount} \u4E2A\u5931\u8D25`),!(!this.endpointManager||e.addedCount===0))try{let r=this.endpointManager.getConnectionStatus().filter(o=>o.connected).length;if(r===0){this.logger.debug("\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u7AEF\u70B9\uFF0C\u8DF3\u8FC7\u91CD\u8FDE");return}this.logger.info(`\u5F00\u59CB\u91CD\u8FDE ${r} \u4E2A\u63A5\u5165\u70B9...`),await this.endpointManager.reconnect(),this.logger.info("\u63A5\u5165\u70B9\u91CD\u8FDE\u6210\u529F\uFF0C\u6279\u91CF\u670D\u52A1\u5DE5\u5177\u5DF2\u540C\u6B65"),this.eventBus.emitEvent("endpoint:reconnect:completed",{trigger:"mcp_server_batch_added",serverName:void 0,endpointCount:r,timestamp:Date.now()})}catch(t){this.logger.error("\u63A5\u5165\u70B9\u91CD\u8FDE\u5931\u8D25:",t),this.eventBus.emitEvent("endpoint:reconnect:failed",{trigger:"mcp_server_batch_added",serverName:void 0,error:t instanceof Error?t.message:String(t),timestamp:Date.now()})}})}async start(){if(this.httpServer){this.logger.warn("Web server is already running");return}await this.initializeConnections(),this.setupRouteSystem(),this.setupRoutesFromRegistry();let e=Fc({fetch:this.app.fetch,port:this.port,hostname:ge.DEFAULT_BIND_ADDRESS,createServer:Hc});if(this.httpServer=e,!this.httpServer)throw new Error("HTTP server \u672A\u521D\u59CB\u5316");this.wss=new zc({server:this.httpServer}),this.setupWebSocket(),this.heartbeatMonitorInterval=this.heartbeatHandler.startHeartbeatMonitoring(),this.logger.info(`Web server listening on http://${ge.DEFAULT_BIND_ADDRESS}:${this.port}`),this.logger.info(`Local access: http://localhost:${this.port}`)}stop(){return new Promise(e=>{let t=!1,r=c(()=>{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(()=>{this.httpServer?this.httpServer.close(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()}):(this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()),setTimeout(()=>{this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u5F3A\u5236\u505C\u6B62"),r()},2e3)})}else this.logger.info("Web \u670D\u52A1\u5668\u5DF2\u505C\u6B62"),r()})()})}destroy(){this.logger.debug("\u9500\u6BC1 WebServer \u5B9E\u4F8B"),this.heartbeatMonitorInterval&&(this.heartbeatHandler.stopHeartbeatMonitoring(this.heartbeatMonitorInterval),this.heartbeatMonitorInterval=void 0),this.statusService.destroy(),this.notificationService.destroy(),Fr(),this.logger.debug("WebServer \u5B9E\u4F8B\u5DF2\u9500\u6BC1")}};export{js as WebServer};
90
90
  //# sourceMappingURL=WebServer.js.map