@yunkeai/yunke-cli 2.0.4 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import{createRequire as y5}from"node:module";var N5=Object.create;var{getPrototypeOf:R5,defineProperty:hi,getOwnPropertyNames:U5}=Object;var C5=Object.prototype.hasOwnProperty;function S5(n){return this[n]}var t5,E5,F5=(n,b,_)=>{var w=n!=null&&typeof n==="object";if(w){var $=b?t5??=new WeakMap:E5??=new WeakMap,q=$.get(n);if(q)return q}_=n!=null?N5(R5(n)):{};let o=b||!n||!n.__esModule?hi(_,"default",{value:n,enumerable:!0}):_;for(let x of U5(n))if(!C5.call(o,x))hi(o,x,{get:S5.bind(n,x),enumerable:!0});if(w)$.set(n,o);return o};var T=(n,b)=>()=>(b||n((b={exports:{}}).exports,b),b.exports);var P5=(n)=>n;function T5(n,b){this[n]=P5.bind(null,b)}var L1=(n,b)=>{for(var _ in b)hi(n,_,{get:b[_],enumerable:!0,configurable:!0,set:T5.bind(b,_)})};var c1=(n,b)=>()=>(n&&(b=n(n=0)),b);var E=y5(import.meta.url);import{readFileSync as E9}from"node:fs";import{join as Ei,dirname as F9}from"node:path";import{fileURLToPath as P9}from"node:url";function T9(){try{return"2.0.4"}catch{}let n=[];try{let b=F9(P9(import.meta.url));n.push(Ei(b,"..","..","..","package.json"),Ei(b,"..","..","package.json"))}catch{}n.push(Ei(process.cwd(),"package.json"));for(let b of n)try{let _=E9(b,"utf-8"),w=JSON.parse(_);if(w.version)return w.version}catch{}return"unknown"}var R;var qn=c1(()=>{R=T9()});var H4=T((TQ,v4)=>{var A0=1000,k0=A0*60,N0=k0*60,q0=N0*24,hw=q0*7,uw=q0*365.25;v4.exports=function(n,b){b=b||{};var _=typeof n;if(_==="string"&&n.length>0)return Bw(n);else if(_==="number"&&isFinite(n))return b.long?jw(n):Mw(n);throw Error("val is not a non-empty string or a valid number. val="+JSON.stringify(n))};function Bw(n){if(n=String(n),n.length>100)return;var b=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(n);if(!b)return;var _=parseFloat(b[1]),w=(b[2]||"ms").toLowerCase();switch(w){case"years":case"year":case"yrs":case"yr":case"y":return _*uw;case"weeks":case"week":case"w":return _*hw;case"days":case"day":case"d":return _*q0;case"hours":case"hour":case"hrs":case"hr":case"h":return _*N0;case"minutes":case"minute":case"mins":case"min":case"m":return _*k0;case"seconds":case"second":case"secs":case"sec":case"s":return _*A0;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return _;default:return}}function Mw(n){var b=Math.abs(n);if(b>=q0)return Math.round(n/q0)+"d";if(b>=N0)return Math.round(n/N0)+"h";if(b>=k0)return Math.round(n/k0)+"m";if(b>=A0)return Math.round(n/A0)+"s";return n+"ms"}function jw(n){var b=Math.abs(n);if(b>=q0)return T2(n,b,q0,"day");if(b>=N0)return T2(n,b,N0,"hour");if(b>=k0)return T2(n,b,k0,"minute");if(b>=A0)return T2(n,b,A0,"second");return n+" ms"}function T2(n,b,_,w){var $=b>=_*1.5;return Math.round(n/_)+" "+w+($?"s":"")}});var di=T((yQ,Q4)=>{function fw(n){_.debug=_,_.default=_,_.coerce=m,_.disable=o,_.enable=$,_.enabled=x,_.humanize=H4(),_.destroy=v,Object.keys(n).forEach((H)=>{_[H]=n[H]}),_.names=[],_.skips=[],_.formatters={};function b(H){let Y=0;for(let l=0;l<H.length;l++)Y=(Y<<5)-Y+H.charCodeAt(l),Y|=0;return _.colors[Math.abs(Y)%_.colors.length]}_.selectColor=b;function _(H){let Y,l=null,j,U;function D(...M){if(!D.enabled)return;let S=D,F=Number(new Date),Z=F-(Y||F);if(S.diff=Z,S.prev=Y,S.curr=F,Y=F,M[0]=_.coerce(M[0]),typeof M[0]!=="string")M.unshift("%O");let An=0;M[0]=M[0].replace(/%([a-zA-Z%])/g,(g0,en)=>{if(g0==="%%")return"%";An++;let Z0=_.formatters[en];if(typeof Z0==="function"){let k5=M[An];g0=Z0.call(S,k5),M.splice(An,1),An--}return g0}),_.formatArgs.call(S,M),(S.log||_.log).apply(S,M)}if(D.namespace=H,D.useColors=_.useColors(),D.color=_.selectColor(H),D.extend=w,D.destroy=_.destroy,Object.defineProperty(D,"enabled",{enumerable:!0,configurable:!1,get:()=>{if(l!==null)return l;if(j!==_.namespaces)j=_.namespaces,U=_.enabled(H);return U},set:(M)=>{l=M}}),typeof _.init==="function")_.init(D);return D}function w(H,Y){let l=_(this.namespace+(typeof Y>"u"?":":Y)+H);return l.log=this.log,l}function $(H){_.save(H),_.namespaces=H,_.names=[],_.skips=[];let Y=(typeof H==="string"?H:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let l of Y)if(l[0]==="-")_.skips.push(l.slice(1));else _.names.push(l)}function q(H,Y){let l=0,j=0,U=-1,D=0;while(l<H.length)if(j<Y.length&&(Y[j]===H[l]||Y[j]==="*"))if(Y[j]==="*")U=j,D=l,j++;else l++,j++;else if(U!==-1)j=U+1,D++,l=D;else return!1;while(j<Y.length&&Y[j]==="*")j++;return j===Y.length}function o(){let H=[..._.names,..._.skips.map((Y)=>"-"+Y)].join(",");return _.enable(""),H}function x(H){for(let Y of _.skips)if(q(H,Y))return!1;for(let Y of _.names)if(q(H,Y))return!0;return!1}function m(H){if(H instanceof Error)return H.stack||H.message;return H}function v(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return _.enable(_.load()),_}Q4.exports=fw});var J4=T((X4,y2)=>{X4.formatArgs=Kw;X4.save=Dw;X4.load=Lw;X4.useColors=Vw;X4.storage=cw();X4.destroy=(()=>{let n=!1;return()=>{if(!n)n=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}})();X4.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Vw(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let n;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(n=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(n[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function Kw(n){if(n[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+n[0]+(this.useColors?"%c ":" ")+"+"+y2.exports.humanize(this.diff),!this.useColors)return;let b="color: "+this.color;n.splice(1,0,b,"color: inherit");let _=0,w=0;n[0].replace(/%[a-zA-Z%]/g,($)=>{if($==="%%")return;if(_++,$==="%c")w=_}),n.splice(w,0,b)}X4.log=console.debug||console.log||(()=>{});function Dw(n){try{if(n)X4.storage.setItem("debug",n);else X4.storage.removeItem("debug")}catch(b){}}function Lw(){let n;try{n=X4.storage.getItem("debug")||X4.storage.getItem("DEBUG")}catch(b){}if(!n&&typeof process<"u"&&"env"in process)n=process.env.DEBUG;return n}function cw(){try{return localStorage}catch(n){}}y2.exports=di()(X4);var{formatters:Aw}=y2.exports;Aw.j=function(n){try{return JSON.stringify(n)}catch(b){return"[UnexpectedJSONParseError]: "+b.message}}});var p4=T((W4,g2)=>{var Ew=E("tty"),I2=E("util");W4.init=Zw;W4.log=yw;W4.formatArgs=Pw;W4.save=Iw;W4.load=gw;W4.useColors=Fw;W4.destroy=I2.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");W4.colors=[6,2,3,4,5,1];try{let n=(()=>{throw new Error("Cannot require module "+"supports-color");})();if(n&&(n.stderr||n).level>=2)W4.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221]}catch(n){}W4.inspectOpts=Object.keys(process.env).filter((n)=>{return/^debug_/i.test(n)}).reduce((n,b)=>{let _=b.substring(6).toLowerCase().replace(/_([a-z])/g,($,q)=>{return q.toUpperCase()}),w=process.env[b];if(/^(yes|on|true|enabled)$/i.test(w))w=!0;else if(/^(no|off|false|disabled)$/i.test(w))w=!1;else if(w==="null")w=null;else w=Number(w);return n[_]=w,n},{});function Fw(){return"colors"in W4.inspectOpts?Boolean(W4.inspectOpts.colors):Ew.isatty(process.stderr.fd)}function Pw(n){let{namespace:b,useColors:_}=this;if(_){let w=this.color,$="\x1B[3"+(w<8?w:"8;5;"+w),q=` ${$};1m${b} \x1B[0m`;n[0]=q+n[0].split(`
2
+ import{createRequire as gq}from"node:module";var Sq=Object.create;var{getPrototypeOf:bq,defineProperty:O6,getOwnPropertyNames:kq}=Object;var hq=Object.prototype.hasOwnProperty;function Tq(n){return this[n]}var Iq,uq,yq=(n,q,H)=>{var Q=n!=null&&typeof n==="object";if(Q){var X=q?Iq??=new WeakMap:uq??=new WeakMap,J=X.get(n);if(J)return J}H=n!=null?Sq(bq(n)):{};let w=q||!n||!n.__esModule?O6(H,"default",{value:n,enumerable:!0}):H;for(let W of kq(n))if(!hq.call(w,W))O6(w,W,{get:Tq.bind(n,W),enumerable:!0});if(Q)X.set(n,w);return w};var H0=(n,q)=>()=>(q||n((q={exports:{}}).exports,q),q.exports);var Zq=(n)=>n;function pq(n,q){this[n]=Zq.bind(null,q)}var p4=(n,q)=>{for(var H in q)O6(n,H,{get:q[H],enumerable:!0,configurable:!0,set:pq.bind(q,H)})};var g4=(n,q)=>()=>(n&&(q=n(n=0)),q);var a=gq(import.meta.url);import{readFileSync as hQ}from"node:fs";import{join as k6,dirname as TQ}from"node:path";import{fileURLToPath as IQ}from"node:url";function uQ(){try{return"2.0.5"}catch{}let n=[];try{let q=TQ(IQ(import.meta.url));n.push(k6(q,"..","..","..","package.json"),k6(q,"..","..","package.json"))}catch{}n.push(k6(process.cwd(),"package.json"));for(let q of n)try{let H=hQ(q,"utf-8"),Q=JSON.parse(H);if(Q.version)return Q.version}catch{}return"unknown"}var u;var K0=g4(()=>{u=uQ()});var R5=H0((gv,L5)=>{var J1=1000,w1=J1*60,W1=w1*60,mn=W1*24,vX=mn*7,KX=mn*365.25;L5.exports=function(n,q){q=q||{};var H=typeof n;if(H==="string"&&n.length>0)return BX(n);else if(H==="number"&&isFinite(n))return q.long?jX(n):MX(n);throw Error("val is not a non-empty string or a valid number. val="+JSON.stringify(n))};function BX(n){if(n=String(n),n.length>100)return;var q=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(n);if(!q)return;var H=parseFloat(q[1]),Q=(q[2]||"ms").toLowerCase();switch(Q){case"years":case"year":case"yrs":case"yr":case"y":return H*KX;case"weeks":case"week":case"w":return H*vX;case"days":case"day":case"d":return H*mn;case"hours":case"hour":case"hrs":case"hr":case"h":return H*W1;case"minutes":case"minute":case"mins":case"min":case"m":return H*w1;case"seconds":case"second":case"secs":case"sec":case"s":return H*J1;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return H;default:return}}function MX(n){var q=Math.abs(n);if(q>=mn)return Math.round(n/mn)+"d";if(q>=W1)return Math.round(n/W1)+"h";if(q>=w1)return Math.round(n/w1)+"m";if(q>=J1)return Math.round(n/J1)+"s";return n+"ms"}function jX(n){var q=Math.abs(n);if(q>=mn)return A2(n,q,mn,"day");if(q>=W1)return A2(n,q,W1,"hour");if(q>=w1)return A2(n,q,w1,"minute");if(q>=J1)return A2(n,q,J1,"second");return n+" ms"}function A2(n,q,H,Q){var X=q>=H*1.5;return Math.round(n/H)+" "+Q+(X?"s":"")}});var g6=H0((iv,N5)=>{function LX(n){H.debug=H,H.default=H,H.coerce=x,H.disable=w,H.enable=X,H.enabled=W,H.humanize=R5(),H.destroy=Y,Object.keys(n).forEach((_)=>{H[_]=n[_]}),H.names=[],H.skips=[],H.formatters={};function q(_){let G=0;for(let O=0;O<_.length;O++)G=(G<<5)-G+_.charCodeAt(O),G|=0;return H.colors[Math.abs(G)%H.colors.length]}H.selectColor=q;function H(_){let G,O=null,M,A;function L(...N){if(!L.enabled)return;let m=L,Z=Number(new Date),f=Z-(G||Z);if(m.diff=f,m.prev=G,m.curr=Z,G=Z,N[0]=H.coerce(N[0]),typeof N[0]!=="string")N.unshift("%O");let i=0;N[0]=N[0].replace(/%([a-zA-Z%])/g,(z,l)=>{if(z==="%%")return"%";i++;let b=H.formatters[l];if(typeof b==="function"){let h=N[i];z=b.call(m,h),N.splice(i,1),i--}return z}),H.formatArgs.call(m,N),(m.log||H.log).apply(m,N)}if(L.namespace=_,L.useColors=H.useColors(),L.color=H.selectColor(_),L.extend=Q,L.destroy=H.destroy,Object.defineProperty(L,"enabled",{enumerable:!0,configurable:!1,get:()=>{if(O!==null)return O;if(M!==H.namespaces)M=H.namespaces,A=H.enabled(_);return A},set:(N)=>{O=N}}),typeof H.init==="function")H.init(L);return L}function Q(_,G){let O=H(this.namespace+(typeof G>"u"?":":G)+_);return O.log=this.log,O}function X(_){H.save(_),H.namespaces=_,H.names=[],H.skips=[];let G=(typeof _==="string"?_:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let O of G)if(O[0]==="-")H.skips.push(O.slice(1));else H.names.push(O)}function J(_,G){let O=0,M=0,A=-1,L=0;while(O<_.length)if(M<G.length&&(G[M]===_[O]||G[M]==="*"))if(G[M]==="*")A=M,L=O,M++;else O++,M++;else if(A!==-1)M=A+1,L++,O=L;else return!1;while(M<G.length&&G[M]==="*")M++;return M===G.length}function w(){let _=[...H.names,...H.skips.map((G)=>"-"+G)].join(",");return H.enable(""),_}function W(_){for(let G of H.skips)if(J(_,G))return!1;for(let G of H.names)if(J(_,G))return!0;return!1}function x(_){if(_ instanceof Error)return _.stack||_.message;return _}function Y(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return H.enable(H.load()),H}N5.exports=LX});var C5=H0((D5,U2)=>{D5.formatArgs=NX;D5.save=DX;D5.load=CX;D5.useColors=RX;D5.storage=AX();D5.destroy=(()=>{let n=!1;return()=>{if(!n)n=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}})();D5.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function RX(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let n;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(n=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(n[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function NX(n){if(n[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+n[0]+(this.useColors?"%c ":" ")+"+"+U2.exports.humanize(this.diff),!this.useColors)return;let q="color: "+this.color;n.splice(1,0,q,"color: inherit");let H=0,Q=0;n[0].replace(/%[a-zA-Z%]/g,(X)=>{if(X==="%%")return;if(H++,X==="%c")Q=H}),n.splice(Q,0,q)}D5.log=console.debug||console.log||(()=>{});function DX(n){try{if(n)D5.storage.setItem("debug",n);else D5.storage.removeItem("debug")}catch(q){}}function CX(){let n;try{n=D5.storage.getItem("debug")||D5.storage.getItem("DEBUG")}catch(q){}if(!n&&typeof process<"u"&&"env"in process)n=process.env.DEBUG;return n}function AX(){try{return localStorage}catch(n){}}U2.exports=g6()(D5);var{formatters:UX}=U2.exports;UX.j=function(n){try{return JSON.stringify(n)}catch(q){return"[UnexpectedJSONParseError]: "+q.message}}});var m5=H0((U5,m2)=>{var hX=a("tty"),F2=a("util");U5.init=gX;U5.log=yX;U5.formatArgs=IX;U5.save=ZX;U5.load=pX;U5.useColors=TX;U5.destroy=F2.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");U5.colors=[6,2,3,4,5,1];try{let n=(()=>{throw new Error("Cannot require module "+"supports-color");})();if(n&&(n.stderr||n).level>=2)U5.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221]}catch(n){}U5.inspectOpts=Object.keys(process.env).filter((n)=>{return/^debug_/i.test(n)}).reduce((n,q)=>{let H=q.substring(6).toLowerCase().replace(/_([a-z])/g,(X,J)=>{return J.toUpperCase()}),Q=process.env[q];if(/^(yes|on|true|enabled)$/i.test(Q))Q=!0;else if(/^(no|off|false|disabled)$/i.test(Q))Q=!1;else if(Q==="null")Q=null;else Q=Number(Q);return n[H]=Q,n},{});function TX(){return"colors"in U5.inspectOpts?Boolean(U5.inspectOpts.colors):hX.isatty(process.stderr.fd)}function IX(n){let{namespace:q,useColors:H}=this;if(H){let Q=this.color,X="\x1B[3"+(Q<8?Q:"8;5;"+Q),J=` ${X};1m${q} \x1B[0m`;n[0]=J+n[0].split(`
3
3
  `).join(`
4
- `+q),n.push($+"m+"+g2.exports.humanize(this.diff)+"\x1B[0m")}else n[0]=Tw()+b+" "+n[0]}function Tw(){if(W4.inspectOpts.hideDate)return"";return new Date().toISOString()+" "}function yw(...n){return process.stderr.write(I2.formatWithOptions(W4.inspectOpts,...n)+`
5
- `)}function Iw(n){if(n)process.env.DEBUG=n;else delete process.env.DEBUG}function gw(){return process.env.DEBUG}function Zw(n){n.inspectOpts={};let b=Object.keys(W4.inspectOpts);for(let _=0;_<b.length;_++)n.inspectOpts[b[_]]=W4.inspectOpts[b[_]]}g2.exports=di()(W4);var{formatters:Y4}=g2.exports;Y4.o=function(n){return this.inspectOpts.colors=this.useColors,I2.inspect(n,this.inspectOpts).split(`
6
- `).map((b)=>b.trim()).join(" ")};Y4.O=function(n){return this.inspectOpts.colors=this.useColors,I2.inspect(n,this.inspectOpts)}});var G4=T((ZQ,ai)=>{if(typeof process>"u"||process.type==="renderer"||!1||process.__nwjs)ai.exports=J4();else ai.exports=p4()});var u4=T((dQ,h4)=>{h4.exports=O4;function O4(n,b){if(n&&b)return O4(n)(b);if(typeof n!=="function")throw TypeError("need wrapper function");return Object.keys(n).forEach(function(w){_[w]=n[w]}),_;function _(){var w=Array(arguments.length);for(var $=0;$<w.length;$++)w[$]=arguments[$];var q=n.apply(this,w),o=w[w.length-1];if(typeof q==="function"&&q!==o)Object.keys(o).forEach(function(x){q[x]=o[x]});return q}}});var ri=T((aQ,ei)=>{var B4=u4();ei.exports=B4(Z2);ei.exports.strict=B4(M4);Z2.proto=Z2(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return Z2(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return M4(this)},configurable:!0})});function Z2(n){var b=function(){if(b.called)return b.value;return b.called=!0,b.value=n.apply(this,arguments)};return b.called=!1,b}function M4(n){var b=function(){if(b.called)throw Error(b.onceError);return b.called=!0,b.value=n.apply(this,arguments)},_=n.name||"Function wrapped with `once`";return b.onceError=_+" shouldn't be called more than once",b.called=!1,b}});var V4=T((eQ,f4)=>{var i7=ri(),b7=function(){},_7=global.Bare?queueMicrotask:process.nextTick.bind(process),w7=function(n){return n.setHeader&&typeof n.abort==="function"},$7=function(n){return n.stdio&&Array.isArray(n.stdio)&&n.stdio.length===3},j4=function(n,b,_){if(typeof b==="function")return j4(n,null,b);if(!b)b={};_=i7(_||b7);var{_writableState:w,_readableState:$}=n,q=b.readable||b.readable!==!1&&n.readable,o=b.writable||b.writable!==!1&&n.writable,x=!1,m=function(){if(!n.writable)v()},v=function(){if(o=!1,!q)_.call(n)},H=function(){if(q=!1,!o)_.call(n)},Y=function(M){_.call(n,M?Error("exited with error code: "+M):null)},l=function(M){_.call(n,M)},j=function(){_7(U)},U=function(){if(x)return;if(q&&!($&&($.ended&&!$.destroyed)))return _.call(n,Error("premature close"));if(o&&!(w&&(w.ended&&!w.destroyed)))return _.call(n,Error("premature close"))},D=function(){n.req.on("finish",v)};if(w7(n))if(n.on("complete",v),n.on("abort",j),n.req)D();else n.on("request",D);else if(o&&!w)n.on("end",m),n.on("close",m);if($7(n))n.on("exit",Y);if(n.on("end",H),n.on("finish",v),b.error!==!1)n.on("error",l);return n.on("close",j),function(){if(x=!0,n.removeListener("complete",v),n.removeListener("abort",j),n.removeListener("request",D),n.req)n.req.removeListener("finish",v);n.removeListener("end",m),n.removeListener("close",m),n.removeListener("finish",v),n.removeListener("exit",Y),n.removeListener("end",H),n.removeListener("error",l),n.removeListener("close",j)}};f4.exports=j4});var L4=T((rQ,D4)=>{var q7=ri(),o7=V4(),d2;try{d2=E("fs")}catch(n){}var o2=function(){},x7=typeof process>"u"?!1:/^v?\.0/.test(process.version),a2=function(n){return typeof n==="function"},m7=function(n){if(!x7)return!1;if(!d2)return!1;return(n instanceof(d2.ReadStream||o2)||n instanceof(d2.WriteStream||o2))&&a2(n.close)},v7=function(n){return n.setHeader&&a2(n.abort)},H7=function(n,b,_,w){w=q7(w);var $=!1;n.on("close",function(){$=!0}),o7(n,{readable:b,writable:_},function(o){if(o)return w(o);$=!0,w()});var q=!1;return function(o){if($)return;if(q)return;if(q=!0,m7(n))return n.close(o2);if(v7(n))return n.abort();if(a2(n.destroy))return n.destroy();w(o||Error("stream was destroyed"))}},K4=function(n){n()},Q7=function(n,b){return n.pipe(b)},X7=function(){var n=Array.prototype.slice.call(arguments),b=a2(n[n.length-1]||o2)&&n.pop()||o2;if(Array.isArray(n[0]))n=n[0];if(n.length<2)throw Error("pump requires two streams per minimum");var _,w=n.map(function($,q){var o=q<n.length-1,x=q>0;return H7($,o,x,function(m){if(!_)_=m;if(m)w.forEach(K4);if(o)return;w.forEach(K4),b(_)})});return n.reduce(Q7)};D4.exports=X7});var A4=T((zQ,c4)=>{var{PassThrough:J7}=E("stream");c4.exports=(n)=>{n={...n};let{array:b}=n,{encoding:_}=n,w=_==="buffer",$=!1;if(b)$=!(_||w);else _=_||"utf8";if(w)_=null;let q=new J7({objectMode:$});if(_)q.setEncoding(_);let o=0,x=[];return q.on("data",(m)=>{if(x.push(m),$)o=x.length;else o+=m.length}),q.getBufferedValue=()=>{if(b)return x;return w?Buffer.concat(x,o):x.join("")},q.getBufferedLength=()=>o,q}});var k4=T((sQ,R0)=>{var{constants:Y7}=E("buffer"),W7=L4(),l7=A4();class zi extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}}async function e2(n,b){if(!n)return Promise.reject(Error("Expected a stream"));b={maxBuffer:1/0,...b};let{maxBuffer:_}=b,w;return await new Promise(($,q)=>{let o=(x)=>{if(x&&w.getBufferedLength()<=Y7.MAX_LENGTH)x.bufferedData=w.getBufferedValue();q(x)};w=W7(n,l7(b),(x)=>{if(x){o(x);return}$()}),w.on("data",()=>{if(w.getBufferedLength()>_)o(new zi)})}),w.getBufferedValue()}R0.exports=e2;R0.exports.default=e2;R0.exports.buffer=(n,b)=>e2(n,{...b,encoding:"buffer"});R0.exports.array=(n,b)=>e2(n,{...b,array:!0});R0.exports.MaxBufferError=zi});var C4=T((nX,U4)=>{U4.exports=r2;function r2(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}r2.prototype.go=function(n){if(this.pending<this.max)R4(this,n);else this.waiting.push(n)};r2.prototype.wait=function(n){if(this.pending===0)n(this.error);else this.listeners.push(n)};r2.prototype.hold=function(){return N4(this)};function N4(n){n.pending+=1;var b=!1;return _;function _($){if(b)throw Error("callback called twice");if(b=!0,n.error=n.error||$,n.pending-=1,n.waiting.length>0&&n.pending<n.max)R4(n,n.waiting.shift());else if(n.pending===0){var q=n.listeners;n.listeners=[],q.forEach(w)}}function w($){$(n.error)}}function R4(n,b){b(N4(n))}});var t4=T((u7)=>{var x2=E("fs"),z2=E("util"),si=E("stream"),S4=si.Readable,n1=si.Writable,p7=si.PassThrough,G7=C4(),s2=E("events").EventEmitter;u7.createFromBuffer=O7;u7.createFromFd=h7;u7.BufferSlicer=Dn;u7.FdSlicer=Kn;z2.inherits(Kn,s2);function Kn(n,b){b=b||{},s2.call(this),this.fd=n,this.pend=new G7,this.pend.max=1,this.refCount=0,this.autoClose=!!b.autoClose}Kn.prototype.read=function(n,b,_,w,$){var q=this;q.pend.go(function(o){x2.read(q.fd,n,b,_,w,function(x,m,v){o(),$(x,m,v)})})};Kn.prototype.write=function(n,b,_,w,$){var q=this;q.pend.go(function(o){x2.write(q.fd,n,b,_,w,function(x,m,v){o(),$(x,m,v)})})};Kn.prototype.createReadStream=function(n){return new ni(this,n)};Kn.prototype.createWriteStream=function(n){return new ii(this,n)};Kn.prototype.ref=function(){this.refCount+=1};Kn.prototype.unref=function(){var n=this;if(n.refCount-=1,n.refCount>0)return;if(n.refCount<0)throw Error("invalid unref");if(n.autoClose)x2.close(n.fd,b);function b(_){if(_)n.emit("error",_);else n.emit("close")}};z2.inherits(ni,S4);function ni(n,b){b=b||{},S4.call(this,b),this.context=n,this.context.ref(),this.start=b.start||0,this.endOffset=b.end,this.pos=this.start,this.destroyed=!1}ni.prototype._read=function(n){var b=this;if(b.destroyed)return;var _=Math.min(b._readableState.highWaterMark,n);if(b.endOffset!=null)_=Math.min(_,b.endOffset-b.pos);if(_<=0){b.destroyed=!0,b.push(null),b.context.unref();return}b.context.pend.go(function(w){if(b.destroyed)return w();var $=new Buffer(_);x2.read(b.context.fd,$,0,_,b.pos,function(q,o){if(q)b.destroy(q);else if(o===0)b.destroyed=!0,b.push(null),b.context.unref();else b.pos+=o,b.push($.slice(0,o));w()})})};ni.prototype.destroy=function(n){if(this.destroyed)return;n=n||Error("stream destroyed"),this.destroyed=!0,this.emit("error",n),this.context.unref()};z2.inherits(ii,n1);function ii(n,b){b=b||{},n1.call(this,b),this.context=n,this.context.ref(),this.start=b.start||0,this.endOffset=b.end==null?1/0:+b.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}ii.prototype._write=function(n,b,_){var w=this;if(w.destroyed)return;if(w.pos+n.length>w.endOffset){var $=Error("maximum file length exceeded");$.code="ETOOBIG",w.destroy(),_($);return}w.context.pend.go(function(q){if(w.destroyed)return q();x2.write(w.context.fd,n,0,n.length,w.pos,function(o,x){if(o)w.destroy(),q(),_(o);else w.bytesWritten+=x,w.pos+=x,w.emit("progress"),q(),_()})})};ii.prototype.destroy=function(){if(this.destroyed)return;this.destroyed=!0,this.context.unref()};z2.inherits(Dn,s2);function Dn(n,b){s2.call(this),b=b||{},this.refCount=0,this.buffer=n,this.maxChunkSize=b.maxChunkSize||Number.MAX_SAFE_INTEGER}Dn.prototype.read=function(n,b,_,w,$){var q=w+_,o=q-this.buffer.length,x=o>0?o:_;this.buffer.copy(n,b,w,q),setImmediate(function(){$(null,x)})};Dn.prototype.write=function(n,b,_,w,$){n.copy(this.buffer,w,b,b+_),setImmediate(function(){$(null,_,n)})};Dn.prototype.createReadStream=function(n){n=n||{};var b=new p7(n);b.destroyed=!1,b.start=n.start||0,b.endOffset=n.end,b.pos=b.endOffset||this.buffer.length;var _=this.buffer.slice(b.start,b.pos),w=0;while(!0){var $=w+this.maxChunkSize;if($>=_.length){if(w<_.length)b.write(_.slice(w,_.length));break}b.write(_.slice(w,$)),w=$}return b.end(),b.destroy=function(){b.destroyed=!0},b};Dn.prototype.createWriteStream=function(n){var b=this;n=n||{};var _=new n1(n);return _.start=n.start||0,_.endOffset=n.end==null?this.buffer.length:+n.end,_.bytesWritten=0,_.pos=_.start,_.destroyed=!1,_._write=function(w,$,q){if(_.destroyed)return;var o=_.pos+w.length;if(o>_.endOffset){var x=Error("maximum file length exceeded");x.code="ETOOBIG",_.destroyed=!0,q(x);return}w.copy(b.buffer,_.pos,0,w.length),_.bytesWritten+=w.length,_.pos=o,_.emit("progress"),q()},_.destroy=function(){_.destroyed=!0},_};Dn.prototype.ref=function(){this.refCount+=1};Dn.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw Error("invalid unref")};function O7(n,b){return new Dn(n,b)}function h7(n,b){return new Kn(n,b)}});var P4=T((bX,F4)=>{var yn=E("buffer").Buffer,i1=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918000,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];if(typeof Int32Array<"u")i1=new Int32Array(i1);function E4(n){if(yn.isBuffer(n))return n;var b=typeof yn.alloc==="function"&&typeof yn.from==="function";if(typeof n==="number")return b?yn.alloc(n):new yn(n);else if(typeof n==="string")return b?yn.from(n):new yn(n);else throw Error("input must be buffer, number, or string, received "+typeof n)}function V7(n){var b=E4(4);return b.writeInt32BE(n,0),b}function b1(n,b){if(n=E4(n),yn.isBuffer(b))b=b.readUInt32BE(0);var _=~~b^-1;for(var w=0;w<n.length;w++)_=i1[(_^n[w])&255]^_>>>8;return _^-1}function _1(){return V7(b1.apply(null,arguments))}_1.signed=function(){return b1.apply(null,arguments)};_1.unsigned=function(){return b1.apply(null,arguments)>>>0};F4.exports=_1});var a4=T((N7)=>{var w1=E("fs"),K7=E("zlib"),T4=t4(),D7=P4(),wi=E("util"),$i=E("events").EventEmitter,y4=E("stream").Transform,$1=E("stream").PassThrough,L7=E("stream").Writable;N7.open=c7;N7.fromFd=I4;N7.fromBuffer=A7;N7.fromRandomAccessReader=q1;N7.dosDateTimeToDate=Z4;N7.validateFileName=d4;N7.ZipFile=In;N7.Entry=m2;N7.RandomAccessReader=gn;function c7(n,b,_){if(typeof b==="function")_=b,b=null;if(b==null)b={};if(b.autoClose==null)b.autoClose=!0;if(b.lazyEntries==null)b.lazyEntries=!1;if(b.decodeStrings==null)b.decodeStrings=!0;if(b.validateEntrySizes==null)b.validateEntrySizes=!0;if(b.strictFileNames==null)b.strictFileNames=!1;if(_==null)_=_i;w1.open(n,"r",function(w,$){if(w)return _(w);I4($,b,function(q,o){if(q)w1.close($,_i);_(q,o)})})}function I4(n,b,_){if(typeof b==="function")_=b,b=null;if(b==null)b={};if(b.autoClose==null)b.autoClose=!1;if(b.lazyEntries==null)b.lazyEntries=!1;if(b.decodeStrings==null)b.decodeStrings=!0;if(b.validateEntrySizes==null)b.validateEntrySizes=!0;if(b.strictFileNames==null)b.strictFileNames=!1;if(_==null)_=_i;w1.fstat(n,function(w,$){if(w)return _(w);var q=T4.createFromFd(n,{autoClose:!0});q1(q,$.size,b,_)})}function A7(n,b,_){if(typeof b==="function")_=b,b=null;if(b==null)b={};if(b.autoClose=!1,b.lazyEntries==null)b.lazyEntries=!1;if(b.decodeStrings==null)b.decodeStrings=!0;if(b.validateEntrySizes==null)b.validateEntrySizes=!0;if(b.strictFileNames==null)b.strictFileNames=!1;var w=T4.createFromBuffer(n,{maxChunkSize:65536});q1(w,n.length,b,_)}function q1(n,b,_,w){if(typeof _==="function")w=_,_=null;if(_==null)_={};if(_.autoClose==null)_.autoClose=!0;if(_.lazyEntries==null)_.lazyEntries=!1;if(_.decodeStrings==null)_.decodeStrings=!0;var $=!!_.decodeStrings;if(_.validateEntrySizes==null)_.validateEntrySizes=!0;if(_.strictFileNames==null)_.strictFileNames=!1;if(w==null)w=_i;if(typeof b!=="number")throw Error("expected totalSize parameter to be a number");if(b>Number.MAX_SAFE_INTEGER)throw Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");n.ref();var q=22,o=65535,x=Math.min(q+o,b),m=hn(x),v=b-m.length;U0(n,m,0,x,v,function(H){if(H)return w(H);for(var Y=x-q;Y>=0;Y-=1){if(m.readUInt32LE(Y)!==101010256)continue;var l=m.slice(Y),j=l.readUInt16LE(4);if(j!==0)return w(Error("multi-disk zip files are not supported: found disk number: "+j));var U=l.readUInt16LE(10),D=l.readUInt32LE(16),M=l.readUInt16LE(20),S=l.length-q;if(M!==S)return w(Error("invalid comment length. expected: "+S+". found: "+M));var F=$?bi(l,22,l.length,!1):l.slice(22);if(!(U===65535||D===4294967295))return w(null,new In(n,D,b,U,F,_.autoClose,_.lazyEntries,$,_.validateEntrySizes,_.strictFileNames));var Z=hn(20),An=v+Y-Z.length;U0(n,Z,0,Z.length,An,function(Y0){if(Y0)return w(Y0);if(Z.readUInt32LE(0)!==117853008)return w(Error("invalid zip64 end of central directory locator signature"));var g0=C0(Z,8),en=hn(56);U0(n,en,0,en.length,g0,function(Z0){if(Z0)return w(Z0);if(en.readUInt32LE(0)!==101075792)return w(Error("invalid zip64 end of central directory record signature"));return U=C0(en,32),D=C0(en,48),w(null,new In(n,D,b,U,F,_.autoClose,_.lazyEntries,$,_.validateEntrySizes,_.strictFileNames))})});return}w(Error("end of central directory record signature not found"))})}wi.inherits(In,$i);function In(n,b,_,w,$,q,o,x,m,v){var H=this;if($i.call(H),H.reader=n,H.reader.on("error",function(Y){g4(H,Y)}),H.reader.once("close",function(){H.emit("close")}),H.readEntryCursor=b,H.fileSize=_,H.entryCount=w,H.comment=$,H.entriesRead=0,H.autoClose=!!q,H.lazyEntries=!!o,H.decodeStrings=!!x,H.validateEntrySizes=!!m,H.strictFileNames=!!v,H.isOpen=!0,H.emittedError=!1,!H.lazyEntries)H._readEntry()}In.prototype.close=function(){if(!this.isOpen)return;this.isOpen=!1,this.reader.unref()};function on(n,b){if(n.autoClose)n.close();g4(n,b)}function g4(n,b){if(n.emittedError)return;n.emittedError=!0,n.emit("error",b)}In.prototype.readEntry=function(){if(!this.lazyEntries)throw Error("readEntry() called without lazyEntries:true");this._readEntry()};In.prototype._readEntry=function(){var n=this;if(n.entryCount===n.entriesRead){setImmediate(function(){if(n.autoClose)n.close();if(n.emittedError)return;n.emit("end")});return}if(n.emittedError)return;var b=hn(46);U0(n.reader,b,0,b.length,n.readEntryCursor,function(_){if(_)return on(n,_);if(n.emittedError)return;var w=new m2,$=b.readUInt32LE(0);if($!==33639248)return on(n,Error("invalid central directory file header signature: 0x"+$.toString(16)));if(w.versionMadeBy=b.readUInt16LE(4),w.versionNeededToExtract=b.readUInt16LE(6),w.generalPurposeBitFlag=b.readUInt16LE(8),w.compressionMethod=b.readUInt16LE(10),w.lastModFileTime=b.readUInt16LE(12),w.lastModFileDate=b.readUInt16LE(14),w.crc32=b.readUInt32LE(16),w.compressedSize=b.readUInt32LE(20),w.uncompressedSize=b.readUInt32LE(24),w.fileNameLength=b.readUInt16LE(28),w.extraFieldLength=b.readUInt16LE(30),w.fileCommentLength=b.readUInt16LE(32),w.internalFileAttributes=b.readUInt16LE(36),w.externalFileAttributes=b.readUInt32LE(38),w.relativeOffsetOfLocalHeader=b.readUInt32LE(42),w.generalPurposeBitFlag&64)return on(n,Error("strong encryption is not supported"));n.readEntryCursor+=46,b=hn(w.fileNameLength+w.extraFieldLength+w.fileCommentLength),U0(n.reader,b,0,b.length,n.readEntryCursor,function(q){if(q)return on(n,q);if(n.emittedError)return;var o=(w.generalPurposeBitFlag&2048)!==0;w.fileName=n.decodeStrings?bi(b,0,w.fileNameLength,o):b.slice(0,w.fileNameLength);var x=w.fileNameLength+w.extraFieldLength,m=b.slice(w.fileNameLength,x);w.extraFields=[];var v=0;while(v<m.length-3){var H=m.readUInt16LE(v+0),Y=m.readUInt16LE(v+2),l=v+4,j=l+Y;if(j>m.length)return on(n,Error("extra field length exceeds extra field buffer size"));var U=hn(Y);m.copy(U,0,l,j),w.extraFields.push({id:H,data:U}),v=j}if(w.fileComment=n.decodeStrings?bi(b,x,x+w.fileCommentLength,o):b.slice(x,x+w.fileCommentLength),w.comment=w.fileComment,n.readEntryCursor+=b.length,n.entriesRead+=1,w.uncompressedSize===4294967295||w.compressedSize===4294967295||w.relativeOffsetOfLocalHeader===4294967295){var D=null;for(var v=0;v<w.extraFields.length;v++){var M=w.extraFields[v];if(M.id===1){D=M.data;break}}if(D==null)return on(n,Error("expected zip64 extended information extra field"));var S=0;if(w.uncompressedSize===4294967295){if(S+8>D.length)return on(n,Error("zip64 extended information extra field does not include uncompressed size"));w.uncompressedSize=C0(D,S),S+=8}if(w.compressedSize===4294967295){if(S+8>D.length)return on(n,Error("zip64 extended information extra field does not include compressed size"));w.compressedSize=C0(D,S),S+=8}if(w.relativeOffsetOfLocalHeader===4294967295){if(S+8>D.length)return on(n,Error("zip64 extended information extra field does not include relative header offset"));w.relativeOffsetOfLocalHeader=C0(D,S),S+=8}}if(n.decodeStrings)for(var v=0;v<w.extraFields.length;v++){var M=w.extraFields[v];if(M.id===28789){if(M.data.length<6)continue;if(M.data.readUInt8(0)!==1)continue;var F=M.data.readUInt32LE(1);if(D7.unsigned(b.slice(0,w.fileNameLength))!==F)continue;w.fileName=bi(M.data,5,M.data.length,!0);break}}if(n.validateEntrySizes&&w.compressionMethod===0){var Z=w.uncompressedSize;if(w.isEncrypted())Z+=12;if(w.compressedSize!==Z){var An="compressed/uncompressed size mismatch for stored file: "+w.compressedSize+" != "+w.uncompressedSize;return on(n,Error(An))}}if(n.decodeStrings){if(!n.strictFileNames)w.fileName=w.fileName.replace(/\\/g,"/");var Y0=d4(w.fileName,n.validateFileNameOptions);if(Y0!=null)return on(n,Error(Y0))}if(n.emit("entry",w),!n.lazyEntries)n._readEntry()})})};In.prototype.openReadStream=function(n,b,_){var w=this,$=0,q=n.compressedSize;if(_==null)_=b,b={};else{if(b.decrypt!=null){if(!n.isEncrypted())throw Error("options.decrypt can only be specified for encrypted entries");if(b.decrypt!==!1)throw Error("invalid options.decrypt value: "+b.decrypt);if(n.isCompressed()){if(b.decompress!==!1)throw Error("entry is encrypted and compressed, and options.decompress !== false")}}if(b.decompress!=null){if(!n.isCompressed())throw Error("options.decompress can only be specified for compressed entries");if(!(b.decompress===!1||b.decompress===!0))throw Error("invalid options.decompress value: "+b.decompress)}if(b.start!=null||b.end!=null){if(n.isCompressed()&&b.decompress!==!1)throw Error("start/end range not allowed for compressed entry without options.decompress === false");if(n.isEncrypted()&&b.decrypt!==!1)throw Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(b.start!=null){if($=b.start,$<0)throw Error("options.start < 0");if($>n.compressedSize)throw Error("options.start > entry.compressedSize")}if(b.end!=null){if(q=b.end,q<0)throw Error("options.end < 0");if(q>n.compressedSize)throw Error("options.end > entry.compressedSize");if(q<$)throw Error("options.end < options.start")}}if(!w.isOpen)return _(Error("closed"));if(n.isEncrypted()){if(b.decrypt!==!1)return _(Error("entry is encrypted, and options.decrypt !== false"))}w.reader.ref();var o=hn(30);U0(w.reader,o,0,o.length,n.relativeOffsetOfLocalHeader,function(x){try{if(x)return _(x);var m=o.readUInt32LE(0);if(m!==67324752)return _(Error("invalid local file header signature: 0x"+m.toString(16)));var v=o.readUInt16LE(26),H=o.readUInt16LE(28),Y=n.relativeOffsetOfLocalHeader+o.length+v+H,l;if(n.compressionMethod===0)l=!1;else if(n.compressionMethod===8)l=b.decompress!=null?b.decompress:!0;else return _(Error("unsupported compression method: "+n.compressionMethod));var j=Y,U=j+n.compressedSize;if(n.compressedSize!==0){if(U>w.fileSize)return _(Error("file data overflows file bounds: "+j+" + "+n.compressedSize+" > "+w.fileSize))}var D=w.reader.createReadStream({start:j+$,end:j+q}),M=D;if(l){var S=!1,F=K7.createInflateRaw();if(D.on("error",function(Z){setImmediate(function(){if(!S)F.emit("error",Z)})}),D.pipe(F),w.validateEntrySizes)M=new v2(n.uncompressedSize),F.on("error",function(Z){setImmediate(function(){if(!S)M.emit("error",Z)})}),F.pipe(M);else M=F;M.destroy=function(){if(S=!0,F!==M)F.unpipe(M);D.unpipe(F),D.destroy()}}_(null,M)}finally{w.reader.unref()}})};function m2(){}m2.prototype.getLastModDate=function(){return Z4(this.lastModFileDate,this.lastModFileTime)};m2.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};m2.prototype.isCompressed=function(){return this.compressionMethod===8};function Z4(n,b){var _=n&31,w=(n>>5&15)-1,$=(n>>9&127)+1980,q=0,o=(b&31)*2,x=b>>5&63,m=b>>11&31;return new Date($,w,_,m,x,o,q)}function d4(n){if(n.indexOf("\\")!==-1)return"invalid characters in fileName: "+n;if(/^[a-zA-Z]:/.test(n)||/^\//.test(n))return"absolute path: "+n;if(n.split("/").indexOf("..")!==-1)return"invalid relative path: "+n;return null}function U0(n,b,_,w,$,q){if(w===0)return setImmediate(function(){q(null,hn(0))});n.read(b,_,w,$,function(o,x){if(o)return q(o);if(x<w)return q(Error("unexpected EOF"));q()})}wi.inherits(v2,y4);function v2(n){y4.call(this),this.actualByteCount=0,this.expectedByteCount=n}v2.prototype._transform=function(n,b,_){if(this.actualByteCount+=n.length,this.actualByteCount>this.expectedByteCount){var w="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return _(Error(w))}_(null,n)};v2.prototype._flush=function(n){if(this.actualByteCount<this.expectedByteCount){var b="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return n(Error(b))}n()};wi.inherits(gn,$i);function gn(){$i.call(this),this.refCount=0}gn.prototype.ref=function(){this.refCount+=1};gn.prototype.unref=function(){var n=this;if(n.refCount-=1,n.refCount>0)return;if(n.refCount<0)throw Error("invalid unref");n.close(b);function b(_){if(_)return n.emit("error",_);n.emit("close")}};gn.prototype.createReadStream=function(n){var{start:b,end:_}=n;if(b===_){var w=new $1;return setImmediate(function(){w.end()}),w}var $=this._readStreamForRange(b,_),q=!1,o=new qi(this);$.on("error",function(m){setImmediate(function(){if(!q)o.emit("error",m)})}),o.destroy=function(){$.unpipe(o),o.unref(),$.destroy()};var x=new v2(_-b);return o.on("error",function(m){setImmediate(function(){if(!q)x.emit("error",m)})}),x.destroy=function(){q=!0,o.unpipe(x),o.destroy()},$.pipe(o).pipe(x)};gn.prototype._readStreamForRange=function(n,b){throw Error("not implemented")};gn.prototype.read=function(n,b,_,w,$){var q=this.createReadStream({start:w,end:w+_}),o=new L7,x=0;o._write=function(m,v,H){m.copy(n,b+x,0,m.length),x+=m.length,H()},o.on("finish",$),q.on("error",function(m){$(m)}),q.pipe(o)};gn.prototype.close=function(n){setImmediate(n)};wi.inherits(qi,$1);function qi(n){$1.call(this),this.context=n,this.context.ref(),this.unreffedYet=!1}qi.prototype._flush=function(n){this.unref(),n()};qi.prototype.unref=function(n){if(this.unreffedYet)return;this.unreffedYet=!0,this.context.unref()};var k7="\x00☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function bi(n,b,_,w){if(w)return n.toString("utf8",b,_);else{var $="";for(var q=b;q<_;q++)$+=k7[n[q]];return $}}function C0(n,b){var _=n.readUInt32LE(b),w=n.readUInt32LE(b+4);return w*4294967296+_}var hn;if(typeof Buffer.allocUnsafe==="function")hn=function(n){return Buffer.allocUnsafe(n)};else hn=function(n){return new Buffer(n)};function _i(n){if(n)throw n}});var z4=T((wX,r4)=>{var xn=G4()("extract-zip"),{createWriteStream:y7,promises:S0}=E("fs"),I7=k4(),x0=E("path"),{promisify:o1}=E("util"),g7=E("stream"),Z7=a4(),d7=o1(Z7.open),a7=o1(g7.pipeline);class e4{constructor(n,b){this.zipPath=n,this.opts=b}async extract(){return xn("opening",this.zipPath,"with opts",this.opts),this.zipfile=await d7(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((n,b)=>{this.zipfile.on("error",(_)=>{this.canceled=!0,b(_)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{if(!this.canceled)xn("zip extraction complete"),n()}),this.zipfile.on("entry",async(_)=>{if(this.canceled){xn("skipping entry",_.fileName,{cancelled:this.canceled});return}if(xn("zipfile entry",_.fileName),_.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let w=x0.dirname(x0.join(this.opts.dir,_.fileName));try{await S0.mkdir(w,{recursive:!0});let $=await S0.realpath(w);if(x0.relative(this.opts.dir,$).split(x0.sep).includes(".."))throw Error(`Out of bound path "${$}" found while processing file ${_.fileName}`);await this.extractEntry(_),xn("finished processing",_.fileName),this.zipfile.readEntry()}catch($){this.canceled=!0,this.zipfile.close(),b($)}})})}async extractEntry(n){if(this.canceled){xn("skipping entry extraction",n.fileName,{cancelled:this.canceled});return}if(this.opts.onEntry)this.opts.onEntry(n,this.zipfile);let b=x0.join(this.opts.dir,n.fileName),_=n.externalFileAttributes>>16&65535,w=61440,$=16384,q=40960,o=(_&w)===q,x=(_&w)===$;if(!x&&n.fileName.endsWith("/"))x=!0;let m=n.versionMadeBy>>8;if(!x)x=m===0&&n.externalFileAttributes===16;xn("extracting entry",{filename:n.fileName,isDir:x,isSymlink:o});let v=this.getExtractedMode(_,x)&511,H=x?b:x0.dirname(b),Y={recursive:!0};if(x)Y.mode=v;if(xn("mkdir",{dir:H,...Y}),await S0.mkdir(H,Y),x)return;xn("opening read stream",b);let l=await o1(this.zipfile.openReadStream.bind(this.zipfile))(n);if(o){let j=await I7(l);xn("creating symlink",j,b),await S0.symlink(j,b)}else await a7(l,y7(b,{mode:v}))}getExtractedMode(n,b){let _=n;if(_===0)if(b){if(this.opts.defaultDirMode)_=parseInt(this.opts.defaultDirMode,10);if(!_)_=493}else{if(this.opts.defaultFileMode)_=parseInt(this.opts.defaultFileMode,10);if(!_)_=420}return _}}r4.exports=async function(n,b){if(xn("creating target directory",b.dir),!x0.isAbsolute(b.dir))throw Error("Target directory is expected to be absolute");return await S0.mkdir(b.dir,{recursive:!0}),b.dir=await S0.realpath(b.dir),new e4(n,b).extract()}});var l5={};L1(l5,{rollbackFromLatestBackup:()=>V1,listBackups:()=>I0,backupCurrentBinary:()=>f1,BACKUP_DIR:()=>an});import{copyFile as Y5,readdir as Vq,unlink as Kq,mkdir as Dq,rename as Lq}from"node:fs/promises";import{existsSync as cq}from"node:fs";import{homedir as Aq}from"node:os";import{join as pi,basename as kq}from"node:path";async function W5(){if(!cq(an))await Dq(an,{recursive:!0})}async function f1(){await W5();let n=process.execPath,b=new Date().toISOString().replace(/[:.]/g,"-"),_=`${kq(n)}-${R}-${b}`,w=pi(an,_);return await Y5(n,w),await Rq(),w}async function I0(){return await W5(),(await Vq(an)).filter((_)=>_.startsWith("yunke")).map((_)=>pi(an,_)).sort().reverse()}async function V1(){let n=await I0();if(n.length===0)return null;let b=n[0],_=process.execPath,w=`${_}.rollback`;return await Y5(b,w),await Lq(w,_),b}async function Rq(){let b=(await I0()).slice(Nq);for(let _ of b)try{await Kq(_)}catch{}}var an,Nq=3;var Gi=c1(()=>{qn();an=pi(process.env.YUNKE_CONFIG_DIR??pi(Aq(),".yunke"),"backups")});class G extends Error{code;details;constructor(n,b,_){super(b);this.code=n;this.details=_;this.name="YunkeError"}}class W0 extends G{constructor(n){super("COMMAND_NOT_FOUND",`Command '${n}' not found. Use 'yunke schema' to list available commands.`);this.name="CommandNotFoundError"}}class ui extends G{constructor(n,b){super("VALIDATION_FAILED",n,b);this.name="ValidationError"}}class u2 extends G{constructor(n,b){super("EXECUTION_FAILED",n,b);this.name="ExecutionError"}}class B2 extends G{constructor(n,b,_){super("PLUGIN_LOAD_FAILED",`Failed to load plugin '${n}': ${b}`,_);this.name="PluginLoadError"}}class Bi extends G{constructor(n,b,_){super("PLUGIN_CONFLICT",`Command '${n}' already registered by plugin '${b}', cannot register from '${_}'`);this.name="PluginConflictError"}}class M2 extends G{constructor(n,b){super("TIMEOUT",`Command '${n}' timed out after ${b}ms`);this.name="TimeoutError"}}class rn{commands;constructor(n=new Map){this.commands=n}register(n){if(this.commands.has(n.name)){let _=this.commands.get(n.name);throw new Bi(n.name,_.pluginName,n.pluginName)}let b=new Map(this.commands);return b.set(n.name,n),new rn(b)}unregister(n){if(!this.commands.has(n))return this;let b=new Map(this.commands);return b.delete(n),new rn(b)}get(n){return this.commands.get(n)}getAll(){return Array.from(this.commands.values())}getAllVisible(){return this.getAll().filter((n)=>!n.hidden)}getByPlugin(n){return this.getAll().filter((b)=>b.pluginName===n)}has(n){return this.commands.has(n)}get size(){return this.commands.size}}function A1(n,b,_){return{command:n,duration_ms:_,timestamp:new Date().toISOString(),plugin:b}}function k1(n,b,_,w){return{success:!0,data:_,error:null,metadata:A1(n,b,w)}}function kn(n,b,_,w){return{success:!1,data:null,error:{code:_ instanceof G?_.code:"EXECUTION_FAILED",message:_ instanceof Error?_.message:String(_),details:_ instanceof G?_.details:void 0},metadata:A1(n,b,w)}}import{appendFileSync as I5,mkdirSync as g5,renameSync as N1,statSync as Z5,unlinkSync as R1}from"node:fs";import{homedir as d5}from"node:os";import{join as Mi}from"node:path";var a5=1048576,e5=3,r5=5,z5=200,s5=1000,n8=500;function i8(n=process.env.YUNKE_LOG_LEVEL){let b=(n??"").trim().toLowerCase();return b==="off"||b==="error"?b:"info"}function b8(){let n=process.env.YUNKE_CONFIG_DIR??Mi(process.env.YUNKE_HOME_OVERRIDE??d5(),".yunke");return Mi(n,"logs")}var _8=["token","password","passwd","pwd","secret","jwt","smscode","verifycode","captcha","authorization","apikey","cookie","session","credential","privatekey"];function w8(n){let b=n.toLowerCase().replace(/[^a-z0-9]/g,"");return _8.some((_)=>b.includes(_))}function fi(n,b){return n.length>b?n.slice(0,b)+"...[truncated]":n}function ji(n,b=0){if(b>r5)return"[max-depth]";if(n===null||n===void 0)return n;if(typeof n==="string")return fi(n,z5);if(typeof n==="number"||typeof n==="boolean")return n;if(Array.isArray(n))return n.map((_)=>ji(_,b+1));if(typeof n==="object"){let _={};for(let[w,$]of Object.entries(n))_[w]=w8(w)?"[REDACTED]":ji($,b+1);return _}return String(n)}var $8=/(?<!\d)(1[3-9]\d{9})(?!\d)/g;function q8(n){return n.replace($8,(b)=>`${b.slice(0,3)}****${b.slice(-4)}`)}function o8(n){if(!n||Object.keys(n).length===0)return"";let b;try{b=JSON.stringify(ji(n))??""}catch{return"[unserializable]"}return b=q8(b),fi(b,s5)}function j2(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\r?\n/g,"\\n")}"`}function x8(n,b){try{if(Z5(n).size<=b)return}catch{return}for(let _=e5-1;_>=1;_--){let w=`${n}.${_+1}`;try{R1(w)}catch{}try{N1(`${n}.${_}`,w)}catch{}}try{R1(`${n}.1`)}catch{}try{N1(n,`${n}.1`)}catch{}}function d0(n,b,_,w){try{let $=i8();if($==="off")return;if($==="error"&&b!=="error")return;let q=b8();g5(q,{recursive:!0});let o=Mi(q,n);x8(o,w?.maxBytes??a5),I5(o,`${new Date().toISOString()} [${b.toUpperCase()}] ${_.replace(/\r?\n/g,"\\n")}
7
- `,"utf-8")}catch{}}function f2(n){let{parsed:b,output:_}=n,w=_.metadata,$=[`cmd=${j2(w.command)}`,`plugin=${j2(w.plugin)}`,`success=${_.success}`,`duration_ms=${w.duration_ms}`];if(!_.success&&_.error)$.push(`code=${j2(_.error.code)}`,`msg=${j2(fi(_.error.message,n8))}`);let q=o8(b.args);if(q)$.push(`args=${q}`);d0("cli.log",_.success?"info":"error",$.join(" "))}var i={};L1(i,{void:()=>g8,util:()=>c,unknown:()=>y8,union:()=>e8,undefined:()=>F8,tuple:()=>s8,transformer:()=>m9,symbol:()=>E8,string:()=>y1,strictObject:()=>a8,setErrorMap:()=>H8,set:()=>b9,record:()=>n9,quotelessJson:()=>m8,promise:()=>x9,preprocess:()=>Q9,pipeline:()=>X9,ostring:()=>J9,optional:()=>v9,onumber:()=>Y9,oboolean:()=>W9,objectUtil:()=>Vi,object:()=>d8,number:()=>I1,nullable:()=>H9,null:()=>P8,never:()=>I8,nativeEnum:()=>o9,nan:()=>C8,map:()=>i9,makeIssue:()=>a0,literal:()=>$9,lazy:()=>w9,late:()=>R8,isValid:()=>Nn,isDirty:()=>K2,isAsync:()=>p0,isAborted:()=>V2,intersection:()=>z8,instanceof:()=>U8,getParsedType:()=>Wn,getErrorMap:()=>l0,function:()=>_9,enum:()=>q9,effect:()=>m9,discriminatedUnion:()=>r8,defaultErrorMap:()=>Bn,datetimeRegex:()=>F1,date:()=>t8,custom:()=>T1,coerce:()=>l9,boolean:()=>g1,bigint:()=>S8,array:()=>Z8,any:()=>T8,addIssueToContext:()=>W,ZodVoid:()=>r0,ZodUnknown:()=>Rn,ZodUnion:()=>M0,ZodUndefined:()=>u0,ZodType:()=>L,ZodTuple:()=>pn,ZodTransformer:()=>_n,ZodSymbol:()=>e0,ZodString:()=>r,ZodSet:()=>i0,ZodSchema:()=>L,ZodRecord:()=>z0,ZodReadonly:()=>L0,ZodPromise:()=>b0,ZodPipeline:()=>i2,ZodParsedType:()=>J,ZodOptional:()=>z,ZodObject:()=>C,ZodNumber:()=>Un,ZodNullable:()=>jn,ZodNull:()=>B0,ZodNever:()=>ln,ZodNativeEnum:()=>K0,ZodNaN:()=>n2,ZodMap:()=>s0,ZodLiteral:()=>V0,ZodLazy:()=>f0,ZodIssueCode:()=>Q,ZodIntersection:()=>j0,ZodFunction:()=>O0,ZodFirstPartyTypeKind:()=>X,ZodError:()=>d,ZodEnum:()=>Sn,ZodEffects:()=>_n,ZodDiscriminatedUnion:()=>D2,ZodDefault:()=>tn,ZodDate:()=>sn,ZodCatch:()=>D0,ZodBranded:()=>L2,ZodBoolean:()=>h0,ZodBigInt:()=>Cn,ZodArray:()=>nn,ZodAny:()=>n0,Schema:()=>L,ParseStatus:()=>P,OK:()=>y,NEVER:()=>p9,INVALID:()=>u,EMPTY_PATH:()=>Q8,DIRTY:()=>zn,BRAND:()=>N8});var c;(function(n){n.assertEqual=($)=>{};function b($){}n.assertIs=b;function _($){throw Error()}n.assertNever=_,n.arrayToEnum=($)=>{let q={};for(let o of $)q[o]=o;return q},n.getValidEnumValues=($)=>{let q=n.objectKeys($).filter((x)=>typeof $[$[x]]!=="number"),o={};for(let x of q)o[x]=$[x];return n.objectValues(o)},n.objectValues=($)=>{return n.objectKeys($).map(function(q){return $[q]})},n.objectKeys=typeof Object.keys==="function"?($)=>Object.keys($):($)=>{let q=[];for(let o in $)if(Object.prototype.hasOwnProperty.call($,o))q.push(o);return q},n.find=($,q)=>{for(let o of $)if(q(o))return o;return},n.isInteger=typeof Number.isInteger==="function"?($)=>Number.isInteger($):($)=>typeof $==="number"&&Number.isFinite($)&&Math.floor($)===$;function w($,q=" | "){return $.map((o)=>typeof o==="string"?`'${o}'`:o).join(q)}n.joinValues=w,n.jsonStringifyReplacer=($,q)=>{if(typeof q==="bigint")return q.toString();return q}})(c||(c={}));var Vi;(function(n){n.mergeShapes=(b,_)=>{return{...b,..._}}})(Vi||(Vi={}));var J=c.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Wn=(n)=>{switch(typeof n){case"undefined":return J.undefined;case"string":return J.string;case"number":return Number.isNaN(n)?J.nan:J.number;case"boolean":return J.boolean;case"function":return J.function;case"bigint":return J.bigint;case"symbol":return J.symbol;case"object":if(Array.isArray(n))return J.array;if(n===null)return J.null;if(n.then&&typeof n.then==="function"&&n.catch&&typeof n.catch==="function")return J.promise;if(typeof Map<"u"&&n instanceof Map)return J.map;if(typeof Set<"u"&&n instanceof Set)return J.set;if(typeof Date<"u"&&n instanceof Date)return J.date;return J.object;default:return J.unknown}};var Q=c.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),m8=(n)=>{return JSON.stringify(n,null,2).replace(/"([^"]+)":/g,"$1:")};class d extends Error{get errors(){return this.issues}constructor(n){super();this.issues=[],this.addIssue=(_)=>{this.issues=[...this.issues,_]},this.addIssues=(_=[])=>{this.issues=[...this.issues,..._]};let b=new.target.prototype;if(Object.setPrototypeOf)Object.setPrototypeOf(this,b);else this.__proto__=b;this.name="ZodError",this.issues=n}format(n){let b=n||function($){return $.message},_={_errors:[]},w=($)=>{for(let q of $.issues)if(q.code==="invalid_union")q.unionErrors.map(w);else if(q.code==="invalid_return_type")w(q.returnTypeError);else if(q.code==="invalid_arguments")w(q.argumentsError);else if(q.path.length===0)_._errors.push(b(q));else{let o=_,x=0;while(x<q.path.length){let m=q.path[x];if(x!==q.path.length-1)o[m]=o[m]||{_errors:[]};else o[m]=o[m]||{_errors:[]},o[m]._errors.push(b(q));o=o[m],x++}}};return w(this),_}static assert(n){if(!(n instanceof d))throw Error(`Not a ZodError: ${n}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,c.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(n=(b)=>b.message){let b={},_=[];for(let w of this.issues)if(w.path.length>0){let $=w.path[0];b[$]=b[$]||[],b[$].push(n(w))}else _.push(n(w));return{formErrors:_,fieldErrors:b}}get formErrors(){return this.flatten()}}d.create=(n)=>{return new d(n)};var v8=(n,b)=>{let _;switch(n.code){case Q.invalid_type:if(n.received===J.undefined)_="Required";else _=`Expected ${n.expected}, received ${n.received}`;break;case Q.invalid_literal:_=`Invalid literal value, expected ${JSON.stringify(n.expected,c.jsonStringifyReplacer)}`;break;case Q.unrecognized_keys:_=`Unrecognized key(s) in object: ${c.joinValues(n.keys,", ")}`;break;case Q.invalid_union:_="Invalid input";break;case Q.invalid_union_discriminator:_=`Invalid discriminator value. Expected ${c.joinValues(n.options)}`;break;case Q.invalid_enum_value:_=`Invalid enum value. Expected ${c.joinValues(n.options)}, received '${n.received}'`;break;case Q.invalid_arguments:_="Invalid function arguments";break;case Q.invalid_return_type:_="Invalid function return type";break;case Q.invalid_date:_="Invalid date";break;case Q.invalid_string:if(typeof n.validation==="object")if("includes"in n.validation){if(_=`Invalid input: must include "${n.validation.includes}"`,typeof n.validation.position==="number")_=`${_} at one or more positions greater than or equal to ${n.validation.position}`}else if("startsWith"in n.validation)_=`Invalid input: must start with "${n.validation.startsWith}"`;else if("endsWith"in n.validation)_=`Invalid input: must end with "${n.validation.endsWith}"`;else c.assertNever(n.validation);else if(n.validation!=="regex")_=`Invalid ${n.validation}`;else _="Invalid";break;case Q.too_small:if(n.type==="array")_=`Array must contain ${n.exact?"exactly":n.inclusive?"at least":"more than"} ${n.minimum} element(s)`;else if(n.type==="string")_=`String must contain ${n.exact?"exactly":n.inclusive?"at least":"over"} ${n.minimum} character(s)`;else if(n.type==="number")_=`Number must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${n.minimum}`;else if(n.type==="bigint")_=`Number must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${n.minimum}`;else if(n.type==="date")_=`Date must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(n.minimum))}`;else _="Invalid input";break;case Q.too_big:if(n.type==="array")_=`Array must contain ${n.exact?"exactly":n.inclusive?"at most":"less than"} ${n.maximum} element(s)`;else if(n.type==="string")_=`String must contain ${n.exact?"exactly":n.inclusive?"at most":"under"} ${n.maximum} character(s)`;else if(n.type==="number")_=`Number must be ${n.exact?"exactly":n.inclusive?"less than or equal to":"less than"} ${n.maximum}`;else if(n.type==="bigint")_=`BigInt must be ${n.exact?"exactly":n.inclusive?"less than or equal to":"less than"} ${n.maximum}`;else if(n.type==="date")_=`Date must be ${n.exact?"exactly":n.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(n.maximum))}`;else _="Invalid input";break;case Q.custom:_="Invalid input";break;case Q.invalid_intersection_types:_="Intersection results could not be merged";break;case Q.not_multiple_of:_=`Number must be a multiple of ${n.multipleOf}`;break;case Q.not_finite:_="Number must be finite";break;default:_=b.defaultError,c.assertNever(n)}return{message:_}},Bn=v8;var U1=Bn;function H8(n){U1=n}function l0(){return U1}var a0=(n)=>{let{data:b,path:_,errorMaps:w,issueData:$}=n,q=[..._,...$.path||[]],o={...$,path:q};if($.message!==void 0)return{...$,path:q,message:$.message};let x="",m=w.filter((v)=>!!v).slice().reverse();for(let v of m)x=v(o,{data:b,defaultError:x}).message;return{...$,path:q,message:x}},Q8=[];function W(n,b){let _=l0(),w=a0({issueData:b,data:n.data,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,_,_===Bn?void 0:Bn].filter(($)=>!!$)});n.common.issues.push(w)}class P{constructor(){this.value="valid"}dirty(){if(this.value==="valid")this.value="dirty"}abort(){if(this.value!=="aborted")this.value="aborted"}static mergeArray(n,b){let _=[];for(let w of b){if(w.status==="aborted")return u;if(w.status==="dirty")n.dirty();_.push(w.value)}return{status:n.value,value:_}}static async mergeObjectAsync(n,b){let _=[];for(let w of b){let $=await w.key,q=await w.value;_.push({key:$,value:q})}return P.mergeObjectSync(n,_)}static mergeObjectSync(n,b){let _={};for(let w of b){let{key:$,value:q}=w;if($.status==="aborted")return u;if(q.status==="aborted")return u;if($.status==="dirty")n.dirty();if(q.status==="dirty")n.dirty();if($.value!=="__proto__"&&(typeof q.value<"u"||w.alwaysSet))_[$.value]=q.value}return{status:n.value,value:_}}}var u=Object.freeze({status:"aborted"}),zn=(n)=>({status:"dirty",value:n}),y=(n)=>({status:"valid",value:n}),V2=(n)=>n.status==="aborted",K2=(n)=>n.status==="dirty",Nn=(n)=>n.status==="valid",p0=(n)=>typeof Promise<"u"&&n instanceof Promise;var h;(function(n){n.errToObj=(b)=>typeof b==="string"?{message:b}:b||{},n.toString=(b)=>typeof b==="string"?b:b?.message})(h||(h={}));class bn{constructor(n,b,_,w){this._cachedPath=[],this.parent=n,this.data=b,this._path=_,this._key=w}get path(){if(!this._cachedPath.length)if(Array.isArray(this._key))this._cachedPath.push(...this._path,...this._key);else this._cachedPath.push(...this._path,this._key);return this._cachedPath}}var C1=(n,b)=>{if(Nn(b))return{success:!0,data:b.value};else{if(!n.common.issues.length)throw Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let _=new d(n.common.issues);return this._error=_,this._error}}}};function f(n){if(!n)return{};let{errorMap:b,invalid_type_error:_,required_error:w,description:$}=n;if(b&&(_||w))throw Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);if(b)return{errorMap:b,description:$};return{errorMap:(o,x)=>{let{message:m}=n;if(o.code==="invalid_enum_value")return{message:m??x.defaultError};if(typeof x.data>"u")return{message:m??w??x.defaultError};if(o.code!=="invalid_type")return{message:x.defaultError};return{message:m??_??x.defaultError}},description:$}}class L{get description(){return this._def.description}_getType(n){return Wn(n.data)}_getOrReturnCtx(n,b){return b||{common:n.parent.common,data:n.data,parsedType:Wn(n.data),schemaErrorMap:this._def.errorMap,path:n.path,parent:n.parent}}_processInputParams(n){return{status:new P,ctx:{common:n.parent.common,data:n.data,parsedType:Wn(n.data),schemaErrorMap:this._def.errorMap,path:n.path,parent:n.parent}}}_parseSync(n){let b=this._parse(n);if(p0(b))throw Error("Synchronous parse encountered promise.");return b}_parseAsync(n){let b=this._parse(n);return Promise.resolve(b)}parse(n,b){let _=this.safeParse(n,b);if(_.success)return _.data;throw _.error}safeParse(n,b){let _={common:{issues:[],async:b?.async??!1,contextualErrorMap:b?.errorMap},path:b?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:Wn(n)},w=this._parseSync({data:n,path:_.path,parent:_});return C1(_,w)}"~validate"(n){let b={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:Wn(n)};if(!this["~standard"].async)try{let _=this._parseSync({data:n,path:[],parent:b});return Nn(_)?{value:_.value}:{issues:b.common.issues}}catch(_){if(_?.message?.toLowerCase()?.includes("encountered"))this["~standard"].async=!0;b.common={issues:[],async:!0}}return this._parseAsync({data:n,path:[],parent:b}).then((_)=>Nn(_)?{value:_.value}:{issues:b.common.issues})}async parseAsync(n,b){let _=await this.safeParseAsync(n,b);if(_.success)return _.data;throw _.error}async safeParseAsync(n,b){let _={common:{issues:[],contextualErrorMap:b?.errorMap,async:!0},path:b?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:Wn(n)},w=this._parse({data:n,path:_.path,parent:_}),$=await(p0(w)?w:Promise.resolve(w));return C1(_,$)}refine(n,b){let _=(w)=>{if(typeof b==="string"||typeof b>"u")return{message:b};else if(typeof b==="function")return b(w);else return b};return this._refinement((w,$)=>{let q=n(w),o=()=>$.addIssue({code:Q.custom,..._(w)});if(typeof Promise<"u"&&q instanceof Promise)return q.then((x)=>{if(!x)return o(),!1;else return!0});if(!q)return o(),!1;else return!0})}refinement(n,b){return this._refinement((_,w)=>{if(!n(_))return w.addIssue(typeof b==="function"?b(_,w):b),!1;else return!0})}_refinement(n){return new _n({schema:this,typeName:X.ZodEffects,effect:{type:"refinement",refinement:n}})}superRefine(n){return this._refinement(n)}constructor(n){this.spa=this.safeParseAsync,this._def=n,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:(b)=>this["~validate"](b)}}optional(){return z.create(this,this._def)}nullable(){return jn.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return nn.create(this)}promise(){return b0.create(this,this._def)}or(n){return M0.create([this,n],this._def)}and(n){return j0.create(this,n,this._def)}transform(n){return new _n({...f(this._def),schema:this,typeName:X.ZodEffects,effect:{type:"transform",transform:n}})}default(n){let b=typeof n==="function"?n:()=>n;return new tn({...f(this._def),innerType:this,defaultValue:b,typeName:X.ZodDefault})}brand(){return new L2({typeName:X.ZodBranded,type:this,...f(this._def)})}catch(n){let b=typeof n==="function"?n:()=>n;return new D0({...f(this._def),innerType:this,catchValue:b,typeName:X.ZodCatch})}describe(n){return new this.constructor({...this._def,description:n})}pipe(n){return i2.create(this,n)}readonly(){return L0.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}var X8=/^c[^\s-]{8,}$/i,J8=/^[0-9a-z]+$/,Y8=/^[0-9A-HJKMNP-TV-Z]{26}$/i,W8=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,l8=/^[a-z0-9_-]{21}$/i,p8=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,G8=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,O8=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,h8="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",Ki,u8=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,B8=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,M8=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,j8=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,f8=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,V8=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,t1="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",K8=new RegExp(`^${t1}$`);function E1(n){let b="[0-5]\\d";if(n.precision)b=`${b}\\.\\d{${n.precision}}`;else if(n.precision==null)b=`${b}(\\.\\d+)?`;let _=n.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${b})${_}`}function D8(n){return new RegExp(`^${E1(n)}$`)}function F1(n){let b=`${t1}T${E1(n)}`,_=[];if(_.push(n.local?"Z?":"Z"),n.offset)_.push("([+-]\\d{2}:?\\d{2})");return b=`${b}(${_.join("|")})`,new RegExp(`^${b}$`)}function L8(n,b){if((b==="v4"||!b)&&u8.test(n))return!0;if((b==="v6"||!b)&&M8.test(n))return!0;return!1}function c8(n,b){if(!p8.test(n))return!1;try{let[_]=n.split(".");if(!_)return!1;let w=_.replace(/-/g,"+").replace(/_/g,"/").padEnd(_.length+(4-_.length%4)%4,"="),$=JSON.parse(atob(w));if(typeof $!=="object"||$===null)return!1;if("typ"in $&&$?.typ!=="JWT")return!1;if(!$.alg)return!1;if(b&&$.alg!==b)return!1;return!0}catch{return!1}}function A8(n,b){if((b==="v4"||!b)&&B8.test(n))return!0;if((b==="v6"||!b)&&j8.test(n))return!0;return!1}class r extends L{_parse(n){if(this._def.coerce)n.data=String(n.data);if(this._getType(n)!==J.string){let $=this._getOrReturnCtx(n);return W($,{code:Q.invalid_type,expected:J.string,received:$.parsedType}),u}let _=new P,w=void 0;for(let $ of this._def.checks)if($.kind==="min"){if(n.data.length<$.value)w=this._getOrReturnCtx(n,w),W(w,{code:Q.too_small,minimum:$.value,type:"string",inclusive:!0,exact:!1,message:$.message}),_.dirty()}else if($.kind==="max"){if(n.data.length>$.value)w=this._getOrReturnCtx(n,w),W(w,{code:Q.too_big,maximum:$.value,type:"string",inclusive:!0,exact:!1,message:$.message}),_.dirty()}else if($.kind==="length"){let q=n.data.length>$.value,o=n.data.length<$.value;if(q||o){if(w=this._getOrReturnCtx(n,w),q)W(w,{code:Q.too_big,maximum:$.value,type:"string",inclusive:!0,exact:!0,message:$.message});else if(o)W(w,{code:Q.too_small,minimum:$.value,type:"string",inclusive:!0,exact:!0,message:$.message});_.dirty()}}else if($.kind==="email"){if(!O8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"email",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="emoji"){if(!Ki)Ki=new RegExp(h8,"u");if(!Ki.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"emoji",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="uuid"){if(!W8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"uuid",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="nanoid"){if(!l8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"nanoid",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="cuid"){if(!X8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"cuid",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="cuid2"){if(!J8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"cuid2",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="ulid"){if(!Y8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"ulid",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="url")try{new URL(n.data)}catch{w=this._getOrReturnCtx(n,w),W(w,{validation:"url",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="regex"){if($.regex.lastIndex=0,!$.regex.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"regex",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="trim")n.data=n.data.trim();else if($.kind==="includes"){if(!n.data.includes($.value,$.position))w=this._getOrReturnCtx(n,w),W(w,{code:Q.invalid_string,validation:{includes:$.value,position:$.position},message:$.message}),_.dirty()}else if($.kind==="toLowerCase")n.data=n.data.toLowerCase();else if($.kind==="toUpperCase")n.data=n.data.toUpperCase();else if($.kind==="startsWith"){if(!n.data.startsWith($.value))w=this._getOrReturnCtx(n,w),W(w,{code:Q.invalid_string,validation:{startsWith:$.value},message:$.message}),_.dirty()}else if($.kind==="endsWith"){if(!n.data.endsWith($.value))w=this._getOrReturnCtx(n,w),W(w,{code:Q.invalid_string,validation:{endsWith:$.value},message:$.message}),_.dirty()}else if($.kind==="datetime"){if(!F1($).test(n.data))w=this._getOrReturnCtx(n,w),W(w,{code:Q.invalid_string,validation:"datetime",message:$.message}),_.dirty()}else if($.kind==="date"){if(!K8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{code:Q.invalid_string,validation:"date",message:$.message}),_.dirty()}else if($.kind==="time"){if(!D8($).test(n.data))w=this._getOrReturnCtx(n,w),W(w,{code:Q.invalid_string,validation:"time",message:$.message}),_.dirty()}else if($.kind==="duration"){if(!G8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"duration",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="ip"){if(!L8(n.data,$.version))w=this._getOrReturnCtx(n,w),W(w,{validation:"ip",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="jwt"){if(!c8(n.data,$.alg))w=this._getOrReturnCtx(n,w),W(w,{validation:"jwt",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="cidr"){if(!A8(n.data,$.version))w=this._getOrReturnCtx(n,w),W(w,{validation:"cidr",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="base64"){if(!f8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"base64",code:Q.invalid_string,message:$.message}),_.dirty()}else if($.kind==="base64url"){if(!V8.test(n.data))w=this._getOrReturnCtx(n,w),W(w,{validation:"base64url",code:Q.invalid_string,message:$.message}),_.dirty()}else c.assertNever($);return{status:_.value,value:n.data}}_regex(n,b,_){return this.refinement((w)=>n.test(w),{validation:b,code:Q.invalid_string,...h.errToObj(_)})}_addCheck(n){return new r({...this._def,checks:[...this._def.checks,n]})}email(n){return this._addCheck({kind:"email",...h.errToObj(n)})}url(n){return this._addCheck({kind:"url",...h.errToObj(n)})}emoji(n){return this._addCheck({kind:"emoji",...h.errToObj(n)})}uuid(n){return this._addCheck({kind:"uuid",...h.errToObj(n)})}nanoid(n){return this._addCheck({kind:"nanoid",...h.errToObj(n)})}cuid(n){return this._addCheck({kind:"cuid",...h.errToObj(n)})}cuid2(n){return this._addCheck({kind:"cuid2",...h.errToObj(n)})}ulid(n){return this._addCheck({kind:"ulid",...h.errToObj(n)})}base64(n){return this._addCheck({kind:"base64",...h.errToObj(n)})}base64url(n){return this._addCheck({kind:"base64url",...h.errToObj(n)})}jwt(n){return this._addCheck({kind:"jwt",...h.errToObj(n)})}ip(n){return this._addCheck({kind:"ip",...h.errToObj(n)})}cidr(n){return this._addCheck({kind:"cidr",...h.errToObj(n)})}datetime(n){if(typeof n==="string")return this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:n});return this._addCheck({kind:"datetime",precision:typeof n?.precision>"u"?null:n?.precision,offset:n?.offset??!1,local:n?.local??!1,...h.errToObj(n?.message)})}date(n){return this._addCheck({kind:"date",message:n})}time(n){if(typeof n==="string")return this._addCheck({kind:"time",precision:null,message:n});return this._addCheck({kind:"time",precision:typeof n?.precision>"u"?null:n?.precision,...h.errToObj(n?.message)})}duration(n){return this._addCheck({kind:"duration",...h.errToObj(n)})}regex(n,b){return this._addCheck({kind:"regex",regex:n,...h.errToObj(b)})}includes(n,b){return this._addCheck({kind:"includes",value:n,position:b?.position,...h.errToObj(b?.message)})}startsWith(n,b){return this._addCheck({kind:"startsWith",value:n,...h.errToObj(b)})}endsWith(n,b){return this._addCheck({kind:"endsWith",value:n,...h.errToObj(b)})}min(n,b){return this._addCheck({kind:"min",value:n,...h.errToObj(b)})}max(n,b){return this._addCheck({kind:"max",value:n,...h.errToObj(b)})}length(n,b){return this._addCheck({kind:"length",value:n,...h.errToObj(b)})}nonempty(n){return this.min(1,h.errToObj(n))}trim(){return new r({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new r({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new r({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find((n)=>n.kind==="datetime")}get isDate(){return!!this._def.checks.find((n)=>n.kind==="date")}get isTime(){return!!this._def.checks.find((n)=>n.kind==="time")}get isDuration(){return!!this._def.checks.find((n)=>n.kind==="duration")}get isEmail(){return!!this._def.checks.find((n)=>n.kind==="email")}get isURL(){return!!this._def.checks.find((n)=>n.kind==="url")}get isEmoji(){return!!this._def.checks.find((n)=>n.kind==="emoji")}get isUUID(){return!!this._def.checks.find((n)=>n.kind==="uuid")}get isNANOID(){return!!this._def.checks.find((n)=>n.kind==="nanoid")}get isCUID(){return!!this._def.checks.find((n)=>n.kind==="cuid")}get isCUID2(){return!!this._def.checks.find((n)=>n.kind==="cuid2")}get isULID(){return!!this._def.checks.find((n)=>n.kind==="ulid")}get isIP(){return!!this._def.checks.find((n)=>n.kind==="ip")}get isCIDR(){return!!this._def.checks.find((n)=>n.kind==="cidr")}get isBase64(){return!!this._def.checks.find((n)=>n.kind==="base64")}get isBase64url(){return!!this._def.checks.find((n)=>n.kind==="base64url")}get minLength(){let n=null;for(let b of this._def.checks)if(b.kind==="min"){if(n===null||b.value>n)n=b.value}return n}get maxLength(){let n=null;for(let b of this._def.checks)if(b.kind==="max"){if(n===null||b.value<n)n=b.value}return n}}r.create=(n)=>{return new r({checks:[],typeName:X.ZodString,coerce:n?.coerce??!1,...f(n)})};function k8(n,b){let _=(n.toString().split(".")[1]||"").length,w=(b.toString().split(".")[1]||"").length,$=_>w?_:w,q=Number.parseInt(n.toFixed($).replace(".","")),o=Number.parseInt(b.toFixed($).replace(".",""));return q%o/10**$}class Un extends L{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(n){if(this._def.coerce)n.data=Number(n.data);if(this._getType(n)!==J.number){let $=this._getOrReturnCtx(n);return W($,{code:Q.invalid_type,expected:J.number,received:$.parsedType}),u}let _=void 0,w=new P;for(let $ of this._def.checks)if($.kind==="int"){if(!c.isInteger(n.data))_=this._getOrReturnCtx(n,_),W(_,{code:Q.invalid_type,expected:"integer",received:"float",message:$.message}),w.dirty()}else if($.kind==="min"){if($.inclusive?n.data<$.value:n.data<=$.value)_=this._getOrReturnCtx(n,_),W(_,{code:Q.too_small,minimum:$.value,type:"number",inclusive:$.inclusive,exact:!1,message:$.message}),w.dirty()}else if($.kind==="max"){if($.inclusive?n.data>$.value:n.data>=$.value)_=this._getOrReturnCtx(n,_),W(_,{code:Q.too_big,maximum:$.value,type:"number",inclusive:$.inclusive,exact:!1,message:$.message}),w.dirty()}else if($.kind==="multipleOf"){if(k8(n.data,$.value)!==0)_=this._getOrReturnCtx(n,_),W(_,{code:Q.not_multiple_of,multipleOf:$.value,message:$.message}),w.dirty()}else if($.kind==="finite"){if(!Number.isFinite(n.data))_=this._getOrReturnCtx(n,_),W(_,{code:Q.not_finite,message:$.message}),w.dirty()}else c.assertNever($);return{status:w.value,value:n.data}}gte(n,b){return this.setLimit("min",n,!0,h.toString(b))}gt(n,b){return this.setLimit("min",n,!1,h.toString(b))}lte(n,b){return this.setLimit("max",n,!0,h.toString(b))}lt(n,b){return this.setLimit("max",n,!1,h.toString(b))}setLimit(n,b,_,w){return new Un({...this._def,checks:[...this._def.checks,{kind:n,value:b,inclusive:_,message:h.toString(w)}]})}_addCheck(n){return new Un({...this._def,checks:[...this._def.checks,n]})}int(n){return this._addCheck({kind:"int",message:h.toString(n)})}positive(n){return this._addCheck({kind:"min",value:0,inclusive:!1,message:h.toString(n)})}negative(n){return this._addCheck({kind:"max",value:0,inclusive:!1,message:h.toString(n)})}nonpositive(n){return this._addCheck({kind:"max",value:0,inclusive:!0,message:h.toString(n)})}nonnegative(n){return this._addCheck({kind:"min",value:0,inclusive:!0,message:h.toString(n)})}multipleOf(n,b){return this._addCheck({kind:"multipleOf",value:n,message:h.toString(b)})}finite(n){return this._addCheck({kind:"finite",message:h.toString(n)})}safe(n){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:h.toString(n)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:h.toString(n)})}get minValue(){let n=null;for(let b of this._def.checks)if(b.kind==="min"){if(n===null||b.value>n)n=b.value}return n}get maxValue(){let n=null;for(let b of this._def.checks)if(b.kind==="max"){if(n===null||b.value<n)n=b.value}return n}get isInt(){return!!this._def.checks.find((n)=>n.kind==="int"||n.kind==="multipleOf"&&c.isInteger(n.value))}get isFinite(){let n=null,b=null;for(let _ of this._def.checks)if(_.kind==="finite"||_.kind==="int"||_.kind==="multipleOf")return!0;else if(_.kind==="min"){if(b===null||_.value>b)b=_.value}else if(_.kind==="max"){if(n===null||_.value<n)n=_.value}return Number.isFinite(b)&&Number.isFinite(n)}}Un.create=(n)=>{return new Un({checks:[],typeName:X.ZodNumber,coerce:n?.coerce||!1,...f(n)})};class Cn extends L{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte}_parse(n){if(this._def.coerce)try{n.data=BigInt(n.data)}catch{return this._getInvalidInput(n)}if(this._getType(n)!==J.bigint)return this._getInvalidInput(n);let _=void 0,w=new P;for(let $ of this._def.checks)if($.kind==="min"){if($.inclusive?n.data<$.value:n.data<=$.value)_=this._getOrReturnCtx(n,_),W(_,{code:Q.too_small,type:"bigint",minimum:$.value,inclusive:$.inclusive,message:$.message}),w.dirty()}else if($.kind==="max"){if($.inclusive?n.data>$.value:n.data>=$.value)_=this._getOrReturnCtx(n,_),W(_,{code:Q.too_big,type:"bigint",maximum:$.value,inclusive:$.inclusive,message:$.message}),w.dirty()}else if($.kind==="multipleOf"){if(n.data%$.value!==BigInt(0))_=this._getOrReturnCtx(n,_),W(_,{code:Q.not_multiple_of,multipleOf:$.value,message:$.message}),w.dirty()}else c.assertNever($);return{status:w.value,value:n.data}}_getInvalidInput(n){let b=this._getOrReturnCtx(n);return W(b,{code:Q.invalid_type,expected:J.bigint,received:b.parsedType}),u}gte(n,b){return this.setLimit("min",n,!0,h.toString(b))}gt(n,b){return this.setLimit("min",n,!1,h.toString(b))}lte(n,b){return this.setLimit("max",n,!0,h.toString(b))}lt(n,b){return this.setLimit("max",n,!1,h.toString(b))}setLimit(n,b,_,w){return new Cn({...this._def,checks:[...this._def.checks,{kind:n,value:b,inclusive:_,message:h.toString(w)}]})}_addCheck(n){return new Cn({...this._def,checks:[...this._def.checks,n]})}positive(n){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:h.toString(n)})}negative(n){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:h.toString(n)})}nonpositive(n){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:h.toString(n)})}nonnegative(n){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:h.toString(n)})}multipleOf(n,b){return this._addCheck({kind:"multipleOf",value:n,message:h.toString(b)})}get minValue(){let n=null;for(let b of this._def.checks)if(b.kind==="min"){if(n===null||b.value>n)n=b.value}return n}get maxValue(){let n=null;for(let b of this._def.checks)if(b.kind==="max"){if(n===null||b.value<n)n=b.value}return n}}Cn.create=(n)=>{return new Cn({checks:[],typeName:X.ZodBigInt,coerce:n?.coerce??!1,...f(n)})};class h0 extends L{_parse(n){if(this._def.coerce)n.data=Boolean(n.data);if(this._getType(n)!==J.boolean){let _=this._getOrReturnCtx(n);return W(_,{code:Q.invalid_type,expected:J.boolean,received:_.parsedType}),u}return y(n.data)}}h0.create=(n)=>{return new h0({typeName:X.ZodBoolean,coerce:n?.coerce||!1,...f(n)})};class sn extends L{_parse(n){if(this._def.coerce)n.data=new Date(n.data);if(this._getType(n)!==J.date){let $=this._getOrReturnCtx(n);return W($,{code:Q.invalid_type,expected:J.date,received:$.parsedType}),u}if(Number.isNaN(n.data.getTime())){let $=this._getOrReturnCtx(n);return W($,{code:Q.invalid_date}),u}let _=new P,w=void 0;for(let $ of this._def.checks)if($.kind==="min"){if(n.data.getTime()<$.value)w=this._getOrReturnCtx(n,w),W(w,{code:Q.too_small,message:$.message,inclusive:!0,exact:!1,minimum:$.value,type:"date"}),_.dirty()}else if($.kind==="max"){if(n.data.getTime()>$.value)w=this._getOrReturnCtx(n,w),W(w,{code:Q.too_big,message:$.message,inclusive:!0,exact:!1,maximum:$.value,type:"date"}),_.dirty()}else c.assertNever($);return{status:_.value,value:new Date(n.data.getTime())}}_addCheck(n){return new sn({...this._def,checks:[...this._def.checks,n]})}min(n,b){return this._addCheck({kind:"min",value:n.getTime(),message:h.toString(b)})}max(n,b){return this._addCheck({kind:"max",value:n.getTime(),message:h.toString(b)})}get minDate(){let n=null;for(let b of this._def.checks)if(b.kind==="min"){if(n===null||b.value>n)n=b.value}return n!=null?new Date(n):null}get maxDate(){let n=null;for(let b of this._def.checks)if(b.kind==="max"){if(n===null||b.value<n)n=b.value}return n!=null?new Date(n):null}}sn.create=(n)=>{return new sn({checks:[],coerce:n?.coerce||!1,typeName:X.ZodDate,...f(n)})};class e0 extends L{_parse(n){if(this._getType(n)!==J.symbol){let _=this._getOrReturnCtx(n);return W(_,{code:Q.invalid_type,expected:J.symbol,received:_.parsedType}),u}return y(n.data)}}e0.create=(n)=>{return new e0({typeName:X.ZodSymbol,...f(n)})};class u0 extends L{_parse(n){if(this._getType(n)!==J.undefined){let _=this._getOrReturnCtx(n);return W(_,{code:Q.invalid_type,expected:J.undefined,received:_.parsedType}),u}return y(n.data)}}u0.create=(n)=>{return new u0({typeName:X.ZodUndefined,...f(n)})};class B0 extends L{_parse(n){if(this._getType(n)!==J.null){let _=this._getOrReturnCtx(n);return W(_,{code:Q.invalid_type,expected:J.null,received:_.parsedType}),u}return y(n.data)}}B0.create=(n)=>{return new B0({typeName:X.ZodNull,...f(n)})};class n0 extends L{constructor(){super(...arguments);this._any=!0}_parse(n){return y(n.data)}}n0.create=(n)=>{return new n0({typeName:X.ZodAny,...f(n)})};class Rn extends L{constructor(){super(...arguments);this._unknown=!0}_parse(n){return y(n.data)}}Rn.create=(n)=>{return new Rn({typeName:X.ZodUnknown,...f(n)})};class ln extends L{_parse(n){let b=this._getOrReturnCtx(n);return W(b,{code:Q.invalid_type,expected:J.never,received:b.parsedType}),u}}ln.create=(n)=>{return new ln({typeName:X.ZodNever,...f(n)})};class r0 extends L{_parse(n){if(this._getType(n)!==J.undefined){let _=this._getOrReturnCtx(n);return W(_,{code:Q.invalid_type,expected:J.void,received:_.parsedType}),u}return y(n.data)}}r0.create=(n)=>{return new r0({typeName:X.ZodVoid,...f(n)})};class nn extends L{_parse(n){let{ctx:b,status:_}=this._processInputParams(n),w=this._def;if(b.parsedType!==J.array)return W(b,{code:Q.invalid_type,expected:J.array,received:b.parsedType}),u;if(w.exactLength!==null){let q=b.data.length>w.exactLength.value,o=b.data.length<w.exactLength.value;if(q||o)W(b,{code:q?Q.too_big:Q.too_small,minimum:o?w.exactLength.value:void 0,maximum:q?w.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:w.exactLength.message}),_.dirty()}if(w.minLength!==null){if(b.data.length<w.minLength.value)W(b,{code:Q.too_small,minimum:w.minLength.value,type:"array",inclusive:!0,exact:!1,message:w.minLength.message}),_.dirty()}if(w.maxLength!==null){if(b.data.length>w.maxLength.value)W(b,{code:Q.too_big,maximum:w.maxLength.value,type:"array",inclusive:!0,exact:!1,message:w.maxLength.message}),_.dirty()}if(b.common.async)return Promise.all([...b.data].map((q,o)=>{return w.type._parseAsync(new bn(b,q,b.path,o))})).then((q)=>{return P.mergeArray(_,q)});let $=[...b.data].map((q,o)=>{return w.type._parseSync(new bn(b,q,b.path,o))});return P.mergeArray(_,$)}get element(){return this._def.type}min(n,b){return new nn({...this._def,minLength:{value:n,message:h.toString(b)}})}max(n,b){return new nn({...this._def,maxLength:{value:n,message:h.toString(b)}})}length(n,b){return new nn({...this._def,exactLength:{value:n,message:h.toString(b)}})}nonempty(n){return this.min(1,n)}}nn.create=(n,b)=>{return new nn({type:n,minLength:null,maxLength:null,exactLength:null,typeName:X.ZodArray,...f(b)})};function G0(n){if(n instanceof C){let b={};for(let _ in n.shape){let w=n.shape[_];b[_]=z.create(G0(w))}return new C({...n._def,shape:()=>b})}else if(n instanceof nn)return new nn({...n._def,type:G0(n.element)});else if(n instanceof z)return z.create(G0(n.unwrap()));else if(n instanceof jn)return jn.create(G0(n.unwrap()));else if(n instanceof pn)return pn.create(n.items.map((b)=>G0(b)));else return n}class C extends L{constructor(){super(...arguments);this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let n=this._def.shape(),b=c.objectKeys(n);return this._cached={shape:n,keys:b},this._cached}_parse(n){if(this._getType(n)!==J.object){let m=this._getOrReturnCtx(n);return W(m,{code:Q.invalid_type,expected:J.object,received:m.parsedType}),u}let{status:_,ctx:w}=this._processInputParams(n),{shape:$,keys:q}=this._getCached(),o=[];if(!(this._def.catchall instanceof ln&&this._def.unknownKeys==="strip")){for(let m in w.data)if(!q.includes(m))o.push(m)}let x=[];for(let m of q){let v=$[m],H=w.data[m];x.push({key:{status:"valid",value:m},value:v._parse(new bn(w,H,w.path,m)),alwaysSet:m in w.data})}if(this._def.catchall instanceof ln){let m=this._def.unknownKeys;if(m==="passthrough")for(let v of o)x.push({key:{status:"valid",value:v},value:{status:"valid",value:w.data[v]}});else if(m==="strict"){if(o.length>0)W(w,{code:Q.unrecognized_keys,keys:o}),_.dirty()}else if(m==="strip");else throw Error("Internal ZodObject error: invalid unknownKeys value.")}else{let m=this._def.catchall;for(let v of o){let H=w.data[v];x.push({key:{status:"valid",value:v},value:m._parse(new bn(w,H,w.path,v)),alwaysSet:v in w.data})}}if(w.common.async)return Promise.resolve().then(async()=>{let m=[];for(let v of x){let H=await v.key,Y=await v.value;m.push({key:H,value:Y,alwaysSet:v.alwaysSet})}return m}).then((m)=>{return P.mergeObjectSync(_,m)});else return P.mergeObjectSync(_,x)}get shape(){return this._def.shape()}strict(n){return h.errToObj,new C({...this._def,unknownKeys:"strict",...n!==void 0?{errorMap:(b,_)=>{let w=this._def.errorMap?.(b,_).message??_.defaultError;if(b.code==="unrecognized_keys")return{message:h.errToObj(n).message??w};return{message:w}}}:{}})}strip(){return new C({...this._def,unknownKeys:"strip"})}passthrough(){return new C({...this._def,unknownKeys:"passthrough"})}extend(n){return new C({...this._def,shape:()=>({...this._def.shape(),...n})})}merge(n){return new C({unknownKeys:n._def.unknownKeys,catchall:n._def.catchall,shape:()=>({...this._def.shape(),...n._def.shape()}),typeName:X.ZodObject})}setKey(n,b){return this.augment({[n]:b})}catchall(n){return new C({...this._def,catchall:n})}pick(n){let b={};for(let _ of c.objectKeys(n))if(n[_]&&this.shape[_])b[_]=this.shape[_];return new C({...this._def,shape:()=>b})}omit(n){let b={};for(let _ of c.objectKeys(this.shape))if(!n[_])b[_]=this.shape[_];return new C({...this._def,shape:()=>b})}deepPartial(){return G0(this)}partial(n){let b={};for(let _ of c.objectKeys(this.shape)){let w=this.shape[_];if(n&&!n[_])b[_]=w;else b[_]=w.optional()}return new C({...this._def,shape:()=>b})}required(n){let b={};for(let _ of c.objectKeys(this.shape))if(n&&!n[_])b[_]=this.shape[_];else{let $=this.shape[_];while($ instanceof z)$=$._def.innerType;b[_]=$}return new C({...this._def,shape:()=>b})}keyof(){return P1(c.objectKeys(this.shape))}}C.create=(n,b)=>{return new C({shape:()=>n,unknownKeys:"strip",catchall:ln.create(),typeName:X.ZodObject,...f(b)})};C.strictCreate=(n,b)=>{return new C({shape:()=>n,unknownKeys:"strict",catchall:ln.create(),typeName:X.ZodObject,...f(b)})};C.lazycreate=(n,b)=>{return new C({shape:n,unknownKeys:"strip",catchall:ln.create(),typeName:X.ZodObject,...f(b)})};class M0 extends L{_parse(n){let{ctx:b}=this._processInputParams(n),_=this._def.options;function w($){for(let o of $)if(o.result.status==="valid")return o.result;for(let o of $)if(o.result.status==="dirty")return b.common.issues.push(...o.ctx.common.issues),o.result;let q=$.map((o)=>new d(o.ctx.common.issues));return W(b,{code:Q.invalid_union,unionErrors:q}),u}if(b.common.async)return Promise.all(_.map(async($)=>{let q={...b,common:{...b.common,issues:[]},parent:null};return{result:await $._parseAsync({data:b.data,path:b.path,parent:q}),ctx:q}})).then(w);else{let $=void 0,q=[];for(let x of _){let m={...b,common:{...b.common,issues:[]},parent:null},v=x._parseSync({data:b.data,path:b.path,parent:m});if(v.status==="valid")return v;else if(v.status==="dirty"&&!$)$={result:v,ctx:m};if(m.common.issues.length)q.push(m.common.issues)}if($)return b.common.issues.push(...$.ctx.common.issues),$.result;let o=q.map((x)=>new d(x));return W(b,{code:Q.invalid_union,unionErrors:o}),u}}get options(){return this._def.options}}M0.create=(n,b)=>{return new M0({options:n,typeName:X.ZodUnion,...f(b)})};var Mn=(n)=>{if(n instanceof f0)return Mn(n.schema);else if(n instanceof _n)return Mn(n.innerType());else if(n instanceof V0)return[n.value];else if(n instanceof Sn)return n.options;else if(n instanceof K0)return c.objectValues(n.enum);else if(n instanceof tn)return Mn(n._def.innerType);else if(n instanceof u0)return[void 0];else if(n instanceof B0)return[null];else if(n instanceof z)return[void 0,...Mn(n.unwrap())];else if(n instanceof jn)return[null,...Mn(n.unwrap())];else if(n instanceof L2)return Mn(n.unwrap());else if(n instanceof L0)return Mn(n.unwrap());else if(n instanceof D0)return Mn(n._def.innerType);else return[]};class D2 extends L{_parse(n){let{ctx:b}=this._processInputParams(n);if(b.parsedType!==J.object)return W(b,{code:Q.invalid_type,expected:J.object,received:b.parsedType}),u;let _=this.discriminator,w=b.data[_],$=this.optionsMap.get(w);if(!$)return W(b,{code:Q.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[_]}),u;if(b.common.async)return $._parseAsync({data:b.data,path:b.path,parent:b});else return $._parseSync({data:b.data,path:b.path,parent:b})}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(n,b,_){let w=new Map;for(let $ of b){let q=Mn($.shape[n]);if(!q.length)throw Error(`A discriminator value for key \`${n}\` could not be extracted from all schema options`);for(let o of q){if(w.has(o))throw Error(`Discriminator property ${String(n)} has duplicate value ${String(o)}`);w.set(o,$)}}return new D2({typeName:X.ZodDiscriminatedUnion,discriminator:n,options:b,optionsMap:w,...f(_)})}}function Di(n,b){let _=Wn(n),w=Wn(b);if(n===b)return{valid:!0,data:n};else if(_===J.object&&w===J.object){let $=c.objectKeys(b),q=c.objectKeys(n).filter((x)=>$.indexOf(x)!==-1),o={...n,...b};for(let x of q){let m=Di(n[x],b[x]);if(!m.valid)return{valid:!1};o[x]=m.data}return{valid:!0,data:o}}else if(_===J.array&&w===J.array){if(n.length!==b.length)return{valid:!1};let $=[];for(let q=0;q<n.length;q++){let o=n[q],x=b[q],m=Di(o,x);if(!m.valid)return{valid:!1};$.push(m.data)}return{valid:!0,data:$}}else if(_===J.date&&w===J.date&&+n===+b)return{valid:!0,data:n};else return{valid:!1}}class j0 extends L{_parse(n){let{status:b,ctx:_}=this._processInputParams(n),w=($,q)=>{if(V2($)||V2(q))return u;let o=Di($.value,q.value);if(!o.valid)return W(_,{code:Q.invalid_intersection_types}),u;if(K2($)||K2(q))b.dirty();return{status:b.value,value:o.data}};if(_.common.async)return Promise.all([this._def.left._parseAsync({data:_.data,path:_.path,parent:_}),this._def.right._parseAsync({data:_.data,path:_.path,parent:_})]).then(([$,q])=>w($,q));else return w(this._def.left._parseSync({data:_.data,path:_.path,parent:_}),this._def.right._parseSync({data:_.data,path:_.path,parent:_}))}}j0.create=(n,b,_)=>{return new j0({left:n,right:b,typeName:X.ZodIntersection,...f(_)})};class pn extends L{_parse(n){let{status:b,ctx:_}=this._processInputParams(n);if(_.parsedType!==J.array)return W(_,{code:Q.invalid_type,expected:J.array,received:_.parsedType}),u;if(_.data.length<this._def.items.length)return W(_,{code:Q.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),u;if(!this._def.rest&&_.data.length>this._def.items.length)W(_,{code:Q.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),b.dirty();let $=[..._.data].map((q,o)=>{let x=this._def.items[o]||this._def.rest;if(!x)return null;return x._parse(new bn(_,q,_.path,o))}).filter((q)=>!!q);if(_.common.async)return Promise.all($).then((q)=>{return P.mergeArray(b,q)});else return P.mergeArray(b,$)}get items(){return this._def.items}rest(n){return new pn({...this._def,rest:n})}}pn.create=(n,b)=>{if(!Array.isArray(n))throw Error("You must pass an array of schemas to z.tuple([ ... ])");return new pn({items:n,typeName:X.ZodTuple,rest:null,...f(b)})};class z0 extends L{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(n){let{status:b,ctx:_}=this._processInputParams(n);if(_.parsedType!==J.object)return W(_,{code:Q.invalid_type,expected:J.object,received:_.parsedType}),u;let w=[],$=this._def.keyType,q=this._def.valueType;for(let o in _.data)w.push({key:$._parse(new bn(_,o,_.path,o)),value:q._parse(new bn(_,_.data[o],_.path,o)),alwaysSet:o in _.data});if(_.common.async)return P.mergeObjectAsync(b,w);else return P.mergeObjectSync(b,w)}get element(){return this._def.valueType}static create(n,b,_){if(b instanceof L)return new z0({keyType:n,valueType:b,typeName:X.ZodRecord,...f(_)});return new z0({keyType:r.create(),valueType:n,typeName:X.ZodRecord,...f(b)})}}class s0 extends L{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(n){let{status:b,ctx:_}=this._processInputParams(n);if(_.parsedType!==J.map)return W(_,{code:Q.invalid_type,expected:J.map,received:_.parsedType}),u;let w=this._def.keyType,$=this._def.valueType,q=[..._.data.entries()].map(([o,x],m)=>{return{key:w._parse(new bn(_,o,_.path,[m,"key"])),value:$._parse(new bn(_,x,_.path,[m,"value"]))}});if(_.common.async){let o=new Map;return Promise.resolve().then(async()=>{for(let x of q){let m=await x.key,v=await x.value;if(m.status==="aborted"||v.status==="aborted")return u;if(m.status==="dirty"||v.status==="dirty")b.dirty();o.set(m.value,v.value)}return{status:b.value,value:o}})}else{let o=new Map;for(let x of q){let{key:m,value:v}=x;if(m.status==="aborted"||v.status==="aborted")return u;if(m.status==="dirty"||v.status==="dirty")b.dirty();o.set(m.value,v.value)}return{status:b.value,value:o}}}}s0.create=(n,b,_)=>{return new s0({valueType:b,keyType:n,typeName:X.ZodMap,...f(_)})};class i0 extends L{_parse(n){let{status:b,ctx:_}=this._processInputParams(n);if(_.parsedType!==J.set)return W(_,{code:Q.invalid_type,expected:J.set,received:_.parsedType}),u;let w=this._def;if(w.minSize!==null){if(_.data.size<w.minSize.value)W(_,{code:Q.too_small,minimum:w.minSize.value,type:"set",inclusive:!0,exact:!1,message:w.minSize.message}),b.dirty()}if(w.maxSize!==null){if(_.data.size>w.maxSize.value)W(_,{code:Q.too_big,maximum:w.maxSize.value,type:"set",inclusive:!0,exact:!1,message:w.maxSize.message}),b.dirty()}let $=this._def.valueType;function q(x){let m=new Set;for(let v of x){if(v.status==="aborted")return u;if(v.status==="dirty")b.dirty();m.add(v.value)}return{status:b.value,value:m}}let o=[..._.data.values()].map((x,m)=>$._parse(new bn(_,x,_.path,m)));if(_.common.async)return Promise.all(o).then((x)=>q(x));else return q(o)}min(n,b){return new i0({...this._def,minSize:{value:n,message:h.toString(b)}})}max(n,b){return new i0({...this._def,maxSize:{value:n,message:h.toString(b)}})}size(n,b){return this.min(n,b).max(n,b)}nonempty(n){return this.min(1,n)}}i0.create=(n,b)=>{return new i0({valueType:n,minSize:null,maxSize:null,typeName:X.ZodSet,...f(b)})};class O0 extends L{constructor(){super(...arguments);this.validate=this.implement}_parse(n){let{ctx:b}=this._processInputParams(n);if(b.parsedType!==J.function)return W(b,{code:Q.invalid_type,expected:J.function,received:b.parsedType}),u;function _(o,x){return a0({data:o,path:b.path,errorMaps:[b.common.contextualErrorMap,b.schemaErrorMap,l0(),Bn].filter((m)=>!!m),issueData:{code:Q.invalid_arguments,argumentsError:x}})}function w(o,x){return a0({data:o,path:b.path,errorMaps:[b.common.contextualErrorMap,b.schemaErrorMap,l0(),Bn].filter((m)=>!!m),issueData:{code:Q.invalid_return_type,returnTypeError:x}})}let $={errorMap:b.common.contextualErrorMap},q=b.data;if(this._def.returns instanceof b0){let o=this;return y(async function(...x){let m=new d([]),v=await o._def.args.parseAsync(x,$).catch((l)=>{throw m.addIssue(_(x,l)),m}),H=await Reflect.apply(q,this,v);return await o._def.returns._def.type.parseAsync(H,$).catch((l)=>{throw m.addIssue(w(H,l)),m})})}else{let o=this;return y(function(...x){let m=o._def.args.safeParse(x,$);if(!m.success)throw new d([_(x,m.error)]);let v=Reflect.apply(q,this,m.data),H=o._def.returns.safeParse(v,$);if(!H.success)throw new d([w(v,H.error)]);return H.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...n){return new O0({...this._def,args:pn.create(n).rest(Rn.create())})}returns(n){return new O0({...this._def,returns:n})}implement(n){return this.parse(n)}strictImplement(n){return this.parse(n)}static create(n,b,_){return new O0({args:n?n:pn.create([]).rest(Rn.create()),returns:b||Rn.create(),typeName:X.ZodFunction,...f(_)})}}class f0 extends L{get schema(){return this._def.getter()}_parse(n){let{ctx:b}=this._processInputParams(n);return this._def.getter()._parse({data:b.data,path:b.path,parent:b})}}f0.create=(n,b)=>{return new f0({getter:n,typeName:X.ZodLazy,...f(b)})};class V0 extends L{_parse(n){if(n.data!==this._def.value){let b=this._getOrReturnCtx(n);return W(b,{received:b.data,code:Q.invalid_literal,expected:this._def.value}),u}return{status:"valid",value:n.data}}get value(){return this._def.value}}V0.create=(n,b)=>{return new V0({value:n,typeName:X.ZodLiteral,...f(b)})};function P1(n,b){return new Sn({values:n,typeName:X.ZodEnum,...f(b)})}class Sn extends L{_parse(n){if(typeof n.data!=="string"){let b=this._getOrReturnCtx(n),_=this._def.values;return W(b,{expected:c.joinValues(_),received:b.parsedType,code:Q.invalid_type}),u}if(!this._cache)this._cache=new Set(this._def.values);if(!this._cache.has(n.data)){let b=this._getOrReturnCtx(n),_=this._def.values;return W(b,{received:b.data,code:Q.invalid_enum_value,options:_}),u}return y(n.data)}get options(){return this._def.values}get enum(){let n={};for(let b of this._def.values)n[b]=b;return n}get Values(){let n={};for(let b of this._def.values)n[b]=b;return n}get Enum(){let n={};for(let b of this._def.values)n[b]=b;return n}extract(n,b=this._def){return Sn.create(n,{...this._def,...b})}exclude(n,b=this._def){return Sn.create(this.options.filter((_)=>!n.includes(_)),{...this._def,...b})}}Sn.create=P1;class K0 extends L{_parse(n){let b=c.getValidEnumValues(this._def.values),_=this._getOrReturnCtx(n);if(_.parsedType!==J.string&&_.parsedType!==J.number){let w=c.objectValues(b);return W(_,{expected:c.joinValues(w),received:_.parsedType,code:Q.invalid_type}),u}if(!this._cache)this._cache=new Set(c.getValidEnumValues(this._def.values));if(!this._cache.has(n.data)){let w=c.objectValues(b);return W(_,{received:_.data,code:Q.invalid_enum_value,options:w}),u}return y(n.data)}get enum(){return this._def.values}}K0.create=(n,b)=>{return new K0({values:n,typeName:X.ZodNativeEnum,...f(b)})};class b0 extends L{unwrap(){return this._def.type}_parse(n){let{ctx:b}=this._processInputParams(n);if(b.parsedType!==J.promise&&b.common.async===!1)return W(b,{code:Q.invalid_type,expected:J.promise,received:b.parsedType}),u;let _=b.parsedType===J.promise?b.data:Promise.resolve(b.data);return y(_.then((w)=>{return this._def.type.parseAsync(w,{path:b.path,errorMap:b.common.contextualErrorMap})}))}}b0.create=(n,b)=>{return new b0({type:n,typeName:X.ZodPromise,...f(b)})};class _n extends L{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===X.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(n){let{status:b,ctx:_}=this._processInputParams(n),w=this._def.effect||null,$={addIssue:(q)=>{if(W(_,q),q.fatal)b.abort();else b.dirty()},get path(){return _.path}};if($.addIssue=$.addIssue.bind($),w.type==="preprocess"){let q=w.transform(_.data,$);if(_.common.async)return Promise.resolve(q).then(async(o)=>{if(b.value==="aborted")return u;let x=await this._def.schema._parseAsync({data:o,path:_.path,parent:_});if(x.status==="aborted")return u;if(x.status==="dirty")return zn(x.value);if(b.value==="dirty")return zn(x.value);return x});else{if(b.value==="aborted")return u;let o=this._def.schema._parseSync({data:q,path:_.path,parent:_});if(o.status==="aborted")return u;if(o.status==="dirty")return zn(o.value);if(b.value==="dirty")return zn(o.value);return o}}if(w.type==="refinement"){let q=(o)=>{let x=w.refinement(o,$);if(_.common.async)return Promise.resolve(x);if(x instanceof Promise)throw Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(_.common.async===!1){let o=this._def.schema._parseSync({data:_.data,path:_.path,parent:_});if(o.status==="aborted")return u;if(o.status==="dirty")b.dirty();return q(o.value),{status:b.value,value:o.value}}else return this._def.schema._parseAsync({data:_.data,path:_.path,parent:_}).then((o)=>{if(o.status==="aborted")return u;if(o.status==="dirty")b.dirty();return q(o.value).then(()=>{return{status:b.value,value:o.value}})})}if(w.type==="transform")if(_.common.async===!1){let q=this._def.schema._parseSync({data:_.data,path:_.path,parent:_});if(!Nn(q))return u;let o=w.transform(q.value,$);if(o instanceof Promise)throw Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:b.value,value:o}}else return this._def.schema._parseAsync({data:_.data,path:_.path,parent:_}).then((q)=>{if(!Nn(q))return u;return Promise.resolve(w.transform(q.value,$)).then((o)=>({status:b.value,value:o}))});c.assertNever(w)}}_n.create=(n,b,_)=>{return new _n({schema:n,typeName:X.ZodEffects,effect:b,...f(_)})};_n.createWithPreprocess=(n,b,_)=>{return new _n({schema:b,effect:{type:"preprocess",transform:n},typeName:X.ZodEffects,...f(_)})};class z extends L{_parse(n){if(this._getType(n)===J.undefined)return y(void 0);return this._def.innerType._parse(n)}unwrap(){return this._def.innerType}}z.create=(n,b)=>{return new z({innerType:n,typeName:X.ZodOptional,...f(b)})};class jn extends L{_parse(n){if(this._getType(n)===J.null)return y(null);return this._def.innerType._parse(n)}unwrap(){return this._def.innerType}}jn.create=(n,b)=>{return new jn({innerType:n,typeName:X.ZodNullable,...f(b)})};class tn extends L{_parse(n){let{ctx:b}=this._processInputParams(n),_=b.data;if(b.parsedType===J.undefined)_=this._def.defaultValue();return this._def.innerType._parse({data:_,path:b.path,parent:b})}removeDefault(){return this._def.innerType}}tn.create=(n,b)=>{return new tn({innerType:n,typeName:X.ZodDefault,defaultValue:typeof b.default==="function"?b.default:()=>b.default,...f(b)})};class D0 extends L{_parse(n){let{ctx:b}=this._processInputParams(n),_={...b,common:{...b.common,issues:[]}},w=this._def.innerType._parse({data:_.data,path:_.path,parent:{..._}});if(p0(w))return w.then(($)=>{return{status:"valid",value:$.status==="valid"?$.value:this._def.catchValue({get error(){return new d(_.common.issues)},input:_.data})}});else return{status:"valid",value:w.status==="valid"?w.value:this._def.catchValue({get error(){return new d(_.common.issues)},input:_.data})}}removeCatch(){return this._def.innerType}}D0.create=(n,b)=>{return new D0({innerType:n,typeName:X.ZodCatch,catchValue:typeof b.catch==="function"?b.catch:()=>b.catch,...f(b)})};class n2 extends L{_parse(n){if(this._getType(n)!==J.nan){let _=this._getOrReturnCtx(n);return W(_,{code:Q.invalid_type,expected:J.nan,received:_.parsedType}),u}return{status:"valid",value:n.data}}}n2.create=(n)=>{return new n2({typeName:X.ZodNaN,...f(n)})};var N8=Symbol("zod_brand");class L2 extends L{_parse(n){let{ctx:b}=this._processInputParams(n),_=b.data;return this._def.type._parse({data:_,path:b.path,parent:b})}unwrap(){return this._def.type}}class i2 extends L{_parse(n){let{status:b,ctx:_}=this._processInputParams(n);if(_.common.async)return(async()=>{let $=await this._def.in._parseAsync({data:_.data,path:_.path,parent:_});if($.status==="aborted")return u;if($.status==="dirty")return b.dirty(),zn($.value);else return this._def.out._parseAsync({data:$.value,path:_.path,parent:_})})();else{let w=this._def.in._parseSync({data:_.data,path:_.path,parent:_});if(w.status==="aborted")return u;if(w.status==="dirty")return b.dirty(),{status:"dirty",value:w.value};else return this._def.out._parseSync({data:w.value,path:_.path,parent:_})}}static create(n,b){return new i2({in:n,out:b,typeName:X.ZodPipeline})}}class L0 extends L{_parse(n){let b=this._def.innerType._parse(n),_=(w)=>{if(Nn(w))w.value=Object.freeze(w.value);return w};return p0(b)?b.then((w)=>_(w)):_(b)}unwrap(){return this._def.innerType}}L0.create=(n,b)=>{return new L0({innerType:n,typeName:X.ZodReadonly,...f(b)})};function S1(n,b){let _=typeof n==="function"?n(b):typeof n==="string"?{message:n}:n;return typeof _==="string"?{message:_}:_}function T1(n,b={},_){if(n)return n0.create().superRefine((w,$)=>{let q=n(w);if(q instanceof Promise)return q.then((o)=>{if(!o){let x=S1(b,w),m=x.fatal??_??!0;$.addIssue({code:"custom",...x,fatal:m})}});if(!q){let o=S1(b,w),x=o.fatal??_??!0;$.addIssue({code:"custom",...o,fatal:x})}return});return n0.create()}var R8={object:C.lazycreate},X;(function(n){n.ZodString="ZodString",n.ZodNumber="ZodNumber",n.ZodNaN="ZodNaN",n.ZodBigInt="ZodBigInt",n.ZodBoolean="ZodBoolean",n.ZodDate="ZodDate",n.ZodSymbol="ZodSymbol",n.ZodUndefined="ZodUndefined",n.ZodNull="ZodNull",n.ZodAny="ZodAny",n.ZodUnknown="ZodUnknown",n.ZodNever="ZodNever",n.ZodVoid="ZodVoid",n.ZodArray="ZodArray",n.ZodObject="ZodObject",n.ZodUnion="ZodUnion",n.ZodDiscriminatedUnion="ZodDiscriminatedUnion",n.ZodIntersection="ZodIntersection",n.ZodTuple="ZodTuple",n.ZodRecord="ZodRecord",n.ZodMap="ZodMap",n.ZodSet="ZodSet",n.ZodFunction="ZodFunction",n.ZodLazy="ZodLazy",n.ZodLiteral="ZodLiteral",n.ZodEnum="ZodEnum",n.ZodEffects="ZodEffects",n.ZodNativeEnum="ZodNativeEnum",n.ZodOptional="ZodOptional",n.ZodNullable="ZodNullable",n.ZodDefault="ZodDefault",n.ZodCatch="ZodCatch",n.ZodPromise="ZodPromise",n.ZodBranded="ZodBranded",n.ZodPipeline="ZodPipeline",n.ZodReadonly="ZodReadonly"})(X||(X={}));var U8=(n,b={message:`Input not instance of ${n.name}`})=>T1((_)=>_ instanceof n,b),y1=r.create,I1=Un.create,C8=n2.create,S8=Cn.create,g1=h0.create,t8=sn.create,E8=e0.create,F8=u0.create,P8=B0.create,T8=n0.create,y8=Rn.create,I8=ln.create,g8=r0.create,Z8=nn.create,d8=C.create,a8=C.strictCreate,e8=M0.create,r8=D2.create,z8=j0.create,s8=pn.create,n9=z0.create,i9=s0.create,b9=i0.create,_9=O0.create,w9=f0.create,$9=V0.create,q9=Sn.create,o9=K0.create,x9=b0.create,m9=_n.create,v9=z.create,H9=jn.create,Q9=_n.createWithPreprocess,X9=i2.create,J9=()=>y1().optional(),Y9=()=>I1().optional(),W9=()=>g1().optional(),l9={string:(n)=>r.create({...n,coerce:!0}),number:(n)=>Un.create({...n,coerce:!0}),boolean:(n)=>h0.create({...n,coerce:!0}),bigint:(n)=>Cn.create({...n,coerce:!0}),date:(n)=>sn.create({...n,coerce:!0})};var p9=u;function G9(n,b){if(!(b instanceof C))return n;let _=b.shape,w={...n};for(let[$,q]of Object.entries(_)){if(typeof w[$]!=="number")continue;let o=q;while(o instanceof z||o instanceof tn)o=o._def.innerType;if(o instanceof r)w[$]=String(w[$])}return w}var O9=30000;class c2{registry;constructor(n){this.registry=n}async execute(n){let b=await this.run(n);return f2({parsed:n,output:b}),JSON.stringify(b)}async run(n){let b=Date.now(),{command:_,args:w}=n,$=this.registry.get(_);if(!$)return kn(_,"core",new W0(_),Date.now()-b);let q=$.parameters.safeParse(G9(w,$.parameters));if(!q.success){let m=new ui(`Invalid arguments for command '${_}'`,q.error.errors);return kn(_,$.pluginName,m,Date.now()-b)}let o=$.timeout??O9,x;try{let m=await Promise.race([$.handler(q.data),new Promise((v,H)=>{x=setTimeout(()=>H(new M2(_,o)),o)})]);return clearTimeout(x),k1(_,$.pluginName,m,Date.now()-b)}catch(m){if(clearTimeout(x),m instanceof M2)return kn(_,$.pluginName,m,Date.now()-b);if(m instanceof G)return kn(_,$.pluginName,m,Date.now()-b);let v=m instanceof Error?new u2(m.message,m.stack):new u2(String(m));return kn(_,$.pluginName,v,Date.now()-b)}}}function Z1(n){if(n==="true")return!0;if(n==="false")return!1;if(n==="0"||/^0\.\d+$/.test(n))return Number(n);if(n.startsWith("0"))return n;if(n!==""&&!isNaN(Number(n)))return Number(n);return n}function a1(n){let b={},_="",w=0;if(n.length>0&&!n[0].startsWith("--"))_=n[0],w=1;while(w<n.length){let $=n[w];if($.startsWith("--")){let q=$.slice(2);if(q.includes("=")){let o=q.indexOf("="),x=q.slice(0,o),m=q.slice(o+1);d1(b,x,Z1(m))}else if(w+1<n.length&&!n[w+1].startsWith("--"))d1(b,q,Z1(n[w+1])),w++;else b[q]=!0}w++}return{command:_,args:b}}function d1(n,b,_){let w=n[b];if(w===void 0)n[b]=_;else if(Array.isArray(w))n[b]=[...w,_];else if(typeof w==="string")n[b]=[w,_]}var h9={version:"1.0.0"};async function u9(n,b){try{if(n.initialize)await n.initialize(h9);let _=b;for(let w of n.commands)_=_.register(w);return{registry:_}}catch(_){let w=_ instanceof Error?new B2(n.name,_.message,_):new B2(n.name,String(_));return{registry:b,error:w}}}async function Li(n,b=new rn){let _=b,w=[];for(let $ of n){let q=await u9($,_);if(_=q.registry,q.error)w.push({pluginName:$.name,error:q.error})}return{registry:_,errors:w}}import{readFileSync as B9,writeFileSync as M9,mkdirSync as j9,existsSync as e1}from"node:fs";import{homedir as f9}from"node:os";import{join as r1}from"node:path";var ci=process.env.YUNKE_CONFIG_DIR??r1(f9(),".yunke"),A2=r1(ci,"plugins.json");function z1(){if(!e1(ci))j9(ci,{recursive:!0})}function _0(){if(z1(),!e1(A2))return{version:"1",plugins:[]};try{let n=B9(A2,"utf-8");return JSON.parse(n)}catch(n){return process.stderr.write(`Warning: Failed to parse plugin config at ${A2}: ${n instanceof Error?n.message:String(n)}
8
- `),{version:"1",plugins:[]}}}function k2(n){z1(),M9(A2,JSON.stringify(n,null,2),"utf-8")}function s1(n){let b=_0(),_=b.plugins.findIndex(($)=>$.name===n.name),w={...n,installedAt:new Date().toISOString()};if(_>=0){let $=[...b.plugins];$[_]=w,k2({...b,plugins:$})}else k2({...b,plugins:[...b.plugins,w]})}function nb(n){let b=_0(),_=b.plugins.filter((w)=>w.name!==n);if(_.length!==b.plugins.length)return k2({...b,plugins:_}),!0;return!1}function Ai(n,b){let _=_0();if(_.plugins.findIndex((q)=>q.name===n)<0)return!1;let $=_.plugins.map((q)=>q.name===n?{...q,enabled:b}:q);return k2({..._,plugins:$}),!0}import{readFileSync as V9,writeFileSync as K9,existsSync as ib,mkdirSync as D9}from"node:fs";import{homedir as L9}from"node:os";import{join as bb}from"node:path";var fn={agenphone:!1,weixiaozhu:!1},ki=process.env.YUNKE_CONFIG_DIR??bb(L9(),".yunke"),Ni=bb(ki,"features.json");function N2(){if(!ib(Ni))return{version:"1",features:{...fn}};try{let n=V9(Ni,"utf-8"),b=JSON.parse(n);return{...b,features:{...fn,...b.features}}}catch{return{version:"1",features:{...fn}}}}function c9(n){if(!ib(ki))D9(ki,{recursive:!0});K9(Ni,JSON.stringify(n,null,2),"utf-8")}function _b(n){return N2().features[n]??!1}function Ri(n,b){let _=N2();c9({..._,features:{..._.features,[n]:b}})}var $b=Symbol("Let zodToJsonSchema decide on which parser to use");var wb={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},qb=(n)=>typeof n==="string"?{...wb,name:n}:{...wb,...n};var ob=(n)=>{let b=qb(n),_=b.name!==void 0?[...b.basePath,b.definitionPath,b.name]:b.basePath;return{...b,flags:{hasReferencedOpenAiAnyType:!1},currentPath:_,propertyPath:void 0,seen:new Map(Object.entries(b.definitions).map(([w,$])=>[$._def,{def:$._def,path:[...b.basePath,b.definitionPath,w],jsonSchema:void 0}]))}};function Ui(n,b,_,w){if(!w?.errorMessages)return;if(_)n.errorMessage={...n.errorMessage,[b]:_}}function N(n,b,_,w,$){n[b]=_,Ui(n,b,w,$)}var R2=(n,b)=>{let _=0;for(;_<n.length&&_<b.length;_++)if(n[_]!==b[_])break;return[(n.length-_).toString(),...b.slice(_)].join("/")};function t(n){if(n.target!=="openAi")return{};let b=[...n.basePath,n.definitionPath,n.openAiAnyTypeName];return n.flags.hasReferencedOpenAiAnyType=!0,{$ref:n.$refStrategy==="relative"?R2(b,n.currentPath):b.join("/")}}function xb(n,b){let _={type:"array"};if(n.type?._def&&n.type?._def?.typeName!==X.ZodAny)_.items=B(n.type._def,{...b,currentPath:[...b.currentPath,"items"]});if(n.minLength)N(_,"minItems",n.minLength.value,n.minLength.message,b);if(n.maxLength)N(_,"maxItems",n.maxLength.value,n.maxLength.message,b);if(n.exactLength)N(_,"minItems",n.exactLength.value,n.exactLength.message,b),N(_,"maxItems",n.exactLength.value,n.exactLength.message,b);return _}function mb(n,b){let _={type:"integer",format:"int64"};if(!n.checks)return _;for(let w of n.checks)switch(w.kind){case"min":if(b.target==="jsonSchema7")if(w.inclusive)N(_,"minimum",w.value,w.message,b);else N(_,"exclusiveMinimum",w.value,w.message,b);else{if(!w.inclusive)_.exclusiveMinimum=!0;N(_,"minimum",w.value,w.message,b)}break;case"max":if(b.target==="jsonSchema7")if(w.inclusive)N(_,"maximum",w.value,w.message,b);else N(_,"exclusiveMaximum",w.value,w.message,b);else{if(!w.inclusive)_.exclusiveMaximum=!0;N(_,"maximum",w.value,w.message,b)}break;case"multipleOf":N(_,"multipleOf",w.value,w.message,b);break}return _}function vb(){return{type:"boolean"}}function U2(n,b){return B(n.type._def,b)}var Hb=(n,b)=>{return B(n.innerType._def,b)};function Ci(n,b,_){let w=_??b.dateStrategy;if(Array.isArray(w))return{anyOf:w.map(($,q)=>Ci(n,b,$))};switch(w){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return A9(n,b)}}var A9=(n,b)=>{let _={type:"integer",format:"unix-time"};if(b.target==="openApi3")return _;for(let w of n.checks)switch(w.kind){case"min":N(_,"minimum",w.value,w.message,b);break;case"max":N(_,"maximum",w.value,w.message,b);break}return _};function Qb(n,b){return{...B(n.innerType._def,b),default:n.defaultValue()}}function Xb(n,b){return b.effectStrategy==="input"?B(n.schema._def,b):t(b)}function Jb(n){return{type:"string",enum:Array.from(n.values)}}var k9=(n)=>{if("type"in n&&n.type==="string")return!1;return"allOf"in n};function Yb(n,b){let _=[B(n.left._def,{...b,currentPath:[...b.currentPath,"allOf","0"]}),B(n.right._def,{...b,currentPath:[...b.currentPath,"allOf","1"]})].filter((q)=>!!q),w=b.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,$=[];return _.forEach((q)=>{if(k9(q)){if($.push(...q.allOf),q.unevaluatedProperties===void 0)w=void 0}else{let o=q;if("additionalProperties"in q&&q.additionalProperties===!1){let{additionalProperties:x,...m}=q;o=m}else w=void 0;$.push(o)}}),$.length?{allOf:$,...w}:void 0}function Wb(n,b){let _=typeof n.value;if(_!=="bigint"&&_!=="number"&&_!=="boolean"&&_!=="string")return{type:Array.isArray(n.value)?"array":"object"};if(b.target==="openApi3")return{type:_==="bigint"?"integer":_,enum:[n.value]};return{type:_==="bigint"?"integer":_,const:n.value}}var Si=void 0,wn={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>{if(Si===void 0)Si=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return Si},uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function C2(n,b){let _={type:"string"};if(n.checks)for(let w of n.checks)switch(w.kind){case"min":N(_,"minLength",typeof _.minLength==="number"?Math.max(_.minLength,w.value):w.value,w.message,b);break;case"max":N(_,"maxLength",typeof _.maxLength==="number"?Math.min(_.maxLength,w.value):w.value,w.message,b);break;case"email":switch(b.emailStrategy){case"format:email":$n(_,"email",w.message,b);break;case"format:idn-email":$n(_,"idn-email",w.message,b);break;case"pattern:zod":I(_,wn.email,w.message,b);break}break;case"url":$n(_,"uri",w.message,b);break;case"uuid":$n(_,"uuid",w.message,b);break;case"regex":I(_,w.regex,w.message,b);break;case"cuid":I(_,wn.cuid,w.message,b);break;case"cuid2":I(_,wn.cuid2,w.message,b);break;case"startsWith":I(_,RegExp(`^${ti(w.value,b)}`),w.message,b);break;case"endsWith":I(_,RegExp(`${ti(w.value,b)}$`),w.message,b);break;case"datetime":$n(_,"date-time",w.message,b);break;case"date":$n(_,"date",w.message,b);break;case"time":$n(_,"time",w.message,b);break;case"duration":$n(_,"duration",w.message,b);break;case"length":N(_,"minLength",typeof _.minLength==="number"?Math.max(_.minLength,w.value):w.value,w.message,b),N(_,"maxLength",typeof _.maxLength==="number"?Math.min(_.maxLength,w.value):w.value,w.message,b);break;case"includes":{I(_,RegExp(ti(w.value,b)),w.message,b);break}case"ip":{if(w.version!=="v6")$n(_,"ipv4",w.message,b);if(w.version!=="v4")$n(_,"ipv6",w.message,b);break}case"base64url":I(_,wn.base64url,w.message,b);break;case"jwt":I(_,wn.jwt,w.message,b);break;case"cidr":{if(w.version!=="v6")I(_,wn.ipv4Cidr,w.message,b);if(w.version!=="v4")I(_,wn.ipv6Cidr,w.message,b);break}case"emoji":I(_,wn.emoji(),w.message,b);break;case"ulid":{I(_,wn.ulid,w.message,b);break}case"base64":{switch(b.base64Strategy){case"format:binary":{$n(_,"binary",w.message,b);break}case"contentEncoding:base64":{N(_,"contentEncoding","base64",w.message,b);break}case"pattern:zod":{I(_,wn.base64,w.message,b);break}}break}case"nanoid":I(_,wn.nanoid,w.message,b);case"toLowerCase":case"toUpperCase":case"trim":break;default:(($)=>{})(w)}return _}function ti(n,b){return b.patternStrategy==="escape"?R9(n):n}var N9=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function R9(n){let b="";for(let _=0;_<n.length;_++){if(!N9.has(n[_]))b+="\\";b+=n[_]}return b}function $n(n,b,_,w){if(n.format||n.anyOf?.some(($)=>$.format)){if(!n.anyOf)n.anyOf=[];if(n.format){if(n.anyOf.push({format:n.format,...n.errorMessage&&w.errorMessages&&{errorMessage:{format:n.errorMessage.format}}}),delete n.format,n.errorMessage){if(delete n.errorMessage.format,Object.keys(n.errorMessage).length===0)delete n.errorMessage}}n.anyOf.push({format:b,..._&&w.errorMessages&&{errorMessage:{format:_}}})}else N(n,"format",b,_,w)}function I(n,b,_,w){if(n.pattern||n.allOf?.some(($)=>$.pattern)){if(!n.allOf)n.allOf=[];if(n.pattern){if(n.allOf.push({pattern:n.pattern,...n.errorMessage&&w.errorMessages&&{errorMessage:{pattern:n.errorMessage.pattern}}}),delete n.pattern,n.errorMessage){if(delete n.errorMessage.pattern,Object.keys(n.errorMessage).length===0)delete n.errorMessage}}n.allOf.push({pattern:lb(b,w),..._&&w.errorMessages&&{errorMessage:{pattern:_}}})}else N(n,"pattern",lb(b,w),_,w)}function lb(n,b){if(!b.applyRegexFlags||!n.flags)return n.source;let _={i:n.flags.includes("i"),m:n.flags.includes("m"),s:n.flags.includes("s")},w=_.i?n.source.toLowerCase():n.source,$="",q=!1,o=!1,x=!1;for(let m=0;m<w.length;m++){if(q){$+=w[m],q=!1;continue}if(_.i){if(o){if(w[m].match(/[a-z]/)){if(x)$+=w[m],$+=`${w[m-2]}-${w[m]}`.toUpperCase(),x=!1;else if(w[m+1]==="-"&&w[m+2]?.match(/[a-z]/))$+=w[m],x=!0;else $+=`${w[m]}${w[m].toUpperCase()}`;continue}}else if(w[m].match(/[a-z]/)){$+=`[${w[m]}${w[m].toUpperCase()}]`;continue}}if(_.m){if(w[m]==="^"){$+=`(^|(?<=[\r
9
- ]))`;continue}else if(w[m]==="$"){$+=`($|(?=[\r
10
- ]))`;continue}}if(_.s&&w[m]==="."){$+=o?`${w[m]}\r
11
- `:`[${w[m]}\r
12
- ]`;continue}if($+=w[m],w[m]==="\\")q=!0;else if(o&&w[m]==="]")o=!1;else if(!o&&w[m]==="[")o=!0}try{new RegExp($)}catch{return console.warn(`Could not convert regex pattern at ${b.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),n.source}return $}function S2(n,b){if(b.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(b.target==="openApi3"&&n.keyType?._def.typeName===X.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((w,$)=>({...w,[$]:B(n.valueType._def,{...b,currentPath:[...b.currentPath,"properties",$]})??t(b)}),{}),additionalProperties:b.rejectedAdditionalProperties};let _={type:"object",additionalProperties:B(n.valueType._def,{...b,currentPath:[...b.currentPath,"additionalProperties"]})??b.allowedAdditionalProperties};if(b.target==="openApi3")return _;if(n.keyType?._def.typeName===X.ZodString&&n.keyType._def.checks?.length){let{type:w,...$}=C2(n.keyType._def,b);return{..._,propertyNames:$}}else if(n.keyType?._def.typeName===X.ZodEnum)return{..._,propertyNames:{enum:n.keyType._def.values}};else if(n.keyType?._def.typeName===X.ZodBranded&&n.keyType._def.type._def.typeName===X.ZodString&&n.keyType._def.type._def.checks?.length){let{type:w,...$}=U2(n.keyType._def,b);return{..._,propertyNames:$}}return _}function pb(n,b){if(b.mapStrategy==="record")return S2(n,b);let _=B(n.keyType._def,{...b,currentPath:[...b.currentPath,"items","items","0"]})||t(b),w=B(n.valueType._def,{...b,currentPath:[...b.currentPath,"items","items","1"]})||t(b);return{type:"array",maxItems:125,items:{type:"array",items:[_,w],minItems:2,maxItems:2}}}function Gb(n){let b=n.values,w=Object.keys(n.values).filter((q)=>{return typeof b[b[q]]!=="number"}).map((q)=>b[q]),$=Array.from(new Set(w.map((q)=>typeof q)));return{type:$.length===1?$[0]==="string"?"string":"number":["string","number"],enum:w}}function Ob(n){return n.target==="openAi"?void 0:{not:t({...n,currentPath:[...n.currentPath,"not"]})}}function hb(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var b2={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function Bb(n,b){if(b.target==="openApi3")return ub(n,b);let _=n.options instanceof Map?Array.from(n.options.values()):n.options;if(_.every((w)=>(w._def.typeName in b2)&&(!w._def.checks||!w._def.checks.length))){let w=_.reduce(($,q)=>{let o=b2[q._def.typeName];return o&&!$.includes(o)?[...$,o]:$},[]);return{type:w.length>1?w:w[0]}}else if(_.every((w)=>w._def.typeName==="ZodLiteral"&&!w.description)){let w=_.reduce(($,q)=>{let o=typeof q._def.value;switch(o){case"string":case"number":case"boolean":return[...$,o];case"bigint":return[...$,"integer"];case"object":if(q._def.value===null)return[...$,"null"];case"symbol":case"undefined":case"function":default:return $}},[]);if(w.length===_.length){let $=w.filter((q,o,x)=>x.indexOf(q)===o);return{type:$.length>1?$:$[0],enum:_.reduce((q,o)=>{return q.includes(o._def.value)?q:[...q,o._def.value]},[])}}}else if(_.every((w)=>w._def.typeName==="ZodEnum"))return{type:"string",enum:_.reduce((w,$)=>[...w,...$._def.values.filter((q)=>!w.includes(q))],[])};return ub(n,b)}var ub=(n,b)=>{let _=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((w,$)=>B(w._def,{...b,currentPath:[...b.currentPath,"anyOf",`${$}`]})).filter((w)=>!!w&&(!b.strictUnions||typeof w==="object"&&Object.keys(w).length>0));return _.length?{anyOf:_}:void 0};function Mb(n,b){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length)){if(b.target==="openApi3")return{type:b2[n.innerType._def.typeName],nullable:!0};return{type:[b2[n.innerType._def.typeName],"null"]}}if(b.target==="openApi3"){let w=B(n.innerType._def,{...b,currentPath:[...b.currentPath]});if(w&&"$ref"in w)return{allOf:[w],nullable:!0};return w&&{...w,nullable:!0}}let _=B(n.innerType._def,{...b,currentPath:[...b.currentPath,"anyOf","0"]});return _&&{anyOf:[_,{type:"null"}]}}function jb(n,b){let _={type:"number"};if(!n.checks)return _;for(let w of n.checks)switch(w.kind){case"int":_.type="integer",Ui(_,"type",w.message,b);break;case"min":if(b.target==="jsonSchema7")if(w.inclusive)N(_,"minimum",w.value,w.message,b);else N(_,"exclusiveMinimum",w.value,w.message,b);else{if(!w.inclusive)_.exclusiveMinimum=!0;N(_,"minimum",w.value,w.message,b)}break;case"max":if(b.target==="jsonSchema7")if(w.inclusive)N(_,"maximum",w.value,w.message,b);else N(_,"exclusiveMaximum",w.value,w.message,b);else{if(!w.inclusive)_.exclusiveMaximum=!0;N(_,"maximum",w.value,w.message,b)}break;case"multipleOf":N(_,"multipleOf",w.value,w.message,b);break}return _}function fb(n,b){let _=b.target==="openAi",w={type:"object",properties:{}},$=[],q=n.shape();for(let x in q){let m=q[x];if(m===void 0||m._def===void 0)continue;let v=C9(m);if(v&&_){if(m._def.typeName==="ZodOptional")m=m._def.innerType;if(!m.isNullable())m=m.nullable();v=!1}let H=B(m._def,{...b,currentPath:[...b.currentPath,"properties",x],propertyPath:[...b.currentPath,"properties",x]});if(H===void 0)continue;if(w.properties[x]=H,!v)$.push(x)}if($.length)w.required=$;let o=U9(n,b);if(o!==void 0)w.additionalProperties=o;return w}function U9(n,b){if(n.catchall._def.typeName!=="ZodNever")return B(n.catchall._def,{...b,currentPath:[...b.currentPath,"additionalProperties"]});switch(n.unknownKeys){case"passthrough":return b.allowedAdditionalProperties;case"strict":return b.rejectedAdditionalProperties;case"strip":return b.removeAdditionalStrategy==="strict"?b.allowedAdditionalProperties:b.rejectedAdditionalProperties}}function C9(n){try{return n.isOptional()}catch{return!0}}var Vb=(n,b)=>{if(b.currentPath.toString()===b.propertyPath?.toString())return B(n.innerType._def,b);let _=B(n.innerType._def,{...b,currentPath:[...b.currentPath,"anyOf","1"]});return _?{anyOf:[{not:t(b)},_]}:t(b)};var Kb=(n,b)=>{if(b.pipeStrategy==="input")return B(n.in._def,b);else if(b.pipeStrategy==="output")return B(n.out._def,b);let _=B(n.in._def,{...b,currentPath:[...b.currentPath,"allOf","0"]}),w=B(n.out._def,{...b,currentPath:[...b.currentPath,"allOf",_?"1":"0"]});return{allOf:[_,w].filter(($)=>$!==void 0)}};function Db(n,b){return B(n.type._def,b)}function Lb(n,b){let w={type:"array",uniqueItems:!0,items:B(n.valueType._def,{...b,currentPath:[...b.currentPath,"items"]})};if(n.minSize)N(w,"minItems",n.minSize.value,n.minSize.message,b);if(n.maxSize)N(w,"maxItems",n.maxSize.value,n.maxSize.message,b);return w}function cb(n,b){if(n.rest)return{type:"array",minItems:n.items.length,items:n.items.map((_,w)=>B(_._def,{...b,currentPath:[...b.currentPath,"items",`${w}`]})).reduce((_,w)=>w===void 0?_:[..._,w],[]),additionalItems:B(n.rest._def,{...b,currentPath:[...b.currentPath,"additionalItems"]})};else return{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((_,w)=>B(_._def,{...b,currentPath:[...b.currentPath,"items",`${w}`]})).reduce((_,w)=>w===void 0?_:[..._,w],[])}}function Ab(n){return{not:t(n)}}function kb(n){return t(n)}var Nb=(n,b)=>{return B(n.innerType._def,b)};var Rb=(n,b,_)=>{switch(b){case X.ZodString:return C2(n,_);case X.ZodNumber:return jb(n,_);case X.ZodObject:return fb(n,_);case X.ZodBigInt:return mb(n,_);case X.ZodBoolean:return vb();case X.ZodDate:return Ci(n,_);case X.ZodUndefined:return Ab(_);case X.ZodNull:return hb(_);case X.ZodArray:return xb(n,_);case X.ZodUnion:case X.ZodDiscriminatedUnion:return Bb(n,_);case X.ZodIntersection:return Yb(n,_);case X.ZodTuple:return cb(n,_);case X.ZodRecord:return S2(n,_);case X.ZodLiteral:return Wb(n,_);case X.ZodEnum:return Jb(n);case X.ZodNativeEnum:return Gb(n);case X.ZodNullable:return Mb(n,_);case X.ZodOptional:return Vb(n,_);case X.ZodMap:return pb(n,_);case X.ZodSet:return Lb(n,_);case X.ZodLazy:return()=>n.getter()._def;case X.ZodPromise:return Db(n,_);case X.ZodNaN:case X.ZodNever:return Ob(_);case X.ZodEffects:return Xb(n,_);case X.ZodAny:return t(_);case X.ZodUnknown:return kb(_);case X.ZodDefault:return Qb(n,_);case X.ZodBranded:return U2(n,_);case X.ZodReadonly:return Nb(n,_);case X.ZodCatch:return Hb(n,_);case X.ZodPipeline:return Kb(n,_);case X.ZodFunction:case X.ZodVoid:case X.ZodSymbol:return;default:return((w)=>{return})(b)}};function B(n,b,_=!1){let w=b.seen.get(n);if(b.override){let x=b.override?.(n,b,w,_);if(x!==$b)return x}if(w&&!_){let x=S9(w,b);if(x!==void 0)return x}let $={def:n,path:b.currentPath,jsonSchema:void 0};b.seen.set(n,$);let q=Rb(n,n.typeName,b),o=typeof q==="function"?B(q(),b):q;if(o)t9(n,b,o);if(b.postProcess){let x=b.postProcess(o,n,b);return $.jsonSchema=o,x}return $.jsonSchema=o,o}var S9=(n,b)=>{switch(b.$refStrategy){case"root":return{$ref:n.path.join("/")};case"relative":return{$ref:R2(b.currentPath,n.path)};case"none":case"seen":{if(n.path.length<b.currentPath.length&&n.path.every((_,w)=>b.currentPath[w]===_))return console.warn(`Recursive reference detected at ${b.currentPath.join("/")}! Defaulting to any`),t(b);return b.$refStrategy==="seen"?t(b):void 0}}},t9=(n,b,_)=>{if(n.description){if(_.description=n.description,b.markdownDescription)_.markdownDescription=n.description}return _};var t2=(n,b)=>{let _=ob(b),w=typeof b==="object"&&b.definitions?Object.entries(b.definitions).reduce((m,[v,H])=>({...m,[v]:B(H._def,{..._,currentPath:[..._.basePath,_.definitionPath,v]},!0)??t(_)}),{}):void 0,$=typeof b==="string"?b:b?.nameStrategy==="title"?void 0:b?.name,q=B(n._def,$===void 0?_:{..._,currentPath:[..._.basePath,_.definitionPath,$]},!1)??t(_),o=typeof b==="object"&&b.name!==void 0&&b.nameStrategy==="title"?b.name:void 0;if(o!==void 0)q.title=o;if(_.flags.hasReferencedOpenAiAnyType){if(!w)w={};if(!w[_.openAiAnyTypeName])w[_.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:_.$refStrategy==="relative"?"1":[..._.basePath,_.definitionPath,_.openAiAnyTypeName].join("/")}}}let x=$===void 0?w?{...q,[_.definitionPath]:w}:q:{$ref:[..._.$refStrategy==="relative"?[]:_.basePath,_.definitionPath,$].join("/"),[_.definitionPath]:{...w,[$]:q}};if(_.target==="jsonSchema7")x.$schema="http://json-schema.org/draft-07/schema#";else if(_.target==="jsonSchema2019-09"||_.target==="openAi")x.$schema="https://json-schema.org/draft/2019-09/schema#";if(_.target==="openAi"&&(("anyOf"in x)||("oneOf"in x)||("allOf"in x)||("type"in x)&&Array.isArray(x.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return x};qn();function Ub(n){return{name:n.name,description:n.description,category:n.category,pluginName:n.pluginName,sideEffects:n.sideEffects,timeout:n.timeout??30000,parameters:t2(n.parameters,{target:"jsonSchema7"}),returns:t2(n.returns,{target:"jsonSchema7"}),examples:n.examples}}function Cb(n){return{version:R,totalCommands:n.length,commands:n.map((b)=>({name:b.name,description:b.description,category:b.category,pluginName:b.pluginName,sideEffects:b.sideEffects}))}}var y9={C5BA0B7D310E45E68077A0D100F830EA:["crm.wechat.","weixiaozhu."]},I9=["crm.wechat.","weixiaozhu."];function Sb(n){let b=n?.trim();if(!b)return I9;return y9[b]??[]}function Fi(n,b){return Sb(b).some((_)=>n.startsWith(_))}function E2(n,b){if(Sb(b).length===0)return[...n];return n.filter((_)=>!Fi(_.name,b))}function tb(n,b=()=>{return}){return{name:"builtin:schema",version:"1.0.0",commands:[{name:"schema",description:"List all available commands with their descriptions and categories",category:"introspection",pluginName:"builtin:schema",parameters:i.object({}),returns:i.unknown(),examples:[{description:"List all commands",input:{},output:{version:"1.0.0",totalCommands:3,commands:[]}}],sideEffects:["none"],handler:async()=>{let _=n();return Cb(E2(_.getAllVisible(),b()))}},{name:"schema.detail",description:"Get detailed JSON Schema for a specific command including parameters, returns, examples, and side effects",category:"introspection",pluginName:"builtin:schema",parameters:i.object({command:i.string().describe("The command name to get schema for")}),returns:i.unknown(),examples:[{description:"Get schema for schema.detail command",input:{command:"schema.detail"},output:{name:"schema.detail",parameters:{},returns:{}}}],sideEffects:["none"],handler:async({command:_})=>{let $=n().get(_);if(!$)throw new W0(_);if(Fi($.name,b()))throw new W0(_);return Ub($)}}]}}qn();function Eb(n,b=()=>{return}){return{name:"builtin:help",version:"1.0.0",commands:[{name:"help",description:"Show structured help information about YunkeCLI and available commands",category:"introspection",pluginName:"builtin:help",parameters:i.object({}),returns:i.unknown(),examples:[{description:"Get help",input:{},output:{name:"yunke-cli",version:"1.0.0",commands:[]}}],sideEffects:["none"],handler:async()=>{let _=n(),w=E2(_.getAllVisible(),b()),$=[...new Set(w.map((q)=>q.category))];return{name:"yunke-cli",version:R,description:"AI-native pluggable CLI framework",usage:"yunke <command> [--option value]",globalOptions:[{name:"--help",description:"Show this help message"}],categories:$.map((q)=>({name:q,commands:w.filter((o)=>o.category===q).map((o)=>({name:o.name,description:o.description}))})),tips:["Use 'yunke schema' to get machine-readable command catalog","Use 'yunke schema.detail --command <name>' to get full JSON Schema for a command"]}}}]}}import{existsSync as g9,realpathSync as Z9}from"node:fs";import{extname as d9}from"node:path";function Fb(){return{name:"builtin:plugin-manager",version:"1.0.0",commands:[{name:"plugin.list",description:"List all installed plugins with their status",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:i.object({}),returns:i.unknown(),examples:[{description:"List plugins",input:{},output:{plugins:[]}}],sideEffects:["filesystem"],handler:async()=>{return{plugins:_0().plugins}}},{name:"plugin.install",description:"Install a plugin from a file system path",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:i.object({path:i.string().describe("Absolute path to the plugin file (.js or .ts)"),name:i.string().optional().describe("Override plugin name")}),returns:i.unknown(),examples:[{description:"Install a plugin",input:{path:"/path/to/my-plugin.js"},output:{installed:!0,name:"my-plugin"}}],sideEffects:["filesystem"],handler:async({path:n,name:b})=>{if(!g9(n))throw new G("CONFIG_ERROR",`Plugin file not found: ${n}`);let _=Z9(n),w=[".js",".mjs",".cjs"],$=d9(_);if(!w.includes($))throw new G("CONFIG_ERROR",`Unsupported plugin file extension '${$}'. Allowed: ${w.join(", ")}`);let q=await import(_),o=q.default??q;if(!o||typeof o!=="object"||!o.name)throw new G("INVALID_PLUGIN","Plugin must export an object with a name field");let x=b??o.name;return s1({name:x,path:_,enabled:!0}),{installed:!0,name:x,path:_}}},{name:"plugin.remove",description:"Remove an installed plugin",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:i.object({name:i.string().describe("Plugin name to remove")}),returns:i.unknown(),examples:[{description:"Remove a plugin",input:{name:"my-plugin"},output:{removed:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!nb(n))throw new G("CONFIG_ERROR",`Plugin '${n}' not found`);return{removed:!0,name:n}}},{name:"plugin.enable",description:"Enable a disabled plugin",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:i.object({name:i.string().describe("Plugin name to enable")}),returns:i.unknown(),examples:[{description:"Enable a plugin",input:{name:"my-plugin"},output:{enabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!Ai(n,!0))throw new G("CONFIG_ERROR",`Plugin '${n}' not found`);return{enabled:!0,name:n}}},{name:"plugin.disable",description:"Disable a plugin without removing it",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:i.object({name:i.string().describe("Plugin name to disable")}),returns:i.unknown(),examples:[{description:"Disable a plugin",input:{name:"my-plugin"},output:{disabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!Ai(n,!1))throw new G("CONFIG_ERROR",`Plugin '${n}' not found`);return{disabled:!0,name:n}}}]}}function Pb(){return{name:"builtin:feature-manager",version:"1.0.0",commands:[{name:"feature.list",description:"List all available feature flags and their current status",category:"feature-management",pluginName:"builtin:feature-manager",parameters:i.object({}),returns:i.unknown(),examples:[{description:"List features",input:{},output:{features:[]}}],sideEffects:["filesystem"],handler:async()=>{let n=N2();return{features:Object.entries(n.features).map(([_,w])=>({name:_,enabled:w,default:fn[_]??!1}))}}},{name:"feature.enable",description:"Enable an optional feature (takes effect on next run)",category:"feature-management",pluginName:"builtin:feature-manager",parameters:i.object({name:i.string().describe('Feature flag name, e.g. "agenphone"')}),returns:i.unknown(),examples:[{description:"Enable agenphone",input:{name:"agenphone"},output:{enabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!(n in fn))throw new G("CONFIG_ERROR",`Unknown feature flag: '${n}'. Available: ${Object.keys(fn).join(", ")}`);return Ri(n,!0),{enabled:!0,name:n,note:"Restart yunke-cli for changes to take effect"}}},{name:"feature.disable",description:"Disable an optional feature (takes effect on next run)",category:"feature-management",pluginName:"builtin:feature-manager",parameters:i.object({name:i.string().describe('Feature flag name, e.g. "agenphone"')}),returns:i.unknown(),examples:[{description:"Disable agenphone",input:{name:"agenphone"},output:{disabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!(n in fn))throw new G("CONFIG_ERROR",`Unknown feature flag: '${n}'. Available: ${Object.keys(fn).join(", ")}`);return Ri(n,!1),{disabled:!0,name:n,note:"Restart yunke-cli for changes to take effect"}}}]}}import{readFileSync as a9,writeFileSync as e9,mkdirSync as r9,existsSync as Tb}from"node:fs";import{homedir as z9}from"node:os";import{join as yb}from"node:path";var Pi=process.env.YUNKE_CONFIG_DIR??yb(z9(),".yunke"),Ti=yb(Pi,"agenphone.json");function _2(){if(!Tb(Ti))return null;try{let n=a9(Ti,"utf-8");return JSON.parse(n)}catch{return null}}function s9(n){if(!Tb(Pi))r9(Pi,{recursive:!0});e9(Ti,JSON.stringify(n,null,2),"utf-8")}function yi(n){let b=_2()??{access_token:"",expires_at:"",device_id:""};s9({...b,...n})}function Ib(n){let b=new Date(n.expires_at).getTime(),_=Date.now(),w=300000;return _>=b-300000}function nw(n=process.env.YUNKE_API_BASE_URL){let b=n?.replace(/\/$/,"");return b&&b.length>0?b:"https://agenphone-api.yunke.ai"}var w0=nw();var iw=["pending","sent","success","failed","timeout"];function A(n){return i.object({request_id:i.string(),status:i.enum(iw),action:i.string(),device_id:i.string(),task_id:i.string().nullable(),response:n.nullable(),error:i.string().nullable(),sent_at:i.string(),completed_at:i.string().nullable()})}var V=A(i.null());function bw(){let n=_2();if(!n?.access_token)throw new G("CONFIG_ERROR","未登录,请先运行 'yunke agenphone.auth.login' 登录");if(Ib(n))throw new G("CONFIG_ERROR","登录已过期,请重新运行 'yunke agenphone.auth.login' 登录");return n.access_token}async function F2(n,b={}){let _=bw(),w=`${w0}${n}`,$={"Content-Type":"application/json",Authorization:`Bearer ${_}`,...b.headers??{}},q=await fetch(w,{...b,headers:$});if(q.status===401)throw new G("CONFIG_ERROR","认证失败,请重新运行 'yunke agenphone.auth.login' 登录");if(!q.ok){let x=`HTTP ${q.status}`;try{let m=await q.json();if(m.message)x=m.message}catch{}throw new G("EXECUTION_FAILED",`AgenPhone API 错误: ${x}`)}return(await q.json()).data}async function Ii(n,b={}){let _=`${w0}${n}`,w={"Content-Type":"application/json",...b.headers??{}},$=await fetch(_,{...b,headers:w});if(!$.ok){let o=`HTTP ${$.status}`;try{let x=await $.json();if(x.message)o=x.message}catch{}throw new G("EXECUTION_FAILED",`AgenPhone API 错误: ${o}`)}return(await $.json()).data}async function p(n,b,_){return F2("/api/v1/common/execute",{method:"POST",body:JSON.stringify({action:n,params:b??null,task_id:_??null})})}var gi="agenphone";function _w(){let n=_2();if(!n?.device_id)throw new G("CONFIG_ERROR","设备 ID 未配置,请先运行 'yunke agenphone.auth.setup --device_id <id>' 设置设备 ID");return n.device_id}var gb={name:"agenphone.auth.setup",description:"Initialize AgenPhone config: Run this once before any other agenphone commands.",category:"agenphone",pluginName:gi,parameters:i.object({device_id:i.string().min(1).describe("Target device ID to control, e.g. dev_abc12345")}),returns:i.object({device_id:i.string(),saved:i.boolean()}),examples:[{description:"Setup AgenPhone",input:{device_id:"dev_abc12345"},output:{device_id:"dev_abc12345",saved:!0}}],sideEffects:["filesystem"],handler:async({device_id:n})=>{return yi({device_id:n}),{device_id:n,saved:!0}}},Zb={name:"agenphone.auth.send-code",description:'Send SMS verification code to phone number for AgenPhone login. Requires agenphone.auth.setup to be run first. Returns both `token` and `sms_id` (same value); use `sms_id` if your agent redacts fields named "token", and pass the value as-is to agenphone.auth.login --token <sms_id>.',category:"agenphone",pluginName:gi,parameters:i.object({phone_number:i.string().describe("Chinese mobile phone number (11 digits)")}),returns:i.object({token:i.string().describe('SMS session token; may be redacted by agents that mask "token" fields'),sms_id:i.string().describe("Same value as `token`, exposed under a non-redacted name as a workaround for agent token masking")}),examples:[{description:"Send verification code",input:{phone_number:"13800138000"},output:{token:"sms_token_xxx",sms_id:"sms_token_xxx"}}],sideEffects:["network"],handler:async({phone_number:n})=>{let b=await Ii("/api/v1/sms/send",{method:"POST",body:JSON.stringify({phone_number:n})});return{token:b.token,sms_id:b.token}}},db={name:"agenphone.auth.login",description:"Login to AgenPhone with SMS verification code. Reads device_id from config (set via agenphone.auth.setup). Saves JWT token to ~/.yunke/agenphone.json.",category:"agenphone",pluginName:gi,parameters:i.object({token:i.string().describe("SMS token returned by agenphone.auth.send-code"),code:i.string().length(6).describe("6-digit SMS verification code")}),returns:i.object({success:i.boolean(),device_id:i.string(),expires_in:i.number()}),examples:[{description:"Login with SMS code",input:{token:"sms_token",code:"123456"},output:{success:!0,device_id:"dev_abc12345",expires_in:2592000}}],sideEffects:["filesystem","network"],handler:async({token:n,code:b})=>{let _=_w(),w=await Ii("/api/v1/auth/cli-login",{method:"POST",body:JSON.stringify({token:n,code:b,device_id:_})}),$=new Date(Date.now()+w.expires_in*1000).toISOString();return yi({access_token:w.access_token,expires_at:$,device_id:w.device_id}),{success:!0,device_id:w.device_id,expires_in:w.expires_in}}};var $0="agenphone",ab={name:"agenphone.app.open",description:"Open an app by package name or URL. On success response is null.",category:"agenphone",pluginName:$0,parameters:i.object({package_name:i.string().min(1).optional().describe("Android package name, e.g. com.tencent.mm"),url:i.string().optional().describe("URL scheme to open")}),returns:V,examples:[{description:"Open WeChat",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"open_app",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("open_app",n)},eb={name:"agenphone.app.list-packages",description:"List installed apps. Use thirdPartyOnly=true to skip system apps. response.packages contains the list.",category:"agenphone",pluginName:$0,parameters:i.object({thirdPartyOnly:i.boolean().optional().describe("Only return third-party apps, default false"),includeVersions:i.boolean().optional().describe("Include version_name and version_code, default false")}),returns:A(i.object({packages:i.array(i.object({package_name:i.string(),app_name:i.string(),version_name:i.string().optional(),version_code:i.number().int().optional()}))})),examples:[{description:"List packages",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_packages",device_id:"dev_abc12345",task_id:null,response:{packages:[{package_name:"com.tencent.mm",app_name:"WeChat"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("list_packages",n)},rb={name:"agenphone.app.foreground",description:"Get the package name and class name of the currently visible foreground app.",category:"agenphone",pluginName:$0,parameters:i.object({}),returns:A(i.object({foreground_package:i.string(),foreground_className:i.string()})),examples:[{description:"Get foreground app",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_foreground_app",device_id:"dev_abc12345",task_id:null,response:{foreground_package:"com.tencent.mm",foreground_className:"com.tencent.mm.MainActivity"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_foreground_app")},zb={name:"agenphone.app.info",description:"Get version and name info for a specific installed app.",category:"agenphone",pluginName:$0,parameters:i.object({package_name:i.string().min(1).describe("App package name")}),returns:A(i.object({package_name:i.string(),app_name:i.string(),version_name:i.string(),version_code:i.number().int()})),examples:[{description:"Get WeChat info",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"get_app_info",device_id:"dev_abc12345",task_id:null,response:{package_name:"com.tencent.mm",app_name:"WeChat",version_name:"8.0",version_code:800},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("get_app_info",n)},sb={name:"agenphone.app.force-stop",description:"Force stop a running app. Requires EnterpriseProvider or root. On success response is null.",category:"agenphone",pluginName:$0,parameters:i.object({package_name:i.string().min(1).describe("App package name to force stop")}),returns:V,examples:[{description:"Force stop WeChat",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"force_stop_app",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("force_stop_app",n)},n_={name:"agenphone.app.uninstall",description:"Silently uninstall an app. Requires EnterpriseProvider or root. On success response is null.",category:"agenphone",pluginName:$0,parameters:i.object({package_name:i.string().min(1).describe("App package name to uninstall")}),returns:V,examples:[{description:"Uninstall app",input:{package_name:"com.example.app"},output:{request_id:"req_7f3a2b",status:"success",action:"uninstall_app",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("uninstall_app",n)},i_={name:"agenphone.app.clear-data",description:"Clear all data and cache for an app. Requires EnterpriseProvider or root. On success response is null.",category:"agenphone",pluginName:$0,parameters:i.object({package_name:i.string().min(1).describe("App package name to clear data for")}),returns:V,examples:[{description:"Clear WeChat data",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"clear_app_data",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("clear_app_data",n)};var En="agenphone",b_={name:"agenphone.comm.call",description:"Initiate a phone call. On success response is null.",category:"agenphone",pluginName:En,parameters:i.object({phone_number:i.string().describe("Phone number to call")}),returns:V,examples:[{description:"Call a number",input:{phone_number:"13800138000"},output:{request_id:"req_7f3a2b",status:"success",action:"call",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("call",n)},__={name:"agenphone.comm.hang-up",description:"Hang up the current phone call. On success response is null.",category:"agenphone",pluginName:En,parameters:i.object({}),returns:V,examples:[{description:"Hang up call",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"hang_up",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("hang_up")},w_={name:"agenphone.comm.answer",description:"Answer an incoming phone call. On success response is null.",category:"agenphone",pluginName:En,parameters:i.object({}),returns:V,examples:[{description:"Answer call",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"answer_call",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("answer_call")},$_={name:"agenphone.comm.list-contacts",description:"List contacts (requires READ_CONTACTS). response.contact_list contains entries with id, display_name, numbers.",category:"agenphone",pluginName:En,parameters:i.object({limit:i.number().int().positive().optional().describe("Max results to return, default 50"),offset:i.number().int().min(0).optional().describe("Skip N entries, default 0")}),returns:A(i.object({contact_list:i.array(i.object({id:i.string(),display_name:i.string(),numbers:i.array(i.string())}))})),examples:[{description:"List contacts",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_contacts",device_id:"dev_abc12345",task_id:null,response:{contact_list:[{id:"1",display_name:"Alice",numbers:["13800138000"]}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("list_contacts",n)},q_={name:"agenphone.comm.search-contacts",description:"Search contacts by name or number. response.contacts contains matches.",category:"agenphone",pluginName:En,parameters:i.object({name:i.string().optional().describe("Fuzzy match on display name"),number:i.string().optional().describe("Filter by having this number"),limit:i.number().int().positive().optional().describe("Max results, default 20")}),returns:A(i.object({contacts:i.array(i.object({id:i.string(),display_name:i.string()}))})),examples:[{description:"Search by name",input:{name:"Alice"},output:{request_id:"req_7f3a2b",status:"success",action:"search_contacts",device_id:"dev_abc12345",task_id:null,response:{contacts:[{id:"1",display_name:"Alice"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("search_contacts",n)},o_={name:"agenphone.comm.list-call-log",description:"List recent call log (requires READ_CALL_LOG). response.call_log contains entries with number, type_name (incoming/outgoing/missed), date (ms), duration (s).",category:"agenphone",pluginName:En,parameters:i.object({limit:i.number().int().positive().optional().describe("Max results, default 50"),offset:i.number().int().min(0).optional().describe("Skip N entries, default 0")}),returns:A(i.object({call_log:i.array(i.object({number:i.string(),type:i.number().int(),type_name:i.enum(["incoming","outgoing","missed"]),date:i.number(),duration:i.number().int(),name:i.string().optional()}))})),examples:[{description:"List call log",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_call_log",device_id:"dev_abc12345",task_id:null,response:{call_log:[{number:"10086",type:1,type_name:"incoming",date:1709123456789,duration:120}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("list_call_log",n)},x_={name:"agenphone.comm.send-sms",description:"Send an SMS message. On success response is null.",category:"agenphone",pluginName:En,parameters:i.object({phone_number:i.string().describe("Recipient phone number"),message:i.string().min(1).describe("SMS message content")}),returns:V,examples:[{description:"Send SMS",input:{phone_number:"13800138000",message:"Hello"},output:{request_id:"req_7f3a2b",status:"success",action:"send_sms",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("send_sms",n)},m_={name:"agenphone.comm.read-sms",description:"Read SMS inbox (requires READ_SMS). response.sms_list contains entries with address, body, date (ms).",category:"agenphone",pluginName:En,parameters:i.object({limit:i.number().int().positive().optional().describe("Max results, default 50"),offset:i.number().int().min(0).optional().describe("Skip N entries, default 0")}),returns:A(i.object({sms_list:i.array(i.object({address:i.string(),body:i.string(),date:i.number()}))})),examples:[{description:"Read SMS",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"read_sms",device_id:"dev_abc12345",task_id:null,response:{sms_list:[{address:"10086",body:"余额10元",date:1709123456789}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("read_sms",n)};var a="agenphone",v_={name:"agenphone.screen.tap",description:"Tap a coordinate on the screen. Requires accessibility or root. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({x:i.number().int().describe("X coordinate in pixels"),y:i.number().int().describe("Y coordinate in pixels")}),returns:V,examples:[{description:"Tap center",input:{x:540,y:960},output:{request_id:"req_7f3a2b",status:"success",action:"tap",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("tap",n)},H_={name:"agenphone.screen.swipe",description:"Swipe from one coordinate to another. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({start_x:i.number().int().describe("Start X coordinate"),start_y:i.number().int().describe("Start Y coordinate"),end_x:i.number().int().describe("End X coordinate"),end_y:i.number().int().describe("End Y coordinate"),duration:i.number().int().positive().optional().describe("Swipe duration in ms, default 300")}),returns:V,examples:[{description:"Swipe up",input:{start_x:540,start_y:1500,end_x:540,end_y:500},output:{request_id:"req_7f3a2b",status:"success",action:"swipe",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("swipe",n)},Q_={name:"agenphone.screen.drag",description:"Long-press drag from one position to another. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({start_x:i.number().int().describe("Start X coordinate"),start_y:i.number().int().describe("Start Y coordinate"),end_x:i.number().int().describe("End X coordinate"),end_y:i.number().int().describe("End Y coordinate"),duration:i.number().int().positive().optional().describe("Drag duration in ms, default 400")}),returns:V,examples:[{description:"Drag element",input:{start_x:100,start_y:200,end_x:300,end_y:400},output:{request_id:"req_7f3a2b",status:"success",action:"drag",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("drag",n)},X_={name:"agenphone.screen.input",description:"Tap a coordinate then input text into that field. Requires accessibility or root. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({text:i.string().min(1).describe("Text to input"),x:i.number().int().optional().describe("X coordinate to tap first for focus"),y:i.number().int().optional().describe("Y coordinate to tap first for focus")}),returns:V,examples:[{description:"Type text",input:{text:"hello world",x:540,y:500},output:{request_id:"req_7f3a2b",status:"success",action:"input_text",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("input_text",n)},J_={name:"agenphone.screen.long-press",description:"Long press at a coordinate. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({x:i.number().int().describe("X coordinate"),y:i.number().int().describe("Y coordinate"),duration:i.number().int().positive().optional().describe("Long press duration in ms, default 1500")}),returns:V,examples:[{description:"Long press",input:{x:540,y:960},output:{request_id:"req_7f3a2b",status:"success",action:"long_press",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("long_press",n)},Y_={name:"agenphone.screen.global-action",description:"Perform a system global action via accessibility. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({action:i.enum(["back","home","recents"]).describe("System action: back=go back, home=go to home screen, recents=open recent apps")}),returns:V,examples:[{description:"Press home",input:{action:"home"},output:{request_id:"req_7f3a2b",status:"success",action:"global_action",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("global_action",n)},W_={name:"agenphone.screen.screenshot",description:"Take a screenshot. Returns an OSS image URL (not base64). Use this to visually inspect the current screen state.",category:"agenphone",pluginName:a,parameters:i.object({}),returns:i.object({image_url:i.string().url().describe("Screenshot image URL (hosted on OSS)"),width:i.number().int().describe("Image width in pixels"),height:i.number().int().describe("Image height in pixels")}),examples:[{description:"Take screenshot",input:{},output:{image_url:"https://oss.example.com/xxx.png",width:1080,height:1920}}],sideEffects:["network"],handler:async()=>F2("/api/v1/device/screenshot",{method:"POST",body:JSON.stringify({})})},l_={name:"agenphone.screen.ui-tree",description:"Get the accessibility node tree of the current screen. Requires accessibility service enabled. response.hierarchy is the full UI tree.",category:"agenphone",pluginName:a,parameters:i.object({}),returns:A(i.object({hierarchy:i.record(i.unknown())})),examples:[{description:"Get UI tree",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_screen_hierarchy",device_id:"dev_abc12345",task_id:null,response:{hierarchy:{}},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_screen_hierarchy")},p_={name:"agenphone.screen.find-element",description:"Find a UI element by text or view_id. response.found indicates if found; response.center_x/center_y give the tap coordinates.",category:"agenphone",pluginName:a,parameters:i.object({text:i.string().optional().describe("Element visible text to find"),view_id:i.string().optional().describe("Element resource view ID"),class_name:i.string().optional().describe("Limit to a specific widget class")}),returns:A(i.object({found:i.boolean(),center_x:i.number().optional(),center_y:i.number().optional()})),examples:[{description:"Find by text",input:{text:"登录"},output:{request_id:"req_7f3a2b",status:"success",action:"find_element",device_id:"dev_abc12345",task_id:null,response:{found:!0,center_x:540,center_y:960},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("find_element",n)},G_={name:"agenphone.screen.click-by-text",description:"Find a UI element by its visible text and click it. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({text:i.string().min(1).describe("Visible text of the element to click")}),returns:V,examples:[{description:"Click login button",input:{text:"登录"},output:{request_id:"req_7f3a2b",status:"success",action:"click_by_text",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("click_by_text",n)},O_={name:"agenphone.screen.click-by-id",description:"Find a UI element by its resource view_id and click it. On success response is null.",category:"agenphone",pluginName:a,parameters:i.object({view_id:i.string().min(1).describe("Resource ID, e.g. com.example:id/btn_login")}),returns:V,examples:[{description:"Click by ID",input:{view_id:"com.example:id/btn_login"},output:{request_id:"req_7f3a2b",status:"success",action:"click_by_view_id",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("click_by_view_id",n)},h_={name:"agenphone.screen.unlock",description:"Wake the screen and attempt to dismiss the lock screen. response.screen_woken indicates wake success; response.keyguard_dismissed indicates lock dismissed (may be false on Android 8+).",category:"agenphone",pluginName:a,parameters:i.object({}),returns:A(i.object({screen_woken:i.boolean(),keyguard_dismissed:i.boolean()})),examples:[{description:"Unlock screen",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"unlock_device",device_id:"dev_abc12345",task_id:null,response:{screen_woken:!0,keyguard_dismissed:!1},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("unlock_device")},u_={name:"agenphone.screen.set-brightness",description:"Set screen brightness (requires WRITE_SETTINGS). response.brightness is the applied value.",category:"agenphone",pluginName:a,parameters:i.object({brightness:i.number().int().min(0).max(255).describe("Brightness level 0–255")}),returns:A(i.object({brightness:i.number().int()})),examples:[{description:"Set brightness to 128",input:{brightness:128},output:{request_id:"req_7f3a2b",status:"success",action:"set_brightness",device_id:"dev_abc12345",task_id:null,response:{brightness:128},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("set_brightness",n)},B_={name:"agenphone.screen.gui-analyze",description:"Analyze a screenshot with the Doubao vision model and return the suggested next action. Does NOT execute the action — use tap/swipe/input/etc to execute. "+"Returns { thought, action_raw, action } where action.type ∈ {click, long_press, type, scroll, drag, open_app, press_home, press_back, hotkey, wait, finished, left_double, right_single, unknown}. "+"Coordinate actions carry x/y; type carries content; scroll carries x/y/direction; drag carries start_x/start_y/end_x/end_y; hotkey carries key; open_app carries package_name; finished carries content.",category:"agenphone",pluginName:a,parameters:i.object({instruction:i.string().min(1).describe('Task instruction, e.g. "打开微信并给张三发消息"'),image_url:i.string().url().describe("Screenshot URL (OSS/HTTPS). Get one from agenphone.screen.screenshot first."),img_width:i.number().int().positive().describe("Screenshot width in pixels (pass `width` from agenphone.screen.screenshot)"),img_height:i.number().int().positive().describe("Screenshot height in pixels (pass `height` from agenphone.screen.screenshot)"),platform:i.enum(["phone","computer"]).optional().describe("GUI scene, default phone"),language:i.string().min(1).optional().describe("Language used in Thought, default Chinese"),history:i.array(i.object({role:i.enum(["user","assistant"]).describe("Who produced this turn"),content:i.unknown().describe("Turn content (prior instruction or action result)")})).optional().describe("Prior turns for multi-turn analysis")}),returns:i.object({thought:i.string().describe("Model reasoning / plan for the next step"),action_raw:i.string().describe("Raw model action string before parsing"),action:i.record(i.unknown()).describe("Parsed action. Always has `type`. See command description for type-specific fields.")}),examples:[{description:"Analyze a phone screenshot",input:{instruction:"打开微信",image_url:"https://oss.example.com/xxx.png",img_width:1080,img_height:1920},output:{thought:"我需要点击微信图标",action_raw:"click(point='<point>300 500</point>')",action:{type:"click",x:324,y:960}}}],sideEffects:["network"],handler:async(n)=>F2("/api/v1/device/gui-analyze",{method:"POST",body:JSON.stringify(n)})};var Gn="agenphone",M_={name:"agenphone.device.status",description:"Get screen on/off status. response.screen_on: 0=screen on, 1=screen off.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:A(i.object({screen_on:i.number().int().describe("0=screen on, 1=screen off")})),examples:[{description:"Get status",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_status",device_id:"dev_abc12345",task_id:null,response:{screen_on:0},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_status")},j_={name:"agenphone.device.info",description:"Get comprehensive device info. response contains model, manufacturer, sdk, battery_level, battery_charging, network_type, wifi_connected, storage_total_mb, storage_available_mb, memory_total_mb, memory_available_mb, screen_brightness, locale, foreground_package, etc.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:A(i.object({model:i.string(),manufacturer:i.string(),sdk:i.number().int(),release:i.string(),battery_level:i.number().int(),battery_charging:i.boolean(),network_type:i.string(),wifi_connected:i.boolean(),mobile_connected:i.boolean(),storage_total_mb:i.number(),storage_available_mb:i.number(),memory_total_mb:i.number(),memory_available_mb:i.number(),screen_rotation:i.number().int(),screen_orientation:i.string(),foreground_package:i.string(),foreground_className:i.string(),screen_brightness:i.number().int(),language:i.string(),language_country:i.string(),locale:i.string(),imei:i.string().optional()})),examples:[{description:"Get device info",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_device_info",device_id:"dev_abc12345",task_id:null,response:{model:"Pixel 6",manufacturer:"Google",sdk:33,release:"13",battery_level:85,battery_charging:!1,network_type:"wifi",wifi_connected:!0,mobile_connected:!1,storage_total_mb:128000,storage_available_mb:64000,memory_total_mb:8192,memory_available_mb:2048,screen_rotation:0,screen_orientation:"portrait",foreground_package:"com.android.chrome",foreground_className:"...",screen_brightness:128,language:"zh",language_country:"CN",locale:"zh-CN"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_device_info")},f_={name:"agenphone.device.battery",description:"Get battery level and charging status. response.battery_level is 0–100; response.battery_charging is true when charging.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:A(i.object({battery_level:i.number().int(),battery_charging:i.boolean()})),examples:[{description:"Get battery",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_battery",device_id:"dev_abc12345",task_id:null,response:{battery_level:85,battery_charging:!1},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_battery")},V_={name:"agenphone.device.volume",description:"Get current volume levels. response contains media_volume, media_max, alarm_volume, ring_volume.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:A(i.object({media_volume:i.number().int(),media_max:i.number().int(),alarm_volume:i.number().int(),ring_volume:i.number().int()})),examples:[{description:"Get volume",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_volume",device_id:"dev_abc12345",task_id:null,response:{media_volume:10,media_max:15,alarm_volume:5,ring_volume:8},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_volume")},K_={name:"agenphone.device.location",description:"Get last known GPS location (requires ACCESS_FINE_LOCATION). response.latitude and response.longitude are decimal degrees.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:A(i.object({latitude:i.number(),longitude:i.number()})),examples:[{description:"Get location",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_location",device_id:"dev_abc12345",task_id:null,response:{latitude:39.9042,longitude:116.4074},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_location")},D_={name:"agenphone.device.lock-status",description:"Get screen and lock status. response.lock_type: none/pattern/pin/password/unknown.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:A(i.object({screen_on:i.boolean(),is_locked:i.boolean(),lock_type:i.enum(["none","pattern","pin","password","unknown"])})),examples:[{description:"Get lock status",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_lock_status",device_id:"dev_abc12345",task_id:null,response:{screen_on:!0,is_locked:!0,lock_type:"pattern"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_lock_status")},L_={name:"agenphone.device.reboot",description:"Reboot the device. Requires root or EnterpriseProvider. On success response is null.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:V,examples:[{description:"Reboot",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"reboot",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("reboot")},c_={name:"agenphone.device.shutdown",description:"Shut down the device. Requires root or EnterpriseProvider. On success response is null.",category:"agenphone",pluginName:Gn,parameters:i.object({}),returns:V,examples:[{description:"Shutdown",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"shutdown",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("shutdown")},A_={name:"agenphone.device.set-volume",description:"Set volume for an audio stream. level must be 0 to the stream max (see agenphone.device.volume). On success response is null.",category:"agenphone",pluginName:Gn,parameters:i.object({stream:i.enum(["media","alarm","ring"]).optional().describe("Audio stream, default media"),level:i.number().int().min(0).describe("Volume level (0 to stream max)")}),returns:V,examples:[{description:"Set media volume",input:{stream:"media",level:10},output:{request_id:"req_7f3a2b",status:"success",action:"set_volume",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("set_volume",n)},k_={name:"agenphone.device.vibrate",description:"Vibrate the device (requires VIBRATE permission). On success response is null.",category:"agenphone",pluginName:Gn,parameters:i.object({duration:i.number().int().positive().optional().describe("Vibration duration in ms, default 200")}),returns:V,examples:[{description:"Vibrate 500ms",input:{duration:500},output:{request_id:"req_7f3a2b",status:"success",action:"vibrate",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("vibrate",n)};var N_="agenphone",R_={name:"agenphone.clipboard.get",description:"Read current clipboard text. response.clipboard_text is empty string if clipboard is empty.",category:"agenphone",pluginName:N_,parameters:i.object({}),returns:A(i.object({clipboard_text:i.string()})),examples:[{description:"Get clipboard",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_clipboard",device_id:"dev_abc12345",task_id:null,response:{clipboard_text:"copied text"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("get_clipboard")},U_={name:"agenphone.clipboard.set",description:"Set clipboard text on the device. On success response is null.",category:"agenphone",pluginName:N_,parameters:i.object({content:i.string().describe("Text to write to clipboard")}),returns:V,examples:[{description:"Set clipboard",input:{content:"hello"},output:{request_id:"req_7f3a2b",status:"success",action:"set_clipboard",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("set_clipboard",n)};var Fn="agenphone",C_={name:"agenphone.file.list",description:"List files and subdirectories. response.files contains entries with name, path, is_dir, size (bytes).",category:"agenphone",pluginName:Fn,parameters:i.object({path:i.string().describe("Directory path on device, e.g. /sdcard/")}),returns:A(i.object({files:i.array(i.object({name:i.string(),path:i.string(),is_dir:i.boolean(),size:i.number()}))})),examples:[{description:"List sdcard",input:{path:"/sdcard/"},output:{request_id:"req_7f3a2b",status:"success",action:"list_files",device_id:"dev_abc12345",task_id:null,response:{files:[{name:"doc.txt",path:"/sdcard/doc.txt",is_dir:!1,size:1024}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("list_files",n)},S_={name:"agenphone.file.read",description:'Read file content. Text files (≤512KB): response.content is UTF-8 string, response.encoding="utf-8". Image files (jpg/png/gif): response.content_base64 is base64, response.encoding="base64".',category:"agenphone",pluginName:Fn,parameters:i.object({path:i.string().describe("File path on device")}),returns:A(i.union([i.object({content:i.string(),encoding:i.literal("utf-8")}),i.object({content_base64:i.string(),encoding:i.literal("base64")})])),examples:[{description:"Read text file",input:{path:"/sdcard/note.txt"},output:{request_id:"req_7f3a2b",status:"success",action:"read_file",device_id:"dev_abc12345",task_id:null,response:{content:"hello",encoding:"utf-8"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("read_file",n)},t_={name:"agenphone.file.write",description:"Write text to a file (parent dirs created if needed). On success response is null.",category:"agenphone",pluginName:Fn,parameters:i.object({path:i.string().describe("File path on device"),content:i.string().optional().describe("Text content to write, default empty string")}),returns:V,examples:[{description:"Write file",input:{path:"/sdcard/note.txt",content:"hello"},output:{request_id:"req_7f3a2b",status:"success",action:"write_file",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("write_file",n)},E_={name:"agenphone.file.delete",description:"Delete a file on the device. On success response is null.",category:"agenphone",pluginName:Fn,parameters:i.object({path:i.string().describe("File path to delete")}),returns:V,examples:[{description:"Delete file",input:{path:"/sdcard/old.txt"},output:{request_id:"req_7f3a2b",status:"success",action:"delete_file",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("delete_file",n)},F_={name:"agenphone.file.analyze-storage",description:"Analyze total size and file count in a directory. response contains path, total_bytes, file_count.",category:"agenphone",pluginName:Fn,parameters:i.object({path:i.string().describe("Directory path to analyze"),maxDepth:i.number().int().positive().optional().describe("Recursion depth, default 3"),minSizeMB:i.number().min(0).optional().describe("Only count files >= this size in MB, default 0")}),returns:A(i.object({path:i.string(),total_bytes:i.number(),file_count:i.number().int()})),examples:[{description:"Analyze sdcard",input:{path:"/sdcard"},output:{request_id:"req_7f3a2b",status:"success",action:"analyze_storage",device_id:"dev_abc12345",task_id:null,response:{path:"/sdcard",total_bytes:104857600,file_count:50},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("analyze_storage",n)},P_={name:"agenphone.file.find-large",description:"Find files larger than minSize bytes. response.files contains entries with path and size (bytes).",category:"agenphone",pluginName:Fn,parameters:i.object({path:i.string().describe("Root directory to search"),minSize:i.number().positive().optional().describe("Minimum file size in bytes, e.g. 10485760 for 10MB"),limit:i.number().int().positive().optional().describe("Max results, default 50")}),returns:A(i.object({files:i.array(i.object({path:i.string(),size:i.number()}))})),examples:[{description:"Find large files",input:{path:"/sdcard",minSize:10485760},output:{request_id:"req_7f3a2b",status:"success",action:"find_large_files",device_id:"dev_abc12345",task_id:null,response:{files:[{path:"/sdcard/video.mp4",size:52428800}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("find_large_files",n)},T_={name:"agenphone.file.index-media",description:"Index image metadata from media library (up to 200 items). response.items contains entries with id, path, date_added.",category:"agenphone",pluginName:Fn,parameters:i.object({}),returns:A(i.object({items:i.array(i.object({id:i.string(),path:i.string(),date_added:i.number()}))})),examples:[{description:"Index media",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"index_media_metadata",device_id:"dev_abc12345",task_id:null,response:{items:[{id:"1",path:"/sdcard/DCIM/photo.jpg",date_added:1709123456}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("index_media_metadata")},y_={name:"agenphone.file.search-media",description:"Search media library by type and keyword. response.items contains entries with id, path, display_name.",category:"agenphone",pluginName:Fn,parameters:i.object({mediaType:i.enum(["image","video","audio"]).optional().describe("Media type, default image"),keyword:i.string().optional().describe("Filename or path keyword"),limit:i.number().int().positive().optional().describe("Max results, default 10")}),returns:A(i.object({items:i.array(i.object({id:i.string(),path:i.string(),display_name:i.string().optional()}))})),examples:[{description:"Search images",input:{mediaType:"image"},output:{request_id:"req_7f3a2b",status:"success",action:"search_media",device_id:"dev_abc12345",task_id:null,response:{items:[{id:"1",path:"/sdcard/DCIM/photo.jpg",display_name:"photo.jpg"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("search_media",n)};var I_="agenphone",g_={name:"agenphone.audio.play",description:"Play audio from a URI or local path. On success response is null.",category:"agenphone",pluginName:I_,parameters:i.object({uri:i.string().describe("Media URI or absolute local path, e.g. /sdcard/audio.mp3")}),returns:V,examples:[{description:"Play audio",input:{uri:"/sdcard/audio.mp3"},output:{request_id:"req_7f3a2b",status:"success",action:"play_audio",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("play_audio",n)},Z_={name:"agenphone.audio.stop",description:"Stop the currently playing audio. On success response is null.",category:"agenphone",pluginName:I_,parameters:i.object({}),returns:V,examples:[{description:"Stop audio",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"stop_audio",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("stop_audio")};var P2="agenphone",d_={name:"agenphone.notification.read",description:"Read notifications captured by NotificationListener. response.notifications contains entries with key, package_name, title, body, post_time (ms).",category:"agenphone",pluginName:P2,parameters:i.object({}),returns:A(i.object({notifications:i.array(i.object({key:i.string(),package_name:i.string(),title:i.string(),body:i.string(),post_time:i.number()}))})),examples:[{description:"Read notifications",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"read_notifications",device_id:"dev_abc12345",task_id:null,response:{notifications:[{key:"pkg|1|tag",package_name:"com.example.app",title:"标题",body:"内容",post_time:1709123456789}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("read_notifications")},a_={name:"agenphone.notification.post",description:"Post a system notification from this app (useful for testing). On success response is null.",category:"agenphone",pluginName:P2,parameters:i.object({title:i.string().optional().describe('Notification title, default "DevSupport"'),body:i.string().optional().describe("Notification body content")}),returns:V,examples:[{description:"Post notification",input:{title:"Alert",body:"Hello"},output:{request_id:"req_7f3a2b",status:"success",action:"post_notification",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("post_notification",n)},e_={name:"agenphone.notification.dismiss",description:"Dismiss a notification by key (requires NotificationListener). Use agenphone.notification.read to get keys. On success response is null.",category:"agenphone",pluginName:P2,parameters:i.object({key:i.string().describe("Notification key from read_notifications")}),returns:V,examples:[{description:"Dismiss notification",input:{key:"pkg|1|tag"},output:{request_id:"req_7f3a2b",status:"success",action:"dismiss_notification",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("dismiss_notification",n)},r_={name:"agenphone.notification.dismiss-all",description:"Dismiss all notifications posted by this app (does not affect other apps). On success response is null.",category:"agenphone",pluginName:P2,parameters:i.object({}),returns:V,examples:[{description:"Dismiss all",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"dismiss_all_notifications",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("dismiss_all_notifications")};var w2="agenphone",z_={name:"agenphone.overlay.toast",description:"Show a toast/instruction-log message on the device screen. On success response is null.",category:"agenphone",pluginName:w2,parameters:i.object({message:i.string().min(1).describe("Message text to display")}),returns:V,examples:[{description:"Show toast",input:{message:"Hello!"},output:{request_id:"req_7f3a2b",status:"success",action:"show_toast",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("show_toast",n)},s_={name:"agenphone.overlay.show",description:"Show a floating overlay window. response.overlay_id is the ID needed to hide it later.",category:"agenphone",pluginName:w2,parameters:i.object({text:i.string().optional().describe("Text to display in the overlay")}),returns:A(i.object({overlay_id:i.string().describe("ID to use with agenphone.overlay.hide")})),examples:[{description:"Show overlay",input:{text:"Status: OK"},output:{request_id:"req_7f3a2b",status:"success",action:"show_overlay",device_id:"dev_abc12345",task_id:null,response:{overlay_id:"overlay_abc123"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>p("show_overlay",n)},n4={name:"agenphone.overlay.hide",description:"Hide a specific overlay by its ID (from agenphone.overlay.show). On success response is null.",category:"agenphone",pluginName:w2,parameters:i.object({overlay_id:i.string().describe("Overlay ID returned by agenphone.overlay.show")}),returns:V,examples:[{description:"Hide overlay",input:{overlay_id:"overlay_abc123"},output:{request_id:"req_7f3a2b",status:"success",action:"hide_overlay",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("hide_overlay",n)},i4={name:"agenphone.overlay.hide-all",description:"Hide all overlays managed by this app. On success response is null.",category:"agenphone",pluginName:w2,parameters:i.object({}),returns:V,examples:[{description:"Hide all overlays",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"hide_all_overlays",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>p("hide_all_overlays")},b4={name:"agenphone.overlay.list",description:"List all currently visible overlays. response.overlays contains entries with overlay_id and text.",category:"agenphone",pluginName:w2,parameters:i.object({}),returns:A(i.object({overlays:i.array(i.object({overlay_id:i.string(),text:i.string()}))})),examples:[{description:"List overlays",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_overlays",device_id:"dev_abc12345",task_id:null,response:{overlays:[{overlay_id:"overlay_abc123",text:"Status: OK"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>p("list_overlays")};var ww="agenphone",_4={name:"agenphone.tts.speak",description:"Speak text aloud using system TTS engine. On success response is null.",category:"agenphone",pluginName:ww,parameters:i.object({text:i.string().min(1).describe("Text to speak"),locale:i.string().optional().describe("Locale code, e.g. zh-CN, en-US"),speed:i.number().min(0.5).max(2).optional().describe("Speech speed 0.5–2.0, default 1.0")}),returns:V,examples:[{description:"Speak text",input:{text:"你好世界"},output:{request_id:"req_7f3a2b",status:"success",action:"speak_tts",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>p("speak_tts",n)};var w4={name:"agenphone",version:"2.0.0",featureFlag:"agenphone",commands:[gb,Zb,db,ab,eb,rb,zb,sb,n_,i_,b_,__,w_,$_,q_,o_,x_,m_,v_,H_,Q_,X_,J_,Y_,W_,l_,p_,G_,O_,h_,u_,B_,M_,j_,f_,V_,K_,D_,L_,c_,A_,k_,R_,U_,C_,S_,t_,E_,F_,P_,T_,y_,g_,Z_,d_,a_,e_,r_,z_,s_,n4,i4,b4,_4]};import{readFileSync as qw,writeFileSync as MQ,mkdirSync as jQ,existsSync as ow}from"node:fs";import{join as $4}from"node:path";import{homedir as $w}from"node:os";function Pn(){return process.env.YUNKE_HOME_OVERRIDE??$w()}function xw(){return $4(Pn(),".yunke")}function mw(){return $4(xw(),"skillshub.json")}var $2={api_base_url:"https://skillshub.yunke.ai",channel:"stable",target:"generic"};function On(){let n=mw();if(!ow(n))return{...$2};try{let b=qw(n,"utf-8"),_=JSON.parse(b);return{api_base_url:_.api_base_url??$2.api_base_url,channel:_.channel??$2.channel,target:_.target??$2.target}}catch{return{...$2}}}var vw="yunke-cli/1.0.0";function Hw(){return On().api_base_url.replace(/\/$/,"")}async function Vn(n,b){let w=`${Hw()}${n}`,$={"User-Agent":vw,...b?.headers??{}},q=await fetch(w,{...b,headers:$});if(!q.ok){let o=`HTTP ${q.status}`;try{let x=await q.json();if(x.message)o=x.message}catch{}throw new G("EXECUTION_FAILED",`Skillshub API error: ${o}`)}return await q.json()}var Qw="skillshub",Xw=i.object({slug:i.string(),displayName:i.string(),summary:i.string(),type:i.string(),version:i.string(),targets:i.array(i.string()),channel:i.string()}),q4={name:"skillshub.search",description:"Search for skills and plugins on the Skillshub registry",category:"skillshub",pluginName:Qw,parameters:i.object({query:i.string().describe("搜索关键词"),limit:i.number().int().min(1).max(100).default(20).describe("返回数量上限"),type:i.string().optional().describe("按类型过滤,如 skill、plugin"),channel:i.enum(["stable","beta","canary"]).optional().describe("渠道,默认使用配置中的 channel")}),returns:i.object({results:i.array(Xw),total:i.number()}),examples:[{description:"Search for calendar-related skills",input:{query:"calendar"},output:{results:[],total:0}}],sideEffects:["network"],handler:async(n)=>{let b=On(),_=n.channel??b.channel,w=new URLSearchParams({q:n.query,channel:_,target:b.target,limit:String(n.limit),offset:"0"});if(n.type!==void 0)w.set("type",n.type);let $=await Vn(`/api/v1/search?${w.toString()}`);return{results:$.results,total:$.results.length}}};import{readFileSync as Jw,writeFileSync as Yw,mkdirSync as Ww,existsSync as o4}from"node:fs";import{dirname as lw,join as pw}from"node:path";var Gw="skills-lock.json";function x4(){return pw(Pn(),".yunke",Gw)}function Zi(){return{version:2,skills:{}}}function Tn(){let n=x4();if(!o4(n))return Zi();try{let b=Jw(n,"utf-8"),_=JSON.parse(b);if(_.version!==2||typeof _.skills!=="object")return Zi();return{version:2,skills:{..._.skills}}}catch{return Zi()}}function c0(n){let b=x4(),_=lw(b);if(!o4(_))Ww(_,{recursive:!0});Yw(b,JSON.stringify(n,null,2),"utf-8")}var Ow="skillshub",m4={name:"skillshub.list",description:"List locally installed skills from the lockfile",category:"skillshub",pluginName:Ow,parameters:i.object({}),returns:i.object({skills:i.array(i.object({slug:i.string(),name:i.string(),version:i.string(),source:i.string()})),total:i.number()}),examples:[{description:"List all installed skills",input:{},output:{skills:[],total:0}}],sideEffects:["none"],handler:async()=>{let n=Tn(),b=Object.entries(n.skills).map(([_,w])=>({slug:_,name:w.name,version:w.version,source:w.source}));return{skills:b,total:b.length}}};import{join as X$}from"node:path";import{createHash as b$,randomUUID as _$}from"node:crypto";import{createReadStream as w$,writeFileSync as $$,existsSync as q$,unlinkSync as o$}from"node:fs";import{tmpdir as x$}from"node:os";import{join as m$}from"node:path";var _6=F5(z4(),1);import{spawnSync as e7}from"node:child_process";import{cpSync as i6,existsSync as oi,mkdirSync as b6,readdirSync as n6,rmSync as r7,statSync as z7}from"node:fs";import{dirname as s7,join as Q2}from"node:path";var s4=(n)=>d0("skillshub.log","info",n),x1=(n)=>d0("skillshub.log","warn",n),H2=(n)=>d0("skillshub.log","error",n);function n$(){return Q2(Pn(),".yunke","skill-cache")}function w6(n){return Q2(n$(),n)}function t0(n){if(!oi(n))return;if(e7(process.execPath,["-e",`require('fs').rmSync(${JSON.stringify(n)},{recursive:true,force:true})`],{env:{...process.env,NODE_OPTIONS:"",CODEBUDDY_SESSION_ID:"",CLAUDE_SESSION_ID:""},stdio:["ignore","ignore","pipe"]}).status!==0)r7(n,{recursive:!0,force:!0})}async function $6(n,b){let _=w6(b);if(oi(_))try{t0(_)}catch(w){x1(`forceRmSync 清缓存失败已忽略: ${_} - ${w instanceof Error?w.message:String(w)}`)}return b6(_,{recursive:!0}),await _6.default(n,{dir:_}),i$(_),_}function i$(n){let b=n6(n);if(b.length!==1)return;let _=Q2(n,b[0]);if(!z7(_).isDirectory())return;for(let w of n6(_))i6(Q2(_,w),Q2(n,w),{recursive:!0});t0(_)}function xi(n,b,_=!1){if(oi(b)&&!_)return!1;if(oi(b))try{t0(b)}catch(w){x1(`forceRmSync 删旧目标失败已忽略: ${b} - ${w instanceof Error?w.message:String(w)}`)}return b6(s7(b),{recursive:!0}),i6(n,b,{recursive:!0,force:!0}),!0}function q6(n){t0(w6(n))}async function v$(n){let b=b$("sha256"),_=w$(n);return new Promise((w,$)=>{_.on("data",(q)=>b.update(q)),_.on("end",()=>w(b.digest("hex"))),_.on("error",$)})}async function mi(n,b,_){let w=m$(x$(),`${_$()}.zip`);try{let $=await fetch(n);if(!$.ok)throw H2(`download failed: HTTP ${$.status} - ${n}`),new G("EXECUTION_FAILED",`下载失败: HTTP ${$.status} - ${n}`);if(!$.body)throw new G("EXECUTION_FAILED",`下载失败: 响应体为空 - ${n}`);let q=await $.arrayBuffer();if($$(w,Buffer.from(q)),_){let o=await v$(w);if(o!==_)throw H2(`sha256 mismatch: expected ${_} got ${o}`),new G("EXECUTION_FAILED",`SHA-256 校验失败: 期望 ${_},实际 ${o}`)}return await $6(w,b)}finally{if(q$(w))o$(w)}}import{existsSync as H$}from"node:fs";import{join as m1}from"node:path";var Q$=[{dir:".agents/skills",fallback:!0},{dir:".openclaw/skills"},{dir:".hermes/skills"},{dir:".workbuddy/skills"},{dir:".codebuddy/skills"},{dir:".qoder/skills"},{dir:".qoder-cn/skills"},{dir:".trae/skills"},{dir:".trae-cn/skills"},{dir:".qwenwork/skills"},{dir:".qwenworkcn/skills"},{dir:".qwen/skills"},{dir:".claude/skills"},{dir:".lingma/skills"},{dir:".iflow/skills"}];function E0(){let n=Pn(),b=[];for(let _ of Q$){if(_.fallback){b.push(m1(n,_.dir));continue}let w=_.dir.split("/")[0];if(H$(m1(n,w)))b.push(m1(n,_.dir))}return b}var J$="skillshub",o6={name:"skillshub.install",description:"Download and install a skill, distributing to all detected clients",category:"skillshub",pluginName:J$,parameters:i.object({slug:i.string().describe("skill 的 slug 标识"),force:i.boolean().default(!1).describe("覆盖已存在的 skill"),dir:i.string().optional().describe("单目录安装(escape hatch,默认多客户端分发)")}),returns:i.object({slug:i.string(),message:i.string()}),examples:[{description:"Install a skill by slug",input:{slug:"find-skills"},output:{slug:"find-skills",message:"Installed successfully"}}],sideEffects:["network","filesystem"],handler:async(n)=>{let b=On(),_=n.dir?[n.dir]:E0(),w=await Vn(`/api/v1/manifest/${encodeURIComponent(n.slug)}?target=${b.target}&channel=${b.channel}`),$=w.artifacts.find((Y)=>Y.target===b.target||Y.target==="all");if(!$)throw new G("EXECUTION_FAILED",`无匹配的 artifact(target=${b.target})`);let q=await mi($.downloadUrl,n.slug,$.sha256||void 0),o=0,x=[];for(let Y of _)try{if(xi(q,X$(Y,n.slug),n.force))o++}catch(l){x.push(`${Y}: ${l instanceof Error?l.message:String(l)}`)}if(x.length>0)H2(`${n.slug} copy failures: ${x.join(" | ")}`);if(s4(`${n.slug} installed to ${o}/${_.length} targets`),o===0&&x.length>0)throw new G("EXECUTION_FAILED",`所有目标安装失败:
13
- ${x.join(`
14
- `)}`);let m=Tn(),v={...m,skills:{...m.skills,[n.slug]:{name:n.slug,version:w.version,source:"skillshub"}}};c0(v),await Vn(`/api/v1/install-record/${encodeURIComponent(n.slug)}`,{method:"POST"}).catch(()=>{});let H=x.length?`Installed to ${o} target(s); ${x.length} failed`:"Installed successfully";return{slug:n.slug,message:H}}};import{join as Y$}from"node:path";var W$="skillshub",x6={name:"skillshub.remove",description:"Remove an installed skill from all clients and clean up its cache",category:"skillshub",pluginName:W$,parameters:i.object({slug:i.string().describe("要卸载的 skill slug"),dir:i.string().optional().describe("单目录卸载(escape hatch,默认移除所有客户端)"),force:i.boolean().optional().describe("跳过 lockfile 守卫,强制从各 agent 目录删除(用于清理孤儿/旧 slug)")}),returns:i.object({slug:i.string(),message:i.string()}),examples:[{description:"Remove a skill by slug",input:{slug:"find-skills"},output:{slug:"find-skills",message:"Removed successfully"}}],sideEffects:["filesystem"],handler:async(n)=>{let b=n.dir?[n.dir]:E0(),_=Tn();if(!n.force&&!(n.slug in _.skills))throw new G("EXECUTION_FAILED",`skill '${n.slug}' 未安装`);for(let q of b)t0(Y$(q,n.slug));let{[n.slug]:w,...$}=_.skills;return c0({..._,skills:$}),q6(n.slug),{slug:n.slug,message:"Removed successfully"}}};var l$="skillshub",m6={name:"skillshub.info",description:"Show detailed information about a skill from the registry",category:"skillshub",pluginName:l$,parameters:i.object({slug:i.string().describe("skill 的 slug")}),returns:i.object({slug:i.string(),capability:i.unknown(),versions:i.array(i.unknown()),artifacts:i.array(i.unknown())}),examples:[{description:"Get info for a skill",input:{slug:"find-skills"},output:{slug:"find-skills",capability:{},versions:[],artifacts:[]}}],sideEffects:["network"],handler:async(n)=>{let b=await Vn(`/api/v1/capabilities/${encodeURIComponent(n.slug)}`);return{slug:n.slug,capability:b.capability,versions:b.versions,artifacts:b.artifacts}}};import{join as p$}from"node:path";var G$="skillshub",O$=i.object({slug:i.string(),status:i.enum(["upgraded","skipped","failed"]),from_version:i.string(),to_version:i.string(),message:i.string().optional()}),v6={name:"skillshub.upgrade",description:"Check for and apply updates to installed skills",category:"skillshub",pluginName:G$,parameters:i.object({slug:i.string().optional().describe("指定升级的 skill,不填则升级所有已安装的"),dir:i.string().optional().describe("单目录升级(escape hatch,默认所有客户端)"),check_only:i.boolean().default(!1).describe("只检查更新,不实际安装")}),returns:i.object({checked:i.number(),upgraded:i.number(),skipped:i.number(),failed:i.number(),details:i.array(O$)}),examples:[{description:"Check for updates without installing",input:{check_only:!0},output:{checked:2,upgraded:1,skipped:1,failed:0,details:[]}}],sideEffects:["network","filesystem"],handler:async(n)=>{let b=On(),_=Tn(),w=n.slug?[n.slug]:Object.keys(_.skills),$=[],q=0,o=0,x=0;for(let m of w){let v=_.skills[m];if(!v){$.push({slug:m,status:"failed",from_version:"",to_version:"",message:"skill 未安装"}),x++;continue}try{let H=await Vn(`/api/v1/manifest/${encodeURIComponent(m)}?target=${b.target}&channel=${b.channel}`),Y=H.version,l=v.version,j=H.artifacts.find((M)=>M.target===b.target||M.target==="all");if(!j){$.push({slug:m,status:"skipped",from_version:l,to_version:Y,message:"无匹配的 artifact"}),o++;continue}if(l===Y){$.push({slug:m,status:"skipped",from_version:l,to_version:Y}),o++;continue}if(n.check_only){$.push({slug:m,status:"upgraded",from_version:l,to_version:Y}),q++;continue}let U=await mi(j.downloadUrl,m,j.sha256||void 0),D=n.dir?[n.dir]:E0();for(let M of D)try{xi(U,p$(M,m),!0)}catch{}_={..._,skills:{..._.skills,[m]:{...v,version:Y}}},c0(_),$.push({slug:m,status:"upgraded",from_version:l,to_version:Y}),q++}catch(H){let Y=H instanceof Error?H.message:String(H);$.push({slug:m,status:"failed",from_version:v.version,to_version:"",message:Y}),x++}}return{checked:w.length,upgraded:q,skipped:o,failed:x,details:$}}};var H6={name:"skillshub",version:"1.0.0",commands:[q4,m4,o6,x6,m6,v6]};import{createServer as d$}from"node:http";var h$="/api/v1";async function F0(n,b){let _=`${w0}${h$}${n}`,w=await fetch(_,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)});if(!w.ok){let q=`HTTP ${w.status}`;try{let o=await w.json();q=o.detail??o.message??q}catch{}throw new G("EXECUTION_FAILED",`云客服务错误: ${q}`)}return(await w.json()).data}import{readFileSync as u$,writeFileSync as B$,mkdirSync as M$,existsSync as H1,unlinkSync as j$}from"node:fs";import{homedir as f$}from"node:os";import{join as Q6}from"node:path";var v1=process.env.YUNKE_CONFIG_DIR??Q6(f$(),".yunke"),X2=Q6(v1,"crm.json");function mn(){if(!H1(X2))return null;try{let n=u$(X2,"utf-8");return JSON.parse(n)}catch{return null}}function vi(n){if(!H1(v1))M$(v1,{recursive:!0});B$(X2,JSON.stringify(n,null,2),"utf-8")}function X6(n){let b=mn()??{token:"",user_id:"",company:"",company_code:"",name:"",phone:"",role:"",login_id:""};vi({...b,...n})}function J6(){if(H1(X2))j$(X2)}import{readFileSync as V$,writeFileSync as K$,mkdirSync as D$,existsSync as X1,unlinkSync as L$}from"node:fs";import{homedir as c$}from"node:os";import{join as W6}from"node:path";var A$="https://middleware-test.yunke.ai",k$="https://middleware.yunke.ai",N$=120000,R$=20000,U$=60000,Q1=process.env.YUNKE_CONFIG_DIR??W6(c$(),".yunke"),J2=W6(Q1,"middleware-jwt.json");function J1(){let n=mn();if(n?.base_url)try{let b=new URL(n.base_url);return`${b.protocol}//${b.host}`}catch{}return process.env.YUNKE_CRM_BASE_URL||"https://crm.yunkecn.com"}function C$(){if(process.env.YUNKE_MIDDLEWARE_BASE_URL)return process.env.YUNKE_MIDDLEWARE_BASE_URL.replace(/\/$/,"");return J1().includes("test.")?A$:k$}function l6(){let n=mn();if(!n?.token||!n?.user_id)throw new G("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login-web' 登录");if(!n.company_code)throw new G("CONFIG_ERROR","凭证缺少 company_code,请重新运行 yunke crm.auth.login-web 登录");return{token:n.token,user_id:n.user_id,company_code:n.company_code}}function S$(){if(!X1(J2))return null;try{return JSON.parse(V$(J2,"utf-8"))}catch{return null}}function t$(n){if(!X1(Q1))D$(Q1,{recursive:!0});K$(J2,JSON.stringify(n,null,2),"utf-8")}function E$(n,b,_){if(!n)return!1;if(n.user_id!==b||n.company_code!==_)return!1;return Date.now()<n.expires_at-N$}async function Y6(n=!1){let{token:b,user_id:_,company_code:w}=l6();if(!n){let x=S$();if(E$(x,_,w))return x.token}let $=await globalThis.fetch(`${J1()}/pc/ai/knowledgeBase/getToken`,{method:"POST",headers:{"Content-Type":"application/json",token:b,userId:_,package:"agentapp"},body:"{}",signal:AbortSignal.timeout(R$)});if(!$.ok)throw new G("EXECUTION_FAILED",`换中台 JWT 失败: HTTP ${$.status}`);let q=await $.json();if(!q.success||!q.data?.access_token)throw new G("CONFIG_ERROR",`换中台 JWT 失败: ${q.message||"未知原因"}。可先运行 yunke crm.auth.status 续期,或重新 yunke crm.auth.login-web 登录`);let o={user_id:_,company_code:w,token:q.data.access_token,expires_at:Date.now()+(q.data.expires_in??3600)*1000};return t$(o),o.token}async function O(n,b={}){let{user_id:_,company_code:w}=l6(),$=C$(),q=J1(),o=(H)=>globalThis.fetch(`${$}/api/v1/crm/tools/${n}`,{method:"POST",headers:{Authorization:`Bearer ${H}`,"Content-Type":"application/json"},body:JSON.stringify({company:w,user_id:_,base_url:q,payload:b}),signal:AbortSignal.timeout(U$)}),x=await o(await Y6());if(x.status===401)x=await o(await Y6(!0));let m={};try{m=await x.json()}catch{m={}}if(x.status===200&&m.code===200)return m.data??{};let v=m.message||m.detail||"";if(x.status===401)throw new G("CONFIG_ERROR","中台鉴权失败(重签 JWT 后仍 401),请重新运行 yunke crm.auth.login-web 登录");if(x.status===403)throw new G("CONFIG_ERROR",`企业码/用户与 token 声明不一致: ${v},请重新登录`);if(x.status===404)throw new G("EXECUTION_FAILED",`未知中台工具: ${n}`);if(x.status===422)throw new G("CONFIG_ERROR",`请求上下文缺失(company/user_id/base_url): ${v},请重新登录`);throw new G("EXECUTION_FAILED",v||`中台请求失败: HTTP ${x.status}`)}async function K(){let n=await O("get_department_tree",{showUser:!1}),_=(Array.isArray(n)?n:n.list??[]).find((w)=>w.isDept);if(!_)throw new G("EXECUTION_FAILED","无法获取默认部门 ID");return _.id}function p6(){if(X1(J2))L$(J2)}import{randomBytes as G6,createHash as F$}from"node:crypto";import{request as P$}from"node:http";import{request as T$}from"node:https";var y$="https://crm.yunkecn.com/pc";function I$(n=process.env.YUNKE_PC_OAUTH_BASE_URL){let b=n?.replace(/\/$/,"");return b&&b.length>0?b:y$}var Y1=I$();function O6(n,b){if(!n)return b;let _;try{_=new URL(n).host}catch{throw Error(`invalid iss: ${n}`)}return n.replace(/\/$/,"")}function W1(n){return n.toString("base64url")}function h6(){return W1(G6(32))}function u6(n){return W1(F$("sha256").update(n,"utf8").digest())}function B6(){return W1(G6(16))}function M6(n,b,_){return new Promise((w,$)=>{let x=(new URL(n).protocol==="https:"?T$:P$)(n,{method:"POST",agent:!1,headers:{"content-type":_,"content-length":String(Buffer.byteLength(b))}},(m)=>{let v="";m.setEncoding("utf8"),m.on("data",(H)=>v+=H),m.on("end",()=>w({status:m.statusCode??0,text:v}))});x.on("error",$),x.write(b),x.end()})}async function j6(n,b){let _=JSON.stringify({redirect_uris:[b],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none",scope:"read",client_name:"yunke-cli"}),{status:w,text:$}=await M6(`${n}/oauth/register`,_,"application/json");if(w<200||w>=300)throw Error(`OAuth register failed: HTTP ${w} ${$}`);let q;try{q=JSON.parse($)}catch{throw Error(`OAuth register failed: bad json ${$}`)}if(!q?.client_id)throw Error("OAuth register failed: missing client_id");return q}function f6(n){let b=new URL(`${n.baseUrl}/oauth/authorize`);if(b.searchParams.set("client_id",n.clientId),b.searchParams.set("redirect_uri",n.redirectUri),b.searchParams.set("response_type","code"),b.searchParams.set("code_challenge",n.codeChallenge),b.searchParams.set("code_challenge_method","S256"),b.searchParams.set("state",n.state),n.scope)b.searchParams.set("scope",n.scope);return b.toString()}class V6 extends Error{error;constructor(n,b){super(b);this.name="OAuthTokenError",this.error=n}}async function K6(n){let b=new URLSearchParams({grant_type:"authorization_code",code:n.code,client_id:n.clientId,redirect_uri:n.redirectUri,code_verifier:n.codeVerifier});return L6(`${n.baseUrl}/oauth/token`,b)}async function D6(n){let b=new URLSearchParams({grant_type:"refresh_token",refresh_token:n.refreshToken,client_id:n.clientId});return L6(`${n.baseUrl}/oauth/token`,b)}async function L6(n,b){let{status:_,text:w}=await M6(n,b.toString(),"application/x-www-form-urlencoded"),$=null;try{$=JSON.parse(w)}catch{}if(_<200||_>=300||!$||$.error){let q=$?.error??"http_error",o=$?.error_description??`HTTP ${_}`;throw new V6(q,o)}return $}import{spawn as g$}from"node:child_process";function Z$(n,b=process.platform){let _={detached:!0,stdio:"ignore"};if(b==="win32")return{cmd:"cmd",args:["/c","start",'""',`"${n}"`],opts:{..._,windowsVerbatimArguments:!0}};if(b==="darwin")return{cmd:"open",args:[n],opts:_};return{cmd:"xdg-open",args:[n],opts:_}}function c6(n){let{cmd:b,args:_,opts:w}=Z$(n);try{g$(b,_,w).unref()}catch{}}var A6=`<!DOCTYPE html>
4
+ `+J),n.push(X+"m+"+m2.exports.humanize(this.diff)+"\x1B[0m")}else n[0]=uX()+q+" "+n[0]}function uX(){if(U5.inspectOpts.hideDate)return"";return new Date().toISOString()+" "}function yX(...n){return process.stderr.write(F2.formatWithOptions(U5.inspectOpts,...n)+`
5
+ `)}function ZX(n){if(n)process.env.DEBUG=n;else delete process.env.DEBUG}function pX(){return process.env.DEBUG}function gX(n){n.inspectOpts={};let q=Object.keys(U5.inspectOpts);for(let H=0;H<q.length;H++)n.inspectOpts[q[H]]=U5.inspectOpts[q[H]]}m2.exports=g6()(U5);var{formatters:A5}=m2.exports;A5.o=function(n){return this.inspectOpts.colors=this.useColors,F2.inspect(n,this.inspectOpts).split(`
6
+ `).map((q)=>q.trim()).join(" ")};A5.O=function(n){return this.inspectOpts.colors=this.useColors,F2.inspect(n,this.inspectOpts)}});var E5=H0((lv,i6)=>{if(typeof process>"u"||process.type==="renderer"||!1||process.__nwjs)i6.exports=C5();else i6.exports=m5()});var b5=H0((cv,S5)=>{S5.exports=P5;function P5(n,q){if(n&&q)return P5(n)(q);if(typeof n!=="function")throw TypeError("need wrapper function");return Object.keys(n).forEach(function(Q){H[Q]=n[Q]}),H;function H(){var Q=Array(arguments.length);for(var X=0;X<Q.length;X++)Q[X]=arguments[X];var J=n.apply(this,Q),w=Q[Q.length-1];if(typeof J==="function"&&J!==w)Object.keys(w).forEach(function(W){J[W]=w[W]});return J}}});var f6=H0((dv,o6)=>{var k5=b5();o6.exports=k5(E2);o6.exports.strict=k5(h5);E2.proto=E2(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return E2(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return h5(this)},configurable:!0})});function E2(n){var q=function(){if(q.called)return q.value;return q.called=!0,q.value=n.apply(this,arguments)};return q.called=!1,q}function h5(n){var q=function(){if(q.called)throw Error(q.onceError);return q.called=!0,q.value=n.apply(this,arguments)},H=n.name||"Function wrapped with `once`";return q.onceError=H+" shouldn't be called more than once",q.called=!1,q}});var u5=H0((zv,I5)=>{var tX=f6(),rX=function(){},aX=global.Bare?queueMicrotask:process.nextTick.bind(process),eX=function(n){return n.setHeader&&typeof n.abort==="function"},sX=function(n){return n.stdio&&Array.isArray(n.stdio)&&n.stdio.length===3},T5=function(n,q,H){if(typeof q==="function")return T5(n,null,q);if(!q)q={};H=tX(H||rX);var{_writableState:Q,_readableState:X}=n,J=q.readable||q.readable!==!1&&n.readable,w=q.writable||q.writable!==!1&&n.writable,W=!1,x=function(){if(!n.writable)Y()},Y=function(){if(w=!1,!J)H.call(n)},_=function(){if(J=!1,!w)H.call(n)},G=function(N){H.call(n,N?Error("exited with error code: "+N):null)},O=function(N){H.call(n,N)},M=function(){aX(A)},A=function(){if(W)return;if(J&&!(X&&(X.ended&&!X.destroyed)))return H.call(n,Error("premature close"));if(w&&!(Q&&(Q.ended&&!Q.destroyed)))return H.call(n,Error("premature close"))},L=function(){n.req.on("finish",Y)};if(eX(n))if(n.on("complete",Y),n.on("abort",M),n.req)L();else n.on("request",L);else if(w&&!Q)n.on("end",x),n.on("close",x);if(sX(n))n.on("exit",G);if(n.on("end",_),n.on("finish",Y),q.error!==!1)n.on("error",O);return n.on("close",M),function(){if(W=!0,n.removeListener("complete",Y),n.removeListener("abort",M),n.removeListener("request",L),n.req)n.req.removeListener("finish",Y);n.removeListener("end",x),n.removeListener("close",x),n.removeListener("finish",Y),n.removeListener("exit",G),n.removeListener("end",_),n.removeListener("error",O),n.removeListener("close",M)}};I5.exports=T5});var p5=H0((tv,Z5)=>{var nJ=f6(),$J=u5(),P2;try{P2=a("fs")}catch(n){}var I1=function(){},qJ=typeof process>"u"?!1:/^v?\.0/.test(process.version),S2=function(n){return typeof n==="function"},HJ=function(n){if(!qJ)return!1;if(!P2)return!1;return(n instanceof(P2.ReadStream||I1)||n instanceof(P2.WriteStream||I1))&&S2(n.close)},QJ=function(n){return n.setHeader&&S2(n.abort)},XJ=function(n,q,H,Q){Q=nJ(Q);var X=!1;n.on("close",function(){X=!0}),$J(n,{readable:q,writable:H},function(w){if(w)return Q(w);X=!0,Q()});var J=!1;return function(w){if(X)return;if(J)return;if(J=!0,HJ(n))return n.close(I1);if(QJ(n))return n.abort();if(S2(n.destroy))return n.destroy();Q(w||Error("stream was destroyed"))}},y5=function(n){n()},JJ=function(n,q){return n.pipe(q)},wJ=function(){var n=Array.prototype.slice.call(arguments),q=S2(n[n.length-1]||I1)&&n.pop()||I1;if(Array.isArray(n[0]))n=n[0];if(n.length<2)throw Error("pump requires two streams per minimum");var H,Q=n.map(function(X,J){var w=J<n.length-1,W=J>0;return XJ(X,w,W,function(x){if(!H)H=x;if(x)Q.forEach(y5);if(w)return;Q.forEach(y5),q(H)})});return n.reduce(JJ)};Z5.exports=wJ});var i5=H0((rv,g5)=>{var{PassThrough:WJ}=a("stream");g5.exports=(n)=>{n={...n};let{array:q}=n,{encoding:H}=n,Q=H==="buffer",X=!1;if(q)X=!(H||Q);else H=H||"utf8";if(Q)H=null;let J=new WJ({objectMode:X});if(H)J.setEncoding(H);let w=0,W=[];return J.on("data",(x)=>{if(W.push(x),X)w=W.length;else w+=x.length}),J.getBufferedValue=()=>{if(q)return W;return Q?Buffer.concat(W,w):W.join("")},J.getBufferedLength=()=>w,J}});var o5=H0((av,x1)=>{var{constants:xJ}=a("buffer"),YJ=p5(),_J=i5();class l6 extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}}async function b2(n,q){if(!n)return Promise.reject(Error("Expected a stream"));q={maxBuffer:1/0,...q};let{maxBuffer:H}=q,Q;return await new Promise((X,J)=>{let w=(W)=>{if(W&&Q.getBufferedLength()<=xJ.MAX_LENGTH)W.bufferedData=Q.getBufferedValue();J(W)};Q=YJ(n,_J(q),(W)=>{if(W){w(W);return}X()}),Q.on("data",()=>{if(Q.getBufferedLength()>H)w(new l6)})}),Q.getBufferedValue()}x1.exports=b2;x1.exports.default=b2;x1.exports.buffer=(n,q)=>b2(n,{...q,encoding:"buffer"});x1.exports.array=(n,q)=>b2(n,{...q,array:!0});x1.exports.MaxBufferError=l6});var d5=H0((ev,c5)=>{c5.exports=k2;function k2(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}k2.prototype.go=function(n){if(this.pending<this.max)l5(this,n);else this.waiting.push(n)};k2.prototype.wait=function(n){if(this.pending===0)n(this.error);else this.listeners.push(n)};k2.prototype.hold=function(){return f5(this)};function f5(n){n.pending+=1;var q=!1;return H;function H(X){if(q)throw Error("callback called twice");if(q=!0,n.error=n.error||X,n.pending-=1,n.waiting.length>0&&n.pending<n.max)l5(n,n.waiting.shift());else if(n.pending===0){var J=n.listeners;n.listeners=[],J.forEach(Q)}}function Q(X){X(n.error)}}function l5(n,q){q(f5(n))}});var t5=H0((KJ)=>{var u1=a("fs"),h2=a("util"),c6=a("stream"),z5=c6.Readable,d6=c6.Writable,GJ=c6.PassThrough,OJ=d5(),T2=a("events").EventEmitter;KJ.createFromBuffer=VJ;KJ.createFromFd=vJ;KJ.BufferSlicer=r0;KJ.FdSlicer=t0;h2.inherits(t0,T2);function t0(n,q){q=q||{},T2.call(this),this.fd=n,this.pend=new OJ,this.pend.max=1,this.refCount=0,this.autoClose=!!q.autoClose}t0.prototype.read=function(n,q,H,Q,X){var J=this;J.pend.go(function(w){u1.read(J.fd,n,q,H,Q,function(W,x,Y){w(),X(W,x,Y)})})};t0.prototype.write=function(n,q,H,Q,X){var J=this;J.pend.go(function(w){u1.write(J.fd,n,q,H,Q,function(W,x,Y){w(),X(W,x,Y)})})};t0.prototype.createReadStream=function(n){return new I2(this,n)};t0.prototype.createWriteStream=function(n){return new u2(this,n)};t0.prototype.ref=function(){this.refCount+=1};t0.prototype.unref=function(){var n=this;if(n.refCount-=1,n.refCount>0)return;if(n.refCount<0)throw Error("invalid unref");if(n.autoClose)u1.close(n.fd,q);function q(H){if(H)n.emit("error",H);else n.emit("close")}};h2.inherits(I2,z5);function I2(n,q){q=q||{},z5.call(this,q),this.context=n,this.context.ref(),this.start=q.start||0,this.endOffset=q.end,this.pos=this.start,this.destroyed=!1}I2.prototype._read=function(n){var q=this;if(q.destroyed)return;var H=Math.min(q._readableState.highWaterMark,n);if(q.endOffset!=null)H=Math.min(H,q.endOffset-q.pos);if(H<=0){q.destroyed=!0,q.push(null),q.context.unref();return}q.context.pend.go(function(Q){if(q.destroyed)return Q();var X=new Buffer(H);u1.read(q.context.fd,X,0,H,q.pos,function(J,w){if(J)q.destroy(J);else if(w===0)q.destroyed=!0,q.push(null),q.context.unref();else q.pos+=w,q.push(X.slice(0,w));Q()})})};I2.prototype.destroy=function(n){if(this.destroyed)return;n=n||Error("stream destroyed"),this.destroyed=!0,this.emit("error",n),this.context.unref()};h2.inherits(u2,d6);function u2(n,q){q=q||{},d6.call(this,q),this.context=n,this.context.ref(),this.start=q.start||0,this.endOffset=q.end==null?1/0:+q.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}u2.prototype._write=function(n,q,H){var Q=this;if(Q.destroyed)return;if(Q.pos+n.length>Q.endOffset){var X=Error("maximum file length exceeded");X.code="ETOOBIG",Q.destroy(),H(X);return}Q.context.pend.go(function(J){if(Q.destroyed)return J();u1.write(Q.context.fd,n,0,n.length,Q.pos,function(w,W){if(w)Q.destroy(),J(),H(w);else Q.bytesWritten+=W,Q.pos+=W,Q.emit("progress"),J(),H()})})};u2.prototype.destroy=function(){if(this.destroyed)return;this.destroyed=!0,this.context.unref()};h2.inherits(r0,T2);function r0(n,q){T2.call(this),q=q||{},this.refCount=0,this.buffer=n,this.maxChunkSize=q.maxChunkSize||Number.MAX_SAFE_INTEGER}r0.prototype.read=function(n,q,H,Q,X){var J=Q+H,w=J-this.buffer.length,W=w>0?w:H;this.buffer.copy(n,q,Q,J),setImmediate(function(){X(null,W)})};r0.prototype.write=function(n,q,H,Q,X){n.copy(this.buffer,Q,q,q+H),setImmediate(function(){X(null,H,n)})};r0.prototype.createReadStream=function(n){n=n||{};var q=new GJ(n);q.destroyed=!1,q.start=n.start||0,q.endOffset=n.end,q.pos=q.endOffset||this.buffer.length;var H=this.buffer.slice(q.start,q.pos),Q=0;while(!0){var X=Q+this.maxChunkSize;if(X>=H.length){if(Q<H.length)q.write(H.slice(Q,H.length));break}q.write(H.slice(Q,X)),Q=X}return q.end(),q.destroy=function(){q.destroyed=!0},q};r0.prototype.createWriteStream=function(n){var q=this;n=n||{};var H=new d6(n);return H.start=n.start||0,H.endOffset=n.end==null?this.buffer.length:+n.end,H.bytesWritten=0,H.pos=H.start,H.destroyed=!1,H._write=function(Q,X,J){if(H.destroyed)return;var w=H.pos+Q.length;if(w>H.endOffset){var W=Error("maximum file length exceeded");W.code="ETOOBIG",H.destroyed=!0,J(W);return}Q.copy(q.buffer,H.pos,0,Q.length),H.bytesWritten+=Q.length,H.pos=w,H.emit("progress"),J()},H.destroy=function(){H.destroyed=!0},H};r0.prototype.ref=function(){this.refCount+=1};r0.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw Error("invalid unref")};function VJ(n,q){return new r0(n,q)}function vJ(n,q){return new t0(n,q)}});var e5=H0((nK,a5)=>{var Gn=a("buffer").Buffer,z6=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918000,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];if(typeof Int32Array<"u")z6=new Int32Array(z6);function r5(n){if(Gn.isBuffer(n))return n;var q=typeof Gn.alloc==="function"&&typeof Gn.from==="function";if(typeof n==="number")return q?Gn.alloc(n):new Gn(n);else if(typeof n==="string")return q?Gn.from(n):new Gn(n);else throw Error("input must be buffer, number, or string, received "+typeof n)}function RJ(n){var q=r5(4);return q.writeInt32BE(n,0),q}function t6(n,q){if(n=r5(n),Gn.isBuffer(q))q=q.readUInt32BE(0);var H=~~q^-1;for(var Q=0;Q<n.length;Q++)H=z6[(H^n[Q])&255]^H>>>8;return H^-1}function r6(){return RJ(t6.apply(null,arguments))}r6.signed=function(){return t6.apply(null,arguments)};r6.unsigned=function(){return t6.apply(null,arguments)>>>0};a5.exports=r6});var X9=H0((mJ)=>{var a6=a("fs"),NJ=a("zlib"),s5=t5(),DJ=e5(),p2=a("util"),g2=a("events").EventEmitter,n9=a("stream").Transform,e6=a("stream").PassThrough,CJ=a("stream").Writable;mJ.open=AJ;mJ.fromFd=$9;mJ.fromBuffer=UJ;mJ.fromRandomAccessReader=s6;mJ.dosDateTimeToDate=H9;mJ.validateFileName=Q9;mJ.ZipFile=On;mJ.Entry=y1;mJ.RandomAccessReader=Vn;function AJ(n,q,H){if(typeof q==="function")H=q,q=null;if(q==null)q={};if(q.autoClose==null)q.autoClose=!0;if(q.lazyEntries==null)q.lazyEntries=!1;if(q.decodeStrings==null)q.decodeStrings=!0;if(q.validateEntrySizes==null)q.validateEntrySizes=!0;if(q.strictFileNames==null)q.strictFileNames=!1;if(H==null)H=Z2;a6.open(n,"r",function(Q,X){if(Q)return H(Q);$9(X,q,function(J,w){if(J)a6.close(X,Z2);H(J,w)})})}function $9(n,q,H){if(typeof q==="function")H=q,q=null;if(q==null)q={};if(q.autoClose==null)q.autoClose=!1;if(q.lazyEntries==null)q.lazyEntries=!1;if(q.decodeStrings==null)q.decodeStrings=!0;if(q.validateEntrySizes==null)q.validateEntrySizes=!0;if(q.strictFileNames==null)q.strictFileNames=!1;if(H==null)H=Z2;a6.fstat(n,function(Q,X){if(Q)return H(Q);var J=s5.createFromFd(n,{autoClose:!0});s6(J,X.size,q,H)})}function UJ(n,q,H){if(typeof q==="function")H=q,q=null;if(q==null)q={};if(q.autoClose=!1,q.lazyEntries==null)q.lazyEntries=!1;if(q.decodeStrings==null)q.decodeStrings=!0;if(q.validateEntrySizes==null)q.validateEntrySizes=!0;if(q.strictFileNames==null)q.strictFileNames=!1;var Q=s5.createFromBuffer(n,{maxChunkSize:65536});s6(Q,n.length,q,H)}function s6(n,q,H,Q){if(typeof H==="function")Q=H,H=null;if(H==null)H={};if(H.autoClose==null)H.autoClose=!0;if(H.lazyEntries==null)H.lazyEntries=!1;if(H.decodeStrings==null)H.decodeStrings=!0;var X=!!H.decodeStrings;if(H.validateEntrySizes==null)H.validateEntrySizes=!0;if(H.strictFileNames==null)H.strictFileNames=!1;if(Q==null)Q=Z2;if(typeof q!=="number")throw Error("expected totalSize parameter to be a number");if(q>Number.MAX_SAFE_INTEGER)throw Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");n.ref();var J=22,w=65535,W=Math.min(J+w,q),x=g0(W),Y=q-x.length;Y1(n,x,0,W,Y,function(_){if(_)return Q(_);for(var G=W-J;G>=0;G-=1){if(x.readUInt32LE(G)!==101010256)continue;var O=x.slice(G),M=O.readUInt16LE(4);if(M!==0)return Q(Error("multi-disk zip files are not supported: found disk number: "+M));var A=O.readUInt16LE(10),L=O.readUInt32LE(16),N=O.readUInt16LE(20),m=O.length-J;if(N!==m)return Q(Error("invalid comment length. expected: "+m+". found: "+N));var Z=X?y2(O,22,O.length,!1):O.slice(22);if(!(A===65535||L===4294967295))return Q(null,new On(n,L,q,A,Z,H.autoClose,H.lazyEntries,X,H.validateEntrySizes,H.strictFileNames));var f=g0(20),i=Y+G-f.length;Y1(n,f,0,f.length,i,function(d){if(d)return Q(d);if(f.readUInt32LE(0)!==117853008)return Q(Error("invalid zip64 end of central directory locator signature"));var z=_1(f,8),l=g0(56);Y1(n,l,0,l.length,z,function(b){if(b)return Q(b);if(l.readUInt32LE(0)!==101075792)return Q(Error("invalid zip64 end of central directory record signature"));return A=_1(l,32),L=_1(l,48),Q(null,new On(n,L,q,A,Z,H.autoClose,H.lazyEntries,X,H.validateEntrySizes,H.strictFileNames))})});return}Q(Error("end of central directory record signature not found"))})}p2.inherits(On,g2);function On(n,q,H,Q,X,J,w,W,x,Y){var _=this;if(g2.call(_),_.reader=n,_.reader.on("error",function(G){q9(_,G)}),_.reader.once("close",function(){_.emit("close")}),_.readEntryCursor=q,_.fileSize=H,_.entryCount=Q,_.comment=X,_.entriesRead=0,_.autoClose=!!J,_.lazyEntries=!!w,_.decodeStrings=!!W,_.validateEntrySizes=!!x,_.strictFileNames=!!Y,_.isOpen=!0,_.emittedError=!1,!_.lazyEntries)_._readEntry()}On.prototype.close=function(){if(!this.isOpen)return;this.isOpen=!1,this.reader.unref()};function A0(n,q){if(n.autoClose)n.close();q9(n,q)}function q9(n,q){if(n.emittedError)return;n.emittedError=!0,n.emit("error",q)}On.prototype.readEntry=function(){if(!this.lazyEntries)throw Error("readEntry() called without lazyEntries:true");this._readEntry()};On.prototype._readEntry=function(){var n=this;if(n.entryCount===n.entriesRead){setImmediate(function(){if(n.autoClose)n.close();if(n.emittedError)return;n.emit("end")});return}if(n.emittedError)return;var q=g0(46);Y1(n.reader,q,0,q.length,n.readEntryCursor,function(H){if(H)return A0(n,H);if(n.emittedError)return;var Q=new y1,X=q.readUInt32LE(0);if(X!==33639248)return A0(n,Error("invalid central directory file header signature: 0x"+X.toString(16)));if(Q.versionMadeBy=q.readUInt16LE(4),Q.versionNeededToExtract=q.readUInt16LE(6),Q.generalPurposeBitFlag=q.readUInt16LE(8),Q.compressionMethod=q.readUInt16LE(10),Q.lastModFileTime=q.readUInt16LE(12),Q.lastModFileDate=q.readUInt16LE(14),Q.crc32=q.readUInt32LE(16),Q.compressedSize=q.readUInt32LE(20),Q.uncompressedSize=q.readUInt32LE(24),Q.fileNameLength=q.readUInt16LE(28),Q.extraFieldLength=q.readUInt16LE(30),Q.fileCommentLength=q.readUInt16LE(32),Q.internalFileAttributes=q.readUInt16LE(36),Q.externalFileAttributes=q.readUInt32LE(38),Q.relativeOffsetOfLocalHeader=q.readUInt32LE(42),Q.generalPurposeBitFlag&64)return A0(n,Error("strong encryption is not supported"));n.readEntryCursor+=46,q=g0(Q.fileNameLength+Q.extraFieldLength+Q.fileCommentLength),Y1(n.reader,q,0,q.length,n.readEntryCursor,function(J){if(J)return A0(n,J);if(n.emittedError)return;var w=(Q.generalPurposeBitFlag&2048)!==0;Q.fileName=n.decodeStrings?y2(q,0,Q.fileNameLength,w):q.slice(0,Q.fileNameLength);var W=Q.fileNameLength+Q.extraFieldLength,x=q.slice(Q.fileNameLength,W);Q.extraFields=[];var Y=0;while(Y<x.length-3){var _=x.readUInt16LE(Y+0),G=x.readUInt16LE(Y+2),O=Y+4,M=O+G;if(M>x.length)return A0(n,Error("extra field length exceeds extra field buffer size"));var A=g0(G);x.copy(A,0,O,M),Q.extraFields.push({id:_,data:A}),Y=M}if(Q.fileComment=n.decodeStrings?y2(q,W,W+Q.fileCommentLength,w):q.slice(W,W+Q.fileCommentLength),Q.comment=Q.fileComment,n.readEntryCursor+=q.length,n.entriesRead+=1,Q.uncompressedSize===4294967295||Q.compressedSize===4294967295||Q.relativeOffsetOfLocalHeader===4294967295){var L=null;for(var Y=0;Y<Q.extraFields.length;Y++){var N=Q.extraFields[Y];if(N.id===1){L=N.data;break}}if(L==null)return A0(n,Error("expected zip64 extended information extra field"));var m=0;if(Q.uncompressedSize===4294967295){if(m+8>L.length)return A0(n,Error("zip64 extended information extra field does not include uncompressed size"));Q.uncompressedSize=_1(L,m),m+=8}if(Q.compressedSize===4294967295){if(m+8>L.length)return A0(n,Error("zip64 extended information extra field does not include compressed size"));Q.compressedSize=_1(L,m),m+=8}if(Q.relativeOffsetOfLocalHeader===4294967295){if(m+8>L.length)return A0(n,Error("zip64 extended information extra field does not include relative header offset"));Q.relativeOffsetOfLocalHeader=_1(L,m),m+=8}}if(n.decodeStrings)for(var Y=0;Y<Q.extraFields.length;Y++){var N=Q.extraFields[Y];if(N.id===28789){if(N.data.length<6)continue;if(N.data.readUInt8(0)!==1)continue;var Z=N.data.readUInt32LE(1);if(DJ.unsigned(q.slice(0,Q.fileNameLength))!==Z)continue;Q.fileName=y2(N.data,5,N.data.length,!0);break}}if(n.validateEntrySizes&&Q.compressionMethod===0){var f=Q.uncompressedSize;if(Q.isEncrypted())f+=12;if(Q.compressedSize!==f){var i="compressed/uncompressed size mismatch for stored file: "+Q.compressedSize+" != "+Q.uncompressedSize;return A0(n,Error(i))}}if(n.decodeStrings){if(!n.strictFileNames)Q.fileName=Q.fileName.replace(/\\/g,"/");var d=Q9(Q.fileName,n.validateFileNameOptions);if(d!=null)return A0(n,Error(d))}if(n.emit("entry",Q),!n.lazyEntries)n._readEntry()})})};On.prototype.openReadStream=function(n,q,H){var Q=this,X=0,J=n.compressedSize;if(H==null)H=q,q={};else{if(q.decrypt!=null){if(!n.isEncrypted())throw Error("options.decrypt can only be specified for encrypted entries");if(q.decrypt!==!1)throw Error("invalid options.decrypt value: "+q.decrypt);if(n.isCompressed()){if(q.decompress!==!1)throw Error("entry is encrypted and compressed, and options.decompress !== false")}}if(q.decompress!=null){if(!n.isCompressed())throw Error("options.decompress can only be specified for compressed entries");if(!(q.decompress===!1||q.decompress===!0))throw Error("invalid options.decompress value: "+q.decompress)}if(q.start!=null||q.end!=null){if(n.isCompressed()&&q.decompress!==!1)throw Error("start/end range not allowed for compressed entry without options.decompress === false");if(n.isEncrypted()&&q.decrypt!==!1)throw Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(q.start!=null){if(X=q.start,X<0)throw Error("options.start < 0");if(X>n.compressedSize)throw Error("options.start > entry.compressedSize")}if(q.end!=null){if(J=q.end,J<0)throw Error("options.end < 0");if(J>n.compressedSize)throw Error("options.end > entry.compressedSize");if(J<X)throw Error("options.end < options.start")}}if(!Q.isOpen)return H(Error("closed"));if(n.isEncrypted()){if(q.decrypt!==!1)return H(Error("entry is encrypted, and options.decrypt !== false"))}Q.reader.ref();var w=g0(30);Y1(Q.reader,w,0,w.length,n.relativeOffsetOfLocalHeader,function(W){try{if(W)return H(W);var x=w.readUInt32LE(0);if(x!==67324752)return H(Error("invalid local file header signature: 0x"+x.toString(16)));var Y=w.readUInt16LE(26),_=w.readUInt16LE(28),G=n.relativeOffsetOfLocalHeader+w.length+Y+_,O;if(n.compressionMethod===0)O=!1;else if(n.compressionMethod===8)O=q.decompress!=null?q.decompress:!0;else return H(Error("unsupported compression method: "+n.compressionMethod));var M=G,A=M+n.compressedSize;if(n.compressedSize!==0){if(A>Q.fileSize)return H(Error("file data overflows file bounds: "+M+" + "+n.compressedSize+" > "+Q.fileSize))}var L=Q.reader.createReadStream({start:M+X,end:M+J}),N=L;if(O){var m=!1,Z=NJ.createInflateRaw();if(L.on("error",function(f){setImmediate(function(){if(!m)Z.emit("error",f)})}),L.pipe(Z),Q.validateEntrySizes)N=new Z1(n.uncompressedSize),Z.on("error",function(f){setImmediate(function(){if(!m)N.emit("error",f)})}),Z.pipe(N);else N=Z;N.destroy=function(){if(m=!0,Z!==N)Z.unpipe(N);L.unpipe(Z),L.destroy()}}H(null,N)}finally{Q.reader.unref()}})};function y1(){}y1.prototype.getLastModDate=function(){return H9(this.lastModFileDate,this.lastModFileTime)};y1.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};y1.prototype.isCompressed=function(){return this.compressionMethod===8};function H9(n,q){var H=n&31,Q=(n>>5&15)-1,X=(n>>9&127)+1980,J=0,w=(q&31)*2,W=q>>5&63,x=q>>11&31;return new Date(X,Q,H,x,W,w,J)}function Q9(n){if(n.indexOf("\\")!==-1)return"invalid characters in fileName: "+n;if(/^[a-zA-Z]:/.test(n)||/^\//.test(n))return"absolute path: "+n;if(n.split("/").indexOf("..")!==-1)return"invalid relative path: "+n;return null}function Y1(n,q,H,Q,X,J){if(Q===0)return setImmediate(function(){J(null,g0(0))});n.read(q,H,Q,X,function(w,W){if(w)return J(w);if(W<Q)return J(Error("unexpected EOF"));J()})}p2.inherits(Z1,n9);function Z1(n){n9.call(this),this.actualByteCount=0,this.expectedByteCount=n}Z1.prototype._transform=function(n,q,H){if(this.actualByteCount+=n.length,this.actualByteCount>this.expectedByteCount){var Q="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return H(Error(Q))}H(null,n)};Z1.prototype._flush=function(n){if(this.actualByteCount<this.expectedByteCount){var q="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return n(Error(q))}n()};p2.inherits(Vn,g2);function Vn(){g2.call(this),this.refCount=0}Vn.prototype.ref=function(){this.refCount+=1};Vn.prototype.unref=function(){var n=this;if(n.refCount-=1,n.refCount>0)return;if(n.refCount<0)throw Error("invalid unref");n.close(q);function q(H){if(H)return n.emit("error",H);n.emit("close")}};Vn.prototype.createReadStream=function(n){var{start:q,end:H}=n;if(q===H){var Q=new e6;return setImmediate(function(){Q.end()}),Q}var X=this._readStreamForRange(q,H),J=!1,w=new i2(this);X.on("error",function(x){setImmediate(function(){if(!J)w.emit("error",x)})}),w.destroy=function(){X.unpipe(w),w.unref(),X.destroy()};var W=new Z1(H-q);return w.on("error",function(x){setImmediate(function(){if(!J)W.emit("error",x)})}),W.destroy=function(){J=!0,w.unpipe(W),w.destroy()},X.pipe(w).pipe(W)};Vn.prototype._readStreamForRange=function(n,q){throw Error("not implemented")};Vn.prototype.read=function(n,q,H,Q,X){var J=this.createReadStream({start:Q,end:Q+H}),w=new CJ,W=0;w._write=function(x,Y,_){x.copy(n,q+W,0,x.length),W+=x.length,_()},w.on("finish",X),J.on("error",function(x){X(x)}),J.pipe(w)};Vn.prototype.close=function(n){setImmediate(n)};p2.inherits(i2,e6);function i2(n){e6.call(this),this.context=n,this.context.ref(),this.unreffedYet=!1}i2.prototype._flush=function(n){this.unref(),n()};i2.prototype.unref=function(n){if(this.unreffedYet)return;this.unreffedYet=!0,this.context.unref()};var FJ="\x00☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function y2(n,q,H,Q){if(Q)return n.toString("utf8",q,H);else{var X="";for(var J=q;J<H;J++)X+=FJ[n[J]];return X}}function _1(n,q){var H=n.readUInt32LE(q),Q=n.readUInt32LE(q+4);return Q*4294967296+H}var g0;if(typeof Buffer.allocUnsafe==="function")g0=function(n){return Buffer.allocUnsafe(n)};else g0=function(n){return new Buffer(n)};function Z2(n){if(n)throw n}});var W9=H0((qK,w9)=>{var U0=E5()("extract-zip"),{createWriteStream:yJ,promises:G1}=a("fs"),ZJ=o5(),Pn=a("path"),{promisify:n4}=a("util"),pJ=a("stream"),gJ=X9(),iJ=n4(gJ.open),oJ=n4(pJ.pipeline);class J9{constructor(n,q){this.zipPath=n,this.opts=q}async extract(){return U0("opening",this.zipPath,"with opts",this.opts),this.zipfile=await iJ(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((n,q)=>{this.zipfile.on("error",(H)=>{this.canceled=!0,q(H)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{if(!this.canceled)U0("zip extraction complete"),n()}),this.zipfile.on("entry",async(H)=>{if(this.canceled){U0("skipping entry",H.fileName,{cancelled:this.canceled});return}if(U0("zipfile entry",H.fileName),H.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let Q=Pn.dirname(Pn.join(this.opts.dir,H.fileName));try{await G1.mkdir(Q,{recursive:!0});let X=await G1.realpath(Q);if(Pn.relative(this.opts.dir,X).split(Pn.sep).includes(".."))throw Error(`Out of bound path "${X}" found while processing file ${H.fileName}`);await this.extractEntry(H),U0("finished processing",H.fileName),this.zipfile.readEntry()}catch(X){this.canceled=!0,this.zipfile.close(),q(X)}})})}async extractEntry(n){if(this.canceled){U0("skipping entry extraction",n.fileName,{cancelled:this.canceled});return}if(this.opts.onEntry)this.opts.onEntry(n,this.zipfile);let q=Pn.join(this.opts.dir,n.fileName),H=n.externalFileAttributes>>16&65535,Q=61440,X=16384,J=40960,w=(H&Q)===J,W=(H&Q)===X;if(!W&&n.fileName.endsWith("/"))W=!0;let x=n.versionMadeBy>>8;if(!W)W=x===0&&n.externalFileAttributes===16;U0("extracting entry",{filename:n.fileName,isDir:W,isSymlink:w});let Y=this.getExtractedMode(H,W)&511,_=W?q:Pn.dirname(q),G={recursive:!0};if(W)G.mode=Y;if(U0("mkdir",{dir:_,...G}),await G1.mkdir(_,G),W)return;U0("opening read stream",q);let O=await n4(this.zipfile.openReadStream.bind(this.zipfile))(n);if(w){let M=await ZJ(O);U0("creating symlink",M,q),await G1.symlink(M,q)}else await oJ(O,yJ(q,{mode:Y}))}getExtractedMode(n,q){let H=n;if(H===0)if(q){if(this.opts.defaultDirMode)H=parseInt(this.opts.defaultDirMode,10);if(!H)H=493}else{if(this.opts.defaultFileMode)H=parseInt(this.opts.defaultFileMode,10);if(!H)H=420}return H}}w9.exports=async function(n,q){if(U0("creating target directory",q.dir),!Pn.isAbsolute(q.dir))throw Error("Target directory is expected to be absolute");return await G1.mkdir(q.dir,{recursive:!0}),q.dir=await G1.realpath(q.dir),new J9(n,q).extract()}});var Vq={};p4(Vq,{rollbackFromLatestBackup:()=>k4,listBackups:()=>R1,backupCurrentBinary:()=>b4,BACKUP_DIR:()=>Mn});import{copyFile as Gq,readdir as Ux,unlink as Fx,mkdir as mx,rename as Ex}from"node:fs/promises";import{existsSync as Px}from"node:fs";import{homedir as Sx}from"node:os";import{join as J6,basename as bx}from"node:path";async function Oq(){if(!Px(Mn))await mx(Mn,{recursive:!0})}async function b4(){await Oq();let n=process.execPath,q=new Date().toISOString().replace(/[:.]/g,"-"),H=`${bx(n)}-${u}-${q}`,Q=J6(Mn,H);return await Gq(n,Q),await hx(),Q}async function R1(){return await Oq(),(await Ux(Mn)).filter((H)=>H.startsWith("yunke")).map((H)=>J6(Mn,H)).sort().reverse()}async function k4(){let n=await R1();if(n.length===0)return null;let q=n[0],H=process.execPath,Q=`${H}.rollback`;return await Gq(q,Q),await Ex(Q,H),q}async function hx(){let q=(await R1()).slice(kx);for(let H of q)try{await Fx(H)}catch{}}var Mn,kx=3;var w6=g4(()=>{K0();Mn=J6(process.env.YUNKE_CONFIG_DIR??J6(Sx(),".yunke"),"backups")});class K extends Error{code;details;constructor(n,q,H){super(q);this.code=n;this.details=H;this.name="YunkeError"}}class on extends K{constructor(n){super("COMMAND_NOT_FOUND",`Command '${n}' not found. Use 'yunke schema' to list available commands.`);this.name="CommandNotFoundError"}}class V6 extends K{constructor(n,q){super("VALIDATION_FAILED",n,q);this.name="ValidationError"}}class H2 extends K{constructor(n,q){super("EXECUTION_FAILED",n,q);this.name="ExecutionError"}}class Q2 extends K{constructor(n,q,H){super("PLUGIN_LOAD_FAILED",`Failed to load plugin '${n}': ${q}`,H);this.name="PluginLoadError"}}class v6 extends K{constructor(n,q,H){super("PLUGIN_CONFLICT",`Command '${n}' already registered by plugin '${q}', cannot register from '${H}'`);this.name="PluginConflictError"}}class X2 extends K{constructor(n,q){super("TIMEOUT",`Command '${n}' timed out after ${q}ms`);this.name="TimeoutError"}}class jn{commands;constructor(n=new Map){this.commands=n}register(n){if(this.commands.has(n.name)){let H=this.commands.get(n.name);throw new v6(n.name,H.pluginName,n.pluginName)}let q=new Map(this.commands);return q.set(n.name,n),new jn(q)}unregister(n){if(!this.commands.has(n))return this;let q=new Map(this.commands);return q.delete(n),new jn(q)}get(n){return this.commands.get(n)}getAll(){return Array.from(this.commands.values())}getAllVisible(){return this.getAll().filter((n)=>!n.hidden)}getByPlugin(n){return this.getAll().filter((q)=>q.pluginName===n)}has(n){return this.commands.has(n)}get size(){return this.commands.size}}function i4(n,q,H){return{command:n,duration_ms:H,timestamp:new Date().toISOString(),plugin:q}}function o4(n,q,H,Q){return{success:!0,data:H,error:null,metadata:i4(n,q,Q)}}function $n(n,q,H,Q){return{success:!1,data:null,error:{code:H instanceof K?H.code:"EXECUTION_FAILED",message:H instanceof Error?H.message:String(H),details:H instanceof K?H.details:void 0},metadata:i4(n,q,Q)}}import{appendFileSync as iq,mkdirSync as oq,renameSync as f4,statSync as fq,unlinkSync as l4}from"node:fs";import{homedir as lq}from"node:os";import{join as K6}from"node:path";var cq=1048576,dq=3,zq=5,tq=200,rq=1000,aq=500;function eq(n=process.env.YUNKE_LOG_LEVEL){let q=(n??"").trim().toLowerCase();return q==="off"||q==="error"?q:"info"}function w2(){let n=process.env.YUNKE_CONFIG_DIR??K6(process.env.YUNKE_HOME_OVERRIDE??lq(),".yunke");return K6(n,"logs")}var sq=["token","password","passwd","pwd","secret","jwt","smscode","verifycode","captcha","authorization","apikey","cookie","session","credential","privatekey"];function fn(n){let q=n.toLowerCase().replace(/[^a-z0-9]/g,"");return sq.some((H)=>q.includes(H))}function M6(n,q){return n.length>q?n.slice(0,q)+"...[truncated]":n}function B6(n,q=0){if(q>zq)return"[max-depth]";if(n===null||n===void 0)return n;if(typeof n==="string")return M6(n,tq);if(typeof n==="number"||typeof n==="boolean")return n;if(Array.isArray(n))return n.map((H)=>B6(H,q+1));if(typeof n==="object"){let H={};for(let[Q,X]of Object.entries(n))H[Q]=fn(Q)?"[REDACTED]":B6(X,q+1);return H}return String(n)}var nH=/(?<!\d)(1[3-9]\d{9})(?!\d)/g;function j6(n){return n.replace(nH,(q)=>`${q.slice(0,3)}****${q.slice(-4)}`)}function $H(n){if(!n||Object.keys(n).length===0)return"";let q;try{q=JSON.stringify(B6(n))??""}catch{return"[unserializable]"}return q=j6(q),M6(q,rq)}function J2(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\r?\n/g,"\\n")}"`}function qH(n,q){try{if(fq(n).size<=q)return}catch{return}for(let H=dq-1;H>=1;H--){let Q=`${n}.${H+1}`;try{l4(Q)}catch{}try{f4(`${n}.${H}`,Q)}catch{}}try{l4(`${n}.1`)}catch{}try{f4(n,`${n}.1`)}catch{}}function D1(n,q,H,Q){try{let X=eq();if(X==="off")return;if(X==="error"&&q!=="error")return;let J=w2();oq(J,{recursive:!0});let w=K6(J,n);qH(w,Q?.maxBytes??cq),iq(w,`${new Date().toISOString()} [${q.toUpperCase()}] ${H.replace(/\r?\n/g,"\\n")}
7
+ `,"utf-8")}catch{}}function W2(n){let{parsed:q,output:H}=n,Q=H.metadata,X=[`cmd=${J2(Q.command)}`,`plugin=${J2(Q.plugin)}`,`success=${H.success}`,`duration_ms=${Q.duration_ms}`];if(!H.success&&H.error)X.push(`code=${J2(H.error.code)}`,`msg=${J2(M6(H.error.message,aq))}`);let J=$H(q.args);if(J)X.push(`args=${J}`);D1("cli.log",H.success?"info":"error",X.join(" "))}var $={};p4($,{void:()=>pH,util:()=>I,unknown:()=>yH,union:()=>fH,undefined:()=>TH,tuple:()=>dH,transformer:()=>HQ,symbol:()=>hH,string:()=>n8,strictObject:()=>oH,setErrorMap:()=>XH,set:()=>rH,record:()=>zH,quotelessJson:()=>HH,promise:()=>qQ,preprocess:()=>JQ,pipeline:()=>wQ,ostring:()=>WQ,optional:()=>QQ,onumber:()=>xQ,oboolean:()=>YQ,objectUtil:()=>L6,object:()=>iH,number:()=>$8,nullable:()=>XQ,null:()=>IH,never:()=>ZH,nativeEnum:()=>$Q,nan:()=>SH,map:()=>tH,makeIssue:()=>C1,literal:()=>sH,lazy:()=>eH,late:()=>EH,isValid:()=>qn,isDirty:()=>Y2,isAsync:()=>cn,isAborted:()=>x2,intersection:()=>cH,instanceof:()=>PH,getParsedType:()=>I0,getErrorMap:()=>ln,function:()=>aH,enum:()=>nQ,effect:()=>HQ,discriminatedUnion:()=>lH,defaultErrorMap:()=>f0,datetimeRegex:()=>a4,date:()=>kH,custom:()=>s4,coerce:()=>_Q,boolean:()=>q8,bigint:()=>bH,array:()=>gH,any:()=>uH,addIssueToContext:()=>j,ZodVoid:()=>U1,ZodUnknown:()=>Hn,ZodUnion:()=>en,ZodUndefined:()=>rn,ZodType:()=>T,ZodTuple:()=>y0,ZodTransformer:()=>N0,ZodSymbol:()=>A1,ZodString:()=>_0,ZodSet:()=>Dn,ZodSchema:()=>T,ZodRecord:()=>F1,ZodReadonly:()=>Q1,ZodPromise:()=>Cn,ZodPipeline:()=>P1,ZodParsedType:()=>B,ZodOptional:()=>G0,ZodObject:()=>c,ZodNumber:()=>Qn,ZodNullable:()=>c0,ZodNull:()=>an,ZodNever:()=>u0,ZodNativeEnum:()=>q1,ZodNaN:()=>E1,ZodMap:()=>m1,ZodLiteral:()=>$1,ZodLazy:()=>n1,ZodIssueCode:()=>V,ZodIntersection:()=>sn,ZodFunction:()=>zn,ZodFirstPartyTypeKind:()=>v,ZodError:()=>W0,ZodEnum:()=>Jn,ZodEffects:()=>N0,ZodDiscriminatedUnion:()=>_2,ZodDefault:()=>wn,ZodDate:()=>Rn,ZodCatch:()=>H1,ZodBranded:()=>G2,ZodBoolean:()=>tn,ZodBigInt:()=>Xn,ZodArray:()=>L0,ZodAny:()=>Nn,Schema:()=>T,ParseStatus:()=>n0,OK:()=>Q0,NEVER:()=>GQ,INVALID:()=>U,EMPTY_PATH:()=>JH,DIRTY:()=>Ln,BRAND:()=>mH});var I;(function(n){n.assertEqual=(X)=>{};function q(X){}n.assertIs=q;function H(X){throw Error()}n.assertNever=H,n.arrayToEnum=(X)=>{let J={};for(let w of X)J[w]=w;return J},n.getValidEnumValues=(X)=>{let J=n.objectKeys(X).filter((W)=>typeof X[X[W]]!=="number"),w={};for(let W of J)w[W]=X[W];return n.objectValues(w)},n.objectValues=(X)=>{return n.objectKeys(X).map(function(J){return X[J]})},n.objectKeys=typeof Object.keys==="function"?(X)=>Object.keys(X):(X)=>{let J=[];for(let w in X)if(Object.prototype.hasOwnProperty.call(X,w))J.push(w);return J},n.find=(X,J)=>{for(let w of X)if(J(w))return w;return},n.isInteger=typeof Number.isInteger==="function"?(X)=>Number.isInteger(X):(X)=>typeof X==="number"&&Number.isFinite(X)&&Math.floor(X)===X;function Q(X,J=" | "){return X.map((w)=>typeof w==="string"?`'${w}'`:w).join(J)}n.joinValues=Q,n.jsonStringifyReplacer=(X,J)=>{if(typeof J==="bigint")return J.toString();return J}})(I||(I={}));var L6;(function(n){n.mergeShapes=(q,H)=>{return{...q,...H}}})(L6||(L6={}));var B=I.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),I0=(n)=>{switch(typeof n){case"undefined":return B.undefined;case"string":return B.string;case"number":return Number.isNaN(n)?B.nan:B.number;case"boolean":return B.boolean;case"function":return B.function;case"bigint":return B.bigint;case"symbol":return B.symbol;case"object":if(Array.isArray(n))return B.array;if(n===null)return B.null;if(n.then&&typeof n.then==="function"&&n.catch&&typeof n.catch==="function")return B.promise;if(typeof Map<"u"&&n instanceof Map)return B.map;if(typeof Set<"u"&&n instanceof Set)return B.set;if(typeof Date<"u"&&n instanceof Date)return B.date;return B.object;default:return B.unknown}};var V=I.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),HH=(n)=>{return JSON.stringify(n,null,2).replace(/"([^"]+)":/g,"$1:")};class W0 extends Error{get errors(){return this.issues}constructor(n){super();this.issues=[],this.addIssue=(H)=>{this.issues=[...this.issues,H]},this.addIssues=(H=[])=>{this.issues=[...this.issues,...H]};let q=new.target.prototype;if(Object.setPrototypeOf)Object.setPrototypeOf(this,q);else this.__proto__=q;this.name="ZodError",this.issues=n}format(n){let q=n||function(X){return X.message},H={_errors:[]},Q=(X)=>{for(let J of X.issues)if(J.code==="invalid_union")J.unionErrors.map(Q);else if(J.code==="invalid_return_type")Q(J.returnTypeError);else if(J.code==="invalid_arguments")Q(J.argumentsError);else if(J.path.length===0)H._errors.push(q(J));else{let w=H,W=0;while(W<J.path.length){let x=J.path[W];if(W!==J.path.length-1)w[x]=w[x]||{_errors:[]};else w[x]=w[x]||{_errors:[]},w[x]._errors.push(q(J));w=w[x],W++}}};return Q(this),H}static assert(n){if(!(n instanceof W0))throw Error(`Not a ZodError: ${n}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,I.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(n=(q)=>q.message){let q={},H=[];for(let Q of this.issues)if(Q.path.length>0){let X=Q.path[0];q[X]=q[X]||[],q[X].push(n(Q))}else H.push(n(Q));return{formErrors:H,fieldErrors:q}}get formErrors(){return this.flatten()}}W0.create=(n)=>{return new W0(n)};var QH=(n,q)=>{let H;switch(n.code){case V.invalid_type:if(n.received===B.undefined)H="Required";else H=`Expected ${n.expected}, received ${n.received}`;break;case V.invalid_literal:H=`Invalid literal value, expected ${JSON.stringify(n.expected,I.jsonStringifyReplacer)}`;break;case V.unrecognized_keys:H=`Unrecognized key(s) in object: ${I.joinValues(n.keys,", ")}`;break;case V.invalid_union:H="Invalid input";break;case V.invalid_union_discriminator:H=`Invalid discriminator value. Expected ${I.joinValues(n.options)}`;break;case V.invalid_enum_value:H=`Invalid enum value. Expected ${I.joinValues(n.options)}, received '${n.received}'`;break;case V.invalid_arguments:H="Invalid function arguments";break;case V.invalid_return_type:H="Invalid function return type";break;case V.invalid_date:H="Invalid date";break;case V.invalid_string:if(typeof n.validation==="object")if("includes"in n.validation){if(H=`Invalid input: must include "${n.validation.includes}"`,typeof n.validation.position==="number")H=`${H} at one or more positions greater than or equal to ${n.validation.position}`}else if("startsWith"in n.validation)H=`Invalid input: must start with "${n.validation.startsWith}"`;else if("endsWith"in n.validation)H=`Invalid input: must end with "${n.validation.endsWith}"`;else I.assertNever(n.validation);else if(n.validation!=="regex")H=`Invalid ${n.validation}`;else H="Invalid";break;case V.too_small:if(n.type==="array")H=`Array must contain ${n.exact?"exactly":n.inclusive?"at least":"more than"} ${n.minimum} element(s)`;else if(n.type==="string")H=`String must contain ${n.exact?"exactly":n.inclusive?"at least":"over"} ${n.minimum} character(s)`;else if(n.type==="number")H=`Number must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${n.minimum}`;else if(n.type==="bigint")H=`Number must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${n.minimum}`;else if(n.type==="date")H=`Date must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(n.minimum))}`;else H="Invalid input";break;case V.too_big:if(n.type==="array")H=`Array must contain ${n.exact?"exactly":n.inclusive?"at most":"less than"} ${n.maximum} element(s)`;else if(n.type==="string")H=`String must contain ${n.exact?"exactly":n.inclusive?"at most":"under"} ${n.maximum} character(s)`;else if(n.type==="number")H=`Number must be ${n.exact?"exactly":n.inclusive?"less than or equal to":"less than"} ${n.maximum}`;else if(n.type==="bigint")H=`BigInt must be ${n.exact?"exactly":n.inclusive?"less than or equal to":"less than"} ${n.maximum}`;else if(n.type==="date")H=`Date must be ${n.exact?"exactly":n.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(n.maximum))}`;else H="Invalid input";break;case V.custom:H="Invalid input";break;case V.invalid_intersection_types:H="Intersection results could not be merged";break;case V.not_multiple_of:H=`Number must be a multiple of ${n.multipleOf}`;break;case V.not_finite:H="Number must be finite";break;default:H=q.defaultError,I.assertNever(n)}return{message:H}},f0=QH;var c4=f0;function XH(n){c4=n}function ln(){return c4}var C1=(n)=>{let{data:q,path:H,errorMaps:Q,issueData:X}=n,J=[...H,...X.path||[]],w={...X,path:J};if(X.message!==void 0)return{...X,path:J,message:X.message};let W="",x=Q.filter((Y)=>!!Y).slice().reverse();for(let Y of x)W=Y(w,{data:q,defaultError:W}).message;return{...X,path:J,message:W}},JH=[];function j(n,q){let H=ln(),Q=C1({issueData:q,data:n.data,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,H,H===f0?void 0:f0].filter((X)=>!!X)});n.common.issues.push(Q)}class n0{constructor(){this.value="valid"}dirty(){if(this.value==="valid")this.value="dirty"}abort(){if(this.value!=="aborted")this.value="aborted"}static mergeArray(n,q){let H=[];for(let Q of q){if(Q.status==="aborted")return U;if(Q.status==="dirty")n.dirty();H.push(Q.value)}return{status:n.value,value:H}}static async mergeObjectAsync(n,q){let H=[];for(let Q of q){let X=await Q.key,J=await Q.value;H.push({key:X,value:J})}return n0.mergeObjectSync(n,H)}static mergeObjectSync(n,q){let H={};for(let Q of q){let{key:X,value:J}=Q;if(X.status==="aborted")return U;if(J.status==="aborted")return U;if(X.status==="dirty")n.dirty();if(J.status==="dirty")n.dirty();if(X.value!=="__proto__"&&(typeof J.value<"u"||Q.alwaysSet))H[X.value]=J.value}return{status:n.value,value:H}}}var U=Object.freeze({status:"aborted"}),Ln=(n)=>({status:"dirty",value:n}),Q0=(n)=>({status:"valid",value:n}),x2=(n)=>n.status==="aborted",Y2=(n)=>n.status==="dirty",qn=(n)=>n.status==="valid",cn=(n)=>typeof Promise<"u"&&n instanceof Promise;var C;(function(n){n.errToObj=(q)=>typeof q==="string"?{message:q}:q||{},n.toString=(q)=>typeof q==="string"?q:q?.message})(C||(C={}));class R0{constructor(n,q,H,Q){this._cachedPath=[],this.parent=n,this.data=q,this._path=H,this._key=Q}get path(){if(!this._cachedPath.length)if(Array.isArray(this._key))this._cachedPath.push(...this._path,...this._key);else this._cachedPath.push(...this._path,this._key);return this._cachedPath}}var d4=(n,q)=>{if(qn(q))return{success:!0,data:q.value};else{if(!n.common.issues.length)throw Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let H=new W0(n.common.issues);return this._error=H,this._error}}}};function E(n){if(!n)return{};let{errorMap:q,invalid_type_error:H,required_error:Q,description:X}=n;if(q&&(H||Q))throw Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);if(q)return{errorMap:q,description:X};return{errorMap:(w,W)=>{let{message:x}=n;if(w.code==="invalid_enum_value")return{message:x??W.defaultError};if(typeof W.data>"u")return{message:x??Q??W.defaultError};if(w.code!=="invalid_type")return{message:W.defaultError};return{message:x??H??W.defaultError}},description:X}}class T{get description(){return this._def.description}_getType(n){return I0(n.data)}_getOrReturnCtx(n,q){return q||{common:n.parent.common,data:n.data,parsedType:I0(n.data),schemaErrorMap:this._def.errorMap,path:n.path,parent:n.parent}}_processInputParams(n){return{status:new n0,ctx:{common:n.parent.common,data:n.data,parsedType:I0(n.data),schemaErrorMap:this._def.errorMap,path:n.path,parent:n.parent}}}_parseSync(n){let q=this._parse(n);if(cn(q))throw Error("Synchronous parse encountered promise.");return q}_parseAsync(n){let q=this._parse(n);return Promise.resolve(q)}parse(n,q){let H=this.safeParse(n,q);if(H.success)return H.data;throw H.error}safeParse(n,q){let H={common:{issues:[],async:q?.async??!1,contextualErrorMap:q?.errorMap},path:q?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:I0(n)},Q=this._parseSync({data:n,path:H.path,parent:H});return d4(H,Q)}"~validate"(n){let q={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:I0(n)};if(!this["~standard"].async)try{let H=this._parseSync({data:n,path:[],parent:q});return qn(H)?{value:H.value}:{issues:q.common.issues}}catch(H){if(H?.message?.toLowerCase()?.includes("encountered"))this["~standard"].async=!0;q.common={issues:[],async:!0}}return this._parseAsync({data:n,path:[],parent:q}).then((H)=>qn(H)?{value:H.value}:{issues:q.common.issues})}async parseAsync(n,q){let H=await this.safeParseAsync(n,q);if(H.success)return H.data;throw H.error}async safeParseAsync(n,q){let H={common:{issues:[],contextualErrorMap:q?.errorMap,async:!0},path:q?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:I0(n)},Q=this._parse({data:n,path:H.path,parent:H}),X=await(cn(Q)?Q:Promise.resolve(Q));return d4(H,X)}refine(n,q){let H=(Q)=>{if(typeof q==="string"||typeof q>"u")return{message:q};else if(typeof q==="function")return q(Q);else return q};return this._refinement((Q,X)=>{let J=n(Q),w=()=>X.addIssue({code:V.custom,...H(Q)});if(typeof Promise<"u"&&J instanceof Promise)return J.then((W)=>{if(!W)return w(),!1;else return!0});if(!J)return w(),!1;else return!0})}refinement(n,q){return this._refinement((H,Q)=>{if(!n(H))return Q.addIssue(typeof q==="function"?q(H,Q):q),!1;else return!0})}_refinement(n){return new N0({schema:this,typeName:v.ZodEffects,effect:{type:"refinement",refinement:n}})}superRefine(n){return this._refinement(n)}constructor(n){this.spa=this.safeParseAsync,this._def=n,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:(q)=>this["~validate"](q)}}optional(){return G0.create(this,this._def)}nullable(){return c0.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return L0.create(this)}promise(){return Cn.create(this,this._def)}or(n){return en.create([this,n],this._def)}and(n){return sn.create(this,n,this._def)}transform(n){return new N0({...E(this._def),schema:this,typeName:v.ZodEffects,effect:{type:"transform",transform:n}})}default(n){let q=typeof n==="function"?n:()=>n;return new wn({...E(this._def),innerType:this,defaultValue:q,typeName:v.ZodDefault})}brand(){return new G2({typeName:v.ZodBranded,type:this,...E(this._def)})}catch(n){let q=typeof n==="function"?n:()=>n;return new H1({...E(this._def),innerType:this,catchValue:q,typeName:v.ZodCatch})}describe(n){return new this.constructor({...this._def,description:n})}pipe(n){return P1.create(this,n)}readonly(){return Q1.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}var wH=/^c[^\s-]{8,}$/i,WH=/^[0-9a-z]+$/,xH=/^[0-9A-HJKMNP-TV-Z]{26}$/i,YH=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,_H=/^[a-z0-9_-]{21}$/i,GH=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,OH=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,VH=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,vH="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",R6,KH=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,BH=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,MH=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,jH=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,LH=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,RH=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,t4="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",NH=new RegExp(`^${t4}$`);function r4(n){let q="[0-5]\\d";if(n.precision)q=`${q}\\.\\d{${n.precision}}`;else if(n.precision==null)q=`${q}(\\.\\d+)?`;let H=n.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${q})${H}`}function DH(n){return new RegExp(`^${r4(n)}$`)}function a4(n){let q=`${t4}T${r4(n)}`,H=[];if(H.push(n.local?"Z?":"Z"),n.offset)H.push("([+-]\\d{2}:?\\d{2})");return q=`${q}(${H.join("|")})`,new RegExp(`^${q}$`)}function CH(n,q){if((q==="v4"||!q)&&KH.test(n))return!0;if((q==="v6"||!q)&&MH.test(n))return!0;return!1}function AH(n,q){if(!GH.test(n))return!1;try{let[H]=n.split(".");if(!H)return!1;let Q=H.replace(/-/g,"+").replace(/_/g,"/").padEnd(H.length+(4-H.length%4)%4,"="),X=JSON.parse(atob(Q));if(typeof X!=="object"||X===null)return!1;if("typ"in X&&X?.typ!=="JWT")return!1;if(!X.alg)return!1;if(q&&X.alg!==q)return!1;return!0}catch{return!1}}function UH(n,q){if((q==="v4"||!q)&&BH.test(n))return!0;if((q==="v6"||!q)&&jH.test(n))return!0;return!1}class _0 extends T{_parse(n){if(this._def.coerce)n.data=String(n.data);if(this._getType(n)!==B.string){let X=this._getOrReturnCtx(n);return j(X,{code:V.invalid_type,expected:B.string,received:X.parsedType}),U}let H=new n0,Q=void 0;for(let X of this._def.checks)if(X.kind==="min"){if(n.data.length<X.value)Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.too_small,minimum:X.value,type:"string",inclusive:!0,exact:!1,message:X.message}),H.dirty()}else if(X.kind==="max"){if(n.data.length>X.value)Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.too_big,maximum:X.value,type:"string",inclusive:!0,exact:!1,message:X.message}),H.dirty()}else if(X.kind==="length"){let J=n.data.length>X.value,w=n.data.length<X.value;if(J||w){if(Q=this._getOrReturnCtx(n,Q),J)j(Q,{code:V.too_big,maximum:X.value,type:"string",inclusive:!0,exact:!0,message:X.message});else if(w)j(Q,{code:V.too_small,minimum:X.value,type:"string",inclusive:!0,exact:!0,message:X.message});H.dirty()}}else if(X.kind==="email"){if(!VH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"email",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="emoji"){if(!R6)R6=new RegExp(vH,"u");if(!R6.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"emoji",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="uuid"){if(!YH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"uuid",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="nanoid"){if(!_H.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"nanoid",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="cuid"){if(!wH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"cuid",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="cuid2"){if(!WH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"cuid2",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="ulid"){if(!xH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"ulid",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="url")try{new URL(n.data)}catch{Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"url",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="regex"){if(X.regex.lastIndex=0,!X.regex.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"regex",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="trim")n.data=n.data.trim();else if(X.kind==="includes"){if(!n.data.includes(X.value,X.position))Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.invalid_string,validation:{includes:X.value,position:X.position},message:X.message}),H.dirty()}else if(X.kind==="toLowerCase")n.data=n.data.toLowerCase();else if(X.kind==="toUpperCase")n.data=n.data.toUpperCase();else if(X.kind==="startsWith"){if(!n.data.startsWith(X.value))Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.invalid_string,validation:{startsWith:X.value},message:X.message}),H.dirty()}else if(X.kind==="endsWith"){if(!n.data.endsWith(X.value))Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.invalid_string,validation:{endsWith:X.value},message:X.message}),H.dirty()}else if(X.kind==="datetime"){if(!a4(X).test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.invalid_string,validation:"datetime",message:X.message}),H.dirty()}else if(X.kind==="date"){if(!NH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.invalid_string,validation:"date",message:X.message}),H.dirty()}else if(X.kind==="time"){if(!DH(X).test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.invalid_string,validation:"time",message:X.message}),H.dirty()}else if(X.kind==="duration"){if(!OH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"duration",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="ip"){if(!CH(n.data,X.version))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"ip",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="jwt"){if(!AH(n.data,X.alg))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"jwt",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="cidr"){if(!UH(n.data,X.version))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"cidr",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="base64"){if(!LH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"base64",code:V.invalid_string,message:X.message}),H.dirty()}else if(X.kind==="base64url"){if(!RH.test(n.data))Q=this._getOrReturnCtx(n,Q),j(Q,{validation:"base64url",code:V.invalid_string,message:X.message}),H.dirty()}else I.assertNever(X);return{status:H.value,value:n.data}}_regex(n,q,H){return this.refinement((Q)=>n.test(Q),{validation:q,code:V.invalid_string,...C.errToObj(H)})}_addCheck(n){return new _0({...this._def,checks:[...this._def.checks,n]})}email(n){return this._addCheck({kind:"email",...C.errToObj(n)})}url(n){return this._addCheck({kind:"url",...C.errToObj(n)})}emoji(n){return this._addCheck({kind:"emoji",...C.errToObj(n)})}uuid(n){return this._addCheck({kind:"uuid",...C.errToObj(n)})}nanoid(n){return this._addCheck({kind:"nanoid",...C.errToObj(n)})}cuid(n){return this._addCheck({kind:"cuid",...C.errToObj(n)})}cuid2(n){return this._addCheck({kind:"cuid2",...C.errToObj(n)})}ulid(n){return this._addCheck({kind:"ulid",...C.errToObj(n)})}base64(n){return this._addCheck({kind:"base64",...C.errToObj(n)})}base64url(n){return this._addCheck({kind:"base64url",...C.errToObj(n)})}jwt(n){return this._addCheck({kind:"jwt",...C.errToObj(n)})}ip(n){return this._addCheck({kind:"ip",...C.errToObj(n)})}cidr(n){return this._addCheck({kind:"cidr",...C.errToObj(n)})}datetime(n){if(typeof n==="string")return this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:n});return this._addCheck({kind:"datetime",precision:typeof n?.precision>"u"?null:n?.precision,offset:n?.offset??!1,local:n?.local??!1,...C.errToObj(n?.message)})}date(n){return this._addCheck({kind:"date",message:n})}time(n){if(typeof n==="string")return this._addCheck({kind:"time",precision:null,message:n});return this._addCheck({kind:"time",precision:typeof n?.precision>"u"?null:n?.precision,...C.errToObj(n?.message)})}duration(n){return this._addCheck({kind:"duration",...C.errToObj(n)})}regex(n,q){return this._addCheck({kind:"regex",regex:n,...C.errToObj(q)})}includes(n,q){return this._addCheck({kind:"includes",value:n,position:q?.position,...C.errToObj(q?.message)})}startsWith(n,q){return this._addCheck({kind:"startsWith",value:n,...C.errToObj(q)})}endsWith(n,q){return this._addCheck({kind:"endsWith",value:n,...C.errToObj(q)})}min(n,q){return this._addCheck({kind:"min",value:n,...C.errToObj(q)})}max(n,q){return this._addCheck({kind:"max",value:n,...C.errToObj(q)})}length(n,q){return this._addCheck({kind:"length",value:n,...C.errToObj(q)})}nonempty(n){return this.min(1,C.errToObj(n))}trim(){return new _0({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _0({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _0({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find((n)=>n.kind==="datetime")}get isDate(){return!!this._def.checks.find((n)=>n.kind==="date")}get isTime(){return!!this._def.checks.find((n)=>n.kind==="time")}get isDuration(){return!!this._def.checks.find((n)=>n.kind==="duration")}get isEmail(){return!!this._def.checks.find((n)=>n.kind==="email")}get isURL(){return!!this._def.checks.find((n)=>n.kind==="url")}get isEmoji(){return!!this._def.checks.find((n)=>n.kind==="emoji")}get isUUID(){return!!this._def.checks.find((n)=>n.kind==="uuid")}get isNANOID(){return!!this._def.checks.find((n)=>n.kind==="nanoid")}get isCUID(){return!!this._def.checks.find((n)=>n.kind==="cuid")}get isCUID2(){return!!this._def.checks.find((n)=>n.kind==="cuid2")}get isULID(){return!!this._def.checks.find((n)=>n.kind==="ulid")}get isIP(){return!!this._def.checks.find((n)=>n.kind==="ip")}get isCIDR(){return!!this._def.checks.find((n)=>n.kind==="cidr")}get isBase64(){return!!this._def.checks.find((n)=>n.kind==="base64")}get isBase64url(){return!!this._def.checks.find((n)=>n.kind==="base64url")}get minLength(){let n=null;for(let q of this._def.checks)if(q.kind==="min"){if(n===null||q.value>n)n=q.value}return n}get maxLength(){let n=null;for(let q of this._def.checks)if(q.kind==="max"){if(n===null||q.value<n)n=q.value}return n}}_0.create=(n)=>{return new _0({checks:[],typeName:v.ZodString,coerce:n?.coerce??!1,...E(n)})};function FH(n,q){let H=(n.toString().split(".")[1]||"").length,Q=(q.toString().split(".")[1]||"").length,X=H>Q?H:Q,J=Number.parseInt(n.toFixed(X).replace(".","")),w=Number.parseInt(q.toFixed(X).replace(".",""));return J%w/10**X}class Qn extends T{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(n){if(this._def.coerce)n.data=Number(n.data);if(this._getType(n)!==B.number){let X=this._getOrReturnCtx(n);return j(X,{code:V.invalid_type,expected:B.number,received:X.parsedType}),U}let H=void 0,Q=new n0;for(let X of this._def.checks)if(X.kind==="int"){if(!I.isInteger(n.data))H=this._getOrReturnCtx(n,H),j(H,{code:V.invalid_type,expected:"integer",received:"float",message:X.message}),Q.dirty()}else if(X.kind==="min"){if(X.inclusive?n.data<X.value:n.data<=X.value)H=this._getOrReturnCtx(n,H),j(H,{code:V.too_small,minimum:X.value,type:"number",inclusive:X.inclusive,exact:!1,message:X.message}),Q.dirty()}else if(X.kind==="max"){if(X.inclusive?n.data>X.value:n.data>=X.value)H=this._getOrReturnCtx(n,H),j(H,{code:V.too_big,maximum:X.value,type:"number",inclusive:X.inclusive,exact:!1,message:X.message}),Q.dirty()}else if(X.kind==="multipleOf"){if(FH(n.data,X.value)!==0)H=this._getOrReturnCtx(n,H),j(H,{code:V.not_multiple_of,multipleOf:X.value,message:X.message}),Q.dirty()}else if(X.kind==="finite"){if(!Number.isFinite(n.data))H=this._getOrReturnCtx(n,H),j(H,{code:V.not_finite,message:X.message}),Q.dirty()}else I.assertNever(X);return{status:Q.value,value:n.data}}gte(n,q){return this.setLimit("min",n,!0,C.toString(q))}gt(n,q){return this.setLimit("min",n,!1,C.toString(q))}lte(n,q){return this.setLimit("max",n,!0,C.toString(q))}lt(n,q){return this.setLimit("max",n,!1,C.toString(q))}setLimit(n,q,H,Q){return new Qn({...this._def,checks:[...this._def.checks,{kind:n,value:q,inclusive:H,message:C.toString(Q)}]})}_addCheck(n){return new Qn({...this._def,checks:[...this._def.checks,n]})}int(n){return this._addCheck({kind:"int",message:C.toString(n)})}positive(n){return this._addCheck({kind:"min",value:0,inclusive:!1,message:C.toString(n)})}negative(n){return this._addCheck({kind:"max",value:0,inclusive:!1,message:C.toString(n)})}nonpositive(n){return this._addCheck({kind:"max",value:0,inclusive:!0,message:C.toString(n)})}nonnegative(n){return this._addCheck({kind:"min",value:0,inclusive:!0,message:C.toString(n)})}multipleOf(n,q){return this._addCheck({kind:"multipleOf",value:n,message:C.toString(q)})}finite(n){return this._addCheck({kind:"finite",message:C.toString(n)})}safe(n){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:C.toString(n)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:C.toString(n)})}get minValue(){let n=null;for(let q of this._def.checks)if(q.kind==="min"){if(n===null||q.value>n)n=q.value}return n}get maxValue(){let n=null;for(let q of this._def.checks)if(q.kind==="max"){if(n===null||q.value<n)n=q.value}return n}get isInt(){return!!this._def.checks.find((n)=>n.kind==="int"||n.kind==="multipleOf"&&I.isInteger(n.value))}get isFinite(){let n=null,q=null;for(let H of this._def.checks)if(H.kind==="finite"||H.kind==="int"||H.kind==="multipleOf")return!0;else if(H.kind==="min"){if(q===null||H.value>q)q=H.value}else if(H.kind==="max"){if(n===null||H.value<n)n=H.value}return Number.isFinite(q)&&Number.isFinite(n)}}Qn.create=(n)=>{return new Qn({checks:[],typeName:v.ZodNumber,coerce:n?.coerce||!1,...E(n)})};class Xn extends T{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte}_parse(n){if(this._def.coerce)try{n.data=BigInt(n.data)}catch{return this._getInvalidInput(n)}if(this._getType(n)!==B.bigint)return this._getInvalidInput(n);let H=void 0,Q=new n0;for(let X of this._def.checks)if(X.kind==="min"){if(X.inclusive?n.data<X.value:n.data<=X.value)H=this._getOrReturnCtx(n,H),j(H,{code:V.too_small,type:"bigint",minimum:X.value,inclusive:X.inclusive,message:X.message}),Q.dirty()}else if(X.kind==="max"){if(X.inclusive?n.data>X.value:n.data>=X.value)H=this._getOrReturnCtx(n,H),j(H,{code:V.too_big,type:"bigint",maximum:X.value,inclusive:X.inclusive,message:X.message}),Q.dirty()}else if(X.kind==="multipleOf"){if(n.data%X.value!==BigInt(0))H=this._getOrReturnCtx(n,H),j(H,{code:V.not_multiple_of,multipleOf:X.value,message:X.message}),Q.dirty()}else I.assertNever(X);return{status:Q.value,value:n.data}}_getInvalidInput(n){let q=this._getOrReturnCtx(n);return j(q,{code:V.invalid_type,expected:B.bigint,received:q.parsedType}),U}gte(n,q){return this.setLimit("min",n,!0,C.toString(q))}gt(n,q){return this.setLimit("min",n,!1,C.toString(q))}lte(n,q){return this.setLimit("max",n,!0,C.toString(q))}lt(n,q){return this.setLimit("max",n,!1,C.toString(q))}setLimit(n,q,H,Q){return new Xn({...this._def,checks:[...this._def.checks,{kind:n,value:q,inclusive:H,message:C.toString(Q)}]})}_addCheck(n){return new Xn({...this._def,checks:[...this._def.checks,n]})}positive(n){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:C.toString(n)})}negative(n){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:C.toString(n)})}nonpositive(n){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:C.toString(n)})}nonnegative(n){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:C.toString(n)})}multipleOf(n,q){return this._addCheck({kind:"multipleOf",value:n,message:C.toString(q)})}get minValue(){let n=null;for(let q of this._def.checks)if(q.kind==="min"){if(n===null||q.value>n)n=q.value}return n}get maxValue(){let n=null;for(let q of this._def.checks)if(q.kind==="max"){if(n===null||q.value<n)n=q.value}return n}}Xn.create=(n)=>{return new Xn({checks:[],typeName:v.ZodBigInt,coerce:n?.coerce??!1,...E(n)})};class tn extends T{_parse(n){if(this._def.coerce)n.data=Boolean(n.data);if(this._getType(n)!==B.boolean){let H=this._getOrReturnCtx(n);return j(H,{code:V.invalid_type,expected:B.boolean,received:H.parsedType}),U}return Q0(n.data)}}tn.create=(n)=>{return new tn({typeName:v.ZodBoolean,coerce:n?.coerce||!1,...E(n)})};class Rn extends T{_parse(n){if(this._def.coerce)n.data=new Date(n.data);if(this._getType(n)!==B.date){let X=this._getOrReturnCtx(n);return j(X,{code:V.invalid_type,expected:B.date,received:X.parsedType}),U}if(Number.isNaN(n.data.getTime())){let X=this._getOrReturnCtx(n);return j(X,{code:V.invalid_date}),U}let H=new n0,Q=void 0;for(let X of this._def.checks)if(X.kind==="min"){if(n.data.getTime()<X.value)Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.too_small,message:X.message,inclusive:!0,exact:!1,minimum:X.value,type:"date"}),H.dirty()}else if(X.kind==="max"){if(n.data.getTime()>X.value)Q=this._getOrReturnCtx(n,Q),j(Q,{code:V.too_big,message:X.message,inclusive:!0,exact:!1,maximum:X.value,type:"date"}),H.dirty()}else I.assertNever(X);return{status:H.value,value:new Date(n.data.getTime())}}_addCheck(n){return new Rn({...this._def,checks:[...this._def.checks,n]})}min(n,q){return this._addCheck({kind:"min",value:n.getTime(),message:C.toString(q)})}max(n,q){return this._addCheck({kind:"max",value:n.getTime(),message:C.toString(q)})}get minDate(){let n=null;for(let q of this._def.checks)if(q.kind==="min"){if(n===null||q.value>n)n=q.value}return n!=null?new Date(n):null}get maxDate(){let n=null;for(let q of this._def.checks)if(q.kind==="max"){if(n===null||q.value<n)n=q.value}return n!=null?new Date(n):null}}Rn.create=(n)=>{return new Rn({checks:[],coerce:n?.coerce||!1,typeName:v.ZodDate,...E(n)})};class A1 extends T{_parse(n){if(this._getType(n)!==B.symbol){let H=this._getOrReturnCtx(n);return j(H,{code:V.invalid_type,expected:B.symbol,received:H.parsedType}),U}return Q0(n.data)}}A1.create=(n)=>{return new A1({typeName:v.ZodSymbol,...E(n)})};class rn extends T{_parse(n){if(this._getType(n)!==B.undefined){let H=this._getOrReturnCtx(n);return j(H,{code:V.invalid_type,expected:B.undefined,received:H.parsedType}),U}return Q0(n.data)}}rn.create=(n)=>{return new rn({typeName:v.ZodUndefined,...E(n)})};class an extends T{_parse(n){if(this._getType(n)!==B.null){let H=this._getOrReturnCtx(n);return j(H,{code:V.invalid_type,expected:B.null,received:H.parsedType}),U}return Q0(n.data)}}an.create=(n)=>{return new an({typeName:v.ZodNull,...E(n)})};class Nn extends T{constructor(){super(...arguments);this._any=!0}_parse(n){return Q0(n.data)}}Nn.create=(n)=>{return new Nn({typeName:v.ZodAny,...E(n)})};class Hn extends T{constructor(){super(...arguments);this._unknown=!0}_parse(n){return Q0(n.data)}}Hn.create=(n)=>{return new Hn({typeName:v.ZodUnknown,...E(n)})};class u0 extends T{_parse(n){let q=this._getOrReturnCtx(n);return j(q,{code:V.invalid_type,expected:B.never,received:q.parsedType}),U}}u0.create=(n)=>{return new u0({typeName:v.ZodNever,...E(n)})};class U1 extends T{_parse(n){if(this._getType(n)!==B.undefined){let H=this._getOrReturnCtx(n);return j(H,{code:V.invalid_type,expected:B.void,received:H.parsedType}),U}return Q0(n.data)}}U1.create=(n)=>{return new U1({typeName:v.ZodVoid,...E(n)})};class L0 extends T{_parse(n){let{ctx:q,status:H}=this._processInputParams(n),Q=this._def;if(q.parsedType!==B.array)return j(q,{code:V.invalid_type,expected:B.array,received:q.parsedType}),U;if(Q.exactLength!==null){let J=q.data.length>Q.exactLength.value,w=q.data.length<Q.exactLength.value;if(J||w)j(q,{code:J?V.too_big:V.too_small,minimum:w?Q.exactLength.value:void 0,maximum:J?Q.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:Q.exactLength.message}),H.dirty()}if(Q.minLength!==null){if(q.data.length<Q.minLength.value)j(q,{code:V.too_small,minimum:Q.minLength.value,type:"array",inclusive:!0,exact:!1,message:Q.minLength.message}),H.dirty()}if(Q.maxLength!==null){if(q.data.length>Q.maxLength.value)j(q,{code:V.too_big,maximum:Q.maxLength.value,type:"array",inclusive:!0,exact:!1,message:Q.maxLength.message}),H.dirty()}if(q.common.async)return Promise.all([...q.data].map((J,w)=>{return Q.type._parseAsync(new R0(q,J,q.path,w))})).then((J)=>{return n0.mergeArray(H,J)});let X=[...q.data].map((J,w)=>{return Q.type._parseSync(new R0(q,J,q.path,w))});return n0.mergeArray(H,X)}get element(){return this._def.type}min(n,q){return new L0({...this._def,minLength:{value:n,message:C.toString(q)}})}max(n,q){return new L0({...this._def,maxLength:{value:n,message:C.toString(q)}})}length(n,q){return new L0({...this._def,exactLength:{value:n,message:C.toString(q)}})}nonempty(n){return this.min(1,n)}}L0.create=(n,q)=>{return new L0({type:n,minLength:null,maxLength:null,exactLength:null,typeName:v.ZodArray,...E(q)})};function dn(n){if(n instanceof c){let q={};for(let H in n.shape){let Q=n.shape[H];q[H]=G0.create(dn(Q))}return new c({...n._def,shape:()=>q})}else if(n instanceof L0)return new L0({...n._def,type:dn(n.element)});else if(n instanceof G0)return G0.create(dn(n.unwrap()));else if(n instanceof c0)return c0.create(dn(n.unwrap()));else if(n instanceof y0)return y0.create(n.items.map((q)=>dn(q)));else return n}class c extends T{constructor(){super(...arguments);this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let n=this._def.shape(),q=I.objectKeys(n);return this._cached={shape:n,keys:q},this._cached}_parse(n){if(this._getType(n)!==B.object){let x=this._getOrReturnCtx(n);return j(x,{code:V.invalid_type,expected:B.object,received:x.parsedType}),U}let{status:H,ctx:Q}=this._processInputParams(n),{shape:X,keys:J}=this._getCached(),w=[];if(!(this._def.catchall instanceof u0&&this._def.unknownKeys==="strip")){for(let x in Q.data)if(!J.includes(x))w.push(x)}let W=[];for(let x of J){let Y=X[x],_=Q.data[x];W.push({key:{status:"valid",value:x},value:Y._parse(new R0(Q,_,Q.path,x)),alwaysSet:x in Q.data})}if(this._def.catchall instanceof u0){let x=this._def.unknownKeys;if(x==="passthrough")for(let Y of w)W.push({key:{status:"valid",value:Y},value:{status:"valid",value:Q.data[Y]}});else if(x==="strict"){if(w.length>0)j(Q,{code:V.unrecognized_keys,keys:w}),H.dirty()}else if(x==="strip");else throw Error("Internal ZodObject error: invalid unknownKeys value.")}else{let x=this._def.catchall;for(let Y of w){let _=Q.data[Y];W.push({key:{status:"valid",value:Y},value:x._parse(new R0(Q,_,Q.path,Y)),alwaysSet:Y in Q.data})}}if(Q.common.async)return Promise.resolve().then(async()=>{let x=[];for(let Y of W){let _=await Y.key,G=await Y.value;x.push({key:_,value:G,alwaysSet:Y.alwaysSet})}return x}).then((x)=>{return n0.mergeObjectSync(H,x)});else return n0.mergeObjectSync(H,W)}get shape(){return this._def.shape()}strict(n){return C.errToObj,new c({...this._def,unknownKeys:"strict",...n!==void 0?{errorMap:(q,H)=>{let Q=this._def.errorMap?.(q,H).message??H.defaultError;if(q.code==="unrecognized_keys")return{message:C.errToObj(n).message??Q};return{message:Q}}}:{}})}strip(){return new c({...this._def,unknownKeys:"strip"})}passthrough(){return new c({...this._def,unknownKeys:"passthrough"})}extend(n){return new c({...this._def,shape:()=>({...this._def.shape(),...n})})}merge(n){return new c({unknownKeys:n._def.unknownKeys,catchall:n._def.catchall,shape:()=>({...this._def.shape(),...n._def.shape()}),typeName:v.ZodObject})}setKey(n,q){return this.augment({[n]:q})}catchall(n){return new c({...this._def,catchall:n})}pick(n){let q={};for(let H of I.objectKeys(n))if(n[H]&&this.shape[H])q[H]=this.shape[H];return new c({...this._def,shape:()=>q})}omit(n){let q={};for(let H of I.objectKeys(this.shape))if(!n[H])q[H]=this.shape[H];return new c({...this._def,shape:()=>q})}deepPartial(){return dn(this)}partial(n){let q={};for(let H of I.objectKeys(this.shape)){let Q=this.shape[H];if(n&&!n[H])q[H]=Q;else q[H]=Q.optional()}return new c({...this._def,shape:()=>q})}required(n){let q={};for(let H of I.objectKeys(this.shape))if(n&&!n[H])q[H]=this.shape[H];else{let X=this.shape[H];while(X instanceof G0)X=X._def.innerType;q[H]=X}return new c({...this._def,shape:()=>q})}keyof(){return e4(I.objectKeys(this.shape))}}c.create=(n,q)=>{return new c({shape:()=>n,unknownKeys:"strip",catchall:u0.create(),typeName:v.ZodObject,...E(q)})};c.strictCreate=(n,q)=>{return new c({shape:()=>n,unknownKeys:"strict",catchall:u0.create(),typeName:v.ZodObject,...E(q)})};c.lazycreate=(n,q)=>{return new c({shape:n,unknownKeys:"strip",catchall:u0.create(),typeName:v.ZodObject,...E(q)})};class en extends T{_parse(n){let{ctx:q}=this._processInputParams(n),H=this._def.options;function Q(X){for(let w of X)if(w.result.status==="valid")return w.result;for(let w of X)if(w.result.status==="dirty")return q.common.issues.push(...w.ctx.common.issues),w.result;let J=X.map((w)=>new W0(w.ctx.common.issues));return j(q,{code:V.invalid_union,unionErrors:J}),U}if(q.common.async)return Promise.all(H.map(async(X)=>{let J={...q,common:{...q.common,issues:[]},parent:null};return{result:await X._parseAsync({data:q.data,path:q.path,parent:J}),ctx:J}})).then(Q);else{let X=void 0,J=[];for(let W of H){let x={...q,common:{...q.common,issues:[]},parent:null},Y=W._parseSync({data:q.data,path:q.path,parent:x});if(Y.status==="valid")return Y;else if(Y.status==="dirty"&&!X)X={result:Y,ctx:x};if(x.common.issues.length)J.push(x.common.issues)}if(X)return q.common.issues.push(...X.ctx.common.issues),X.result;let w=J.map((W)=>new W0(W));return j(q,{code:V.invalid_union,unionErrors:w}),U}}get options(){return this._def.options}}en.create=(n,q)=>{return new en({options:n,typeName:v.ZodUnion,...E(q)})};var l0=(n)=>{if(n instanceof n1)return l0(n.schema);else if(n instanceof N0)return l0(n.innerType());else if(n instanceof $1)return[n.value];else if(n instanceof Jn)return n.options;else if(n instanceof q1)return I.objectValues(n.enum);else if(n instanceof wn)return l0(n._def.innerType);else if(n instanceof rn)return[void 0];else if(n instanceof an)return[null];else if(n instanceof G0)return[void 0,...l0(n.unwrap())];else if(n instanceof c0)return[null,...l0(n.unwrap())];else if(n instanceof G2)return l0(n.unwrap());else if(n instanceof Q1)return l0(n.unwrap());else if(n instanceof H1)return l0(n._def.innerType);else return[]};class _2 extends T{_parse(n){let{ctx:q}=this._processInputParams(n);if(q.parsedType!==B.object)return j(q,{code:V.invalid_type,expected:B.object,received:q.parsedType}),U;let H=this.discriminator,Q=q.data[H],X=this.optionsMap.get(Q);if(!X)return j(q,{code:V.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[H]}),U;if(q.common.async)return X._parseAsync({data:q.data,path:q.path,parent:q});else return X._parseSync({data:q.data,path:q.path,parent:q})}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(n,q,H){let Q=new Map;for(let X of q){let J=l0(X.shape[n]);if(!J.length)throw Error(`A discriminator value for key \`${n}\` could not be extracted from all schema options`);for(let w of J){if(Q.has(w))throw Error(`Discriminator property ${String(n)} has duplicate value ${String(w)}`);Q.set(w,X)}}return new _2({typeName:v.ZodDiscriminatedUnion,discriminator:n,options:q,optionsMap:Q,...E(H)})}}function N6(n,q){let H=I0(n),Q=I0(q);if(n===q)return{valid:!0,data:n};else if(H===B.object&&Q===B.object){let X=I.objectKeys(q),J=I.objectKeys(n).filter((W)=>X.indexOf(W)!==-1),w={...n,...q};for(let W of J){let x=N6(n[W],q[W]);if(!x.valid)return{valid:!1};w[W]=x.data}return{valid:!0,data:w}}else if(H===B.array&&Q===B.array){if(n.length!==q.length)return{valid:!1};let X=[];for(let J=0;J<n.length;J++){let w=n[J],W=q[J],x=N6(w,W);if(!x.valid)return{valid:!1};X.push(x.data)}return{valid:!0,data:X}}else if(H===B.date&&Q===B.date&&+n===+q)return{valid:!0,data:n};else return{valid:!1}}class sn extends T{_parse(n){let{status:q,ctx:H}=this._processInputParams(n),Q=(X,J)=>{if(x2(X)||x2(J))return U;let w=N6(X.value,J.value);if(!w.valid)return j(H,{code:V.invalid_intersection_types}),U;if(Y2(X)||Y2(J))q.dirty();return{status:q.value,value:w.data}};if(H.common.async)return Promise.all([this._def.left._parseAsync({data:H.data,path:H.path,parent:H}),this._def.right._parseAsync({data:H.data,path:H.path,parent:H})]).then(([X,J])=>Q(X,J));else return Q(this._def.left._parseSync({data:H.data,path:H.path,parent:H}),this._def.right._parseSync({data:H.data,path:H.path,parent:H}))}}sn.create=(n,q,H)=>{return new sn({left:n,right:q,typeName:v.ZodIntersection,...E(H)})};class y0 extends T{_parse(n){let{status:q,ctx:H}=this._processInputParams(n);if(H.parsedType!==B.array)return j(H,{code:V.invalid_type,expected:B.array,received:H.parsedType}),U;if(H.data.length<this._def.items.length)return j(H,{code:V.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),U;if(!this._def.rest&&H.data.length>this._def.items.length)j(H,{code:V.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),q.dirty();let X=[...H.data].map((J,w)=>{let W=this._def.items[w]||this._def.rest;if(!W)return null;return W._parse(new R0(H,J,H.path,w))}).filter((J)=>!!J);if(H.common.async)return Promise.all(X).then((J)=>{return n0.mergeArray(q,J)});else return n0.mergeArray(q,X)}get items(){return this._def.items}rest(n){return new y0({...this._def,rest:n})}}y0.create=(n,q)=>{if(!Array.isArray(n))throw Error("You must pass an array of schemas to z.tuple([ ... ])");return new y0({items:n,typeName:v.ZodTuple,rest:null,...E(q)})};class F1 extends T{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(n){let{status:q,ctx:H}=this._processInputParams(n);if(H.parsedType!==B.object)return j(H,{code:V.invalid_type,expected:B.object,received:H.parsedType}),U;let Q=[],X=this._def.keyType,J=this._def.valueType;for(let w in H.data)Q.push({key:X._parse(new R0(H,w,H.path,w)),value:J._parse(new R0(H,H.data[w],H.path,w)),alwaysSet:w in H.data});if(H.common.async)return n0.mergeObjectAsync(q,Q);else return n0.mergeObjectSync(q,Q)}get element(){return this._def.valueType}static create(n,q,H){if(q instanceof T)return new F1({keyType:n,valueType:q,typeName:v.ZodRecord,...E(H)});return new F1({keyType:_0.create(),valueType:n,typeName:v.ZodRecord,...E(q)})}}class m1 extends T{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(n){let{status:q,ctx:H}=this._processInputParams(n);if(H.parsedType!==B.map)return j(H,{code:V.invalid_type,expected:B.map,received:H.parsedType}),U;let Q=this._def.keyType,X=this._def.valueType,J=[...H.data.entries()].map(([w,W],x)=>{return{key:Q._parse(new R0(H,w,H.path,[x,"key"])),value:X._parse(new R0(H,W,H.path,[x,"value"]))}});if(H.common.async){let w=new Map;return Promise.resolve().then(async()=>{for(let W of J){let x=await W.key,Y=await W.value;if(x.status==="aborted"||Y.status==="aborted")return U;if(x.status==="dirty"||Y.status==="dirty")q.dirty();w.set(x.value,Y.value)}return{status:q.value,value:w}})}else{let w=new Map;for(let W of J){let{key:x,value:Y}=W;if(x.status==="aborted"||Y.status==="aborted")return U;if(x.status==="dirty"||Y.status==="dirty")q.dirty();w.set(x.value,Y.value)}return{status:q.value,value:w}}}}m1.create=(n,q,H)=>{return new m1({valueType:q,keyType:n,typeName:v.ZodMap,...E(H)})};class Dn extends T{_parse(n){let{status:q,ctx:H}=this._processInputParams(n);if(H.parsedType!==B.set)return j(H,{code:V.invalid_type,expected:B.set,received:H.parsedType}),U;let Q=this._def;if(Q.minSize!==null){if(H.data.size<Q.minSize.value)j(H,{code:V.too_small,minimum:Q.minSize.value,type:"set",inclusive:!0,exact:!1,message:Q.minSize.message}),q.dirty()}if(Q.maxSize!==null){if(H.data.size>Q.maxSize.value)j(H,{code:V.too_big,maximum:Q.maxSize.value,type:"set",inclusive:!0,exact:!1,message:Q.maxSize.message}),q.dirty()}let X=this._def.valueType;function J(W){let x=new Set;for(let Y of W){if(Y.status==="aborted")return U;if(Y.status==="dirty")q.dirty();x.add(Y.value)}return{status:q.value,value:x}}let w=[...H.data.values()].map((W,x)=>X._parse(new R0(H,W,H.path,x)));if(H.common.async)return Promise.all(w).then((W)=>J(W));else return J(w)}min(n,q){return new Dn({...this._def,minSize:{value:n,message:C.toString(q)}})}max(n,q){return new Dn({...this._def,maxSize:{value:n,message:C.toString(q)}})}size(n,q){return this.min(n,q).max(n,q)}nonempty(n){return this.min(1,n)}}Dn.create=(n,q)=>{return new Dn({valueType:n,minSize:null,maxSize:null,typeName:v.ZodSet,...E(q)})};class zn extends T{constructor(){super(...arguments);this.validate=this.implement}_parse(n){let{ctx:q}=this._processInputParams(n);if(q.parsedType!==B.function)return j(q,{code:V.invalid_type,expected:B.function,received:q.parsedType}),U;function H(w,W){return C1({data:w,path:q.path,errorMaps:[q.common.contextualErrorMap,q.schemaErrorMap,ln(),f0].filter((x)=>!!x),issueData:{code:V.invalid_arguments,argumentsError:W}})}function Q(w,W){return C1({data:w,path:q.path,errorMaps:[q.common.contextualErrorMap,q.schemaErrorMap,ln(),f0].filter((x)=>!!x),issueData:{code:V.invalid_return_type,returnTypeError:W}})}let X={errorMap:q.common.contextualErrorMap},J=q.data;if(this._def.returns instanceof Cn){let w=this;return Q0(async function(...W){let x=new W0([]),Y=await w._def.args.parseAsync(W,X).catch((O)=>{throw x.addIssue(H(W,O)),x}),_=await Reflect.apply(J,this,Y);return await w._def.returns._def.type.parseAsync(_,X).catch((O)=>{throw x.addIssue(Q(_,O)),x})})}else{let w=this;return Q0(function(...W){let x=w._def.args.safeParse(W,X);if(!x.success)throw new W0([H(W,x.error)]);let Y=Reflect.apply(J,this,x.data),_=w._def.returns.safeParse(Y,X);if(!_.success)throw new W0([Q(Y,_.error)]);return _.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...n){return new zn({...this._def,args:y0.create(n).rest(Hn.create())})}returns(n){return new zn({...this._def,returns:n})}implement(n){return this.parse(n)}strictImplement(n){return this.parse(n)}static create(n,q,H){return new zn({args:n?n:y0.create([]).rest(Hn.create()),returns:q||Hn.create(),typeName:v.ZodFunction,...E(H)})}}class n1 extends T{get schema(){return this._def.getter()}_parse(n){let{ctx:q}=this._processInputParams(n);return this._def.getter()._parse({data:q.data,path:q.path,parent:q})}}n1.create=(n,q)=>{return new n1({getter:n,typeName:v.ZodLazy,...E(q)})};class $1 extends T{_parse(n){if(n.data!==this._def.value){let q=this._getOrReturnCtx(n);return j(q,{received:q.data,code:V.invalid_literal,expected:this._def.value}),U}return{status:"valid",value:n.data}}get value(){return this._def.value}}$1.create=(n,q)=>{return new $1({value:n,typeName:v.ZodLiteral,...E(q)})};function e4(n,q){return new Jn({values:n,typeName:v.ZodEnum,...E(q)})}class Jn extends T{_parse(n){if(typeof n.data!=="string"){let q=this._getOrReturnCtx(n),H=this._def.values;return j(q,{expected:I.joinValues(H),received:q.parsedType,code:V.invalid_type}),U}if(!this._cache)this._cache=new Set(this._def.values);if(!this._cache.has(n.data)){let q=this._getOrReturnCtx(n),H=this._def.values;return j(q,{received:q.data,code:V.invalid_enum_value,options:H}),U}return Q0(n.data)}get options(){return this._def.values}get enum(){let n={};for(let q of this._def.values)n[q]=q;return n}get Values(){let n={};for(let q of this._def.values)n[q]=q;return n}get Enum(){let n={};for(let q of this._def.values)n[q]=q;return n}extract(n,q=this._def){return Jn.create(n,{...this._def,...q})}exclude(n,q=this._def){return Jn.create(this.options.filter((H)=>!n.includes(H)),{...this._def,...q})}}Jn.create=e4;class q1 extends T{_parse(n){let q=I.getValidEnumValues(this._def.values),H=this._getOrReturnCtx(n);if(H.parsedType!==B.string&&H.parsedType!==B.number){let Q=I.objectValues(q);return j(H,{expected:I.joinValues(Q),received:H.parsedType,code:V.invalid_type}),U}if(!this._cache)this._cache=new Set(I.getValidEnumValues(this._def.values));if(!this._cache.has(n.data)){let Q=I.objectValues(q);return j(H,{received:H.data,code:V.invalid_enum_value,options:Q}),U}return Q0(n.data)}get enum(){return this._def.values}}q1.create=(n,q)=>{return new q1({values:n,typeName:v.ZodNativeEnum,...E(q)})};class Cn extends T{unwrap(){return this._def.type}_parse(n){let{ctx:q}=this._processInputParams(n);if(q.parsedType!==B.promise&&q.common.async===!1)return j(q,{code:V.invalid_type,expected:B.promise,received:q.parsedType}),U;let H=q.parsedType===B.promise?q.data:Promise.resolve(q.data);return Q0(H.then((Q)=>{return this._def.type.parseAsync(Q,{path:q.path,errorMap:q.common.contextualErrorMap})}))}}Cn.create=(n,q)=>{return new Cn({type:n,typeName:v.ZodPromise,...E(q)})};class N0 extends T{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===v.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(n){let{status:q,ctx:H}=this._processInputParams(n),Q=this._def.effect||null,X={addIssue:(J)=>{if(j(H,J),J.fatal)q.abort();else q.dirty()},get path(){return H.path}};if(X.addIssue=X.addIssue.bind(X),Q.type==="preprocess"){let J=Q.transform(H.data,X);if(H.common.async)return Promise.resolve(J).then(async(w)=>{if(q.value==="aborted")return U;let W=await this._def.schema._parseAsync({data:w,path:H.path,parent:H});if(W.status==="aborted")return U;if(W.status==="dirty")return Ln(W.value);if(q.value==="dirty")return Ln(W.value);return W});else{if(q.value==="aborted")return U;let w=this._def.schema._parseSync({data:J,path:H.path,parent:H});if(w.status==="aborted")return U;if(w.status==="dirty")return Ln(w.value);if(q.value==="dirty")return Ln(w.value);return w}}if(Q.type==="refinement"){let J=(w)=>{let W=Q.refinement(w,X);if(H.common.async)return Promise.resolve(W);if(W instanceof Promise)throw Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return w};if(H.common.async===!1){let w=this._def.schema._parseSync({data:H.data,path:H.path,parent:H});if(w.status==="aborted")return U;if(w.status==="dirty")q.dirty();return J(w.value),{status:q.value,value:w.value}}else return this._def.schema._parseAsync({data:H.data,path:H.path,parent:H}).then((w)=>{if(w.status==="aborted")return U;if(w.status==="dirty")q.dirty();return J(w.value).then(()=>{return{status:q.value,value:w.value}})})}if(Q.type==="transform")if(H.common.async===!1){let J=this._def.schema._parseSync({data:H.data,path:H.path,parent:H});if(!qn(J))return U;let w=Q.transform(J.value,X);if(w instanceof Promise)throw Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:q.value,value:w}}else return this._def.schema._parseAsync({data:H.data,path:H.path,parent:H}).then((J)=>{if(!qn(J))return U;return Promise.resolve(Q.transform(J.value,X)).then((w)=>({status:q.value,value:w}))});I.assertNever(Q)}}N0.create=(n,q,H)=>{return new N0({schema:n,typeName:v.ZodEffects,effect:q,...E(H)})};N0.createWithPreprocess=(n,q,H)=>{return new N0({schema:q,effect:{type:"preprocess",transform:n},typeName:v.ZodEffects,...E(H)})};class G0 extends T{_parse(n){if(this._getType(n)===B.undefined)return Q0(void 0);return this._def.innerType._parse(n)}unwrap(){return this._def.innerType}}G0.create=(n,q)=>{return new G0({innerType:n,typeName:v.ZodOptional,...E(q)})};class c0 extends T{_parse(n){if(this._getType(n)===B.null)return Q0(null);return this._def.innerType._parse(n)}unwrap(){return this._def.innerType}}c0.create=(n,q)=>{return new c0({innerType:n,typeName:v.ZodNullable,...E(q)})};class wn extends T{_parse(n){let{ctx:q}=this._processInputParams(n),H=q.data;if(q.parsedType===B.undefined)H=this._def.defaultValue();return this._def.innerType._parse({data:H,path:q.path,parent:q})}removeDefault(){return this._def.innerType}}wn.create=(n,q)=>{return new wn({innerType:n,typeName:v.ZodDefault,defaultValue:typeof q.default==="function"?q.default:()=>q.default,...E(q)})};class H1 extends T{_parse(n){let{ctx:q}=this._processInputParams(n),H={...q,common:{...q.common,issues:[]}},Q=this._def.innerType._parse({data:H.data,path:H.path,parent:{...H}});if(cn(Q))return Q.then((X)=>{return{status:"valid",value:X.status==="valid"?X.value:this._def.catchValue({get error(){return new W0(H.common.issues)},input:H.data})}});else return{status:"valid",value:Q.status==="valid"?Q.value:this._def.catchValue({get error(){return new W0(H.common.issues)},input:H.data})}}removeCatch(){return this._def.innerType}}H1.create=(n,q)=>{return new H1({innerType:n,typeName:v.ZodCatch,catchValue:typeof q.catch==="function"?q.catch:()=>q.catch,...E(q)})};class E1 extends T{_parse(n){if(this._getType(n)!==B.nan){let H=this._getOrReturnCtx(n);return j(H,{code:V.invalid_type,expected:B.nan,received:H.parsedType}),U}return{status:"valid",value:n.data}}}E1.create=(n)=>{return new E1({typeName:v.ZodNaN,...E(n)})};var mH=Symbol("zod_brand");class G2 extends T{_parse(n){let{ctx:q}=this._processInputParams(n),H=q.data;return this._def.type._parse({data:H,path:q.path,parent:q})}unwrap(){return this._def.type}}class P1 extends T{_parse(n){let{status:q,ctx:H}=this._processInputParams(n);if(H.common.async)return(async()=>{let X=await this._def.in._parseAsync({data:H.data,path:H.path,parent:H});if(X.status==="aborted")return U;if(X.status==="dirty")return q.dirty(),Ln(X.value);else return this._def.out._parseAsync({data:X.value,path:H.path,parent:H})})();else{let Q=this._def.in._parseSync({data:H.data,path:H.path,parent:H});if(Q.status==="aborted")return U;if(Q.status==="dirty")return q.dirty(),{status:"dirty",value:Q.value};else return this._def.out._parseSync({data:Q.value,path:H.path,parent:H})}}static create(n,q){return new P1({in:n,out:q,typeName:v.ZodPipeline})}}class Q1 extends T{_parse(n){let q=this._def.innerType._parse(n),H=(Q)=>{if(qn(Q))Q.value=Object.freeze(Q.value);return Q};return cn(q)?q.then((Q)=>H(Q)):H(q)}unwrap(){return this._def.innerType}}Q1.create=(n,q)=>{return new Q1({innerType:n,typeName:v.ZodReadonly,...E(q)})};function z4(n,q){let H=typeof n==="function"?n(q):typeof n==="string"?{message:n}:n;return typeof H==="string"?{message:H}:H}function s4(n,q={},H){if(n)return Nn.create().superRefine((Q,X)=>{let J=n(Q);if(J instanceof Promise)return J.then((w)=>{if(!w){let W=z4(q,Q),x=W.fatal??H??!0;X.addIssue({code:"custom",...W,fatal:x})}});if(!J){let w=z4(q,Q),W=w.fatal??H??!0;X.addIssue({code:"custom",...w,fatal:W})}return});return Nn.create()}var EH={object:c.lazycreate},v;(function(n){n.ZodString="ZodString",n.ZodNumber="ZodNumber",n.ZodNaN="ZodNaN",n.ZodBigInt="ZodBigInt",n.ZodBoolean="ZodBoolean",n.ZodDate="ZodDate",n.ZodSymbol="ZodSymbol",n.ZodUndefined="ZodUndefined",n.ZodNull="ZodNull",n.ZodAny="ZodAny",n.ZodUnknown="ZodUnknown",n.ZodNever="ZodNever",n.ZodVoid="ZodVoid",n.ZodArray="ZodArray",n.ZodObject="ZodObject",n.ZodUnion="ZodUnion",n.ZodDiscriminatedUnion="ZodDiscriminatedUnion",n.ZodIntersection="ZodIntersection",n.ZodTuple="ZodTuple",n.ZodRecord="ZodRecord",n.ZodMap="ZodMap",n.ZodSet="ZodSet",n.ZodFunction="ZodFunction",n.ZodLazy="ZodLazy",n.ZodLiteral="ZodLiteral",n.ZodEnum="ZodEnum",n.ZodEffects="ZodEffects",n.ZodNativeEnum="ZodNativeEnum",n.ZodOptional="ZodOptional",n.ZodNullable="ZodNullable",n.ZodDefault="ZodDefault",n.ZodCatch="ZodCatch",n.ZodPromise="ZodPromise",n.ZodBranded="ZodBranded",n.ZodPipeline="ZodPipeline",n.ZodReadonly="ZodReadonly"})(v||(v={}));var PH=(n,q={message:`Input not instance of ${n.name}`})=>s4((H)=>H instanceof n,q),n8=_0.create,$8=Qn.create,SH=E1.create,bH=Xn.create,q8=tn.create,kH=Rn.create,hH=A1.create,TH=rn.create,IH=an.create,uH=Nn.create,yH=Hn.create,ZH=u0.create,pH=U1.create,gH=L0.create,iH=c.create,oH=c.strictCreate,fH=en.create,lH=_2.create,cH=sn.create,dH=y0.create,zH=F1.create,tH=m1.create,rH=Dn.create,aH=zn.create,eH=n1.create,sH=$1.create,nQ=Jn.create,$Q=q1.create,qQ=Cn.create,HQ=N0.create,QQ=G0.create,XQ=c0.create,JQ=N0.createWithPreprocess,wQ=P1.create,WQ=()=>n8().optional(),xQ=()=>$8().optional(),YQ=()=>q8().optional(),_Q={string:(n)=>_0.create({...n,coerce:!0}),number:(n)=>Qn.create({...n,coerce:!0}),boolean:(n)=>tn.create({...n,coerce:!0}),bigint:(n)=>Xn.create({...n,coerce:!0}),date:(n)=>Rn.create({...n,coerce:!0})};var GQ=U;function OQ(n,q){if(!(q instanceof c))return n;let H=q.shape,Q={...n};for(let[X,J]of Object.entries(H)){if(typeof Q[X]!=="number")continue;let w=J;while(w instanceof G0||w instanceof wn)w=w._def.innerType;if(w instanceof _0)Q[X]=String(Q[X])}return Q}var VQ=30000;class O2{registry;constructor(n){this.registry=n}async execute(n){let q=await this.run(n);return W2({parsed:n,output:q}),JSON.stringify(q)}async run(n){let q=Date.now(),{command:H,args:Q}=n,X=this.registry.get(H);if(!X)return $n(H,"core",new on(H),Date.now()-q);let J=X.parameters.safeParse(OQ(Q,X.parameters));if(!J.success){let x=new V6(`Invalid arguments for command '${H}'`,J.error.errors);return $n(H,X.pluginName,x,Date.now()-q)}let w=X.timeout??VQ,W;try{let x=await Promise.race([X.handler(J.data),new Promise((Y,_)=>{W=setTimeout(()=>_(new X2(H,w)),w)})]);return clearTimeout(W),o4(H,X.pluginName,x,Date.now()-q)}catch(x){if(clearTimeout(W),x instanceof X2)return $n(H,X.pluginName,x,Date.now()-q);if(x instanceof K)return $n(H,X.pluginName,x,Date.now()-q);let Y=x instanceof Error?new H2(x.message,x.stack):new H2(String(x));return $n(H,X.pluginName,Y,Date.now()-q)}}}function H8(n){if(n==="true")return!0;if(n==="false")return!1;if(n==="0"||/^0\.\d+$/.test(n))return Number(n);if(n.startsWith("0"))return n;if(n!==""&&!isNaN(Number(n)))return Number(n);return n}function X8(n){let q={},H="",Q=0;if(n.length>0&&!n[0].startsWith("--"))H=n[0],Q=1;while(Q<n.length){let X=n[Q];if(X.startsWith("--")){let J=X.slice(2);if(J.includes("=")){let w=J.indexOf("="),W=J.slice(0,w),x=J.slice(w+1);Q8(q,W,H8(x))}else if(Q+1<n.length&&!n[Q+1].startsWith("--"))Q8(q,J,H8(n[Q+1])),Q++;else q[J]=!0}Q++}return{command:H,args:q}}function Q8(n,q,H){let Q=n[q];if(Q===void 0)n[q]=H;else if(Array.isArray(Q))n[q]=[...Q,H];else if(typeof Q==="string")n[q]=[Q,H]}var vQ={version:"1.0.0"};async function KQ(n,q){try{if(n.initialize)await n.initialize(vQ);let H=q;for(let Q of n.commands)H=H.register(Q);return{registry:H}}catch(H){let Q=H instanceof Error?new Q2(n.name,H.message,H):new Q2(n.name,String(H));return{registry:q,error:Q}}}async function D6(n,q=new jn){let H=q,Q=[];for(let X of n){let J=await KQ(X,H);if(H=J.registry,J.error)Q.push({pluginName:X.name,error:J.error})}return{registry:H,errors:Q}}import{readFileSync as BQ,writeFileSync as MQ,mkdirSync as jQ,existsSync as J8}from"node:fs";import{homedir as LQ}from"node:os";import{join as w8}from"node:path";var C6=process.env.YUNKE_CONFIG_DIR??w8(LQ(),".yunke"),V2=w8(C6,"plugins.json");function W8(){if(!J8(C6))jQ(C6,{recursive:!0})}function An(){if(W8(),!J8(V2))return{version:"1",plugins:[]};try{let n=BQ(V2,"utf-8");return JSON.parse(n)}catch(n){return process.stderr.write(`Warning: Failed to parse plugin config at ${V2}: ${n instanceof Error?n.message:String(n)}
8
+ `),{version:"1",plugins:[]}}}function v2(n){W8(),MQ(V2,JSON.stringify(n,null,2),"utf-8")}function x8(n){let q=An(),H=q.plugins.findIndex((X)=>X.name===n.name),Q={...n,installedAt:new Date().toISOString()};if(H>=0){let X=[...q.plugins];X[H]=Q,v2({...q,plugins:X})}else v2({...q,plugins:[...q.plugins,Q]})}function Y8(n){let q=An(),H=q.plugins.filter((Q)=>Q.name!==n);if(H.length!==q.plugins.length)return v2({...q,plugins:H}),!0;return!1}function A6(n,q){let H=An();if(H.plugins.findIndex((J)=>J.name===n)<0)return!1;let X=H.plugins.map((J)=>J.name===n?{...J,enabled:q}:J);return v2({...H,plugins:X}),!0}import{readFileSync as RQ,writeFileSync as NQ,existsSync as _8,mkdirSync as DQ}from"node:fs";import{homedir as CQ}from"node:os";import{join as G8}from"node:path";var d0={agenphone:!1,weixiaozhu:!1},U6=process.env.YUNKE_CONFIG_DIR??G8(CQ(),".yunke"),F6=G8(U6,"features.json");function K2(){if(!_8(F6))return{version:"1",features:{...d0}};try{let n=RQ(F6,"utf-8"),q=JSON.parse(n);return{...q,features:{...d0,...q.features}}}catch{return{version:"1",features:{...d0}}}}function AQ(n){if(!_8(U6))DQ(U6,{recursive:!0});NQ(F6,JSON.stringify(n,null,2),"utf-8")}function O8(n){return K2().features[n]??!1}function m6(n,q){let H=K2();AQ({...H,features:{...H.features,[n]:q}})}var v8=Symbol("Let zodToJsonSchema decide on which parser to use");var V8={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},K8=(n)=>typeof n==="string"?{...V8,name:n}:{...V8,...n};var B8=(n)=>{let q=K8(n),H=q.name!==void 0?[...q.basePath,q.definitionPath,q.name]:q.basePath;return{...q,flags:{hasReferencedOpenAiAnyType:!1},currentPath:H,propertyPath:void 0,seen:new Map(Object.entries(q.definitions).map(([Q,X])=>[X._def,{def:X._def,path:[...q.basePath,q.definitionPath,Q],jsonSchema:void 0}]))}};function E6(n,q,H,Q){if(!Q?.errorMessages)return;if(H)n.errorMessage={...n.errorMessage,[q]:H}}function o(n,q,H,Q,X){n[q]=H,E6(n,q,Q,X)}var B2=(n,q)=>{let H=0;for(;H<n.length&&H<q.length;H++)if(n[H]!==q[H])break;return[(n.length-H).toString(),...q.slice(H)].join("/")};function t(n){if(n.target!=="openAi")return{};let q=[...n.basePath,n.definitionPath,n.openAiAnyTypeName];return n.flags.hasReferencedOpenAiAnyType=!0,{$ref:n.$refStrategy==="relative"?B2(q,n.currentPath):q.join("/")}}function M8(n,q){let H={type:"array"};if(n.type?._def&&n.type?._def?.typeName!==v.ZodAny)H.items=F(n.type._def,{...q,currentPath:[...q.currentPath,"items"]});if(n.minLength)o(H,"minItems",n.minLength.value,n.minLength.message,q);if(n.maxLength)o(H,"maxItems",n.maxLength.value,n.maxLength.message,q);if(n.exactLength)o(H,"minItems",n.exactLength.value,n.exactLength.message,q),o(H,"maxItems",n.exactLength.value,n.exactLength.message,q);return H}function j8(n,q){let H={type:"integer",format:"int64"};if(!n.checks)return H;for(let Q of n.checks)switch(Q.kind){case"min":if(q.target==="jsonSchema7")if(Q.inclusive)o(H,"minimum",Q.value,Q.message,q);else o(H,"exclusiveMinimum",Q.value,Q.message,q);else{if(!Q.inclusive)H.exclusiveMinimum=!0;o(H,"minimum",Q.value,Q.message,q)}break;case"max":if(q.target==="jsonSchema7")if(Q.inclusive)o(H,"maximum",Q.value,Q.message,q);else o(H,"exclusiveMaximum",Q.value,Q.message,q);else{if(!Q.inclusive)H.exclusiveMaximum=!0;o(H,"maximum",Q.value,Q.message,q)}break;case"multipleOf":o(H,"multipleOf",Q.value,Q.message,q);break}return H}function L8(){return{type:"boolean"}}function M2(n,q){return F(n.type._def,q)}var R8=(n,q)=>{return F(n.innerType._def,q)};function P6(n,q,H){let Q=H??q.dateStrategy;if(Array.isArray(Q))return{anyOf:Q.map((X,J)=>P6(n,q,X))};switch(Q){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return UQ(n,q)}}var UQ=(n,q)=>{let H={type:"integer",format:"unix-time"};if(q.target==="openApi3")return H;for(let Q of n.checks)switch(Q.kind){case"min":o(H,"minimum",Q.value,Q.message,q);break;case"max":o(H,"maximum",Q.value,Q.message,q);break}return H};function N8(n,q){return{...F(n.innerType._def,q),default:n.defaultValue()}}function D8(n,q){return q.effectStrategy==="input"?F(n.schema._def,q):t(q)}function C8(n){return{type:"string",enum:Array.from(n.values)}}var FQ=(n)=>{if("type"in n&&n.type==="string")return!1;return"allOf"in n};function A8(n,q){let H=[F(n.left._def,{...q,currentPath:[...q.currentPath,"allOf","0"]}),F(n.right._def,{...q,currentPath:[...q.currentPath,"allOf","1"]})].filter((J)=>!!J),Q=q.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,X=[];return H.forEach((J)=>{if(FQ(J)){if(X.push(...J.allOf),J.unevaluatedProperties===void 0)Q=void 0}else{let w=J;if("additionalProperties"in J&&J.additionalProperties===!1){let{additionalProperties:W,...x}=J;w=x}else Q=void 0;X.push(w)}}),X.length?{allOf:X,...Q}:void 0}function U8(n,q){let H=typeof n.value;if(H!=="bigint"&&H!=="number"&&H!=="boolean"&&H!=="string")return{type:Array.isArray(n.value)?"array":"object"};if(q.target==="openApi3")return{type:H==="bigint"?"integer":H,enum:[n.value]};return{type:H==="bigint"?"integer":H,const:n.value}}var S6=void 0,D0={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>{if(S6===void 0)S6=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return S6},uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function j2(n,q){let H={type:"string"};if(n.checks)for(let Q of n.checks)switch(Q.kind){case"min":o(H,"minLength",typeof H.minLength==="number"?Math.max(H.minLength,Q.value):Q.value,Q.message,q);break;case"max":o(H,"maxLength",typeof H.maxLength==="number"?Math.min(H.maxLength,Q.value):Q.value,Q.message,q);break;case"email":switch(q.emailStrategy){case"format:email":C0(H,"email",Q.message,q);break;case"format:idn-email":C0(H,"idn-email",Q.message,q);break;case"pattern:zod":J0(H,D0.email,Q.message,q);break}break;case"url":C0(H,"uri",Q.message,q);break;case"uuid":C0(H,"uuid",Q.message,q);break;case"regex":J0(H,Q.regex,Q.message,q);break;case"cuid":J0(H,D0.cuid,Q.message,q);break;case"cuid2":J0(H,D0.cuid2,Q.message,q);break;case"startsWith":J0(H,RegExp(`^${b6(Q.value,q)}`),Q.message,q);break;case"endsWith":J0(H,RegExp(`${b6(Q.value,q)}$`),Q.message,q);break;case"datetime":C0(H,"date-time",Q.message,q);break;case"date":C0(H,"date",Q.message,q);break;case"time":C0(H,"time",Q.message,q);break;case"duration":C0(H,"duration",Q.message,q);break;case"length":o(H,"minLength",typeof H.minLength==="number"?Math.max(H.minLength,Q.value):Q.value,Q.message,q),o(H,"maxLength",typeof H.maxLength==="number"?Math.min(H.maxLength,Q.value):Q.value,Q.message,q);break;case"includes":{J0(H,RegExp(b6(Q.value,q)),Q.message,q);break}case"ip":{if(Q.version!=="v6")C0(H,"ipv4",Q.message,q);if(Q.version!=="v4")C0(H,"ipv6",Q.message,q);break}case"base64url":J0(H,D0.base64url,Q.message,q);break;case"jwt":J0(H,D0.jwt,Q.message,q);break;case"cidr":{if(Q.version!=="v6")J0(H,D0.ipv4Cidr,Q.message,q);if(Q.version!=="v4")J0(H,D0.ipv6Cidr,Q.message,q);break}case"emoji":J0(H,D0.emoji(),Q.message,q);break;case"ulid":{J0(H,D0.ulid,Q.message,q);break}case"base64":{switch(q.base64Strategy){case"format:binary":{C0(H,"binary",Q.message,q);break}case"contentEncoding:base64":{o(H,"contentEncoding","base64",Q.message,q);break}case"pattern:zod":{J0(H,D0.base64,Q.message,q);break}}break}case"nanoid":J0(H,D0.nanoid,Q.message,q);case"toLowerCase":case"toUpperCase":case"trim":break;default:((X)=>{})(Q)}return H}function b6(n,q){return q.patternStrategy==="escape"?EQ(n):n}var mQ=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function EQ(n){let q="";for(let H=0;H<n.length;H++){if(!mQ.has(n[H]))q+="\\";q+=n[H]}return q}function C0(n,q,H,Q){if(n.format||n.anyOf?.some((X)=>X.format)){if(!n.anyOf)n.anyOf=[];if(n.format){if(n.anyOf.push({format:n.format,...n.errorMessage&&Q.errorMessages&&{errorMessage:{format:n.errorMessage.format}}}),delete n.format,n.errorMessage){if(delete n.errorMessage.format,Object.keys(n.errorMessage).length===0)delete n.errorMessage}}n.anyOf.push({format:q,...H&&Q.errorMessages&&{errorMessage:{format:H}}})}else o(n,"format",q,H,Q)}function J0(n,q,H,Q){if(n.pattern||n.allOf?.some((X)=>X.pattern)){if(!n.allOf)n.allOf=[];if(n.pattern){if(n.allOf.push({pattern:n.pattern,...n.errorMessage&&Q.errorMessages&&{errorMessage:{pattern:n.errorMessage.pattern}}}),delete n.pattern,n.errorMessage){if(delete n.errorMessage.pattern,Object.keys(n.errorMessage).length===0)delete n.errorMessage}}n.allOf.push({pattern:F8(q,Q),...H&&Q.errorMessages&&{errorMessage:{pattern:H}}})}else o(n,"pattern",F8(q,Q),H,Q)}function F8(n,q){if(!q.applyRegexFlags||!n.flags)return n.source;let H={i:n.flags.includes("i"),m:n.flags.includes("m"),s:n.flags.includes("s")},Q=H.i?n.source.toLowerCase():n.source,X="",J=!1,w=!1,W=!1;for(let x=0;x<Q.length;x++){if(J){X+=Q[x],J=!1;continue}if(H.i){if(w){if(Q[x].match(/[a-z]/)){if(W)X+=Q[x],X+=`${Q[x-2]}-${Q[x]}`.toUpperCase(),W=!1;else if(Q[x+1]==="-"&&Q[x+2]?.match(/[a-z]/))X+=Q[x],W=!0;else X+=`${Q[x]}${Q[x].toUpperCase()}`;continue}}else if(Q[x].match(/[a-z]/)){X+=`[${Q[x]}${Q[x].toUpperCase()}]`;continue}}if(H.m){if(Q[x]==="^"){X+=`(^|(?<=[\r
9
+ ]))`;continue}else if(Q[x]==="$"){X+=`($|(?=[\r
10
+ ]))`;continue}}if(H.s&&Q[x]==="."){X+=w?`${Q[x]}\r
11
+ `:`[${Q[x]}\r
12
+ ]`;continue}if(X+=Q[x],Q[x]==="\\")J=!0;else if(w&&Q[x]==="]")w=!1;else if(!w&&Q[x]==="[")w=!0}try{new RegExp(X)}catch{return console.warn(`Could not convert regex pattern at ${q.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),n.source}return X}function L2(n,q){if(q.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(q.target==="openApi3"&&n.keyType?._def.typeName===v.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((Q,X)=>({...Q,[X]:F(n.valueType._def,{...q,currentPath:[...q.currentPath,"properties",X]})??t(q)}),{}),additionalProperties:q.rejectedAdditionalProperties};let H={type:"object",additionalProperties:F(n.valueType._def,{...q,currentPath:[...q.currentPath,"additionalProperties"]})??q.allowedAdditionalProperties};if(q.target==="openApi3")return H;if(n.keyType?._def.typeName===v.ZodString&&n.keyType._def.checks?.length){let{type:Q,...X}=j2(n.keyType._def,q);return{...H,propertyNames:X}}else if(n.keyType?._def.typeName===v.ZodEnum)return{...H,propertyNames:{enum:n.keyType._def.values}};else if(n.keyType?._def.typeName===v.ZodBranded&&n.keyType._def.type._def.typeName===v.ZodString&&n.keyType._def.type._def.checks?.length){let{type:Q,...X}=M2(n.keyType._def,q);return{...H,propertyNames:X}}return H}function m8(n,q){if(q.mapStrategy==="record")return L2(n,q);let H=F(n.keyType._def,{...q,currentPath:[...q.currentPath,"items","items","0"]})||t(q),Q=F(n.valueType._def,{...q,currentPath:[...q.currentPath,"items","items","1"]})||t(q);return{type:"array",maxItems:125,items:{type:"array",items:[H,Q],minItems:2,maxItems:2}}}function E8(n){let q=n.values,Q=Object.keys(n.values).filter((J)=>{return typeof q[q[J]]!=="number"}).map((J)=>q[J]),X=Array.from(new Set(Q.map((J)=>typeof J)));return{type:X.length===1?X[0]==="string"?"string":"number":["string","number"],enum:Q}}function P8(n){return n.target==="openAi"?void 0:{not:t({...n,currentPath:[...n.currentPath,"not"]})}}function S8(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var S1={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function k8(n,q){if(q.target==="openApi3")return b8(n,q);let H=n.options instanceof Map?Array.from(n.options.values()):n.options;if(H.every((Q)=>(Q._def.typeName in S1)&&(!Q._def.checks||!Q._def.checks.length))){let Q=H.reduce((X,J)=>{let w=S1[J._def.typeName];return w&&!X.includes(w)?[...X,w]:X},[]);return{type:Q.length>1?Q:Q[0]}}else if(H.every((Q)=>Q._def.typeName==="ZodLiteral"&&!Q.description)){let Q=H.reduce((X,J)=>{let w=typeof J._def.value;switch(w){case"string":case"number":case"boolean":return[...X,w];case"bigint":return[...X,"integer"];case"object":if(J._def.value===null)return[...X,"null"];case"symbol":case"undefined":case"function":default:return X}},[]);if(Q.length===H.length){let X=Q.filter((J,w,W)=>W.indexOf(J)===w);return{type:X.length>1?X:X[0],enum:H.reduce((J,w)=>{return J.includes(w._def.value)?J:[...J,w._def.value]},[])}}}else if(H.every((Q)=>Q._def.typeName==="ZodEnum"))return{type:"string",enum:H.reduce((Q,X)=>[...Q,...X._def.values.filter((J)=>!Q.includes(J))],[])};return b8(n,q)}var b8=(n,q)=>{let H=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((Q,X)=>F(Q._def,{...q,currentPath:[...q.currentPath,"anyOf",`${X}`]})).filter((Q)=>!!Q&&(!q.strictUnions||typeof Q==="object"&&Object.keys(Q).length>0));return H.length?{anyOf:H}:void 0};function h8(n,q){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length)){if(q.target==="openApi3")return{type:S1[n.innerType._def.typeName],nullable:!0};return{type:[S1[n.innerType._def.typeName],"null"]}}if(q.target==="openApi3"){let Q=F(n.innerType._def,{...q,currentPath:[...q.currentPath]});if(Q&&"$ref"in Q)return{allOf:[Q],nullable:!0};return Q&&{...Q,nullable:!0}}let H=F(n.innerType._def,{...q,currentPath:[...q.currentPath,"anyOf","0"]});return H&&{anyOf:[H,{type:"null"}]}}function T8(n,q){let H={type:"number"};if(!n.checks)return H;for(let Q of n.checks)switch(Q.kind){case"int":H.type="integer",E6(H,"type",Q.message,q);break;case"min":if(q.target==="jsonSchema7")if(Q.inclusive)o(H,"minimum",Q.value,Q.message,q);else o(H,"exclusiveMinimum",Q.value,Q.message,q);else{if(!Q.inclusive)H.exclusiveMinimum=!0;o(H,"minimum",Q.value,Q.message,q)}break;case"max":if(q.target==="jsonSchema7")if(Q.inclusive)o(H,"maximum",Q.value,Q.message,q);else o(H,"exclusiveMaximum",Q.value,Q.message,q);else{if(!Q.inclusive)H.exclusiveMaximum=!0;o(H,"maximum",Q.value,Q.message,q)}break;case"multipleOf":o(H,"multipleOf",Q.value,Q.message,q);break}return H}function I8(n,q){let H=q.target==="openAi",Q={type:"object",properties:{}},X=[],J=n.shape();for(let W in J){let x=J[W];if(x===void 0||x._def===void 0)continue;let Y=SQ(x);if(Y&&H){if(x._def.typeName==="ZodOptional")x=x._def.innerType;if(!x.isNullable())x=x.nullable();Y=!1}let _=F(x._def,{...q,currentPath:[...q.currentPath,"properties",W],propertyPath:[...q.currentPath,"properties",W]});if(_===void 0)continue;if(Q.properties[W]=_,!Y)X.push(W)}if(X.length)Q.required=X;let w=PQ(n,q);if(w!==void 0)Q.additionalProperties=w;return Q}function PQ(n,q){if(n.catchall._def.typeName!=="ZodNever")return F(n.catchall._def,{...q,currentPath:[...q.currentPath,"additionalProperties"]});switch(n.unknownKeys){case"passthrough":return q.allowedAdditionalProperties;case"strict":return q.rejectedAdditionalProperties;case"strip":return q.removeAdditionalStrategy==="strict"?q.allowedAdditionalProperties:q.rejectedAdditionalProperties}}function SQ(n){try{return n.isOptional()}catch{return!0}}var u8=(n,q)=>{if(q.currentPath.toString()===q.propertyPath?.toString())return F(n.innerType._def,q);let H=F(n.innerType._def,{...q,currentPath:[...q.currentPath,"anyOf","1"]});return H?{anyOf:[{not:t(q)},H]}:t(q)};var y8=(n,q)=>{if(q.pipeStrategy==="input")return F(n.in._def,q);else if(q.pipeStrategy==="output")return F(n.out._def,q);let H=F(n.in._def,{...q,currentPath:[...q.currentPath,"allOf","0"]}),Q=F(n.out._def,{...q,currentPath:[...q.currentPath,"allOf",H?"1":"0"]});return{allOf:[H,Q].filter((X)=>X!==void 0)}};function Z8(n,q){return F(n.type._def,q)}function p8(n,q){let Q={type:"array",uniqueItems:!0,items:F(n.valueType._def,{...q,currentPath:[...q.currentPath,"items"]})};if(n.minSize)o(Q,"minItems",n.minSize.value,n.minSize.message,q);if(n.maxSize)o(Q,"maxItems",n.maxSize.value,n.maxSize.message,q);return Q}function g8(n,q){if(n.rest)return{type:"array",minItems:n.items.length,items:n.items.map((H,Q)=>F(H._def,{...q,currentPath:[...q.currentPath,"items",`${Q}`]})).reduce((H,Q)=>Q===void 0?H:[...H,Q],[]),additionalItems:F(n.rest._def,{...q,currentPath:[...q.currentPath,"additionalItems"]})};else return{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((H,Q)=>F(H._def,{...q,currentPath:[...q.currentPath,"items",`${Q}`]})).reduce((H,Q)=>Q===void 0?H:[...H,Q],[])}}function i8(n){return{not:t(n)}}function o8(n){return t(n)}var f8=(n,q)=>{return F(n.innerType._def,q)};var l8=(n,q,H)=>{switch(q){case v.ZodString:return j2(n,H);case v.ZodNumber:return T8(n,H);case v.ZodObject:return I8(n,H);case v.ZodBigInt:return j8(n,H);case v.ZodBoolean:return L8();case v.ZodDate:return P6(n,H);case v.ZodUndefined:return i8(H);case v.ZodNull:return S8(H);case v.ZodArray:return M8(n,H);case v.ZodUnion:case v.ZodDiscriminatedUnion:return k8(n,H);case v.ZodIntersection:return A8(n,H);case v.ZodTuple:return g8(n,H);case v.ZodRecord:return L2(n,H);case v.ZodLiteral:return U8(n,H);case v.ZodEnum:return C8(n);case v.ZodNativeEnum:return E8(n);case v.ZodNullable:return h8(n,H);case v.ZodOptional:return u8(n,H);case v.ZodMap:return m8(n,H);case v.ZodSet:return p8(n,H);case v.ZodLazy:return()=>n.getter()._def;case v.ZodPromise:return Z8(n,H);case v.ZodNaN:case v.ZodNever:return P8(H);case v.ZodEffects:return D8(n,H);case v.ZodAny:return t(H);case v.ZodUnknown:return o8(H);case v.ZodDefault:return N8(n,H);case v.ZodBranded:return M2(n,H);case v.ZodReadonly:return f8(n,H);case v.ZodCatch:return R8(n,H);case v.ZodPipeline:return y8(n,H);case v.ZodFunction:case v.ZodVoid:case v.ZodSymbol:return;default:return((Q)=>{return})(q)}};function F(n,q,H=!1){let Q=q.seen.get(n);if(q.override){let W=q.override?.(n,q,Q,H);if(W!==v8)return W}if(Q&&!H){let W=bQ(Q,q);if(W!==void 0)return W}let X={def:n,path:q.currentPath,jsonSchema:void 0};q.seen.set(n,X);let J=l8(n,n.typeName,q),w=typeof J==="function"?F(J(),q):J;if(w)kQ(n,q,w);if(q.postProcess){let W=q.postProcess(w,n,q);return X.jsonSchema=w,W}return X.jsonSchema=w,w}var bQ=(n,q)=>{switch(q.$refStrategy){case"root":return{$ref:n.path.join("/")};case"relative":return{$ref:B2(q.currentPath,n.path)};case"none":case"seen":{if(n.path.length<q.currentPath.length&&n.path.every((H,Q)=>q.currentPath[Q]===H))return console.warn(`Recursive reference detected at ${q.currentPath.join("/")}! Defaulting to any`),t(q);return q.$refStrategy==="seen"?t(q):void 0}}},kQ=(n,q,H)=>{if(n.description){if(H.description=n.description,q.markdownDescription)H.markdownDescription=n.description}return H};var R2=(n,q)=>{let H=B8(q),Q=typeof q==="object"&&q.definitions?Object.entries(q.definitions).reduce((x,[Y,_])=>({...x,[Y]:F(_._def,{...H,currentPath:[...H.basePath,H.definitionPath,Y]},!0)??t(H)}),{}):void 0,X=typeof q==="string"?q:q?.nameStrategy==="title"?void 0:q?.name,J=F(n._def,X===void 0?H:{...H,currentPath:[...H.basePath,H.definitionPath,X]},!1)??t(H),w=typeof q==="object"&&q.name!==void 0&&q.nameStrategy==="title"?q.name:void 0;if(w!==void 0)J.title=w;if(H.flags.hasReferencedOpenAiAnyType){if(!Q)Q={};if(!Q[H.openAiAnyTypeName])Q[H.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:H.$refStrategy==="relative"?"1":[...H.basePath,H.definitionPath,H.openAiAnyTypeName].join("/")}}}let W=X===void 0?Q?{...J,[H.definitionPath]:Q}:J:{$ref:[...H.$refStrategy==="relative"?[]:H.basePath,H.definitionPath,X].join("/"),[H.definitionPath]:{...Q,[X]:J}};if(H.target==="jsonSchema7")W.$schema="http://json-schema.org/draft-07/schema#";else if(H.target==="jsonSchema2019-09"||H.target==="openAi")W.$schema="https://json-schema.org/draft/2019-09/schema#";if(H.target==="openAi"&&(("anyOf"in W)||("oneOf"in W)||("allOf"in W)||("type"in W)&&Array.isArray(W.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return W};K0();function c8(n){return{name:n.name,description:n.description,category:n.category,pluginName:n.pluginName,sideEffects:n.sideEffects,timeout:n.timeout??30000,parameters:R2(n.parameters,{target:"jsonSchema7"}),returns:R2(n.returns,{target:"jsonSchema7"}),examples:n.examples}}function d8(n){return{version:u,totalCommands:n.length,commands:n.map((q)=>({name:q.name,description:q.description,category:q.category,pluginName:q.pluginName,sideEffects:q.sideEffects}))}}var yQ={C5BA0B7D310E45E68077A0D100F830EA:["crm.wechat.","weixiaozhu."]},ZQ=["crm.wechat.","weixiaozhu."];function z8(n){let q=n?.trim();if(!q)return ZQ;return yQ[q]??[]}function h6(n,q){return z8(q).some((H)=>n.startsWith(H))}function N2(n,q){if(z8(q).length===0)return[...n];return n.filter((H)=>!h6(H.name,q))}function t8(n,q=()=>{return}){return{name:"builtin:schema",version:"1.0.0",commands:[{name:"schema",description:"List all available commands with their descriptions and categories",category:"introspection",pluginName:"builtin:schema",parameters:$.object({}),returns:$.unknown(),examples:[{description:"List all commands",input:{},output:{version:"1.0.0",totalCommands:3,commands:[]}}],sideEffects:["none"],handler:async()=>{let H=n();return d8(N2(H.getAllVisible(),q()))}},{name:"schema.detail",description:"Get detailed JSON Schema for a specific command including parameters, returns, examples, and side effects",category:"introspection",pluginName:"builtin:schema",parameters:$.object({command:$.string().describe("The command name to get schema for")}),returns:$.unknown(),examples:[{description:"Get schema for schema.detail command",input:{command:"schema.detail"},output:{name:"schema.detail",parameters:{},returns:{}}}],sideEffects:["none"],handler:async({command:H})=>{let X=n().get(H);if(!X)throw new on(H);if(h6(X.name,q()))throw new on(H);return c8(X)}}]}}K0();function r8(n,q=()=>{return}){return{name:"builtin:help",version:"1.0.0",commands:[{name:"help",description:"Show structured help information about YunkeCLI and available commands",category:"introspection",pluginName:"builtin:help",parameters:$.object({}),returns:$.unknown(),examples:[{description:"Get help",input:{},output:{name:"yunke-cli",version:"1.0.0",commands:[]}}],sideEffects:["none"],handler:async()=>{let H=n(),Q=N2(H.getAllVisible(),q()),X=[...new Set(Q.map((J)=>J.category))];return{name:"yunke-cli",version:u,description:"AI-native pluggable CLI framework",usage:"yunke <command> [--option value]",globalOptions:[{name:"--help",description:"Show this help message"}],categories:X.map((J)=>({name:J,commands:Q.filter((w)=>w.category===J).map((w)=>({name:w.name,description:w.description}))})),tips:["Use 'yunke schema' to get machine-readable command catalog","Use 'yunke schema.detail --command <name>' to get full JSON Schema for a command"]}}}]}}import{existsSync as pQ,realpathSync as gQ}from"node:fs";import{extname as iQ}from"node:path";function a8(){return{name:"builtin:plugin-manager",version:"1.0.0",commands:[{name:"plugin.list",description:"List all installed plugins with their status",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:$.object({}),returns:$.unknown(),examples:[{description:"List plugins",input:{},output:{plugins:[]}}],sideEffects:["filesystem"],handler:async()=>{return{plugins:An().plugins}}},{name:"plugin.install",description:"Install a plugin from a file system path",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:$.object({path:$.string().describe("Absolute path to the plugin file (.js or .ts)"),name:$.string().optional().describe("Override plugin name")}),returns:$.unknown(),examples:[{description:"Install a plugin",input:{path:"/path/to/my-plugin.js"},output:{installed:!0,name:"my-plugin"}}],sideEffects:["filesystem"],handler:async({path:n,name:q})=>{if(!pQ(n))throw new K("CONFIG_ERROR",`Plugin file not found: ${n}`);let H=gQ(n),Q=[".js",".mjs",".cjs"],X=iQ(H);if(!Q.includes(X))throw new K("CONFIG_ERROR",`Unsupported plugin file extension '${X}'. Allowed: ${Q.join(", ")}`);let J=await import(H),w=J.default??J;if(!w||typeof w!=="object"||!w.name)throw new K("INVALID_PLUGIN","Plugin must export an object with a name field");let W=q??w.name;return x8({name:W,path:H,enabled:!0}),{installed:!0,name:W,path:H}}},{name:"plugin.remove",description:"Remove an installed plugin",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:$.object({name:$.string().describe("Plugin name to remove")}),returns:$.unknown(),examples:[{description:"Remove a plugin",input:{name:"my-plugin"},output:{removed:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!Y8(n))throw new K("CONFIG_ERROR",`Plugin '${n}' not found`);return{removed:!0,name:n}}},{name:"plugin.enable",description:"Enable a disabled plugin",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:$.object({name:$.string().describe("Plugin name to enable")}),returns:$.unknown(),examples:[{description:"Enable a plugin",input:{name:"my-plugin"},output:{enabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!A6(n,!0))throw new K("CONFIG_ERROR",`Plugin '${n}' not found`);return{enabled:!0,name:n}}},{name:"plugin.disable",description:"Disable a plugin without removing it",category:"plugin-management",pluginName:"builtin:plugin-manager",parameters:$.object({name:$.string().describe("Plugin name to disable")}),returns:$.unknown(),examples:[{description:"Disable a plugin",input:{name:"my-plugin"},output:{disabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!A6(n,!1))throw new K("CONFIG_ERROR",`Plugin '${n}' not found`);return{disabled:!0,name:n}}}]}}function e8(){return{name:"builtin:feature-manager",version:"1.0.0",commands:[{name:"feature.list",description:"List all available feature flags and their current status",category:"feature-management",pluginName:"builtin:feature-manager",parameters:$.object({}),returns:$.unknown(),examples:[{description:"List features",input:{},output:{features:[]}}],sideEffects:["filesystem"],handler:async()=>{let n=K2();return{features:Object.entries(n.features).map(([H,Q])=>({name:H,enabled:Q,default:d0[H]??!1}))}}},{name:"feature.enable",description:"Enable an optional feature (takes effect on next run)",category:"feature-management",pluginName:"builtin:feature-manager",parameters:$.object({name:$.string().describe('Feature flag name, e.g. "agenphone"')}),returns:$.unknown(),examples:[{description:"Enable agenphone",input:{name:"agenphone"},output:{enabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!(n in d0))throw new K("CONFIG_ERROR",`Unknown feature flag: '${n}'. Available: ${Object.keys(d0).join(", ")}`);return m6(n,!0),{enabled:!0,name:n,note:"Restart yunke-cli for changes to take effect"}}},{name:"feature.disable",description:"Disable an optional feature (takes effect on next run)",category:"feature-management",pluginName:"builtin:feature-manager",parameters:$.object({name:$.string().describe('Feature flag name, e.g. "agenphone"')}),returns:$.unknown(),examples:[{description:"Disable agenphone",input:{name:"agenphone"},output:{disabled:!0}}],sideEffects:["filesystem"],handler:async({name:n})=>{if(!(n in d0))throw new K("CONFIG_ERROR",`Unknown feature flag: '${n}'. Available: ${Object.keys(d0).join(", ")}`);return m6(n,!1),{disabled:!0,name:n,note:"Restart yunke-cli for changes to take effect"}}}]}}import{readFileSync as oQ,writeFileSync as fQ,mkdirSync as lQ,existsSync as s8}from"node:fs";import{homedir as cQ}from"node:os";import{join as n3}from"node:path";var T6=process.env.YUNKE_CONFIG_DIR??n3(cQ(),".yunke"),I6=n3(T6,"agenphone.json");function b1(){if(!s8(I6))return null;try{let n=oQ(I6,"utf-8");return JSON.parse(n)}catch{return null}}function dQ(n){if(!s8(T6))lQ(T6,{recursive:!0});fQ(I6,JSON.stringify(n,null,2),"utf-8")}function u6(n){let q=b1()??{access_token:"",expires_at:"",device_id:""};dQ({...q,...n})}function $3(n){let q=new Date(n.expires_at).getTime(),H=Date.now(),Q=300000;return H>=q-300000}function zQ(n=process.env.YUNKE_API_BASE_URL){let q=n?.replace(/\/$/,"");return q&&q.length>0?q:"https://agenphone-api.yunke.ai"}var Un=zQ();var tQ=["pending","sent","success","failed","timeout"];function p(n){return $.object({request_id:$.string(),status:$.enum(tQ),action:$.string(),device_id:$.string(),task_id:$.string().nullable(),response:n.nullable(),error:$.string().nullable(),sent_at:$.string(),completed_at:$.string().nullable()})}var P=p($.null());function rQ(){let n=b1();if(!n?.access_token)throw new K("CONFIG_ERROR","未登录,请先运行 'yunke agenphone.auth.login' 登录");if($3(n))throw new K("CONFIG_ERROR","登录已过期,请重新运行 'yunke agenphone.auth.login' 登录");return n.access_token}async function D2(n,q={}){let H=rQ(),Q=`${Un}${n}`,X={"Content-Type":"application/json",Authorization:`Bearer ${H}`,...q.headers??{}},J=await fetch(Q,{...q,headers:X});if(J.status===401)throw new K("CONFIG_ERROR","认证失败,请重新运行 'yunke agenphone.auth.login' 登录");if(!J.ok){let W=`HTTP ${J.status}`;try{let x=await J.json();if(x.message)W=x.message}catch{}throw new K("EXECUTION_FAILED",`AgenPhone API 错误: ${W}`)}return(await J.json()).data}async function y6(n,q={}){let H=`${Un}${n}`,Q={"Content-Type":"application/json",...q.headers??{}},X=await fetch(H,{...q,headers:Q});if(!X.ok){let w=`HTTP ${X.status}`;try{let W=await X.json();if(W.message)w=W.message}catch{}throw new K("EXECUTION_FAILED",`AgenPhone API 错误: ${w}`)}return(await X.json()).data}async function R(n,q,H){return D2("/api/v1/common/execute",{method:"POST",body:JSON.stringify({action:n,params:q??null,task_id:H??null})})}var Z6="agenphone";function aQ(){let n=b1();if(!n?.device_id)throw new K("CONFIG_ERROR","设备 ID 未配置,请先运行 'yunke agenphone.auth.setup --device_id <id>' 设置设备 ID");return n.device_id}var q3={name:"agenphone.auth.setup",description:"Initialize AgenPhone config: Run this once before any other agenphone commands.",category:"agenphone",pluginName:Z6,parameters:$.object({device_id:$.string().min(1).describe("Target device ID to control, e.g. dev_abc12345")}),returns:$.object({device_id:$.string(),saved:$.boolean()}),examples:[{description:"Setup AgenPhone",input:{device_id:"dev_abc12345"},output:{device_id:"dev_abc12345",saved:!0}}],sideEffects:["filesystem"],handler:async({device_id:n})=>{return u6({device_id:n}),{device_id:n,saved:!0}}},H3={name:"agenphone.auth.send-code",description:'Send SMS verification code to phone number for AgenPhone login. Requires agenphone.auth.setup to be run first. Returns both `token` and `sms_id` (same value); use `sms_id` if your agent redacts fields named "token", and pass the value as-is to agenphone.auth.login --token <sms_id>.',category:"agenphone",pluginName:Z6,parameters:$.object({phone_number:$.string().describe("Chinese mobile phone number (11 digits)")}),returns:$.object({token:$.string().describe('SMS session token; may be redacted by agents that mask "token" fields'),sms_id:$.string().describe("Same value as `token`, exposed under a non-redacted name as a workaround for agent token masking")}),examples:[{description:"Send verification code",input:{phone_number:"13800138000"},output:{token:"sms_token_xxx",sms_id:"sms_token_xxx"}}],sideEffects:["network"],handler:async({phone_number:n})=>{let q=await y6("/api/v1/sms/send",{method:"POST",body:JSON.stringify({phone_number:n})});return{token:q.token,sms_id:q.token}}},Q3={name:"agenphone.auth.login",description:"Login to AgenPhone with SMS verification code. Reads device_id from config (set via agenphone.auth.setup). Saves JWT token to ~/.yunke/agenphone.json.",category:"agenphone",pluginName:Z6,parameters:$.object({token:$.string().describe("SMS token returned by agenphone.auth.send-code"),code:$.string().length(6).describe("6-digit SMS verification code")}),returns:$.object({success:$.boolean(),device_id:$.string(),expires_in:$.number()}),examples:[{description:"Login with SMS code",input:{token:"sms_token",code:"123456"},output:{success:!0,device_id:"dev_abc12345",expires_in:2592000}}],sideEffects:["filesystem","network"],handler:async({token:n,code:q})=>{let H=aQ(),Q=await y6("/api/v1/auth/cli-login",{method:"POST",body:JSON.stringify({token:n,code:q,device_id:H})}),X=new Date(Date.now()+Q.expires_in*1000).toISOString();return u6({access_token:Q.access_token,expires_at:X,device_id:Q.device_id}),{success:!0,device_id:Q.device_id,expires_in:Q.expires_in}}};var Fn="agenphone",X3={name:"agenphone.app.open",description:"Open an app by package name or URL. On success response is null.",category:"agenphone",pluginName:Fn,parameters:$.object({package_name:$.string().min(1).optional().describe("Android package name, e.g. com.tencent.mm"),url:$.string().optional().describe("URL scheme to open")}),returns:P,examples:[{description:"Open WeChat",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"open_app",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("open_app",n)},J3={name:"agenphone.app.list-packages",description:"List installed apps. Use thirdPartyOnly=true to skip system apps. response.packages contains the list.",category:"agenphone",pluginName:Fn,parameters:$.object({thirdPartyOnly:$.boolean().optional().describe("Only return third-party apps, default false"),includeVersions:$.boolean().optional().describe("Include version_name and version_code, default false")}),returns:p($.object({packages:$.array($.object({package_name:$.string(),app_name:$.string(),version_name:$.string().optional(),version_code:$.number().int().optional()}))})),examples:[{description:"List packages",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_packages",device_id:"dev_abc12345",task_id:null,response:{packages:[{package_name:"com.tencent.mm",app_name:"WeChat"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("list_packages",n)},w3={name:"agenphone.app.foreground",description:"Get the package name and class name of the currently visible foreground app.",category:"agenphone",pluginName:Fn,parameters:$.object({}),returns:p($.object({foreground_package:$.string(),foreground_className:$.string()})),examples:[{description:"Get foreground app",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_foreground_app",device_id:"dev_abc12345",task_id:null,response:{foreground_package:"com.tencent.mm",foreground_className:"com.tencent.mm.MainActivity"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_foreground_app")},W3={name:"agenphone.app.info",description:"Get version and name info for a specific installed app.",category:"agenphone",pluginName:Fn,parameters:$.object({package_name:$.string().min(1).describe("App package name")}),returns:p($.object({package_name:$.string(),app_name:$.string(),version_name:$.string(),version_code:$.number().int()})),examples:[{description:"Get WeChat info",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"get_app_info",device_id:"dev_abc12345",task_id:null,response:{package_name:"com.tencent.mm",app_name:"WeChat",version_name:"8.0",version_code:800},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("get_app_info",n)},x3={name:"agenphone.app.force-stop",description:"Force stop a running app. Requires EnterpriseProvider or root. On success response is null.",category:"agenphone",pluginName:Fn,parameters:$.object({package_name:$.string().min(1).describe("App package name to force stop")}),returns:P,examples:[{description:"Force stop WeChat",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"force_stop_app",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("force_stop_app",n)},Y3={name:"agenphone.app.uninstall",description:"Silently uninstall an app. Requires EnterpriseProvider or root. On success response is null.",category:"agenphone",pluginName:Fn,parameters:$.object({package_name:$.string().min(1).describe("App package name to uninstall")}),returns:P,examples:[{description:"Uninstall app",input:{package_name:"com.example.app"},output:{request_id:"req_7f3a2b",status:"success",action:"uninstall_app",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("uninstall_app",n)},_3={name:"agenphone.app.clear-data",description:"Clear all data and cache for an app. Requires EnterpriseProvider or root. On success response is null.",category:"agenphone",pluginName:Fn,parameters:$.object({package_name:$.string().min(1).describe("App package name to clear data for")}),returns:P,examples:[{description:"Clear WeChat data",input:{package_name:"com.tencent.mm"},output:{request_id:"req_7f3a2b",status:"success",action:"clear_app_data",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("clear_app_data",n)};var Wn="agenphone",G3={name:"agenphone.comm.call",description:"Initiate a phone call. On success response is null.",category:"agenphone",pluginName:Wn,parameters:$.object({phone_number:$.string().describe("Phone number to call")}),returns:P,examples:[{description:"Call a number",input:{phone_number:"13800138000"},output:{request_id:"req_7f3a2b",status:"success",action:"call",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("call",n)},O3={name:"agenphone.comm.hang-up",description:"Hang up the current phone call. On success response is null.",category:"agenphone",pluginName:Wn,parameters:$.object({}),returns:P,examples:[{description:"Hang up call",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"hang_up",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("hang_up")},V3={name:"agenphone.comm.answer",description:"Answer an incoming phone call. On success response is null.",category:"agenphone",pluginName:Wn,parameters:$.object({}),returns:P,examples:[{description:"Answer call",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"answer_call",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("answer_call")},v3={name:"agenphone.comm.list-contacts",description:"List contacts (requires READ_CONTACTS). response.contact_list contains entries with id, display_name, numbers.",category:"agenphone",pluginName:Wn,parameters:$.object({limit:$.number().int().positive().optional().describe("Max results to return, default 50"),offset:$.number().int().min(0).optional().describe("Skip N entries, default 0")}),returns:p($.object({contact_list:$.array($.object({id:$.string(),display_name:$.string(),numbers:$.array($.string())}))})),examples:[{description:"List contacts",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_contacts",device_id:"dev_abc12345",task_id:null,response:{contact_list:[{id:"1",display_name:"Alice",numbers:["13800138000"]}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("list_contacts",n)},K3={name:"agenphone.comm.search-contacts",description:"Search contacts by name or number. response.contacts contains matches.",category:"agenphone",pluginName:Wn,parameters:$.object({name:$.string().optional().describe("Fuzzy match on display name"),number:$.string().optional().describe("Filter by having this number"),limit:$.number().int().positive().optional().describe("Max results, default 20")}),returns:p($.object({contacts:$.array($.object({id:$.string(),display_name:$.string()}))})),examples:[{description:"Search by name",input:{name:"Alice"},output:{request_id:"req_7f3a2b",status:"success",action:"search_contacts",device_id:"dev_abc12345",task_id:null,response:{contacts:[{id:"1",display_name:"Alice"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("search_contacts",n)},B3={name:"agenphone.comm.list-call-log",description:"List recent call log (requires READ_CALL_LOG). response.call_log contains entries with number, type_name (incoming/outgoing/missed), date (ms), duration (s).",category:"agenphone",pluginName:Wn,parameters:$.object({limit:$.number().int().positive().optional().describe("Max results, default 50"),offset:$.number().int().min(0).optional().describe("Skip N entries, default 0")}),returns:p($.object({call_log:$.array($.object({number:$.string(),type:$.number().int(),type_name:$.enum(["incoming","outgoing","missed"]),date:$.number(),duration:$.number().int(),name:$.string().optional()}))})),examples:[{description:"List call log",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_call_log",device_id:"dev_abc12345",task_id:null,response:{call_log:[{number:"10086",type:1,type_name:"incoming",date:1709123456789,duration:120}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("list_call_log",n)},M3={name:"agenphone.comm.send-sms",description:"Send an SMS message. On success response is null.",category:"agenphone",pluginName:Wn,parameters:$.object({phone_number:$.string().describe("Recipient phone number"),message:$.string().min(1).describe("SMS message content")}),returns:P,examples:[{description:"Send SMS",input:{phone_number:"13800138000",message:"Hello"},output:{request_id:"req_7f3a2b",status:"success",action:"send_sms",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("send_sms",n)},j3={name:"agenphone.comm.read-sms",description:"Read SMS inbox (requires READ_SMS). response.sms_list contains entries with address, body, date (ms).",category:"agenphone",pluginName:Wn,parameters:$.object({limit:$.number().int().positive().optional().describe("Max results, default 50"),offset:$.number().int().min(0).optional().describe("Skip N entries, default 0")}),returns:p($.object({sms_list:$.array($.object({address:$.string(),body:$.string(),date:$.number()}))})),examples:[{description:"Read SMS",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"read_sms",device_id:"dev_abc12345",task_id:null,response:{sms_list:[{address:"10086",body:"余额10元",date:1709123456789}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("read_sms",n)};var x0="agenphone",L3={name:"agenphone.screen.tap",description:"Tap a coordinate on the screen. Requires accessibility or root. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({x:$.number().int().describe("X coordinate in pixels"),y:$.number().int().describe("Y coordinate in pixels")}),returns:P,examples:[{description:"Tap center",input:{x:540,y:960},output:{request_id:"req_7f3a2b",status:"success",action:"tap",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("tap",n)},R3={name:"agenphone.screen.swipe",description:"Swipe from one coordinate to another. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({start_x:$.number().int().describe("Start X coordinate"),start_y:$.number().int().describe("Start Y coordinate"),end_x:$.number().int().describe("End X coordinate"),end_y:$.number().int().describe("End Y coordinate"),duration:$.number().int().positive().optional().describe("Swipe duration in ms, default 300")}),returns:P,examples:[{description:"Swipe up",input:{start_x:540,start_y:1500,end_x:540,end_y:500},output:{request_id:"req_7f3a2b",status:"success",action:"swipe",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("swipe",n)},N3={name:"agenphone.screen.drag",description:"Long-press drag from one position to another. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({start_x:$.number().int().describe("Start X coordinate"),start_y:$.number().int().describe("Start Y coordinate"),end_x:$.number().int().describe("End X coordinate"),end_y:$.number().int().describe("End Y coordinate"),duration:$.number().int().positive().optional().describe("Drag duration in ms, default 400")}),returns:P,examples:[{description:"Drag element",input:{start_x:100,start_y:200,end_x:300,end_y:400},output:{request_id:"req_7f3a2b",status:"success",action:"drag",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("drag",n)},D3={name:"agenphone.screen.input",description:"Tap a coordinate then input text into that field. Requires accessibility or root. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({text:$.string().min(1).describe("Text to input"),x:$.number().int().optional().describe("X coordinate to tap first for focus"),y:$.number().int().optional().describe("Y coordinate to tap first for focus")}),returns:P,examples:[{description:"Type text",input:{text:"hello world",x:540,y:500},output:{request_id:"req_7f3a2b",status:"success",action:"input_text",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("input_text",n)},C3={name:"agenphone.screen.long-press",description:"Long press at a coordinate. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({x:$.number().int().describe("X coordinate"),y:$.number().int().describe("Y coordinate"),duration:$.number().int().positive().optional().describe("Long press duration in ms, default 1500")}),returns:P,examples:[{description:"Long press",input:{x:540,y:960},output:{request_id:"req_7f3a2b",status:"success",action:"long_press",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("long_press",n)},A3={name:"agenphone.screen.global-action",description:"Perform a system global action via accessibility. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({action:$.enum(["back","home","recents"]).describe("System action: back=go back, home=go to home screen, recents=open recent apps")}),returns:P,examples:[{description:"Press home",input:{action:"home"},output:{request_id:"req_7f3a2b",status:"success",action:"global_action",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("global_action",n)},U3={name:"agenphone.screen.screenshot",description:"Take a screenshot. Returns an OSS image URL (not base64). Use this to visually inspect the current screen state.",category:"agenphone",pluginName:x0,parameters:$.object({}),returns:$.object({image_url:$.string().url().describe("Screenshot image URL (hosted on OSS)"),width:$.number().int().describe("Image width in pixels"),height:$.number().int().describe("Image height in pixels")}),examples:[{description:"Take screenshot",input:{},output:{image_url:"https://oss.example.com/xxx.png",width:1080,height:1920}}],sideEffects:["network"],handler:async()=>D2("/api/v1/device/screenshot",{method:"POST",body:JSON.stringify({})})},F3={name:"agenphone.screen.ui-tree",description:"Get the accessibility node tree of the current screen. Requires accessibility service enabled. response.hierarchy is the full UI tree.",category:"agenphone",pluginName:x0,parameters:$.object({}),returns:p($.object({hierarchy:$.record($.unknown())})),examples:[{description:"Get UI tree",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_screen_hierarchy",device_id:"dev_abc12345",task_id:null,response:{hierarchy:{}},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_screen_hierarchy")},m3={name:"agenphone.screen.find-element",description:"Find a UI element by text or view_id. response.found indicates if found; response.center_x/center_y give the tap coordinates.",category:"agenphone",pluginName:x0,parameters:$.object({text:$.string().optional().describe("Element visible text to find"),view_id:$.string().optional().describe("Element resource view ID"),class_name:$.string().optional().describe("Limit to a specific widget class")}),returns:p($.object({found:$.boolean(),center_x:$.number().optional(),center_y:$.number().optional()})),examples:[{description:"Find by text",input:{text:"登录"},output:{request_id:"req_7f3a2b",status:"success",action:"find_element",device_id:"dev_abc12345",task_id:null,response:{found:!0,center_x:540,center_y:960},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("find_element",n)},E3={name:"agenphone.screen.click-by-text",description:"Find a UI element by its visible text and click it. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({text:$.string().min(1).describe("Visible text of the element to click")}),returns:P,examples:[{description:"Click login button",input:{text:"登录"},output:{request_id:"req_7f3a2b",status:"success",action:"click_by_text",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("click_by_text",n)},P3={name:"agenphone.screen.click-by-id",description:"Find a UI element by its resource view_id and click it. On success response is null.",category:"agenphone",pluginName:x0,parameters:$.object({view_id:$.string().min(1).describe("Resource ID, e.g. com.example:id/btn_login")}),returns:P,examples:[{description:"Click by ID",input:{view_id:"com.example:id/btn_login"},output:{request_id:"req_7f3a2b",status:"success",action:"click_by_view_id",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("click_by_view_id",n)},S3={name:"agenphone.screen.unlock",description:"Wake the screen and attempt to dismiss the lock screen. response.screen_woken indicates wake success; response.keyguard_dismissed indicates lock dismissed (may be false on Android 8+).",category:"agenphone",pluginName:x0,parameters:$.object({}),returns:p($.object({screen_woken:$.boolean(),keyguard_dismissed:$.boolean()})),examples:[{description:"Unlock screen",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"unlock_device",device_id:"dev_abc12345",task_id:null,response:{screen_woken:!0,keyguard_dismissed:!1},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("unlock_device")},b3={name:"agenphone.screen.set-brightness",description:"Set screen brightness (requires WRITE_SETTINGS). response.brightness is the applied value.",category:"agenphone",pluginName:x0,parameters:$.object({brightness:$.number().int().min(0).max(255).describe("Brightness level 0–255")}),returns:p($.object({brightness:$.number().int()})),examples:[{description:"Set brightness to 128",input:{brightness:128},output:{request_id:"req_7f3a2b",status:"success",action:"set_brightness",device_id:"dev_abc12345",task_id:null,response:{brightness:128},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("set_brightness",n)},k3={name:"agenphone.screen.gui-analyze",description:"Analyze a screenshot with the Doubao vision model and return the suggested next action. Does NOT execute the action — use tap/swipe/input/etc to execute. "+"Returns { thought, action_raw, action } where action.type ∈ {click, long_press, type, scroll, drag, open_app, press_home, press_back, hotkey, wait, finished, left_double, right_single, unknown}. "+"Coordinate actions carry x/y; type carries content; scroll carries x/y/direction; drag carries start_x/start_y/end_x/end_y; hotkey carries key; open_app carries package_name; finished carries content.",category:"agenphone",pluginName:x0,parameters:$.object({instruction:$.string().min(1).describe('Task instruction, e.g. "打开微信并给张三发消息"'),image_url:$.string().url().describe("Screenshot URL (OSS/HTTPS). Get one from agenphone.screen.screenshot first."),img_width:$.number().int().positive().describe("Screenshot width in pixels (pass `width` from agenphone.screen.screenshot)"),img_height:$.number().int().positive().describe("Screenshot height in pixels (pass `height` from agenphone.screen.screenshot)"),platform:$.enum(["phone","computer"]).optional().describe("GUI scene, default phone"),language:$.string().min(1).optional().describe("Language used in Thought, default Chinese"),history:$.array($.object({role:$.enum(["user","assistant"]).describe("Who produced this turn"),content:$.unknown().describe("Turn content (prior instruction or action result)")})).optional().describe("Prior turns for multi-turn analysis")}),returns:$.object({thought:$.string().describe("Model reasoning / plan for the next step"),action_raw:$.string().describe("Raw model action string before parsing"),action:$.record($.unknown()).describe("Parsed action. Always has `type`. See command description for type-specific fields.")}),examples:[{description:"Analyze a phone screenshot",input:{instruction:"打开微信",image_url:"https://oss.example.com/xxx.png",img_width:1080,img_height:1920},output:{thought:"我需要点击微信图标",action_raw:"click(point='<point>300 500</point>')",action:{type:"click",x:324,y:960}}}],sideEffects:["network"],handler:async(n)=>D2("/api/v1/device/gui-analyze",{method:"POST",body:JSON.stringify(n)})};var Z0="agenphone",h3={name:"agenphone.device.status",description:"Get screen on/off status. response.screen_on: 0=screen on, 1=screen off.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:p($.object({screen_on:$.number().int().describe("0=screen on, 1=screen off")})),examples:[{description:"Get status",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_status",device_id:"dev_abc12345",task_id:null,response:{screen_on:0},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_status")},T3={name:"agenphone.device.info",description:"Get comprehensive device info. response contains model, manufacturer, sdk, battery_level, battery_charging, network_type, wifi_connected, storage_total_mb, storage_available_mb, memory_total_mb, memory_available_mb, screen_brightness, locale, foreground_package, etc.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:p($.object({model:$.string(),manufacturer:$.string(),sdk:$.number().int(),release:$.string(),battery_level:$.number().int(),battery_charging:$.boolean(),network_type:$.string(),wifi_connected:$.boolean(),mobile_connected:$.boolean(),storage_total_mb:$.number(),storage_available_mb:$.number(),memory_total_mb:$.number(),memory_available_mb:$.number(),screen_rotation:$.number().int(),screen_orientation:$.string(),foreground_package:$.string(),foreground_className:$.string(),screen_brightness:$.number().int(),language:$.string(),language_country:$.string(),locale:$.string(),imei:$.string().optional()})),examples:[{description:"Get device info",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_device_info",device_id:"dev_abc12345",task_id:null,response:{model:"Pixel 6",manufacturer:"Google",sdk:33,release:"13",battery_level:85,battery_charging:!1,network_type:"wifi",wifi_connected:!0,mobile_connected:!1,storage_total_mb:128000,storage_available_mb:64000,memory_total_mb:8192,memory_available_mb:2048,screen_rotation:0,screen_orientation:"portrait",foreground_package:"com.android.chrome",foreground_className:"...",screen_brightness:128,language:"zh",language_country:"CN",locale:"zh-CN"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_device_info")},I3={name:"agenphone.device.battery",description:"Get battery level and charging status. response.battery_level is 0–100; response.battery_charging is true when charging.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:p($.object({battery_level:$.number().int(),battery_charging:$.boolean()})),examples:[{description:"Get battery",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_battery",device_id:"dev_abc12345",task_id:null,response:{battery_level:85,battery_charging:!1},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_battery")},u3={name:"agenphone.device.volume",description:"Get current volume levels. response contains media_volume, media_max, alarm_volume, ring_volume.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:p($.object({media_volume:$.number().int(),media_max:$.number().int(),alarm_volume:$.number().int(),ring_volume:$.number().int()})),examples:[{description:"Get volume",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_volume",device_id:"dev_abc12345",task_id:null,response:{media_volume:10,media_max:15,alarm_volume:5,ring_volume:8},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_volume")},y3={name:"agenphone.device.location",description:"Get last known GPS location (requires ACCESS_FINE_LOCATION). response.latitude and response.longitude are decimal degrees.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:p($.object({latitude:$.number(),longitude:$.number()})),examples:[{description:"Get location",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_location",device_id:"dev_abc12345",task_id:null,response:{latitude:39.9042,longitude:116.4074},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_location")},Z3={name:"agenphone.device.lock-status",description:"Get screen and lock status. response.lock_type: none/pattern/pin/password/unknown.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:p($.object({screen_on:$.boolean(),is_locked:$.boolean(),lock_type:$.enum(["none","pattern","pin","password","unknown"])})),examples:[{description:"Get lock status",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_lock_status",device_id:"dev_abc12345",task_id:null,response:{screen_on:!0,is_locked:!0,lock_type:"pattern"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_lock_status")},p3={name:"agenphone.device.reboot",description:"Reboot the device. Requires root or EnterpriseProvider. On success response is null.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:P,examples:[{description:"Reboot",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"reboot",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("reboot")},g3={name:"agenphone.device.shutdown",description:"Shut down the device. Requires root or EnterpriseProvider. On success response is null.",category:"agenphone",pluginName:Z0,parameters:$.object({}),returns:P,examples:[{description:"Shutdown",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"shutdown",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("shutdown")},i3={name:"agenphone.device.set-volume",description:"Set volume for an audio stream. level must be 0 to the stream max (see agenphone.device.volume). On success response is null.",category:"agenphone",pluginName:Z0,parameters:$.object({stream:$.enum(["media","alarm","ring"]).optional().describe("Audio stream, default media"),level:$.number().int().min(0).describe("Volume level (0 to stream max)")}),returns:P,examples:[{description:"Set media volume",input:{stream:"media",level:10},output:{request_id:"req_7f3a2b",status:"success",action:"set_volume",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("set_volume",n)},o3={name:"agenphone.device.vibrate",description:"Vibrate the device (requires VIBRATE permission). On success response is null.",category:"agenphone",pluginName:Z0,parameters:$.object({duration:$.number().int().positive().optional().describe("Vibration duration in ms, default 200")}),returns:P,examples:[{description:"Vibrate 500ms",input:{duration:500},output:{request_id:"req_7f3a2b",status:"success",action:"vibrate",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("vibrate",n)};var f3="agenphone",l3={name:"agenphone.clipboard.get",description:"Read current clipboard text. response.clipboard_text is empty string if clipboard is empty.",category:"agenphone",pluginName:f3,parameters:$.object({}),returns:p($.object({clipboard_text:$.string()})),examples:[{description:"Get clipboard",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"get_clipboard",device_id:"dev_abc12345",task_id:null,response:{clipboard_text:"copied text"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("get_clipboard")},c3={name:"agenphone.clipboard.set",description:"Set clipboard text on the device. On success response is null.",category:"agenphone",pluginName:f3,parameters:$.object({content:$.string().describe("Text to write to clipboard")}),returns:P,examples:[{description:"Set clipboard",input:{content:"hello"},output:{request_id:"req_7f3a2b",status:"success",action:"set_clipboard",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("set_clipboard",n)};var xn="agenphone",d3={name:"agenphone.file.list",description:"List files and subdirectories. response.files contains entries with name, path, is_dir, size (bytes).",category:"agenphone",pluginName:xn,parameters:$.object({path:$.string().describe("Directory path on device, e.g. /sdcard/")}),returns:p($.object({files:$.array($.object({name:$.string(),path:$.string(),is_dir:$.boolean(),size:$.number()}))})),examples:[{description:"List sdcard",input:{path:"/sdcard/"},output:{request_id:"req_7f3a2b",status:"success",action:"list_files",device_id:"dev_abc12345",task_id:null,response:{files:[{name:"doc.txt",path:"/sdcard/doc.txt",is_dir:!1,size:1024}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("list_files",n)},z3={name:"agenphone.file.read",description:'Read file content. Text files (≤512KB): response.content is UTF-8 string, response.encoding="utf-8". Image files (jpg/png/gif): response.content_base64 is base64, response.encoding="base64".',category:"agenphone",pluginName:xn,parameters:$.object({path:$.string().describe("File path on device")}),returns:p($.union([$.object({content:$.string(),encoding:$.literal("utf-8")}),$.object({content_base64:$.string(),encoding:$.literal("base64")})])),examples:[{description:"Read text file",input:{path:"/sdcard/note.txt"},output:{request_id:"req_7f3a2b",status:"success",action:"read_file",device_id:"dev_abc12345",task_id:null,response:{content:"hello",encoding:"utf-8"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("read_file",n)},t3={name:"agenphone.file.write",description:"Write text to a file (parent dirs created if needed). On success response is null.",category:"agenphone",pluginName:xn,parameters:$.object({path:$.string().describe("File path on device"),content:$.string().optional().describe("Text content to write, default empty string")}),returns:P,examples:[{description:"Write file",input:{path:"/sdcard/note.txt",content:"hello"},output:{request_id:"req_7f3a2b",status:"success",action:"write_file",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("write_file",n)},r3={name:"agenphone.file.delete",description:"Delete a file on the device. On success response is null.",category:"agenphone",pluginName:xn,parameters:$.object({path:$.string().describe("File path to delete")}),returns:P,examples:[{description:"Delete file",input:{path:"/sdcard/old.txt"},output:{request_id:"req_7f3a2b",status:"success",action:"delete_file",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("delete_file",n)},a3={name:"agenphone.file.analyze-storage",description:"Analyze total size and file count in a directory. response contains path, total_bytes, file_count.",category:"agenphone",pluginName:xn,parameters:$.object({path:$.string().describe("Directory path to analyze"),maxDepth:$.number().int().positive().optional().describe("Recursion depth, default 3"),minSizeMB:$.number().min(0).optional().describe("Only count files >= this size in MB, default 0")}),returns:p($.object({path:$.string(),total_bytes:$.number(),file_count:$.number().int()})),examples:[{description:"Analyze sdcard",input:{path:"/sdcard"},output:{request_id:"req_7f3a2b",status:"success",action:"analyze_storage",device_id:"dev_abc12345",task_id:null,response:{path:"/sdcard",total_bytes:104857600,file_count:50},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("analyze_storage",n)},e3={name:"agenphone.file.find-large",description:"Find files larger than minSize bytes. response.files contains entries with path and size (bytes).",category:"agenphone",pluginName:xn,parameters:$.object({path:$.string().describe("Root directory to search"),minSize:$.number().positive().optional().describe("Minimum file size in bytes, e.g. 10485760 for 10MB"),limit:$.number().int().positive().optional().describe("Max results, default 50")}),returns:p($.object({files:$.array($.object({path:$.string(),size:$.number()}))})),examples:[{description:"Find large files",input:{path:"/sdcard",minSize:10485760},output:{request_id:"req_7f3a2b",status:"success",action:"find_large_files",device_id:"dev_abc12345",task_id:null,response:{files:[{path:"/sdcard/video.mp4",size:52428800}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("find_large_files",n)},s3={name:"agenphone.file.index-media",description:"Index image metadata from media library (up to 200 items). response.items contains entries with id, path, date_added.",category:"agenphone",pluginName:xn,parameters:$.object({}),returns:p($.object({items:$.array($.object({id:$.string(),path:$.string(),date_added:$.number()}))})),examples:[{description:"Index media",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"index_media_metadata",device_id:"dev_abc12345",task_id:null,response:{items:[{id:"1",path:"/sdcard/DCIM/photo.jpg",date_added:1709123456}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("index_media_metadata")},n5={name:"agenphone.file.search-media",description:"Search media library by type and keyword. response.items contains entries with id, path, display_name.",category:"agenphone",pluginName:xn,parameters:$.object({mediaType:$.enum(["image","video","audio"]).optional().describe("Media type, default image"),keyword:$.string().optional().describe("Filename or path keyword"),limit:$.number().int().positive().optional().describe("Max results, default 10")}),returns:p($.object({items:$.array($.object({id:$.string(),path:$.string(),display_name:$.string().optional()}))})),examples:[{description:"Search images",input:{mediaType:"image"},output:{request_id:"req_7f3a2b",status:"success",action:"search_media",device_id:"dev_abc12345",task_id:null,response:{items:[{id:"1",path:"/sdcard/DCIM/photo.jpg",display_name:"photo.jpg"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("search_media",n)};var $5="agenphone",q5={name:"agenphone.audio.play",description:"Play audio from a URI or local path. On success response is null.",category:"agenphone",pluginName:$5,parameters:$.object({uri:$.string().describe("Media URI or absolute local path, e.g. /sdcard/audio.mp3")}),returns:P,examples:[{description:"Play audio",input:{uri:"/sdcard/audio.mp3"},output:{request_id:"req_7f3a2b",status:"success",action:"play_audio",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("play_audio",n)},H5={name:"agenphone.audio.stop",description:"Stop the currently playing audio. On success response is null.",category:"agenphone",pluginName:$5,parameters:$.object({}),returns:P,examples:[{description:"Stop audio",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"stop_audio",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("stop_audio")};var C2="agenphone",Q5={name:"agenphone.notification.read",description:"Read notifications captured by NotificationListener. response.notifications contains entries with key, package_name, title, body, post_time (ms).",category:"agenphone",pluginName:C2,parameters:$.object({}),returns:p($.object({notifications:$.array($.object({key:$.string(),package_name:$.string(),title:$.string(),body:$.string(),post_time:$.number()}))})),examples:[{description:"Read notifications",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"read_notifications",device_id:"dev_abc12345",task_id:null,response:{notifications:[{key:"pkg|1|tag",package_name:"com.example.app",title:"标题",body:"内容",post_time:1709123456789}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("read_notifications")},X5={name:"agenphone.notification.post",description:"Post a system notification from this app (useful for testing). On success response is null.",category:"agenphone",pluginName:C2,parameters:$.object({title:$.string().optional().describe('Notification title, default "DevSupport"'),body:$.string().optional().describe("Notification body content")}),returns:P,examples:[{description:"Post notification",input:{title:"Alert",body:"Hello"},output:{request_id:"req_7f3a2b",status:"success",action:"post_notification",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("post_notification",n)},J5={name:"agenphone.notification.dismiss",description:"Dismiss a notification by key (requires NotificationListener). Use agenphone.notification.read to get keys. On success response is null.",category:"agenphone",pluginName:C2,parameters:$.object({key:$.string().describe("Notification key from read_notifications")}),returns:P,examples:[{description:"Dismiss notification",input:{key:"pkg|1|tag"},output:{request_id:"req_7f3a2b",status:"success",action:"dismiss_notification",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("dismiss_notification",n)},w5={name:"agenphone.notification.dismiss-all",description:"Dismiss all notifications posted by this app (does not affect other apps). On success response is null.",category:"agenphone",pluginName:C2,parameters:$.object({}),returns:P,examples:[{description:"Dismiss all",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"dismiss_all_notifications",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("dismiss_all_notifications")};var k1="agenphone",W5={name:"agenphone.overlay.toast",description:"Show a toast/instruction-log message on the device screen. On success response is null.",category:"agenphone",pluginName:k1,parameters:$.object({message:$.string().min(1).describe("Message text to display")}),returns:P,examples:[{description:"Show toast",input:{message:"Hello!"},output:{request_id:"req_7f3a2b",status:"success",action:"show_toast",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("show_toast",n)},x5={name:"agenphone.overlay.show",description:"Show a floating overlay window. response.overlay_id is the ID needed to hide it later.",category:"agenphone",pluginName:k1,parameters:$.object({text:$.string().optional().describe("Text to display in the overlay")}),returns:p($.object({overlay_id:$.string().describe("ID to use with agenphone.overlay.hide")})),examples:[{description:"Show overlay",input:{text:"Status: OK"},output:{request_id:"req_7f3a2b",status:"success",action:"show_overlay",device_id:"dev_abc12345",task_id:null,response:{overlay_id:"overlay_abc123"},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async(n)=>R("show_overlay",n)},Y5={name:"agenphone.overlay.hide",description:"Hide a specific overlay by its ID (from agenphone.overlay.show). On success response is null.",category:"agenphone",pluginName:k1,parameters:$.object({overlay_id:$.string().describe("Overlay ID returned by agenphone.overlay.show")}),returns:P,examples:[{description:"Hide overlay",input:{overlay_id:"overlay_abc123"},output:{request_id:"req_7f3a2b",status:"success",action:"hide_overlay",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("hide_overlay",n)},_5={name:"agenphone.overlay.hide-all",description:"Hide all overlays managed by this app. On success response is null.",category:"agenphone",pluginName:k1,parameters:$.object({}),returns:P,examples:[{description:"Hide all overlays",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"hide_all_overlays",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async()=>R("hide_all_overlays")},G5={name:"agenphone.overlay.list",description:"List all currently visible overlays. response.overlays contains entries with overlay_id and text.",category:"agenphone",pluginName:k1,parameters:$.object({}),returns:p($.object({overlays:$.array($.object({overlay_id:$.string(),text:$.string()}))})),examples:[{description:"List overlays",input:{},output:{request_id:"req_7f3a2b",status:"success",action:"list_overlays",device_id:"dev_abc12345",task_id:null,response:{overlays:[{overlay_id:"overlay_abc123",text:"Status: OK"}]},error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:"2026-09-15T10:00:02+08:00"}}],sideEffects:["network"],handler:async()=>R("list_overlays")};var eQ="agenphone",O5={name:"agenphone.tts.speak",description:"Speak text aloud using system TTS engine. On success response is null.",category:"agenphone",pluginName:eQ,parameters:$.object({text:$.string().min(1).describe("Text to speak"),locale:$.string().optional().describe("Locale code, e.g. zh-CN, en-US"),speed:$.number().min(0.5).max(2).optional().describe("Speech speed 0.5–2.0, default 1.0")}),returns:P,examples:[{description:"Speak text",input:{text:"你好世界"},output:{request_id:"req_7f3a2b",status:"success",action:"speak_tts",device_id:"dev_abc12345",task_id:null,response:null,error:null,sent_at:"2026-09-15T10:00:00+08:00",completed_at:null}}],sideEffects:["network"],handler:async(n)=>R("speak_tts",n)};var V5={name:"agenphone",version:"2.0.0",featureFlag:"agenphone",commands:[q3,H3,Q3,X3,J3,w3,W3,x3,Y3,_3,G3,O3,V3,v3,K3,B3,M3,j3,L3,R3,N3,D3,C3,A3,U3,F3,m3,E3,P3,S3,b3,k3,h3,T3,I3,u3,y3,Z3,p3,g3,i3,o3,l3,c3,d3,z3,t3,r3,a3,e3,s3,n5,q5,H5,Q5,X5,J5,w5,W5,x5,Y5,_5,G5,O5]};import{readFileSync as nX,writeFileSync as Nv,mkdirSync as Dv,existsSync as $X}from"node:fs";import{join as v5}from"node:path";import{homedir as sQ}from"node:os";function Yn(){return process.env.YUNKE_HOME_OVERRIDE??sQ()}function qX(){return v5(Yn(),".yunke")}function HX(){return v5(qX(),"skillshub.json")}var h1={api_base_url:"https://skillshub.yunke.ai",channel:"stable",target:"generic"};function p0(){let n=HX();if(!$X(n))return{...h1};try{let q=nX(n,"utf-8"),H=JSON.parse(q);return{api_base_url:H.api_base_url??h1.api_base_url,channel:H.channel??h1.channel,target:H.target??h1.target}}catch{return{...h1}}}var QX="yunke-cli/1.0.0";function XX(){return p0().api_base_url.replace(/\/$/,"")}async function z0(n,q){let Q=`${XX()}${n}`,X={"User-Agent":QX,...q?.headers??{}},J=await fetch(Q,{...q,headers:X});if(!J.ok){let w=`HTTP ${J.status}`;try{let W=await J.json();if(W.message)w=W.message}catch{}throw new K("EXECUTION_FAILED",`Skillshub API error: ${w}`)}return await J.json()}var JX="skillshub",wX=$.object({slug:$.string(),displayName:$.string(),summary:$.string(),type:$.string(),version:$.string(),targets:$.array($.string()),channel:$.string()}),K5={name:"skillshub.search",description:"Search for skills and plugins on the Skillshub registry",category:"skillshub",pluginName:JX,parameters:$.object({query:$.string().describe("搜索关键词"),limit:$.number().int().min(1).max(100).default(20).describe("返回数量上限"),type:$.string().optional().describe("按类型过滤,如 skill、plugin"),channel:$.enum(["stable","beta","canary"]).optional().describe("渠道,默认使用配置中的 channel")}),returns:$.object({results:$.array(wX),total:$.number()}),examples:[{description:"Search for calendar-related skills",input:{query:"calendar"},output:{results:[],total:0}}],sideEffects:["network"],handler:async(n)=>{let q=p0(),H=n.channel??q.channel,Q=new URLSearchParams({q:n.query,channel:H,target:q.target,limit:String(n.limit),offset:"0"});if(n.type!==void 0)Q.set("type",n.type);let X=await z0(`/api/v1/search?${Q.toString()}`);return{results:X.results,total:X.results.length}}};import{readFileSync as WX,writeFileSync as xX,mkdirSync as YX,existsSync as B5}from"node:fs";import{dirname as _X,join as GX}from"node:path";var OX="skills-lock.json";function M5(){return GX(Yn(),".yunke",OX)}function p6(){return{version:2,skills:{}}}function _n(){let n=M5();if(!B5(n))return p6();try{let q=WX(n,"utf-8"),H=JSON.parse(q);if(H.version!==2||typeof H.skills!=="object")return p6();return{version:2,skills:{...H.skills}}}catch{return p6()}}function X1(n){let q=M5(),H=_X(q);if(!B5(H))YX(H,{recursive:!0});xX(q,JSON.stringify(n,null,2),"utf-8")}var VX="skillshub",j5={name:"skillshub.list",description:"List locally installed skills from the lockfile",category:"skillshub",pluginName:VX,parameters:$.object({}),returns:$.object({skills:$.array($.object({slug:$.string(),name:$.string(),version:$.string(),source:$.string()})),total:$.number()}),examples:[{description:"List all installed skills",input:{},output:{skills:[],total:0}}],sideEffects:["none"],handler:async()=>{let n=_n(),q=Object.entries(n.skills).map(([H,Q])=>({slug:H,name:Q.name,version:Q.version,source:Q.source}));return{skills:q,total:q.length}}};import{join as ww}from"node:path";import{createHash as rJ,randomUUID as aJ}from"node:crypto";import{createReadStream as eJ,writeFileSync as sJ,existsSync as nw,unlinkSync as $w}from"node:fs";import{tmpdir as qw}from"node:os";import{join as Hw}from"node:path";var O9=yq(W9(),1);import{spawnSync as fJ}from"node:child_process";import{cpSync as _9,existsSync as o2,mkdirSync as G9,readdirSync as Y9,rmSync as lJ,statSync as cJ}from"node:fs";import{dirname as dJ,join as g1}from"node:path";var x9=(n)=>D1("skillshub.log","info",n),$4=(n)=>D1("skillshub.log","warn",n),p1=(n)=>D1("skillshub.log","error",n);function zJ(){return g1(Yn(),".yunke","skill-cache")}function V9(n){return g1(zJ(),n)}function O1(n){if(!o2(n))return;if(fJ(process.execPath,["-e",`require('fs').rmSync(${JSON.stringify(n)},{recursive:true,force:true})`],{env:{...process.env,NODE_OPTIONS:"",CODEBUDDY_SESSION_ID:"",CLAUDE_SESSION_ID:""},stdio:["ignore","ignore","pipe"]}).status!==0)lJ(n,{recursive:!0,force:!0})}async function v9(n,q){let H=V9(q);if(o2(H))try{O1(H)}catch(Q){$4(`forceRmSync 清缓存失败已忽略: ${H} - ${Q instanceof Error?Q.message:String(Q)}`)}return G9(H,{recursive:!0}),await O9.default(n,{dir:H}),tJ(H),H}function tJ(n){let q=Y9(n);if(q.length!==1)return;let H=g1(n,q[0]);if(!cJ(H).isDirectory())return;for(let Q of Y9(H))_9(g1(H,Q),g1(n,Q),{recursive:!0});O1(H)}function f2(n,q,H=!1){if(o2(q)&&!H)return!1;if(o2(q))try{O1(q)}catch(Q){$4(`forceRmSync 删旧目标失败已忽略: ${q} - ${Q instanceof Error?Q.message:String(Q)}`)}return G9(dJ(q),{recursive:!0}),_9(n,q,{recursive:!0,force:!0}),!0}function K9(n){O1(V9(n))}async function Qw(n){let q=rJ("sha256"),H=eJ(n);return new Promise((Q,X)=>{H.on("data",(J)=>q.update(J)),H.on("end",()=>Q(q.digest("hex"))),H.on("error",X)})}async function l2(n,q,H){let Q=Hw(qw(),`${aJ()}.zip`);try{let X=await fetch(n);if(!X.ok)throw p1(`download failed: HTTP ${X.status} - ${n}`),new K("EXECUTION_FAILED",`下载失败: HTTP ${X.status} - ${n}`);if(!X.body)throw new K("EXECUTION_FAILED",`下载失败: 响应体为空 - ${n}`);let J=await X.arrayBuffer();if(sJ(Q,Buffer.from(J)),H){let w=await Qw(Q);if(w!==H)throw p1(`sha256 mismatch: expected ${H} got ${w}`),new K("EXECUTION_FAILED",`SHA-256 校验失败: 期望 ${H},实际 ${w}`)}return await v9(Q,q)}finally{if(nw(Q))$w(Q)}}import{existsSync as Xw}from"node:fs";import{join as q4}from"node:path";var Jw=[{dir:".agents/skills",fallback:!0},{dir:".openclaw/skills"},{dir:".hermes/skills"},{dir:".workbuddy/skills"},{dir:".codebuddy/skills"},{dir:".qoder/skills"},{dir:".qoder-cn/skills"},{dir:".trae/skills"},{dir:".trae-cn/skills"},{dir:".qwenwork/skills"},{dir:".qwenworkcn/skills"},{dir:".qwen/skills"},{dir:".claude/skills"},{dir:".lingma/skills"},{dir:".iflow/skills"}];function V1(){let n=Yn(),q=[];for(let H of Jw){if(H.fallback){q.push(q4(n,H.dir));continue}let Q=H.dir.split("/")[0];if(Xw(q4(n,Q)))q.push(q4(n,H.dir))}return q}var Ww="skillshub",B9={name:"skillshub.install",description:"Download and install a skill, distributing to all detected clients",category:"skillshub",pluginName:Ww,parameters:$.object({slug:$.string().describe("skill 的 slug 标识"),force:$.boolean().default(!1).describe("覆盖已存在的 skill"),dir:$.string().optional().describe("单目录安装(escape hatch,默认多客户端分发)")}),returns:$.object({slug:$.string(),message:$.string()}),examples:[{description:"Install a skill by slug",input:{slug:"find-skills"},output:{slug:"find-skills",message:"Installed successfully"}}],sideEffects:["network","filesystem"],handler:async(n)=>{let q=p0(),H=n.dir?[n.dir]:V1(),Q=await z0(`/api/v1/manifest/${encodeURIComponent(n.slug)}?target=${q.target}&channel=${q.channel}`),X=Q.artifacts.find((G)=>G.target===q.target||G.target==="all");if(!X)throw new K("EXECUTION_FAILED",`无匹配的 artifact(target=${q.target})`);let J=await l2(X.downloadUrl,n.slug,X.sha256||void 0),w=0,W=[];for(let G of H)try{if(f2(J,ww(G,n.slug),n.force))w++}catch(O){W.push(`${G}: ${O instanceof Error?O.message:String(O)}`)}if(W.length>0)p1(`${n.slug} copy failures: ${W.join(" | ")}`);if(x9(`${n.slug} installed to ${w}/${H.length} targets`),w===0&&W.length>0)throw new K("EXECUTION_FAILED",`所有目标安装失败:
13
+ ${W.join(`
14
+ `)}`);let x=_n(),Y={...x,skills:{...x.skills,[n.slug]:{name:n.slug,version:Q.version,source:"skillshub"}}};X1(Y),await z0(`/api/v1/install-record/${encodeURIComponent(n.slug)}`,{method:"POST"}).catch(()=>{});let _=W.length?`Installed to ${w} target(s); ${W.length} failed`:"Installed successfully";return{slug:n.slug,message:_}}};import{join as xw}from"node:path";var Yw="skillshub",M9={name:"skillshub.remove",description:"Remove an installed skill from all clients and clean up its cache",category:"skillshub",pluginName:Yw,parameters:$.object({slug:$.string().describe("要卸载的 skill slug"),dir:$.string().optional().describe("单目录卸载(escape hatch,默认移除所有客户端)"),force:$.boolean().optional().describe("跳过 lockfile 守卫,强制从各 agent 目录删除(用于清理孤儿/旧 slug)")}),returns:$.object({slug:$.string(),message:$.string()}),examples:[{description:"Remove a skill by slug",input:{slug:"find-skills"},output:{slug:"find-skills",message:"Removed successfully"}}],sideEffects:["filesystem"],handler:async(n)=>{let q=n.dir?[n.dir]:V1(),H=_n();if(!n.force&&!(n.slug in H.skills))throw new K("EXECUTION_FAILED",`skill '${n.slug}' 未安装`);for(let J of q)O1(xw(J,n.slug));let{[n.slug]:Q,...X}=H.skills;return X1({...H,skills:X}),K9(n.slug),{slug:n.slug,message:"Removed successfully"}}};var _w="skillshub",j9={name:"skillshub.info",description:"Show detailed information about a skill from the registry",category:"skillshub",pluginName:_w,parameters:$.object({slug:$.string().describe("skill 的 slug")}),returns:$.object({slug:$.string(),capability:$.unknown(),versions:$.array($.unknown()),artifacts:$.array($.unknown())}),examples:[{description:"Get info for a skill",input:{slug:"find-skills"},output:{slug:"find-skills",capability:{},versions:[],artifacts:[]}}],sideEffects:["network"],handler:async(n)=>{let q=await z0(`/api/v1/capabilities/${encodeURIComponent(n.slug)}`);return{slug:n.slug,capability:q.capability,versions:q.versions,artifacts:q.artifacts}}};import{join as Gw}from"node:path";var Ow="skillshub",Vw=$.object({slug:$.string(),status:$.enum(["upgraded","skipped","failed"]),from_version:$.string(),to_version:$.string(),message:$.string().optional()}),L9={name:"skillshub.upgrade",description:"Check for and apply updates to installed skills",category:"skillshub",pluginName:Ow,parameters:$.object({slug:$.string().optional().describe("指定升级的 skill,不填则升级所有已安装的"),dir:$.string().optional().describe("单目录升级(escape hatch,默认所有客户端)"),check_only:$.boolean().default(!1).describe("只检查更新,不实际安装")}),returns:$.object({checked:$.number(),upgraded:$.number(),skipped:$.number(),failed:$.number(),details:$.array(Vw)}),examples:[{description:"Check for updates without installing",input:{check_only:!0},output:{checked:2,upgraded:1,skipped:1,failed:0,details:[]}}],sideEffects:["network","filesystem"],handler:async(n)=>{let q=p0(),H=_n(),Q=n.slug?[n.slug]:Object.keys(H.skills),X=[],J=0,w=0,W=0;for(let x of Q){let Y=H.skills[x];if(!Y){X.push({slug:x,status:"failed",from_version:"",to_version:"",message:"skill 未安装"}),W++;continue}try{let _=await z0(`/api/v1/manifest/${encodeURIComponent(x)}?target=${q.target}&channel=${q.channel}`),G=_.version,O=Y.version,M=_.artifacts.find((N)=>N.target===q.target||N.target==="all");if(!M){X.push({slug:x,status:"skipped",from_version:O,to_version:G,message:"无匹配的 artifact"}),w++;continue}if(O===G){X.push({slug:x,status:"skipped",from_version:O,to_version:G}),w++;continue}if(n.check_only){X.push({slug:x,status:"upgraded",from_version:O,to_version:G}),J++;continue}let A=await l2(M.downloadUrl,x,M.sha256||void 0),L=n.dir?[n.dir]:V1();for(let N of L)try{f2(A,Gw(N,x),!0)}catch{}H={...H,skills:{...H.skills,[x]:{...Y,version:G}}},X1(H),X.push({slug:x,status:"upgraded",from_version:O,to_version:G}),J++}catch(_){let G=_ instanceof Error?_.message:String(_);X.push({slug:x,status:"failed",from_version:Y.version,to_version:"",message:G}),W++}}return{checked:Q.length,upgraded:J,skipped:w,failed:W,details:X}}};var R9={name:"skillshub",version:"1.0.0",commands:[K5,j5,B9,M9,j9,L9]};import{createServer as gw}from"node:http";var vw="/api/v1";async function v1(n,q){let H=`${Un}${vw}${n}`,Q=await fetch(H,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(q)});if(!Q.ok){let J=`HTTP ${Q.status}`;try{let w=await Q.json();J=w.detail??w.message??J}catch{}throw new K("EXECUTION_FAILED",`云客服务错误: ${J}`)}return(await Q.json()).data}import{readFileSync as Kw,writeFileSync as Bw,mkdirSync as Mw,existsSync as Q4,unlinkSync as jw}from"node:fs";import{homedir as Lw}from"node:os";import{join as N9}from"node:path";var H4=process.env.YUNKE_CONFIG_DIR??N9(Lw(),".yunke"),i1=N9(H4,"crm.json");function O0(){if(!Q4(i1))return null;try{let n=Kw(i1,"utf-8");return JSON.parse(n)}catch{return null}}function c2(n){if(!Q4(H4))Mw(H4,{recursive:!0});Bw(i1,JSON.stringify(n,null,2),"utf-8")}function D9(n){let q=O0()??{token:"",user_id:"",company:"",company_code:"",name:"",phone:"",role:"",login_id:""};c2({...q,...n})}function C9(){if(Q4(i1))jw(i1)}import{readFileSync as Rw,writeFileSync as Nw,mkdirSync as Dw,existsSync as J4,unlinkSync as Cw}from"node:fs";import{homedir as Aw}from"node:os";import{join as A9}from"node:path";var Uw="https://middleware-test.yunke.ai",Fw="https://middleware.yunke.ai",mw=120000,Ew=20000,Pw=60000,X4=process.env.YUNKE_CONFIG_DIR??A9(Aw(),".yunke"),o1=A9(X4,"middleware-jwt.json");function w4(){let n=O0();if(n?.base_url)try{let q=new URL(n.base_url);return`${q.protocol}//${q.host}`}catch{}return process.env.YUNKE_CRM_BASE_URL||"https://crm.yunkecn.com"}function W4(){if(process.env.YUNKE_MIDDLEWARE_BASE_URL)return process.env.YUNKE_MIDDLEWARE_BASE_URL.replace(/\/$/,"");return w4().includes("test.")?Uw:Fw}function U9(){let n=O0();if(!n?.token||!n?.user_id)throw new K("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login-web' 登录");if(!n.company_code)throw new K("CONFIG_ERROR","凭证缺少 company_code,请重新运行 yunke crm.auth.login-web 登录");return{token:n.token,user_id:n.user_id,company_code:n.company_code}}function Sw(){if(!J4(o1))return null;try{return JSON.parse(Rw(o1,"utf-8"))}catch{return null}}function bw(n){if(!J4(X4))Dw(X4,{recursive:!0});Nw(o1,JSON.stringify(n,null,2),"utf-8")}function kw(n,q,H){if(!n)return!1;if(n.user_id!==q||n.company_code!==H)return!1;return Date.now()<n.expires_at-mw}async function f1(n=!1){let{token:q,user_id:H,company_code:Q}=U9();if(!n){let W=Sw();if(kw(W,H,Q))return W.token}let X=await globalThis.fetch(`${w4()}/pc/ai/knowledgeBase/getToken`,{method:"POST",headers:{"Content-Type":"application/json",token:q,userId:H,package:"agentapp"},body:"{}",signal:AbortSignal.timeout(Ew)});if(!X.ok)throw new K("EXECUTION_FAILED",`换中台 JWT 失败: HTTP ${X.status}`);let J=await X.json();if(!J.success||!J.data?.access_token)throw new K("CONFIG_ERROR",`换中台 JWT 失败: ${J.message||"未知原因"}。可先运行 yunke crm.auth.status 续期,或重新 yunke crm.auth.login-web 登录`);let w={user_id:H,company_code:Q,token:J.data.access_token,expires_at:Date.now()+(J.data.expires_in??3600)*1000};return bw(w),w.token}async function D(n,q={}){let{user_id:H,company_code:Q}=U9(),X=W4(),J=w4(),w=(_)=>globalThis.fetch(`${X}/api/v1/crm/tools/${n}`,{method:"POST",headers:{Authorization:`Bearer ${_}`,"Content-Type":"application/json"},body:JSON.stringify({company:Q,user_id:H,base_url:J,payload:q}),signal:AbortSignal.timeout(Pw)}),W=await w(await f1());if(W.status===401)W=await w(await f1(!0));let x={};try{x=await W.json()}catch{x={}}if(W.status===200&&x.code===200)return x.data??{};let Y=x.message||x.detail||"";if(W.status===401)throw new K("CONFIG_ERROR","中台鉴权失败(重签 JWT 后仍 401),请重新运行 yunke crm.auth.login-web 登录");if(W.status===403)throw new K("CONFIG_ERROR",`企业码/用户与 token 声明不一致: ${Y},请重新登录`);if(W.status===404)throw new K("EXECUTION_FAILED",`未知中台工具: ${n}`);if(W.status===422)throw new K("CONFIG_ERROR",`请求上下文缺失(company/user_id/base_url): ${Y},请重新登录`);throw new K("EXECUTION_FAILED",Y||`中台请求失败: HTTP ${W.status}`)}async function S(){let n=await D("get_department_tree",{showUser:!1}),H=(Array.isArray(n)?n:n.list??[]).find((Q)=>Q.isDept);if(!H)throw new K("EXECUTION_FAILED","无法获取默认部门 ID");return H.id}function F9(){if(J4(o1))Cw(o1)}import{randomBytes as m9,createHash as hw}from"node:crypto";import{request as Tw}from"node:http";import{request as Iw}from"node:https";var uw="https://crm.yunkecn.com/pc";function yw(n=process.env.YUNKE_PC_OAUTH_BASE_URL){let q=n?.replace(/\/$/,"");return q&&q.length>0?q:uw}var x4=yw();function E9(n,q){if(!n)return q;let H;try{H=new URL(n).host}catch{throw Error(`invalid iss: ${n}`)}return n.replace(/\/$/,"")}function Y4(n){return n.toString("base64url")}function P9(){return Y4(m9(32))}function S9(n){return Y4(hw("sha256").update(n,"utf8").digest())}function b9(){return Y4(m9(16))}function k9(n,q,H){return new Promise((Q,X)=>{let W=(new URL(n).protocol==="https:"?Iw:Tw)(n,{method:"POST",agent:!1,headers:{"content-type":H,"content-length":String(Buffer.byteLength(q))}},(x)=>{let Y="";x.setEncoding("utf8"),x.on("data",(_)=>Y+=_),x.on("end",()=>Q({status:x.statusCode??0,text:Y}))});W.on("error",X),W.write(q),W.end()})}async function h9(n,q){let H=JSON.stringify({redirect_uris:[q],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none",scope:"read",client_name:"yunke-cli"}),{status:Q,text:X}=await k9(`${n}/oauth/register`,H,"application/json");if(Q<200||Q>=300)throw Error(`OAuth register failed: HTTP ${Q} ${X}`);let J;try{J=JSON.parse(X)}catch{throw Error(`OAuth register failed: bad json ${X}`)}if(!J?.client_id)throw Error("OAuth register failed: missing client_id");return J}function T9(n){let q=new URL(`${n.baseUrl}/oauth/authorize`);if(q.searchParams.set("client_id",n.clientId),q.searchParams.set("redirect_uri",n.redirectUri),q.searchParams.set("response_type","code"),q.searchParams.set("code_challenge",n.codeChallenge),q.searchParams.set("code_challenge_method","S256"),q.searchParams.set("state",n.state),n.scope)q.searchParams.set("scope",n.scope);return q.toString()}class I9 extends Error{error;constructor(n,q){super(q);this.name="OAuthTokenError",this.error=n}}async function u9(n){let q=new URLSearchParams({grant_type:"authorization_code",code:n.code,client_id:n.clientId,redirect_uri:n.redirectUri,code_verifier:n.codeVerifier});return Z9(`${n.baseUrl}/oauth/token`,q)}async function y9(n){let q=new URLSearchParams({grant_type:"refresh_token",refresh_token:n.refreshToken,client_id:n.clientId});return Z9(`${n.baseUrl}/oauth/token`,q)}async function Z9(n,q){let{status:H,text:Q}=await k9(n,q.toString(),"application/x-www-form-urlencoded"),X=null;try{X=JSON.parse(Q)}catch{}if(H<200||H>=300||!X||X.error){let J=X?.error??"http_error",w=X?.error_description??`HTTP ${H}`;throw new I9(J,w)}return X}import{spawn as Zw}from"node:child_process";function pw(n,q=process.platform){let H={detached:!0,stdio:"ignore"};if(q==="win32")return{cmd:"cmd",args:["/c","start",'""',`"${n}"`],opts:{...H,windowsVerbatimArguments:!0}};if(q==="darwin")return{cmd:"open",args:[n],opts:H};return{cmd:"xdg-open",args:[n],opts:H}}function p9(n){let{cmd:q,args:H,opts:Q}=pw(n);try{Zw(q,H,Q).unref()}catch{}}var g9=`<!DOCTYPE html>
15
15
  <html lang="zh-CN">
16
16
  <head>
17
17
  <meta charset="UTF-8">
@@ -352,27 +352,29 @@ function fallbackCopy(text,cb){
352
352
  </script>
353
353
 
354
354
  </body>
355
- </html>`;import{writeSync as k6}from"node:fs";function Hi(n){k6(1,n)}function Y2(n){k6(2,n)}function Ln(n){process.exit(n)}var m0="crm",a$=/^1[3-9]\d{9}$/,p1=i.string().regex(a$,"手机号格式不合法,需为 11 位中国大陆手机号"),R6=i.object({id:i.string(),cellphone:i.string(),company_id:i.string(),user_id:i.string(),user_type:i.number(),real_name:i.string(),user_bind_state:i.number(),auto_call:i.number(),download_limit:i.number(),create_time:i.string(),use_sea:i.number(),department_id:i.string(),power_type:i.number(),login_account:i.string(),role_id:i.string(),user_telephone:i.string(),user_address:i.string(),user_email:i.string(),user_status:i.number(),login_id:i.string(),role_name:i.string(),manage_department_names:i.string(),is_manager:i.boolean(),asr:i.number()}),U6={name:"crm.auth.send-code",description:"向手机号发送云客 CRM 短信验证码,登录第一步。",category:"crm",pluginName:m0,parameters:i.object({phone:p1.describe("11 位中国大陆手机号")}),returns:i.object({success:i.boolean(),message:i.string()}),examples:[{description:"发送验证码",input:{phone:"13800138000"},output:{success:!0,message:"发送成功"}}],sideEffects:["network"],hidden:!0,handler:async({phone:n})=>{let b=await F0("/pc/sms/send",{phone:n,timestamp:Date.now()});return{success:b.success,message:b.message}}},C6={name:"crm.auth.verify",description:"验证短信验证码,返回该手机号关联的企业列表,登录第二步。",category:"crm",pluginName:m0,parameters:i.object({phone:p1.describe("11 位中国大陆手机号"),sms_code:i.string().min(1).describe("收到的短信验证码")}),returns:i.object({companies:i.array(i.object({user_id:i.string(),user_type:i.number(),company_code:i.string(),company:i.string(),domain:i.string()}))}),examples:[{description:"验证验证码,返回企业列表",input:{phone:"13800138000",sms_code:"123456"},output:{companies:[{user_id:"u001",user_type:1,company_code:"yk001",company:"云客",domain:"yunke.ai"}]}}],sideEffects:["network"],hidden:!0,handler:async({phone:n,sms_code:b})=>{return{companies:await F0("/pc/login/verify",{phone:n,sms_code:b})}}},S6={name:"crm.auth.login",description:"选择企业登录,获取 token,自动拉取用户详情,将凭证写入 ~/.yunke/crm.json,登录第三步。",category:"crm",pluginName:m0,parameters:i.object({phone:p1.describe("11 位中国大陆手机号"),y_code:i.string().min(1).describe("短信验证码(同 sms_code)"),company_code:i.string().min(1).describe("从 verify 步骤返回的企业代码")}),returns:i.object({token:i.string(),user_id:i.string(),company:i.string(),company_code:i.string(),name:i.string(),phone:i.string(),role:i.string(),login_id:i.string(),user_info:R6}),examples:[{description:"选择企业登录",input:{phone:"13800138000",y_code:"123456",company_code:"yk001"},output:{token:"tok_xxx",user_id:"u001",company:"云客",company_code:"yk001",name:"张三",phone:"13800138000",role:"admin",login_id:"lid_001",user_info:{id:"u001",cellphone:"13800138000",company_id:"yk001",user_id:"u001",user_type:1,real_name:"张三",user_bind_state:1,auto_call:0,download_limit:100,create_time:"2026-01-01 10:00:00",use_sea:1,department_id:"dept001",power_type:1,login_account:"13800138000",role_id:"role001",user_telephone:"",user_address:"",user_email:"",user_status:1,login_id:"lid_001",role_name:"管理员",manage_department_names:"销售部",is_manager:!0,asr:1}}}],sideEffects:["filesystem","network"],hidden:!0,handler:async({phone:n,y_code:b,company_code:_})=>{let w=await F0("/pc/login/token",{phone:n,y_code:b,company_code:_}),$={token:w.token,user_id:w.user_id,company:w.company,company_code:w.company_code,name:w.name,phone:w.phone,role:w.role,login_id:w.login_id};vi($);let q=await F0("/pc/user/info",{user_id:w.user_id,token:w.token});return{...$,user_info:q}}},t6={name:"crm.auth.user-info",description:"直查 PC 获取完整用户信息(含 menus 等大字段,未过滤)。一般场景优先用 crm.user.info(走中台、已过滤大字段),仅在需要全量字段时用本命令。",category:"crm",pluginName:m0,parameters:i.object({}),returns:R6,examples:[{description:"获取当前登录用户信息",input:{},output:{id:"u001",cellphone:"13800138000",company_id:"yk001",user_id:"u001",user_type:1,real_name:"张三",user_bind_state:1,auto_call:0,download_limit:100,create_time:"2026-01-01 10:00:00",use_sea:1,department_id:"dept001",power_type:1,login_account:"13800138000",role_id:"role001",user_telephone:"",user_address:"",user_email:"",user_status:1,login_id:"lid_001",role_name:"管理员",manage_department_names:"销售部",is_manager:!0,asr:1}}],sideEffects:["network"],handler:async()=>{let n=mn();if(!n?.token||!n?.user_id)throw new G("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login-web' 登录");return F0("/pc/user/info",{user_id:n.user_id,token:n.token})}},E6=300000;function Qi(n){return n instanceof Error?n.message:String(n)}function e$(n){return new Promise((b,_)=>{n.once("error",_),n.listen(0,"127.0.0.1",()=>{n.removeListener("error",_),b()})})}async function N6(n){n.closeAllConnections?.(),await new Promise((b)=>n.close(()=>b())),await new Promise((b)=>setImmediate(b))}function l1(n){return'<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">'+"<title>登录失败 - yunke-cli</title>"+"<style>body{font-family:sans-serif;max-width:420px;margin:80px auto;padding:0 16px;text-align:center}</style>"+`</head><body><h2>登录失败</h2><p>❌ ${r$(n)}</p></body></html>`}function r$(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function z$(n,b,_){return new Promise((w)=>{let $=setTimeout(()=>w(null),E6);n.on("request",(q,o)=>{let x=new URL(q.url??"/","http://127.0.0.1");if(x.pathname!=="/callback"){o.statusCode=404,o.end("not found");return}clearTimeout($);let m=x.searchParams.get("code"),v=x.searchParams.get("state"),H=x.searchParams.get("error"),Y=x.searchParams.get("iss");if(H){let l=x.searchParams.get("error_description")??H;o.end(l1(l)),w(null);return}if(!m||v!==b){o.statusCode=400,o.end(l1("授权回调参数无效(state 不匹配或缺 code)")),w(null);return}w({code:m,iss:Y,reply:(l,j)=>{try{if(l)o.setHeader("Content-Type","text/html; charset=utf-8"),o.end(_);else o.end(l1(j??""))}catch{}}})})})}var F6={name:"crm.auth.login-web",description:"发起浏览器 OAuth 登录:CLI 自动打开系统浏览器(裸输出授权 URL 绕过 JSON 信封,spawn 失败时用户可手动打开打印的 URL),等待回调换 token 后落盘。",category:"crm",pluginName:m0,parameters:i.object({}),returns:i.object({url:i.string()}),examples:[{description:"发起 OAuth 登录(CLI 自己开浏览器)",input:{},output:{url:"https://yunke-pc.example.com/pc/oauth/authorize?client_id=wb_xxx&..."}}],sideEffects:["filesystem","network"],timeout:E6+1e4,handler:async()=>{let n=Y1,b=h6(),_=u6(b),w=B6(),$=d$();try{await e$($)}catch(Y){Y2(`启动本地回调服务器失败: ${Qi(Y)}
356
- `),Ln(1);return}let o=`http://127.0.0.1:${$.address().port}/callback`,x;try{x=(await j6(n,o)).client_id}catch(Y){await N6($),Y2(`OAuth 客户端注册失败: ${Qi(Y)}
357
- `),Ln(1);return}let m=f6({baseUrl:n,clientId:x,redirectUri:o,state:w,codeChallenge:_});Hi(`${m}
358
- `),c6(m);let v=await z$($,w,A6),H=1;if(v)try{let Y=O6(v.iss,n),l=await K6({baseUrl:Y,code:v.code,clientId:x,redirectUri:o,codeVerifier:b});vi({token:l.access_token,user_id:l.user_id??"",company:"",company_code:l.company_code??"",name:l.name??"",phone:"",role:"",login_id:"",refresh_token:l.refresh_token,expires_at:Date.now()+(l.expires_in??3600)*1000,client_id:x,redirect_uri:o,base_url:Y}),v.reply(!0),H=0}catch(Y){let l=`登录失败: ${Qi(Y)}`;Y2(`${l}
359
- `),v.reply(!1,l),H=1}await N6($),Ln(H);return}},P6={name:"crm.auth.status",description:'WorkBuddy 对接:检测登录状态。已登录 exit 0 + 输出 "Logged in as <name>";未登录 exit 非0。token 过期自动 refresh。',category:"crm",pluginName:m0,parameters:i.object({}),returns:i.object({logged_in:i.boolean()}),examples:[{description:"已登录",input:{},output:{logged_in:!0}}],sideEffects:["filesystem","network"],handler:async()=>{let n=mn();if(!n?.token||!n?.user_id){Ln(1);return}if(!(n.expires_at!=null&&Date.now()>=n.expires_at)){Hi(`Logged in as ${n.name}
360
- `),Ln(0);return}if(n.refresh_token&&n.client_id){try{let _=await D6({baseUrl:n.base_url||Y1,refreshToken:n.refresh_token,clientId:n.client_id});X6({token:_.access_token,expires_at:Date.now()+(_.expires_in??3600)*1000,..._.refresh_token?{refresh_token:_.refresh_token}:{}}),Hi(`Logged in as ${n.name}
361
- `),Ln(0);return}catch(_){Y2(`刷新凭证失败: ${Qi(_)}
362
- `)}Ln(1);return}Ln(1);return}},T6={name:"crm.auth.logout",description:"WorkBuddy 对接:登出,删除本地凭证(幂等,未登录也 exit 0)。",category:"crm",pluginName:m0,parameters:i.object({}),returns:i.object({success:i.boolean()}),examples:[{description:"登出",input:{},output:{success:!0}}],sideEffects:["filesystem"],handler:async()=>{return J6(),p6(),{success:!0}}};var y6="crm",s$=i.object({id:i.string().describe("部门 ID 或员工 ID(按 is_dept 区分),可直接作为后续命令的部门/员工入参"),pid:i.string().describe("父节点 ID"),name:i.string().describe("部门名或员工姓名"),is_dept:i.boolean().describe("true=部门,false=员工(部门与员工混排在同一数组,无独立分组字段)"),bind_qywx:i.boolean().describe("是否绑定企业微信"),offline_days:i.number().describe("离线天数"),sort:i.number().describe("排序号"),account:i.string().nullable().optional().describe("员工账号(仅员工项)"),phone_number:i.string().nullable().optional().describe("员工手机号(仅员工项,可能为 null)"),user_type:i.number().nullable().optional().describe("员工类型(仅员工项,可能为 null)")}),nq=i.object({id:i.string(),pid:i.string(),name:i.string(),is_dept:i.boolean(),department_path:i.string(),routes:i.array(i.string()),bind_qywx:i.boolean(),offline_days:i.number(),sort:i.number(),account:i.string().nullable().optional(),phone_number:i.string().nullable().optional(),has_phone:i.boolean().nullable().optional(),user_type:i.number().nullable().optional()}),I6={name:"crm.org.department-tree",description:"查询指定部门下的子部门和员工列表(单级,不递归)。dept_id 为空时查根节点。",category:"crm",pluginName:y6,parameters:i.object({dept_id:i.string().optional().default("").describe("父部门 ID,空字符串表示根节点"),show_user:i.boolean().optional().default(!0).describe("是否返回员工节点"),show_user_status:i.string().optional().default("").describe("过滤员工状态"),query_qywx_status:i.boolean().optional().default(!1).describe("是否查询企业微信绑定状态")}),returns:i.object({items:i.array(s$)}),examples:[{description:"查询根节点",input:{},output:{items:[{id:"dept001",pid:"",name:"销售部",is_dept:!0,bind_qywx:!1,offline_days:0,sort:1}]}},{description:"查询指定部门的子节点",input:{dept_id:"dept001"},output:{items:[{id:"u001",pid:"dept001",name:"张三",is_dept:!1,bind_qywx:!1,offline_days:0,sort:1,phone_number:"13800138000"}]}}],sideEffects:["network"],handler:async({dept_id:n,show_user:b,show_user_status:_,query_qywx_status:w})=>{let $=await O("get_department_tree",{id:n,showUser:b,..._!==""?{showUserStatus:Number(_)}:{},queryQywxStatus:w});return{items:(Array.isArray($)?$:$.list??[]).map((o)=>({id:String(o.id??""),pid:String(o.pid??""),name:String(o.name??""),is_dept:Boolean(o.isDept),bind_qywx:Boolean(o.bindQywx),offline_days:Number(o.offlineDays??0),sort:Number(o.sort??0),account:o.account??null,phone_number:o.phoneNumber??null,user_type:o.userType??null}))}}},g6={name:"crm.org.search",description:"通过关键词模糊搜索部门和员工。search_type: 1=仅部门, 2=仅员工, 3=全部(默认)。",category:"crm",pluginName:y6,parameters:i.object({keyword:i.string().min(1).describe("搜索关键词"),search_type:i.number().int().min(1).max(3).optional().default(3).describe("1=仅部门 2=仅员工 3=全部"),limit:i.number().int().min(1).max(100).optional().default(20).describe("返回条数上限"),phone_only:i.boolean().optional().default(!1).describe("仅返回有手机号的员工")}),returns:i.object({total:i.number(),results:i.array(nq)}),examples:[{description:'搜索关键词"张"',input:{keyword:"张"},output:{total:1,results:[{id:"u001",pid:"dept001",name:"张三",is_dept:!1,department_path:"销售部",routes:["dept001"],bind_qywx:!1,offline_days:0,sort:1}]}}],sideEffects:["network"],handler:async({keyword:n,search_type:b,limit:_,phone_only:w})=>{let $=await O("search_dept_employee",{keyword:n.trim(),type:b,limit:_,phoneOnly:w,queryQywxStatus:!1}),q=Array.isArray($)?$:$.data??$.list??[],o=Array.isArray($)?$.length:$.total??q.length,x=q.map((m)=>{let v=m.routes??[];return{id:String(m.id??""),pid:String(m.pid??""),name:String(m.name??""),is_dept:Boolean(m.isDept),routes:v,department_path:v.join("/"),bind_qywx:Boolean(m.bindQywx),offline_days:Number(m.offlineDays??0),sort:Number(m.sort??0),account:m.account??null,phone_number:m.phoneNumber??null,has_phone:Boolean(m.phoneNumber),user_type:m.userType??null}});return{total:o,results:x}}};var P0="crm";function Z6(n){return String(n).padStart(2,"0")}function G1(n){return`${n.getFullYear()}-${Z6(n.getMonth()+1)}-${Z6(n.getDate())}`}var iq=i.object({show_name:i.string().describe("列显示名(中文)"),field_code:i.string().describe("字段码,数据行 rows 的 key 与之对应"),module:i.string().describe("所属模块(如 微信/短信/通话)"),hidden:i.boolean().describe("是否隐藏")}),bq=i.object({option:i.number(),modules:i.array(i.string()),columns:i.array(iq)}),d6={name:"crm.report.custom-report-list",description:"获取员工报表统计数据。option=department 为部门维度,option=employee 为员工维度。",category:"crm",pluginName:P0,parameters:i.object({option:i.enum(["department","employee"]).optional().default("employee").describe("统计维度:department=部门维度,employee=员工维度,默认 employee"),depart_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),start_time:i.string().optional().default("").describe("开始时间,格式 YYYY-MM-DD,如 2026-04-01"),end_time:i.string().optional().default("").describe("结束时间,格式 YYYY-MM-DD,如 2026-04-08"),page:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(100).optional().default(10).describe("每页条数")}),returns:i.object({heads:bq,total:i.number(),page:i.number(),page_size:i.number(),rows:i.array(i.record(i.union([i.string(),i.number(),i.null()]))).describe("动态列行集:行键 = 列配置 fieldCode(企业可配,语义对照 crm.report.custom-report-columns 的 customShowHeads[].fieldCode ↔ showName)")}).describe("heads.columns 可能为空,列语义务必以 custom-report-columns 为准;total 超过当前页行数时继续翻页"),examples:[{description:"查询部门维度报表(第1页)",input:{option:"department",start_time:"2026-04-01",end_time:"2026-04-08"},output:{heads:{option:0,modules:["通话"],columns:[{show_name:"部门",field_code:"deptName",module:"通话",hidden:!1}]},total:5,page:1,page_size:10,rows:[{deptName:"销售一部",callOutVolume:120,connectionOutRate:"60.00%"}]}},{description:"查询员工维度报表",input:{option:"employee",start_time:"2026-04-01",end_time:"2026-04-08"},output:{heads:{option:1,modules:["通话"],columns:[{show_name:"姓名",field_code:"name",module:"通话",hidden:!1}]},total:20,page:1,page_size:10,rows:[{name:"张三",callOutVolume:50,connectionOutVolume:30}]}}],sideEffects:["network"],handler:async({option:n,depart_id:b,start_time:_,end_time:w,page:$,page_size:q})=>{let o=n==="department"?0:1,x=b||await K(),m=new Date,v=w||G1(m),H=_||G1(new Date(m.getTime()-518400000)),[Y,l]=await Promise.all([O("get_custom_report_columns",{departId:x,option:o}),O("query_custom_report",{option:o,departId:x,pageSize:q,starttime:H,endtime:v,page:$})]),j=(Y.customShowHeads??[]).map((U)=>({show_name:String(U.showName??""),field_code:String(U.fieldCode??""),module:String(U.module??""),hidden:Number(U.hiddens)===1}));return{heads:{option:Y.option??o,modules:Y.modules??[],columns:j},total:l.total??0,page:$,page_size:q,rows:l.list??[]}}},O1=i.union([i.array(i.string()),i.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}),a6={name:"crm.report.custom-report-columns",description:"查询员工自定义报表的列配置(已启用字段及所有可配字段)。",category:"crm",pluginName:P0,parameters:i.object({depart_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({option:i.number().describe("统计维度(与 custom-report-list 的 option 同义:0=部门 1=员工)"),modules:i.array(i.string()).describe("可配置模块清单(如 微信/短信/通话/设备/企微)"),customShowHeads:i.array(i.object({showName:i.string().describe("列显示名(中文)"),fieldCode:i.string().describe("字段码,crm.report.custom-report-list 行 rows 的 key 与之对应"),module:i.string().describe("所属模块(如 微信/短信/通话)"),hiddens:i.number().describe("是否隐藏:0=显示 1=隐藏"),userPower:i.boolean().describe("权限标记(实测样例 false,上游未文档化语义)"),fieldType:i.number().describe("列字段类型编码(上游未文档化语义,实测样例 0)")})).describe("全量可配列清单(可达 77 项),已启用项 = hiddens 为 0 的行"),minRank:i.number().describe("当前排名窗口下限(set-custom-report-columns 的 min_rank 对应项)"),maxRank:i.number().describe("当前排名窗口上限(set-custom-report-columns 的 max_rank 对应项)")}).passthrough().describe("set-custom-report-columns 的回喂来源:修改 customShowHeads 各行 hiddens 后作为其 custom_show_heads 传入"),examples:[{description:"查询默认部门报表列配置",input:{},output:{option:1,modules:["微信","短信","通话"],customShowHeads:[{showName:"发送消息数量",fieldCode:"wechatOutMsg",module:"微信",hiddens:0,userPower:!1,fieldType:0}],minRank:1,maxRank:8}}],sideEffects:["network"],handler:async({depart_id:n})=>{let b=n||await K();return await O("get_custom_report_columns",{departId:b})}},e6={name:"crm.report.set-custom-report-columns",description:"设置员工自定义报表的列配置(从 custom-report-columns 取得后修改 hiddens 再传入)。",category:"crm",pluginName:P0,parameters:i.object({custom_show_heads:i.string().describe("列配置 JSON 字符串(从 custom-report-columns 取得后修改)"),option:i.number().int().optional().default(1).describe("统计维度:0=部门,1=员工,默认 1"),modules:O1.optional().default(["微信","短信","通话"]).describe("启用模块"),max_rank:i.number().int().optional().default(8).describe("排名上限"),min_rank:i.number().int().optional().default(1).describe("排名下限")}),returns:i.object({}).passthrough(),examples:[{description:"设置列配置",input:{custom_show_heads:'[{"fieldCode":"wechatOutMsg","showName":"发送消息","module":"微信","hiddens":0,"userPower":false}]'},output:{}}],sideEffects:["network"],handler:async({custom_show_heads:n,option:b,modules:_,max_rank:w,min_rank:$})=>{let q;try{q=JSON.parse(n)}catch{throw new G("VALIDATION_FAILED","custom_show_heads 不是合法 JSON")}return await O("set_custom_report_columns",{option:b,modules:_,customShowHeads:q,maxRank:w,minRank:$})}},r6={name:"crm.report.customer-metrics",description:"查询客户统计(新增/跟进/待跟进/成交等指标,含环比对比)。",category:"crm",pluginName:P0,parameters:i.object({department_ids:O1.describe("部门 ID 列表(JSON 字符串或数组)"),user_ids:O1.optional().default([]).describe("用户 ID 列表,空则查部门下全部"),time_range:i.number().int().optional().default(2).describe("时间范围:2=昨日 3=近7日 4=近15日 5=近30日")}),returns:i.object({totalCustomerCount:i.number().describe("客户总数"),currentStats:i.object({companyCode:i.string().describe("公司码"),customerMetrics:i.object({newCount:i.number().describe("新增客户数"),followedCount:i.number().describe("已跟进数"),pendingCount:i.number().describe("待跟进数"),dealCount:i.number().describe("成交数"),totalCount:i.number().describe("客户总数")}).passthrough()}).passthrough().describe("本期统计"),compareStats:i.object({companyCode:i.string().describe("公司码"),customerMetrics:i.object({newCount:i.number().describe("新增客户数"),followedCount:i.number().describe("已跟进数"),pendingCount:i.number().describe("待跟进数"),dealCount:i.number().describe("成交数"),totalCount:i.number().describe("客户总数")}).passthrough()}).passthrough().describe("上期对比统计"),compareData:i.record(i.object({diffCount:i.number().describe("环比增减量"),diffRate:i.string().describe('环比增减率(如 "94.00%")')}).passthrough()).describe("环比明细(键:new_count/followed_count/pending_count/deal_count)")}).passthrough(),examples:[{description:"查询部门客户统计(近7日)",input:{department_ids:'["DEPT001"]',time_range:3},output:{totalCustomerCount:15,currentStats:{companyCode:"qeg4ep",customerMetrics:{newCount:3,followedCount:5,pendingCount:2,dealCount:1,totalCount:15}},compareStats:{companyCode:"qeg4ep",customerMetrics:{newCount:2,followedCount:5,pendingCount:3,dealCount:0,totalCount:15}},compareData:{new_count:{diffCount:1,diffRate:"50.00%"},followed_count:{diffCount:0,diffRate:"0%"}}}}],sideEffects:["network"],handler:async({department_ids:n,user_ids:b,time_range:_})=>{let w=b.length>0;return await O("get_customer_metrics",{type:w?0:1,timeRange:_,departmentIds:n,userIds:b})}},z6={name:"crm.report.device-app-statistics-list",description:"查询设备/应用使用时长统计。",category:"crm",pluginName:P0,parameters:i.object({page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),search_type:i.number().int().optional().default(1).describe("搜索类型,默认 1"),sort_type:i.string().optional().default("desc").describe("排序:desc/asc"),user_id:i.string().optional().default("").describe("用户 ID,空则查部门下全部"),range:i.number().int().optional().default(0).describe("时间范围代码:0=今天 -1=昨天 -32=自定义"),range_str:i.string().optional().default("").describe('自定义时间范围,range=-32 时用,格式 "开始,结束"'),department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageIndex:i.number().describe("页码"),pageSize:i.number().describe("页大小"),list:i.array(i.object({name:i.string().describe("应用名"),duration:i.number().optional().describe("使用时长(秒)"),totalDuration:i.number().optional().describe("累计使用时长(秒,跨用户累加)"),numberOfInstallers:i.number().optional().describe("安装人数")}).passthrough())}).passthrough(),examples:[{description:"查询设备应用使用时长(今天)",input:{},output:{total:2,pageIndex:1,pageSize:5,list:[{name:"微信",duration:3600,totalDuration:72000,numberOfInstallers:20}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.department_id||await K(),_=n.range_str;if(n.range===0||n.range===-1){let w=G1(new Date(Date.now()+n.range*86400000));_=`${w},${w}`}return await O("get_app_statistics",{pageNum:n.page_num,pageSize:n.page_size,userId:n.user_id,departmentId:b,..._?{rangeStr:_}:{},...n.search_type!==1?{searchType:n.search_type}:{},...n.sort_type!=="desc"?{sortType:n.sort_type}:{}})}},s6={name:"crm.report.device-statistics",description:"查询设备统计(总数/已绑定/锁定/激活)。department_id 空则取默认部门。",category:"crm",pluginName:P0,parameters:i.object({department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),user_id:i.string().optional().default("").describe("用户 ID,空则查部门下全部")}),returns:i.object({total:i.number(),has_bind:i.number(),locked:i.number(),actived:i.number()}),examples:[{description:"查询默认部门设备统计",input:{},output:{total:10,has_bind:8,locked:1,actived:7}}],sideEffects:["network"],handler:async({department_id:n,user_id:b})=>{let _=n||await K(),w=await O("get_device_statistics",{departmentId:_,userId:b});return{total:w.total,has_bind:w.hasBind,locked:w.locked,actived:w.actived}}};var b3="crm";function n3(n){return String(n).padStart(2,"0")}function i3(n,b=!1){return`${n.getFullYear()}-${n3(n.getMonth()+1)}-${n3(n.getDate())} ${b?"23:59:59":"00:00:00"}`}var _q=i.object({user_id:i.string(),user_name:i.string(),longitude:i.number().nullable(),latitude:i.number().nullable(),addr:i.string(),created_time:i.string(),last_online_time:i.string(),active_type:i.number(),in_or_out:i.number(),in_or_out_name:i.string(),loc_duration:i.number(),location_exception:i.number()}),_3={name:"crm.location.everyone-last-location",description:"查询指定部门所有员工的最后一次定位记录。建议先用 org.search 或 org.department-tree 缩小部门范围。",category:"crm",pluginName:b3,parameters:i.object({department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门;可用 org.search / org.department-tree 选择更小范围"),device_code:i.string().optional().default("").describe("设备编码,空则不过滤")}),returns:i.object({total:i.number(),records:i.array(_q)}),examples:[{description:"查询部门员工最后定位",input:{department_id:"DEPT001"},output:{total:1,records:[{user_id:"u001",user_name:"张三",longitude:116.4,latitude:39.9,addr:"北京市",created_time:"2026-08-01 10:00:00",last_online_time:"2026-08-01 10:00:00",active_type:1,in_or_out:3,in_or_out_name:"未知",loc_duration:0,location_exception:0}]}}],sideEffects:["network"],handler:async({department_id:n,device_code:b})=>{let _=n||await K(),w=await O("get_everyone_last_location",{departmentId:_,deviceCode:b}),$=(Array.isArray(w)?w:w.list??[]).map((q)=>({user_id:String(q.userId??""),user_name:String(q.userName??""),longitude:q.longitude??null,latitude:q.latitude??null,addr:String(q.addr??""),created_time:String(q.createdTime??""),last_online_time:String(q.lastOnlineTime??""),active_type:Number(q.activeType??0),in_or_out:Number(q.inOrOut??3),in_or_out_name:String(q.inOrOutName??"未知"),loc_duration:Number(q.locDuration??0),location_exception:Number(q.locationException??0)}));return{total:$.length,records:$}}},wq=i.object({user_id:i.string(),longitude:i.number().nullable(),latitude:i.number().nullable(),addr:i.string(),created_time:i.string(),start_time:i.string(),end_time:i.string(),loc_duration:i.number(),in_or_out:i.number(),in_or_out_name:i.string(),active_type:i.number(),location_exception:i.number()}),w3={name:"crm.location.record-list",description:"查询指定员工在时间段内的定位轨迹。建议显式传入较短时间范围,不要依赖默认近30天。",category:"crm",pluginName:b3,parameters:i.object({user_id:i.string().min(1).describe("员工用户 ID(可通过 org.search 获取)"),start_time:i.string().optional().default("").describe("开始时间 YYYY-MM-DD HH:mm:ss,空则默认近30天"),end_time:i.string().optional().default("").describe("结束时间 YYYY-MM-DD HH:mm:ss,空则默认今天"),device_code:i.string().optional().default("").describe("设备编码,空则不过滤")}),returns:i.object({total:i.number(),records:i.array(wq)}),examples:[{description:"查询员工某天轨迹",input:{user_id:"u001",start_time:"2026-08-01 00:00:00",end_time:"2026-08-01 23:59:59"},output:{total:1,records:[{user_id:"u001",longitude:116.4,latitude:39.9,addr:"北京市",created_time:"2026-08-01 10:00:00",start_time:"2026-08-01 09:00:00",end_time:"2026-08-01 12:00:00",loc_duration:10800000,in_or_out:3,in_or_out_name:"未知",active_type:1,location_exception:0}]}}],sideEffects:["network"],handler:async({user_id:n,start_time:b,end_time:_,device_code:w})=>{let $=new Date,q=_||i3($,!0),o=b||i3(new Date($.getTime()-2592000000),!1),x=await O("get_loc_record_by_user_id",{userId:n,createTimeRange:{start:o,end:q},deviceCode:w}),m=(x?.list??[]).map((v)=>({user_id:String(v.userId??n),longitude:v.longitude??null,latitude:v.latitude??null,addr:String(v.addr??""),created_time:String(v.createdTime??""),start_time:String(v.starttime??""),end_time:String(v.endtime??""),loc_duration:Number(v.locDuration??0),in_or_out:Number(v.inOrOut??3),in_or_out_name:String(v.inOrOutName??"未知"),active_type:Number(v.activeType??0),location_exception:Number(v.locationException??0)}));return{total:x?.total??m.length,records:m}}};var $3="crm",h1=i.union([i.string(),i.number()]).transform((n)=>String(n)),q3={name:"crm.call.log-list",description:"获取通话记录列表。后端每页最多 10 条;pageCount > 当前页时需翻页取全后再汇总。",category:"crm",pluginName:$3,parameters:i.object({page:i.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数,建议 5-10"),sales_progress:i.string().optional().default("").describe("销售进度"),start_voice_time:i.string().optional().default("").describe("语音开始时间 YYYY-MM-DD HH:mm:ss"),end_voice_time:i.string().optional().default("").describe("语音结束时间"),start_create_time:i.string().optional().default("").describe("创建开始时间"),end_create_time:i.string().optional().default("").describe("创建结束时间"),search_info:i.string().optional().default("").describe("搜索关键词(客户名/公司等)"),last_connect_time_start:i.string().optional().default("").describe("最后连接开始时间"),last_connect_time_end:i.string().optional().default("").describe("最后连接结束时间"),filter_user_id:h1.optional().default("").describe("按员工用户 ID 筛选"),tip_type:i.string().optional().default("").describe("提示类型"),progress:i.string().optional().default("").describe("进度状态"),call_seconds:i.string().optional().default("").describe("通话秒数筛选"),department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),search_phone:h1.optional().default("").describe("按电话号码搜索"),call_id:h1.optional().default("").describe("通话记录 ID"),call_type:i.string().optional().default("s").describe("通话类型过滤;取值沿用 PC 侧历史值(默认 s),上游语义未文档化,非必要不传")}),returns:i.object({page:i.number().describe("页码"),pageCount:i.number().describe("总页数"),totalCount:i.number().describe("总条数"),phoneHidden:i.boolean().optional().describe("手机号脱敏开关位(公司配置)"),hideRecordPlay:i.boolean().optional().describe("录音播放隐藏开关位(上游未文档化)"),data:i.array(i.object({id:i.string().describe("通话记录 ID"),startCallTime:i.string().describe("开始通话时间 yyyy-MM-dd HH:mm:ss"),createdTime:i.string().describe("创建时间 yyyy-MM-dd HH:mm:ss"),callDuration:i.string().describe("通话时长(秒,字符串形态)"),callSeconds:i.number().describe("通话秒数"),incomingCall:i.number().describe("通话方向:0去电 1来电 3来电未接听 4来电(没有) 5来电拒接 6呼出失败 7呼出另设备接听 9呼出IMS 10来电未接IMS"),userId:i.string().describe("员工用户 ID"),userIdName:i.string().describe("员工名"),es_version:i.number().optional().describe("ES 文档版本号(上游未文档化)"),version:i.string().optional().describe("数据版本(上游未文档化)"),ringSecond:i.number().optional().describe("振铃秒数"),callStatus:i.number().optional().describe("通话状态码(上游未文档化)"),canTrans:i.number().optional().describe("可转写标记(上游未文档化)"),progress:i.number().optional().describe("销售进度码"),progressName:i.string().optional().describe("销售进度名"),progressType:i.number().optional().describe("进度来源:1人工 2AI"),channel:i.number().optional().describe("通道码(上游未文档化)"),departmentId:i.string().optional().describe("部门 ID"),departmentList:i.string().optional().describe("部门链(上游未文档化格式)"),planCustomerId:i.string().optional().describe("通话计划关联客户 ID"),planCustomerName:i.string().optional().describe("通话计划关联客户名"),planCustomerCompany:i.string().optional().describe("通话计划关联客户公司"),companyCode:i.string().optional().describe("公司码"),callNumber:i.string().optional().describe("通话号码"),simPhone:i.string().optional().describe("SIM 卡手机号"),simNumber:i.string().optional().describe("SIM 卡随机码(iccid)"),imei:i.string().optional().describe("设备 IMEI"),downloadCount:i.number().optional().describe("录音下载次数"),recordFile:i.string().optional().describe("录音文件 URL"),recordFrom:i.number().optional().describe("录音来源码(上游未文档化)"),isUpload:i.number().optional().describe("录音提交状态:0未提交 1已提交"),tipType:i.number().optional().describe("电话结果码"),ai:i.number().optional().describe("AI 分析状态:0未分析 1已分析"),aiAsr:i.number().optional().describe("ASR 转写状态码(上游未文档化)"),qcStatus:i.number().optional().describe("质检状态码(上游未文档化)"),qualityInspectionPassTime:i.string().optional().describe("质检通过时间 yyyy-MM-dd HH:mm:ss"),userKey:i.string().optional().describe("跟进人 ID"),userKeyName:i.string().optional().describe("跟进人名"),groups:i.string().optional().describe("分组(上游未文档化格式)")}).passthrough())}).passthrough(),examples:[{description:"获取第 1 页通话记录",input:{page:1,page_size:5},output:{page:1,pageCount:3,totalCount:15,data:[]}}],sideEffects:["network"],handler:async(n)=>{let b=n.department_id||await K(),_=n.sales_progress!==""?n.sales_progress:n.progress;return await O("get_call_log_list",{page:n.page,pageSize:n.page_size,departmentId:b,userId:n.filter_user_id,...n.search_info?{searchInfo:n.search_info}:{},...n.search_phone?{searchPhone:n.search_phone}:{},...n.call_id?{id:n.call_id}:{},...n.call_type?{callType:n.call_type}:{},...n.last_connect_time_start?{lastConnectTimeStart:n.last_connect_time_start}:{},...n.last_connect_time_end?{lastConnectTimeEnd:n.last_connect_time_end}:{},...n.tip_type!==""?{tipType:Number(n.tip_type)}:{},...n.call_seconds!==""?{callSeconds:Number(n.call_seconds)}:{},..._!==""?{progress:Number(_)}:{},...n.start_voice_time?{startVoiceTime:n.start_voice_time}:{},...n.end_voice_time?{endVoiceTime:n.end_voice_time}:{},...n.start_create_time?{startCreateTime:n.start_create_time}:{},...n.end_create_time?{endCreateTime:n.end_create_time}:{}})}},o3={name:"crm.call.asr-result",description:"获取通话录音的 ASR 语音转写结果。",category:"crm",pluginName:$3,parameters:i.object({call_action_id:i.string().min(1).describe("通话 ID"),audio_url:i.string().optional().default("").describe("音频文件 URL(可选)"),call_type:i.string().optional().default("1").describe("录音类型:1=通话,12=本地录音")}),returns:i.object({trans_complete:i.number(),asr_result:i.array(i.unknown()),message:i.string()}),examples:[{description:"获取通话录音的 ASR 转写结果",input:{call_action_id:"123456",call_type:"1"},output:{trans_complete:1,asr_result:[],message:""}}],sideEffects:["network"],handler:async({call_action_id:n,audio_url:b,call_type:_})=>{let w=await O("get_call_asr_result",{type:Number(_),businessId:n,...b?{url:b}:{}});return{trans_complete:w.transComplete??0,asr_result:w.asrResult??[],message:w.message??""}}};var s="crm",$q=i.union([i.string(),i.number()]).transform((n)=>String(n)),Zn=i.union([i.array(i.string()),i.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}),W2=i.union([i.array(i.number()),i.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[Number(n)]}});function Xi(n){let b=String(n),_=Date.parse(`${b.replace(" ","T")}+08:00`);if(Number.isNaN(_))throw Error(`无法解析时间: ${b}`);return _}var vn={start_time:i.string().describe("开始时间 yyyy-MM-dd HH:mm:ss(北京时间,CLI 自动转毫秒传中台)"),end_time:i.string().describe("结束时间 yyyy-MM-dd HH:mm:ss(北京时间,CLI 自动转毫秒传中台)"),page_index:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),user_id:i.string().optional().default("").describe("员工 ID"),user_ids:Zn.optional().default([]).describe("员工 ID 列表"),search_type:i.number().int().optional().describe("搜索类型:1客户姓名 2客户手机号 3员工姓名 4员工手机号 5客户微信昵称 6客户微信号 7员工微信昵称 8员工微信号"),keyword:i.string().optional().default("").describe("搜索关键词"),ctype:i.number().int().optional().describe("沟通类型:1电话 2微信 3微信长语音"),sort_field:i.number().int().optional().describe("排序字段:1分析时间 2沟通时间"),sort_order:i.string().optional().default("").describe("排序:asc/desc"),range_field:i.number().int().optional().describe("过滤时间字段:1分析时间 2沟通时间"),call_second_type:i.number().int().optional().describe("通话时长类型")};function un(n,b,_={}){return{pageIndex:n.page_index,pageSize:n.page_size,startTime:Xi(n.start_time),endTime:Xi(n.end_time),dptId:b,...n.user_id?{userId:n.user_id}:{},...Array.isArray(n.user_ids)&&n.user_ids.length?{userIds:n.user_ids}:{},...n.search_type!=null?{type:n.search_type}:{},...n.keyword?{keyword:n.keyword}:{},...n.ctype!=null?{ctype:n.ctype}:{},...n.sort_field!=null?{sortField:String(n.sort_field)}:{},...n.sort_order?{sortOrder:n.sort_order}:{},...n.range_field!=null?{rangeField:String(n.range_field)}:{},...n.call_second_type!=null?{callSecondType:n.call_second_type}:{},..._}}function B1(n,b){return{...n!=null?{callPercent:n}:{},...b!=null?{callSpeed:b}:{}}}var k=(n)=>i.union([i.string(),i.number()]).describe(n),M1="1喜悦 3满足 5兴奋 7希望 11耐心 13愤怒 15悲伤 17焦虑 21失望 23挫败感 25平静 27专业",x3="1满意 3高兴 5感激 7乐观 9不满意 11愤怒 13焦虑 15沮丧 17失望 21平静 23好奇",T0="1高意向 3中意向 5低意向 7需跟进 9客户评估中 11潜在意向需引导 13无意向 15预算顾虑 17产品疑问 19未联系上",m3="1电话 2微信聊天 3微信语音 5企微聊天 6企微语音 11工牌/现场录音 12现场录音",Hn={id:i.string().describe("分析记录 ID"),userId:i.string().describe("员工用户 ID"),ename:i.string().describe("员工姓名"),ephone:i.string().describe("员工电话(脱敏)"),callId:i.string().describe("通话/沟通记录 ID"),createdTime:i.string().describe("分析生成时间 yyyy-MM-dd HH:mm:ss"),ctype:i.number().describe(`沟通类型:${m3}`),content:i.string().describe("完整 AI 分析结果(嵌套 JSON 字符串:意向/情绪/痛点/异议/话术/摘要等,解析后使用)")},Qn={ewxId:i.string().optional().describe("员工微信 ID"),ewxName:i.string().optional().describe("员工微信昵称"),ewxAlias:i.string().optional().describe("员工微信号")},Xn={customerId:i.string().optional().describe("客户 ID"),cname:i.string().optional().describe("客户姓名"),cphone:i.string().optional().describe("客户电话(脱敏)"),cwxId:i.string().optional().describe("客户微信 ID"),cwxName:i.string().optional().describe("客户微信昵称"),cwxAlias:i.string().optional().describe("客户微信号")},Jn={communicationTime:i.string().optional().describe("沟通时间 yyyy-MM-dd HH:mm:ss"),recordFile:i.string().optional().describe("录音/聊天记录文件 URL(OSS 签名,有时效)"),callDuration:k("通话时长(秒)").optional(),callFileId:i.string().optional().describe("通话文件 ID"),epicFile:i.string().optional().describe("员工头像 URL"),cpicFile:i.string().optional().describe("客户头像 URL")},v0=k(`意向度:${T0}`).optional(),y0=i.string().describe("解决判定标记(如 未标记)"),H0=k("销售进度(企业自定义进度 ID)").optional(),u1=i.object({refStatus:i.number().describe("加微状态码(如 7=从未添加微信)"),refStatusMsg:i.string().describe("状态说明文案(如 从未添加微信)")}).passthrough(),e=(n,b)=>i.object({pageIndex:i.number().describe("页码"),pageSize:i.number().describe("页大小"),total:i.number().describe("总条数(超过当前页行数时继续翻页)"),data:i.array(n).describe(b),_pagination:i.string().optional().describe("中台注入的分页提示(还有下一页时出现)")}).passthrough(),v3={name:"crm.ai.employee-sop-analyse-list",description:"查询员工 SOP 分析列表,评估话术执行情况。",category:"crm",pluginName:s,parameters:i.object({...vn,call_percent:i.number().int().optional().describe("通话占比"),call_speed:i.number().int().optional().describe("语速"),sop_id:i.string().optional().default("").describe("SOP 配置 ID"),sop_step_id:i.string().optional().default("").describe("SOP 步骤 ID"),sop_type:W2.optional().default([]).describe("SOP 评估类型列表")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,moodType:k(`员工情绪类型:${M1}`),mood:i.string().describe("员工情绪分析(JSON 字符串:情绪名/情绪类型/情绪分析)"),sopType:k("SOP 评估档位:1优秀(100%) 3较好(90-100%) 5一般(70-90%) 7较差(50-70%) 9不合格(<50%)"),sopName:i.string().describe("SOP 名称"),sopPercent:i.string().describe('SOP 整体完成率(如 "85%"),各步骤完成率在 content 内'),goodSpeechType:k("优秀话术来源:1 AI 推荐 0 人工推荐"),goodSpeech:i.string().optional().describe("优秀话术内容(该沟通被推荐时出现)"),intention:v0}).passthrough(),"SOP 分析行"),examples:[{description:"查询 SOP 分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:63,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,moodType:"25",mood:'{"情绪名":"平静","情绪类型":"中性情绪","情绪分析":"沟通平稳"}',sopType:"3",sopName:"标准接待流程",sopPercent:"85%",goodSpeechType:"1",intention:1,recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"SOP执行":{"整体完成率":"85%"}}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_employee_sop_analyse_list",un(n,b,{...B1(n.call_percent,n.call_speed),...n.sop_id?{sopId:n.sop_id}:{},...n.sop_step_id?{sopStepId:n.sop_step_id}:{},...n.sop_type?.length?{sopType:n.sop_type}:{}}))}},H3={name:"crm.ai.good-speech-list",description:"查询优秀话术列表。",category:"crm",pluginName:s,parameters:i.object({...vn,call_percent:i.number().int().optional().describe("通话占比"),call_speed:i.number().int().optional().describe("语速"),good_speech_type:i.number().int().optional().describe("优秀话术类型")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,moodType:k(`员工情绪类型:${M1}`).optional(),mood:i.string().describe("员工情绪分析(JSON 字符串)"),sopType:k("SOP 评估档位:1优秀(100%) 3较好(90-100%) 5一般(70-90%) 7较差(50-70%) 9不合格(<50%)").optional(),sopName:i.string().optional().describe("SOP 名称"),sopPercent:i.string().optional().describe('SOP 整体完成率(如 "85%")'),goodSpeechType:k("优秀话术来源:1 AI 推荐 0 人工推荐").optional(),goodSpeech:i.string().optional().describe("优秀话术内容(该沟通被推荐时出现)"),intention:v0}).passthrough(),"优秀话术行"),examples:[{description:"查询优秀话术",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:71,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,mood:'{"情绪名":"平静","情绪类型":"中性情绪"}',sopType:"3",sopName:"标准接待流程",sopPercent:"85%",goodSpeechType:"1",goodSpeech:"您好,我们这边先给您报个价,您对比一下性价比。",intention:1,recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"优秀话术分析":{"结论":"是"}}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_good_speech_list",un(n,b,{...B1(n.call_percent,n.call_speed),...n.good_speech_type!=null?{goodSpeechType:n.good_speech_type}:{}}))}},Q3={name:"crm.ai.employee-analyse-list",description:"查询员工沟通综合分析列表(单次沟通一行:情绪、SOP 执行、优秀话术、意向、通话指标并存于行内)。mood_type 按员工情绪过滤记录。",category:"crm",pluginName:s,parameters:i.object({...vn,call_percent:i.number().int().optional().describe("通话占比"),call_speed:i.number().int().optional().describe("语速"),mood_type:W2.optional().default([]).describe("情绪类型过滤:1喜悦 3满足 5兴奋 7希望 11耐心 13愤怒 15悲伤 17焦虑 21失望 23挫败感 25平静 27专业;空则不过滤")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,moodType:k(`员工情绪类型:${M1}`).optional(),mood:i.string().optional().describe("员工情绪分析(JSON 字符串)"),sopType:k("SOP 评估档位:1优秀(100%) 3较好(90-100%) 5一般(70-90%) 7较差(50-70%) 9不合格(<50%)").optional(),sopName:i.string().optional().describe("SOP 名称"),sopPercent:i.string().optional().describe('SOP 整体完成率(如 "85%")'),goodSpeechType:k("优秀话术来源:1 AI 推荐 0 人工推荐").optional(),goodSpeech:i.string().optional().describe("优秀话术内容(该沟通被推荐时出现)"),intention:v0}).passthrough(),"员工沟通综合分析行(单次沟通一行,各分析面并存)"),examples:[{description:"查询员工分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:71,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",ewxId:"wxid_demo001",ewxName:"销售小张",ewxAlias:"zhang_sales",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:2,moodType:"25",mood:'{"情绪名":"平静","情绪类型":"中性情绪"}',sopType:"3",sopName:"标准接待流程",sopPercent:"85%",intention:1,recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"员工沟通分析":{"员工语速":"280 字/分钟"}}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_employee_analyse_list",un(n,b,{...B1(n.call_percent,n.call_speed),...n.mood_type?.length?{moodType:n.mood_type}:{}}))}},X3={name:"crm.ai.customer-objection-list",description:"查询客户异议分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,objection:Zn.optional().default([]).describe("异议列表"),select_type:i.number().int().optional().describe("筛选类型"),solution_judge:i.string().optional().default("").describe("解决方案判定")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,objection:i.string().describe("命中的客户异议(明细见 content 的客户异议分析)"),intention:k(`意向度:${T0}`),progress:H0,solutionJudge:y0}).passthrough(),"客户异议分析行"),examples:[{description:"查询客户异议",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:30,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,objection:"价格异议",intention:"1",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户异议分析":[{"异议类型":"价格问题","客户异议":"价格比竞品高","解决方案":"说明性价比"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_customer_objection_list",un(n,b,{...n.objection?.length?{objection:n.objection}:{},...n.select_type!=null?{selectType:n.select_type}:{},...n.solution_judge?{solutionJudge:n.solution_judge}:{}}))}},J3={name:"crm.ai.customer-pain-list",description:"查询客户痛点分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,pain:Zn.optional().default([]).describe("痛点列表"),select_type:i.number().int().optional().describe("筛选类型"),solution_judge:i.string().optional().default("").describe("解决方案判定")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,pain:i.string().describe("命中的客户痛点(明细见 content 的客户痛点分析)"),intention:k(`意向度:${T0}`),progress:k("销售进度(企业自定义进度 ID)"),solutionJudge:y0}).passthrough(),"客户痛点分析行"),examples:[{description:"查询客户痛点",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:28,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,pain:"预算有限",intention:"5",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户痛点分析":[{"痛点类型":"价格问题","客户痛点":"预算有限","解决方案":"推荐分期方案"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_customer_pain_list",un(n,b,{...n.pain?.length?{pain:n.pain}:{},...n.select_type!=null?{selectType:n.select_type}:{},...n.solution_judge?{solutionJudge:n.solution_judge}:{}}))}},Y3={name:"crm.ai.customer-issue-list",description:"查询客户问题分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,issue:Zn.optional().default([]).describe("问题列表"),select_type:i.number().int().optional().describe("筛选类型"),solution_judge:i.string().optional().default("").describe("解决方案判定")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,issue:i.string().describe("命中的客户问题(明细见 content 的客户问题分析)"),intention:v0,progress:H0,solutionJudge:y0}).passthrough(),"客户问题分析行"),examples:[{description:"查询客户问题",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:41,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,issue:"询问交付周期",intention:"1",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户问题分析":[{"问题类型":"交付问题","客户问题":"多久能交付","问题分析":"关注上线时间"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_customer_issue_list",un(n,b,{...n.issue?.length?{issue:n.issue}:{},...n.select_type!=null?{selectType:n.select_type}:{},...n.solution_judge?{solutionJudge:n.solution_judge}:{}}))}},W3={name:"crm.ai.customer-mood-list",description:"查询客户情绪分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,mood_type:W2.optional().default([]).describe("情绪类型过滤:1喜悦 3满足 5兴奋 7希望 11耐心 13愤怒 15悲伤 17焦虑 21失望 23挫败感 25平静 27专业;空则不过滤"),select_type:i.number().int().optional().describe("筛选类型")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,moodType:k(`客户情绪类型:${x3}`),mood:i.string().describe("客户情绪分析(JSON 字符串:情绪名/情绪类型/情绪分析)"),intention:k(`意向度:${T0}`),progress:H0,solutionJudge:y0,keywords:i.string().optional().describe("沟通关键词(JSON 数组字符串)"),keywordStr:i.string().optional().describe("关键词分类汇总(JSON 字符串:情绪类/痛点类/需求类)"),issue:i.string().optional().describe("渗出键:命中的客户问题"),pain:i.string().optional().describe("渗出键:命中的客户痛点"),objection:i.string().optional().describe("渗出键:命中的客户异议")}).passthrough(),"客户情绪分析行"),examples:[{description:"查询客户情绪",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:55,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,moodType:"21",mood:'{"情绪名":"平静","情绪类型":"中性情绪","情绪分析":"沟通平稳"}',intention:"1",progress:"3",solutionJudge:"未标记",keywords:'["产品价格","优惠活动"]',recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户情绪分析":{"整体情绪判断":{"情绪名":"平静","情绪类型":"中性情绪"}}}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_customer_mood_list",un(n,b,{...n.mood_type?.length?{moodType:n.mood_type}:{},...n.select_type!=null?{selectType:n.select_type}:{}}))}},l3={name:"crm.ai.competitor-analyse-list",description:"查询竞品分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,competitor:Zn.optional().default([]).describe("竞品列表"),select_type:i.number().int().optional().describe("筛选类型")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,competitorName:i.string().describe("命中的竞品名称(明细见 content 的竞品分析)"),intention:v0,progress:H0,solutionJudge:y0}).passthrough(),"竞品分析行"),examples:[{description:"查询竞品分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:10,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",ewxId:"wxid_demo001",ewxName:"销售小张",ewxAlias:"zhang_sales",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,competitorName:"竞品A",intention:"1",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"竞品分析":[{"竞品名称":"竞品A","优势劣势":"价格更低但服务弱"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_competitor_analyse_list",un(n,b,{...n.competitor?.length?{competitor:n.competitor}:{},...n.select_type!=null?{selectType:n.select_type}:{}}))}},p3={name:"crm.ai.failure-analyse-list",description:"查询战败分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,failure_reason:Zn.optional().default([]).describe("战败原因列表"),detail_reason:Zn.optional().default([]).describe("细分原因列表"),intention:W2.optional().default([]).describe("意向度列表"),clue_value:W2.optional().default([]).describe("线索价值列表:1高2中3低"),customer_id:i.string().optional().default("").describe("客户 ID")}),returns:e(i.object({id:i.string().describe("分析记录 ID"),customerId:i.string().describe("客户 ID"),companyCode:i.string().describe("公司码"),cname:i.string().describe("客户姓名"),cphone:i.string().describe("客户电话(脱敏)"),userId:i.string().describe("最后沟通员工用户 ID"),createdTime:i.string().describe("创建时间"),analyseTime:i.string().describe("分析时间"),progress:k("销售进度(企业自定义进度 ID)").optional(),intention:k(`意向度:${T0}`),failureReason:i.array(i.string()).describe("战败原因(多条)"),detailReason:i.array(i.string()).describe("细分原因(多条)"),summaryReason:i.string().describe("综合原因"),judgeReason:i.string().describe("判定原因"),isFailure:k("是否战败:0否 1是"),clueValue:k("线索价值:1高 2中 3低"),followUp:i.string().describe("跟进人"),followUpUserId:i.string().describe("跟进人用户 ID"),headImg:i.string().optional().describe("头像 URL"),cwxId:i.string().optional().describe("客户微信 ID"),cwxName:i.string().optional().describe("客户微信昵称"),cwxAlias:i.string().optional().describe("客户微信号")}).passthrough(),"战败分析行(每客户一行)"),examples:[{description:"查询战败分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:7,data:[{id:"a1b2c3d4e5f6",customerId:"CUST1A2B3C4D",companyCode:"qeg4ep",cname:"李四",cphone:"139****0002",userId:"USER9F8E7D6C",createdTime:"2026-09-01 10:00:00",analyseTime:"2026-09-02 08:00:00",intention:"13",failureReason:["价格偏高","选择了竞品"],detailReason:["竞品折扣更大"],summaryReason:"价格敏感客户被竞品折扣吸引",judgeReason:"多次沟通未促成",isFailure:"1",clueValue:"2",followUp:"王五",followUpUserId:"USER5A4B3C2D1E"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_failure_analyse_list",un(n,b,{...n.failure_reason?.length?{failureReason:n.failure_reason}:{},...n.detail_reason?.length?{detailReason:n.detail_reason}:{},...n.intention?.length?{intention:n.intention}:{},...n.clue_value?.length?{clueValue:n.clue_value}:{},...n.customer_id?{customerId:n.customer_id}:{}}))}},G3={name:"crm.ai.failure-detail-list",description:"查询战败详情列表(单通维度,customer_id 必填)。",category:"crm",pluginName:s,parameters:i.object({...vn,customer_id:i.string().describe("客户 ID(必填)")}),returns:e(i.object({id:i.string().describe("记录 ID"),customerId:i.string().optional().describe("客户 ID"),userId:i.string().optional().describe("员工用户 ID"),ename:i.string().optional().describe("员工姓名"),ephone:i.string().optional().describe("员工电话"),cname:i.string().optional().describe("客户姓名"),cphone:i.string().optional().describe("客户电话"),ewxId:i.string().optional().describe("员工微信 ID"),ewxName:i.string().optional().describe("员工微信昵称"),ewxAlias:i.string().optional().describe("员工微信号"),cwxId:i.string().optional().describe("客户微信 ID"),cwxName:i.string().optional().describe("客户微信昵称"),cwxAlias:i.string().optional().describe("客户微信号"),callId:i.string().optional().describe("通话/沟通记录 ID"),createdTime:i.string().optional().describe("创建时间"),communicationTime:i.string().optional().describe("沟通时间"),ctype:i.number().optional().describe("沟通类型:1电话 2微信聊天 3微信长语音 4微信汇总"),callType:k("来电/去电方向(呼出/呼入编码,上游注释自相矛盾,未实测裁决)").optional(),isFailure:k("是否战败:0否 1是").optional(),clueValue:k("线索价值:1高 2中 3低").optional(),content:i.string().optional().describe("完整分析结果(嵌套 JSON 字符串)"),recordFile:i.string().optional().describe("录音文件 URL"),callDuration:k("通话时长(秒)").optional(),cpicFile:i.string().optional().describe("客户头像 URL"),epicFile:i.string().optional().describe("员工头像 URL")}).passthrough(),"战败单通详情行(字段依据 PC 模型、未实测)"),examples:[{description:"查询战败详情",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59",customer_id:"C001"},output:{pageIndex:1,pageSize:5,total:0,data:[]}}],sideEffects:["network"],handler:async(n)=>{return await O("get_failure_detail_list",{customerId:n.customer_id,pageIndex:n.page_index,pageSize:n.page_size})}},O3={name:"crm.ai.sop-quality-analyse-list",description:"查询 SOP 质检分析列表。",category:"crm",pluginName:s,parameters:i.object({...vn,quality_type:i.number().int().optional().describe("质检类型:1关键词2SOP"),quality_result:i.number().int().optional().describe("质检结果:1合格3不合格5好7中9差"),comm_scenario_id:i.number().int().optional().describe("沟通场景 ID"),sop_id:i.number().int().optional().describe("SOP 配置 ID"),rule_id:i.number().int().optional().describe("规则模板 ID"),task_id:i.number().int().optional().describe("任务 ID"),call_id:i.string().optional().default("").describe("通话 ID")}),returns:e(i.object({id:i.string().describe("质检记录 ID"),userId:i.string().describe("员工用户 ID"),companyCode:i.string().describe("公司码"),ename:i.string().describe("员工姓名或员工微信"),ephone:i.string().describe("员工电话或微信号"),customerId:i.string().optional().describe("客户 ID"),cname:i.string().optional().describe("客户姓名或客户微信"),cphone:i.string().optional().describe("客户电话或客户微信号"),ewxId:i.string().optional().describe("员工微信 ID"),ewxName:i.string().optional().describe("员工微信昵称"),ewxAlias:i.string().optional().describe("员工微信号"),cwxId:i.string().optional().describe("客户微信 ID"),cwxName:i.string().optional().describe("客户微信昵称"),cwxAlias:i.string().optional().describe("客户微信号"),callId:i.string().describe("通话/沟通记录 ID"),callFileId:i.string().optional().describe("通话文件 ID"),createdTime:i.string().describe("创建时间"),communicationTime:i.string().describe("沟通时间"),evaluationType:k("评估方式:1以完成率评估 2以分值评估"),sopId:k("SOP 配置 ID").optional(),ruleId:k("规则模板 ID"),ruleName:i.string().describe("规则模板名称"),taskId:k("质检任务 ID"),taskName:i.string().describe("质检任务名称"),commScenarioId:k("沟通场景 ID").optional(),keywordNum:i.number().optional().describe("关键词命中数"),keywordData:i.string().optional().describe("关键词命中数据"),keywordDataDetail:i.string().optional().describe("关键词命中明细"),qualityType:k("质检类型:1关键词 2SOP"),qualityResult:k("质检结果:1合格 3不合格 5好 7中 9差"),qualityResultDefine:i.string().describe("质检结果定义说明"),executeInfoValue:i.string().describe("SOP 执行情况(已执行)"),executeInfoTotal:i.string().describe("SOP 执行情况(应执行)"),ctype:i.number().describe(`沟通类型:${m3}`),content:i.string().describe("完整分析结果(嵌套 JSON 字符串)"),recordFile:i.string().describe("录音文件 URL"),cpicFile:i.string().optional().describe("客户头像 URL"),epicFile:i.string().optional().describe("员工头像 URL"),callDuration:k("通话时长(秒)"),isFix:k("是否已修复"),hasDeduction:i.boolean().describe("是否有扣分"),deductionCount:i.number().describe("扣分条数"),stageId:i.string().describe("阶段 ID"),deductionStatus:i.string().optional().describe("扣分状态"),isManualAdjusted:i.boolean().optional().describe("是否人工调整过"),adjustReason:i.string().optional().describe("人工调整原因")}).passthrough(),"SOP 质检分析行"),examples:[{description:"查询 SOP 质检",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:10,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",companyCode:"qeg4ep",ename:"张三",ephone:"138****0001",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",evaluationType:1,ruleId:1001,ruleName:"接待流程质检",taskId:2001,taskName:"9月质检任务",qualityType:2,qualityResult:1,qualityResultDefine:"合格",executeInfoValue:"8",executeInfoTotal:"10",ctype:1,content:'{"SOP执行":{"整体完成率":"80%"}}',recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",isFix:0,hasDeduction:!0,deductionCount:1,stageId:"STAGE01"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_sop_quality_analyse_list",un(n,b,{...n.quality_type!=null?{qualityType:n.quality_type}:{},...n.quality_result!=null?{qualityResult:n.quality_result}:{},...n.comm_scenario_id!=null?{commScenarioId:n.comm_scenario_id}:{},...n.rule_id!=null?{ruleId:n.rule_id}:{},...n.task_id!=null?{taskId:n.task_id}:{},...n.sop_id!=null?{sopId:n.sop_id}:{},...n.call_id?{callId:n.call_id}:{}}))}},h3={name:"crm.ai.customer-intention-list",description:"获取客户 AI 分析列表(意向/情绪/痛点/异议等)。",category:"crm",pluginName:s,parameters:i.object({page_index:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),intension_levels:Zn.optional().default([]).describe("意向等级列表(高意向/中意向/低意向/无意向/意向不明/需跟进),空则全部"),search_phone:$q.optional().default("").describe("手机号搜索"),search_name_and_company:i.string().optional().default("").describe("客户名/公司名搜索"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("客户总数"),list:i.array(i.object({id:i.string().describe("客户 ID"),customerName:i.string().describe("客户姓名"),cellPhone:i.string().describe("客户手机号(脱敏)"),createdTime:i.string().describe("客户创建时间"),companyCode:i.string().describe("公司码"),userName:i.string().describe("所属员工账号"),createUserName:i.string().describe("创建人账号"),departmentId:i.string().describe("所属部门 ID"),departmentName:i.string().describe("所属部门名"),userKey:i.string().describe("所属员工用户 ID"),planId:i.string().optional().describe("跟进计划 ID(无计划的客户缺省)"),progress:i.number().describe("销售进度 ID(企业自定义 SalesProgress)"),aiProgress:i.number().describe("AI 判定的销售进度 ID"),aiProgressName:i.string().describe("AI 判定的销售进度名称(如 浏览/闲逛型)"),aiProgressTime:i.string().optional().describe("AI 进度判定时间"),isAnalyse:i.number().describe("是否已有 AI 分析:1是 0否"),keywords:i.string().describe("沟通关键词(JSON 数组字符串)"),intentionLevel:i.string().optional().describe("意向等级名称(高意向/中意向/低意向/无意向/意向不明/需跟进);AI 意向分析未完成的客户整组缺省"),aiRiskLevel:i.string().describe("流失风险等级(高/中/低)"),aiObjection:i.number().optional().describe("已解决异议条数;意向分析未完成缺省"),aiUnObjection:i.number().optional().describe("未解决异议条数;意向分析未完成缺省"),aiIssue:i.number().optional().describe("已解决问题条数;意向分析未完成缺省"),aiUnIssue:i.number().optional().describe("未解决问题条数;意向分析未完成缺省"),aiPain:i.number().optional().describe("已解决痛点条数;意向分析未完成缺省"),aiUnPain:i.number().optional().describe("未解决痛点条数;意向分析未完成缺省"),aiCusMood:i.string().optional().describe('客户情绪(如 "中性情绪:平静");意向分析未完成缺省'),aiEmpMood:i.string().optional().describe('员工情绪(如 "中性情绪:平静")'),aiCusTag:i.string().optional().describe("客户标签"),aiCusTagTime:i.string().optional().describe("客户打标时间"),compete:i.string().optional().describe("竞品信息"),nextAction:i.string().describe("AI 建议下一步动作"),actionProgress:i.string().describe("动作进度(如 AI)"),actionType:i.number().describe("动作类型"),labels:i.array(i.string()).optional().describe("客户标签列表"),labelTime:i.string().optional().describe("最近打标时间"),actionLabels:i.string().optional().describe("动作标签"),customerSource:i.string().describe("客户来源"),regionName:i.string().describe("地区名"),adPlatformName:i.string().describe("广告平台名"),isDistribution:i.number().describe("是否已分配"),callDuration:i.string().describe(`累计通话时长(格式 mm'ss")`),callSeconds:i.number().describe("累计通话秒数"),followTime:i.string().describe("最近跟进时间"),qixinMatch:i.number().describe("企信匹配标记"),mailState:i.string().describe("邮件状态"),inRecycle:i.number().describe("是否在公海/回收站"),isCloudPlan:i.number().describe("云计划标记"),custLevel:i.number().optional().describe("客户等级"),isInPlan:i.number().describe("是否在跟进计划"),isPush:i.number().describe("推送标记"),isMsgPlan:i.number().describe("消息计划标记"),isDelete:i.number().describe("删除标记"),designatedStatus:i.number().describe("指定状态"),version:i.string().describe("数据版本时间(最近更新)"),comMatchScore:i.number().describe("企业匹配分"),comActiveScore:i.number().describe("企业活跃分"),comTycScore:i.number().describe("天眼查评分"),comValidity:i.number().describe("企业信息有效性分"),comDistance:i.number().describe("企业地址距离分"),canCall:i.boolean().describe("可否外呼"),canReceive:i.boolean().describe("可否领取"),delPhone:i.boolean().describe("手机号已删除"),ourCompany:i.boolean().describe("是否本公司号码"),phoneRegistProvinceId_na:i.number().describe("号码归属省 ID"),phoneRegistCityId_na:i.number().optional().describe("号码归属市 ID(部分客户缺省)"),phoneRegistAddress_ik:i.string().describe("号码归属地(如 广东省 清远市)"),toSeaNum:i.number().describe("转公海次数"),areaFlag:i.number().describe("区域标记"),planComplete:i.boolean().describe("跟进计划是否完成"),page:i.number().describe("分页回显(上游未文档化,实测恒 0)"),planCallStatus:i.number().optional().describe("计划通话状态"),planReceiveStatus:i.number().optional().describe("计划领取状态"),planFlickScreen:i.number().optional().describe("划屏状态(上游未文档化)"),isCustomerPush:i.number().describe("客户推送标记"),actState:i.number().describe("激活状态"),bookingNotice:i.number().describe("预约提醒标记"),contactState:i.string().describe("联系状态"),groupName:i.string().describe("客户分组名(如 待分组)"),wxPhoneAddRef:u1.describe("加微信状态"),qwFriendRef:u1.describe("加企微状态"),waFriendRef:u1.optional().describe("第三渠道加微状态(refStatusMsg 自带语义;部分客户缺省)")}).passthrough()).describe("客户行(档案 + AI 分析汇总)"),pageIndex:i.number().describe("页码回显(实测首页回 0)"),pageSize:i.number().describe("页大小回显(实测首页回 0)"),currIndex:i.number().describe("当前页回显(实测首页回 0)")}).passthrough(),examples:[{description:"查询客户意向",input:{},output:{total:4,list:[{id:"CUST1A2B3C4D5E6F",customerName:"李四",cellPhone:"139****0002",createdTime:"2026-03-12 13:32:08",bookingNotice:0,companyCode:"qeg4ep",userName:"16280023256",actState:0,planId:"PLAN7D559DBA275C",progress:0,aiProgress:1,aiProgressName:"浏览/闲逛型",isAnalyse:1,keywords:'["产品价格","优惠活动"]',aiRiskLevel:"低",aiObjection:1,aiUnObjection:0,aiIssue:1,aiUnIssue:0,aiPain:1,aiUnPain:0,aiCusMood:"中性情绪:平静",aiCusTag:"",customerSource:"企业导入",regionName:"",adPlatformName:"",isDistribution:1,actionType:0,callDuration:`3'15"`,callSeconds:195,userKey:"USER9F8E7D6C",qixinMatch:0,mailState:"0",inRecycle:0,isCloudPlan:0,custLevel:0,isInPlan:1,isPush:0,followTime:"2026-03-10 12:09:33",isMsgPlan:0,isDelete:0,designatedStatus:0,version:"2026-09-12 22:19:25",comMatchScore:0,comActiveScore:0,comTycScore:0,comValidity:0,comDistance:0,canCall:!0,departmentName:"销售一部",departmentId:"DEPT494397B51B76",createUserName:"16280023256",phoneRegistProvinceId_na:5,phoneRegistCityId_na:366,phoneRegistAddress_ik:"广东省 清远市",toSeaNum:0,areaFlag:-1,planComplete:!1,page:0,canReceive:!1,delPhone:!1,ourCompany:!1,nextAction:"需重新发起有效沟通,明确客户需求",planCallStatus:0,planReceiveStatus:0,planFlickScreen:-1,isCustomerPush:1,wxPhoneAddRef:{refStatus:7,refStatusMsg:"从未添加微信"},qwFriendRef:{refStatus:7,refStatusMsg:"从未添加微信"},waFriendRef:{refStatus:7,refStatusMsg:"从未添加"},contactState:"0",groupName:"待分组",actionProgress:"AI",intentionLevel:"高意向",labels:["重点客户"],aiEmpMood:"中性情绪:平静"}],pageIndex:0,pageSize:0,currIndex:0}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K(),_=n.intension_levels;return await O("get_ai_analysis_customer_list",{pageIndex:n.page_index,pageSize:n.page_size,deptId:b,...n.search_phone?{searchPhone:n.search_phone}:{},...n.search_name_and_company?{keyword:n.search_name_and_company}:{},..._.length===1?{intentionLevel:_[0]}:{},..._.length>1?{intensionLevel:_}:{}})}},u3={name:"crm.ai.communication-keywords-list",description:"分析客户沟通中的关键词(情绪/痛点/需求)。",category:"crm",pluginName:s,parameters:i.object({page_index:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),start_time:i.string().optional().default("").describe("开始时间,空则不限制"),end_time:i.string().optional().default("").describe("结束时间,空则不限制"),keyword_types:i.string().optional().default("").describe("关键词类别过滤(短语匹配;实测:痛点/需求/情绪 有效,传具体关键词文本无效)"),communication_type:i.string().optional().default("").describe("沟通类型:1电话 2微信聊天 3微信语音 5企微聊天 6企微语音 11工牌/现场录音 12现场录音"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),filter_user_id:i.string().optional().default("").describe("员工用户 ID")}),returns:e(i.object({...Hn,...Qn,...Xn,...Jn,keywords:i.string().describe('沟通关键词(JSON 数组字符串,如 ["产品价格","优惠活动"])'),keywordStr:i.string().optional().describe("关键词分类汇总(JSON 字符串:情绪类/痛点类/需求类)"),moodType:k(`客户情绪类型:${x3}`),mood:i.string().describe("客户情绪分析(JSON 字符串:情绪名/情绪类型/情绪分析)"),intention:k(`意向度:${T0}`),progress:H0,solutionJudge:y0,issue:i.string().optional().describe("渗出键:命中的客户问题"),pain:i.string().optional().describe("渗出键:命中的客户痛点"),objection:i.string().optional().describe("渗出键:命中的客户异议")}).passthrough(),"关键词分析行"),examples:[{description:"查询沟通关键词",input:{},output:{pageIndex:1,pageSize:5,total:551,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,moodType:"21",intention:"1",progress:"3",solutionJudge:"未标记",keywords:'["产品价格","优惠活动"]',keywordStr:'{"情绪类":["积极"],"需求类":["产品价格","优惠活动"]}',mood:'{"情绪名":"平静","情绪类型":"中性情绪","情绪分析":"沟通平稳"}',recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"沟通摘要":"客户询问价格,员工介绍方案"}'}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_customer_insights_keywords_list",{pageIndex:n.page_index,pageSize:n.page_size,...n.start_time?{startTime:Xi(n.start_time)}:{},...n.end_time?{endTime:Xi(n.end_time)}:{},...n.keyword_types?{keywordTypes:n.keyword_types}:{},dptId:b,rangeField:"1",...n.filter_user_id?{userId:n.filter_user_id}:{},...n.communication_type?{ctype:Number(n.communication_type)}:{}})}};var l2="crm",qq=i.union([i.string(),i.number()]).transform((n)=>String(n)),B3=i.union([i.array(i.string()),i.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}});function Ji(n){let b=n.includes(" ")?n.replace(" ","T"):`${n}T00:00:00`;return Date.parse(`${b}+08:00`)}var M3={name:"crm.order.missing-list",description:"查询飞单预警分析列表,检测员工可能的飞单行为。",category:"crm",pluginName:l2,parameters:i.object({start_time:i.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:i.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),page_index:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),user_id:i.string().optional().default("").describe("员工 ID"),user_ids:B3.optional().default([]).describe("员工 ID 列表"),search_type:i.number().int().optional().describe("搜索类型:1客户姓名 2客户手机号 3员工姓名 4员工手机号 5客户微信昵称 6客户微信号 7员工微信昵称 8员工微信号"),keyword:i.string().optional().default("").describe("搜索关键词"),ctype:i.number().int().optional().describe("沟通类型:1电话 2微信 3微信长语音"),sort_field:i.number().int().optional().describe("排序字段:1分析时间 2沟通时间"),sort_order:i.string().optional().default("").describe("排序:asc/desc"),range_field:i.number().int().optional().describe("过滤时间字段:1分析时间 2沟通时间"),call_second_type:i.number().int().optional().describe("通话时长类型"),call_percent:i.number().int().optional().describe("员工通话占比"),call_speed:i.number().int().optional().describe("语速"),missing_topic:B3.optional().default([]).describe("飞单话题筛选列表")}),returns:e(i.object({...Hn,ctype:i.number().describe("沟通类型:1电话 2微信聊天 3微信长语音 4微信汇总"),...Qn,...Xn,...Jn,mood:i.string().optional().describe("情绪码(上游未文档化)"),missingTopic:i.string().optional().describe("命中的飞单话题"),intention:v0,progress:H0}).passthrough(),"飞单预警行:一次沟通的分析切片;PC 模型未声明媒体键(recordFile/callDuration 等),实测存在(同族 ES 文档渗出),语义同 ai 域"),examples:[{description:"查询飞单预警",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:12,data:[{id:"f1001",userId:"U1001",ename:"李四",ephone:"138****0001",callId:"C2001",createdTime:"2026-08-01 10:00:00",ctype:1,content:'{"summary":"…"}',missingTopic:"私下成交",intention:3}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_order_missing_list",{pageIndex:n.page_index,pageSize:n.page_size,startTime:Ji(n.start_time),endTime:Ji(n.end_time),dptId:b,...n.user_id?{userId:n.user_id}:{},userIds:n.user_ids,...n.search_type!=null?{type:n.search_type}:{},...n.keyword?{keyword:n.keyword}:{},...n.ctype!=null?{ctype:n.ctype}:{},...n.sort_field!=null?{sortField:String(n.sort_field)}:{},...n.sort_order?{sortOrder:n.sort_order}:{},...n.range_field!=null?{rangeField:String(n.range_field)}:{},...n.call_second_type!=null?{callSecondType:n.call_second_type}:{},...n.call_percent!=null?{callPercent:n.call_percent}:{},...n.call_speed!=null?{callSpeed:n.call_speed}:{},missingTopic:n.missing_topic})}},j3={name:"crm.sms.log-list",description:"查询短信历史记录列表。",category:"crm",pluginName:l2,parameters:i.object({page:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),customer_id:i.string().optional().default("").describe("客户 ID"),customer_name:i.string().optional().default("").describe("客户姓名"),customer_phone:qq.optional().default("").describe("客户手机号"),start_time:i.string().optional().default("").describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:i.string().optional().default("").describe("结束时间 yyyy-MM-dd HH:mm:ss")}),returns:i.object({power:i.number().optional().describe("权限位(上游未文档化)"),dataCount:i.number().describe("总条数"),data:i.array(i.object({id:i.string().describe("短信记录 ID"),createTime:i.string().describe("时间 yyyy-MM-dd HH:mm:ss"),sms:i.string().describe("短信内容"),direction:i.number().describe("方向:0=接收 1=发送"),customerPhone:i.string().optional().describe("客户手机号(可能脱敏)"),smsSub:i.string().optional().describe("短信主题/摘要"),sender:i.string().optional().describe("发送员工名"),senderDepartment:i.string().optional().describe("发送部门名"),senderDepartmentId:i.string().optional().describe("发送部门 ID"),departmentList:i.string().optional().describe("部门链(上游未文档化格式)"),source:i.number().optional().describe("来源码(上游未文档化)"),simPhone:i.string().optional().describe("SIM 卡手机号"),simNumber:i.string().optional().describe("SIM 卡随机码(iccid)"),userId:i.string().optional().describe("员工用户 ID"),receiveName:i.string().optional().describe("接收人名"),partnerId:i.string().optional().describe("关联 ID(上游未文档化)"),customerId:i.string().optional().describe("客户 ID"),customerName:i.string().optional().describe("客户名"),customerCompany:i.string().optional().describe("客户公司名"),follower:i.string().optional().describe("跟进人名"),remark:i.string().optional().describe("备注"),sourceFileName:i.string().optional().describe("来源文件名(导入类短信)"),sensitiveClassify:i.string().optional().describe("敏感词分类"),sensitiveWorld:i.string().optional().describe("命中敏感词(上游键名拼写 World 即此)"),triggerSensitive:i.number().optional().describe("是否触发敏感:0/1"),isSensitive:i.number().optional().describe("是否敏感:0/1"),sensitiveCategoriesList:i.array(i.unknown()).optional().describe("敏感分类列表(上游未文档化结构)"),sensitiveWordsList:i.array(i.unknown()).optional().describe("敏感词列表(上游未文档化结构)")}).passthrough())}).passthrough(),examples:[{description:"查询短信记录",input:{},output:{power:1,dataCount:35,data:[{id:"s1001",createTime:"2026-09-01 09:30:00",sms:"您好,本周产品直播链接…",direction:1,sender:"李四",simPhone:"139****0002"}]}}],sideEffects:["network"],handler:async({page:n,page_size:b,customer_id:_,customer_name:w,customer_phone:$,start_time:q,end_time:o})=>{return await O("get_sms_log_list",{page:n,pageSize:b,...q?{sendTimeStart:q}:{},...o?{sendTimeEnd:o}:{},..._?{customerId:_}:{},...w?{customerName:w}:{},...$?{customerPhone:$}:{}})}},f3={name:"crm.voice.recording-list",description:"查询现场录音或工牌录音列表。",category:"crm",pluginName:l2,parameters:i.object({start_time:i.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:i.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),page_index:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),device_type:i.number().int().optional().default(0).describe("设备类型:0=现场录音 1=工牌录音"),user_id:i.string().optional().default("").describe("员工 ID"),user_name:i.string().optional().default("").describe("员工姓名"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pages:i.number().describe("总页数"),pageNum:i.number().describe("当前页码"),voices:i.array(i.object({id:i.string().describe("录音 ID"),theme:i.string().describe("主题"),startTime:i.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),endTime:i.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),voiceUrl:i.string().describe("录音文件 URL"),voiceTime:i.number().describe("录音时长(秒)"),createTime:i.string().describe("创建时间 yyyy-MM-dd HH:mm:ss"),deviceType:i.number().describe("设备类型:0=现场录音 1=工牌录音"),createUserId:i.string().describe("员工用户 ID"),createUserName:i.string().describe("员工名"),companyCode:i.string().optional().describe("公司码"),progressName:i.string().optional().describe("销售进度名"),progressType:i.number().optional().describe("进度来源:1人工 2AI"),salesProgress:i.number().optional().describe("销售进度码"),customerName:i.string().optional().describe("客户名"),customerCellphone:i.string().optional().describe("客户手机号(可能脱敏)"),customerId:i.string().optional().describe("客户 ID"),mark:i.string().optional().describe("标记(上游未文档化)"),isTranslate:i.number().optional().describe("是否已转写:0/1"),isDel:i.number().optional().describe("删除标记:0/1"),location:i.string().optional().describe("录音地点"),longitude:i.number().optional().describe("经度"),latitude:i.number().optional().describe("纬度"),deviceNo:i.string().optional().describe("工牌设备 ID"),partnerId:i.string().optional().describe("关联 ID(上游未文档化)"),departmentName:i.string().optional().describe("部门名"),departmentId:i.string().optional().describe("部门 ID"),createUserCellphone:i.string().optional().describe("员工手机号(可能脱敏)")}).passthrough())}).passthrough(),examples:[{description:"查询现场录音",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:8,pages:2,pageNum:1,voices:[{id:"v1001",theme:"客户拜访",startTime:"2026-08-01 14:00:00",endTime:"2026-08-01 14:20:00",voiceUrl:"https://oss.example.com/v/1001.mp3",voiceTime:1200,createTime:"2026-08-01 14:21:00",deviceType:0,createUserId:"U1001",createUserName:"李四",customerName:"王五"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_voice_list",{pageNum:n.page_index,pageSize:n.page_size,startCreateTime:n.start_time,endCreateTime:n.end_time,deviceType:n.device_type,deptId:b,...n.user_id?{createUserId:n.user_id}:{},...n.user_name?{userName:n.user_name}:{}})}},V3={name:"crm.device.control-log-list",description:"查询管控日志列表(开始/结束时间转毫秒时间戳传后端)。",category:"crm",pluginName:l2,parameters:i.object({start_time:i.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:i.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数")}),returns:i.object({}).passthrough(),hidden:!0,examples:[{description:"查询管控日志",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{}}],sideEffects:["network"],handler:async({start_time:n,end_time:b,page_num:_,page_size:w})=>{return await O("get_control_log_list",{pageNum:_,pageSize:w,startTriggerTime:Ji(n),endTriggerTime:Ji(b)})}},oq=new Set(["menus","themeConfig","showfieldHead","showfieldHeadShow"]),K3={name:"crm.user.info",description:"获取当前登录用户的关键信息(基础身份、权限、部门、角色),已过滤 menus/themeConfig 等大字段。可作为需要 userId/departmentId 的前置调用。查当前用户优先用本命令;需 menus 等全量字段时用 crm.auth.user-info。",category:"crm",pluginName:l2,parameters:i.object({}),returns:i.object({userId:i.string().describe("当前登录用户 ID(各命令 user_id 参数的取值来源)"),realName:i.string().describe("姓名"),roleName:i.string().describe("角色名"),isManager:i.boolean().describe("是否管理员"),departmentId:i.string().describe("主部门 ID"),userStatus:i.number().optional().describe("用户状态码(上游未文档化)"),companyId:i.string().optional().describe("公司 ID"),manageDepartmentNames:i.string().optional().describe("管理的部门名(上游未文档化格式)"),cellphone:i.string().optional().describe("登录手机号")}).passthrough(),examples:[{description:"获取当前用户信息",input:{},output:{userId:"U1001",realName:"张三",roleName:"管理员",isManager:!0,departmentId:"D100"}}],sideEffects:["network"],handler:async()=>{let n=await O("get_current_user_info",{});return Object.fromEntries(Object.entries(n).filter(([b])=>!oq.has(b)))}};var g="crm";function Yn(n){return String(n).padStart(2,"0")}function L3(){let n=new Date;return`${n.getFullYear()}-${Yn(n.getMonth()+1)}-${Yn(n.getDate())}`}function c3(n){let b=new Date(Date.now()-n*86400000);return`${b.getFullYear()}-${Yn(b.getMonth()+1)}-${Yn(b.getDate())}`}function xq(){let n=new Date;return`${n.getFullYear()}-${Yn(n.getMonth()+1)}-${Yn(n.getDate())} ${Yn(n.getHours())}:${Yn(n.getMinutes())}:${Yn(n.getSeconds())}`}function mq(n){let b=new Date(Date.now()-n*86400000);return`${b.getFullYear()}-${Yn(b.getMonth()+1)}-${Yn(b.getDate())} 00:00:00`}function D3(n,b){if(n.length>10)return n;return`${n} ${b?"23:59:59":"00:00:00"}`}function Yi(n){let b=n.includes(" ")?n.replace(" ","T"):`${n}T00:00:00`;return Date.parse(`${b}+08:00`)}var A3=i.object({wxId:i.string().describe("客户微信 ID"),nickName:i.string().describe("客户微信昵称"),alias:i.string().optional().describe("客户微信号"),wxPhone:i.string().optional().describe("客户微信绑定手机号(可能脱敏)"),headImg:i.string().optional().describe("客户头像 URL"),addFriendTime:i.string().describe("添加好友时间 yyyy-MM-dd HH:mm:ss"),userId:i.string().describe("所属员工用户 ID"),userName:i.string().optional().describe("员工名"),userPhone:i.string().optional().describe("员工手机号(可能脱敏)"),wxIsOnline:i.number().optional().describe("客户微信在线:0/1"),uploadTime:i.string().optional().describe("数据上报时间"),companyCode:i.string().optional().describe("公司码"),statsMap:i.object({addFriendNum:i.number().optional().describe("加好友数")}).passthrough().optional().describe("统计附表"),isDuo:i.number().optional().describe("是否双开:0/1"),isOpenDuo:i.number().optional().describe("是否开启双开:0/1"),partnerId:i.string().optional().describe("关联 ID(上游未文档化)")}).passthrough(),k3={name:"crm.wechat.user-sale-list",description:"查询员工微信号列表(每员工一条统计行:收发消息数、聊天天数、联系人数等)。行内 wechatId 是会话类命令(search-talker / talker-list / chat-history 等)的 wechat_id 入参来源。",category:"crm",pluginName:g,parameters:i.object({page:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(100).optional().default(5).describe("每页条数"),department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),start_date:i.string().optional().default("").describe("开始日期 YYYY-MM-DD,空则近3天"),end_date:i.string().optional().default("").describe("结束日期 YYYY-MM-DD,空则今天"),sales_name:i.string().optional().default("").describe("销售名称"),user_id:i.string().optional().default("").describe("用户 ID"),wechat_nick_name:i.string().optional().default("").describe("微信昵称"),is_on_job:i.number().int().optional().default(1).describe("是否在职 1=在职 0=离职")}),returns:i.object({pageNum:i.number().describe("页码"),pageSize:i.number().describe("每页条数"),total:i.number().describe("总条数"),data:i.array(i.object({wechatId:i.string().describe("员工微信 ID(会话类命令 wechat_id 入参来源)"),userId:i.string().describe("所属员工用户 ID"),nickName:i.string().optional().describe("员工微信昵称"),userName:i.string().optional().describe("员工名"),salePhone:i.string().optional().describe("公司设置手机号"),alias:i.string().optional().describe("员工微信号"),phone:i.string().optional().describe("员工微信绑定手机号"),headImageUrl:i.string().optional().describe("头像 URL"),isOnJob:i.number().optional().describe("是否在职:1在职 0离职"),isDuo:i.number().optional().describe("是否双开微信:0主微信 1双开"),isOpenDuo:i.number().optional().describe("是否打开微信双开:0未开 1已开"),dataFrom:i.number().optional().describe("数据来源:1 云客手机 2 微小助"),isReFriend:i.string().optional().describe("是否参与重复好友统计:0参与 1不参与(字符串形态)"),deptRoteName:i.string().optional().describe("部门层级 ID 串(逗号分隔)"),uploadTime:i.string().optional().describe("数据上报时间 yyyy-MM-dd HH:mm:ss"),lastUpdate:i.string().optional().describe("数据最后更新时间 yyyy-MM-dd HH:mm:ss"),dbSize:i.number().optional().describe("聊天记录库大小(字节)"),contactsNum:i.number().optional().describe("联系人数"),groupNum:i.number().optional().describe("微信群数"),chatCount:i.number().optional().describe("窗口内沟通人数"),followCount:i.number().optional().describe("窗口内跟进人数"),contactCount:i.number().optional().describe("窗口内有效沟通人数"),sendNum:i.number().optional().describe("窗口内发送消息条数"),receiveNum:i.number().optional().describe("窗口内接收消息条数"),customerSendLastNum:i.number().optional().describe("窗口内客户发送条数(上游未文档化)"),saleSendLastNum:i.number().optional().describe("窗口内员工发送条数(上游未文档化)"),saleSendLastNumRate:i.string().optional().describe('员工发送占比(如 "33%")'),userChanged:i.number().optional().describe("上游未文档化")}).passthrough()).describe("员工微信号统计行(计数类字段为 start_date~end_date 窗口内统计)")}).passthrough(),examples:[{description:"查询员工微信号统计(近 3 天默认窗口)",input:{},output:{pageNum:1,pageSize:5,total:1,data:[{wechatId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",nickName:"客服小张",userName:"张三",salePhone:"",alias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",isOnJob:1,isDuo:0,isOpenDuo:1,dataFrom:1,isReFriend:"0",deptRoteName:"D0001",uploadTime:"2026-09-18 10:00:00",lastUpdate:"2026-09-18 09:00:00",dbSize:1048576,contactsNum:110,groupNum:53,chatCount:12,followCount:3,contactCount:8,sendNum:45,receiveNum:60,customerSendLastNum:30,saleSendLastNum:15,saleSendLastNumRate:"33%",userChanged:0}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.department_id||await K(),_=n.end_date||L3(),w=n.start_date||c3(3);return await O("get_wechat_user_sale_list",{startdate:w,enddate:_,page:n.page,pageSize:n.page_size,isOnJob:n.is_on_job,departmentId:b,...n.sales_name?{salesname:n.sales_name}:{},...n.user_id?{userId:n.user_id}:{},...n.wechat_nick_name?{weChatNickName:n.wechat_nick_name}:{}})}},N3={name:"crm.wechat.friend-circle-statistics-list",description:"查询微信朋友圈统计数据。",category:"crm",pluginName:g,parameters:i.object({page:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),start_date:i.string().optional().default("").describe("开始日期 YYYY-MM-DD,空则近3天"),end_date:i.string().optional().default("").describe("结束日期 YYYY-MM-DD,空则今天"),sales_name:i.string().optional().default("").describe("关键字(员工微信号/手机号/微信昵称模糊查询)"),user_id:i.string().optional().default("").describe("用户 ID"),is_on_job:i.number().int().optional().default(1).describe("是否在职 1=在职 0=离职")}),returns:i.object({pageNum:i.number().describe("页码"),pageSize:i.number().describe("每页条数"),total:i.number().describe("总条数"),data:i.array(i.object({wechatId:i.string().describe("员工微信 ID"),userId:i.string().describe("所属员工用户 ID"),theLastTimeSent:i.string().optional().describe("最后发朋友圈时间 yyyy-MM-dd HH:mm:ss;从未发送的行缺失该键"),userName:i.string().optional().describe("员工名"),salePhone:i.string().optional().describe("公司设置手机号"),partnerId:i.string().optional().describe("员工工号"),nickName:i.string().optional().describe("员工微信昵称"),alias:i.string().optional().describe("员工微信号"),headImageUrl:i.string().optional().describe("头像 URL"),nowStatus:i.string().optional().describe("在线状态:0离线 1在线(7 天未更新聊天记录算离线,字符串形态)"),circleOfFriendsCount:i.number().optional().describe("朋友圈数"),praiseCount:i.number().optional().describe("朋友圈获赞条数"),commentCount:i.number().optional().describe("朋友圈评论条数"),isOnJob:i.number().optional().describe("是否在职:1在职 0离职"),isOpenDuo:i.number().optional().describe("是否打开微信双开:0未开 1已开"),isDuo:i.number().optional().describe("是否双开微信:0主微信 1双开"),lastWxOnlineStatus:i.number().optional().describe("最近微信在线状态")}).passthrough())}).passthrough(),examples:[{description:"查询近 3 天朋友圈统计",input:{},output:{pageNum:1,pageSize:5,total:1,data:[{wechatId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",theLastTimeSent:"2026-09-15 10:20:30",userName:"张三",salePhone:"",partnerId:"E0001",nickName:"客服小张",alias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",nowStatus:"1",circleOfFriendsCount:3,praiseCount:12,commentCount:5,isOnJob:1,isOpenDuo:0,isDuo:0,lastWxOnlineStatus:1}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.department_id||await K(),_=n.end_date||L3(),w=n.start_date||c3(3);return await O("get_friends_circle_statistics_list",{startDate:w,endDate:_,page:n.page,pageSize:n.page_size,isOnJob:n.is_on_job,departmentId:b,...n.sales_name?{salesname:n.sales_name}:{},...n.user_id?{userId:n.user_id}:{}})}},R3={name:"crm.wechat.add-friend-list",description:"查询微信新增好友列表。",category:"crm",pluginName:g,parameters:i.object({page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),department_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),start_time:i.string().optional().default("").describe("开始时间 YYYY-MM-DD HH:mm:ss,空则近3天"),end_time:i.string().optional().default("").describe("结束时间 YYYY-MM-DD HH:mm:ss,空则今天"),user_id:i.string().optional().default("").describe("用户 ID"),keyword:i.string().optional().default("").describe("关键词")}),returns:i.object({pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),total:i.number().describe("总条数"),data:i.array(A3).describe("新增好友行(一行为一个新好友,含所属员工与统计附表)")}).passthrough(),examples:[{description:"查询新增好友",input:{},output:{pageNum:1,pageSize:5,total:18,data:[{wxId:"wxid_abc",nickName:"客户甲",addFriendTime:"2026-09-10 10:20:30",userId:"U1001",userName:"李四",statsMap:{addFriendNum:1}}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.department_id||await K(),_=n.end_time||xq(),w=n.start_time||mq(3);return await O("get_add_friend_list",{start:w,end:_,pageNum:n.page_num,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{},...n.keyword?{keyword:n.keyword}:{}})}},U3={name:"crm.wechat.add-friend-hour-list",description:"查询微信新增好友按时段统计。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),total:i.number().describe("总条数"),data:i.array(A3).describe("时段内新增好友行(同 add-friend-list 行结构)")}).passthrough(),examples:[{description:"查询新增好友时段",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageNum:1,pageSize:5,total:6,data:[{wxId:"wxid_abc",nickName:"客户甲",addFriendTime:"2026-08-02 09:00:00",userId:"U1001"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_add_friend_hour_list",{start:n.start_time,end:n.end_time,pageNum:n.page,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},C3={name:"crm.wechat.voice-call-list",description:"查询微信语音通话列表。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),data:i.array(i.object({id:i.string().describe("通话记录 ID"),weChatId:i.string().describe("员工微信 ID"),talker:i.string().describe("对方微信 ID"),startTime:i.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),endTime:i.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),duration:i.string().describe("通话时长(字符串形态)"),callType:i.number().describe("通话类型码(上游未文档化)"),callStatus:i.number().describe("通话状态码(上游未文档化)"),isSend:i.number().optional().describe("是否员工发起:0/1"),isRoom:i.number().optional().describe("是否群语音:0/1"),userId:i.string().describe("员工用户 ID"),userName:i.string().optional().describe("员工名"),userPhone:i.string().optional().describe("员工手机号(可能脱敏)"),userWeChatNickName:i.string().optional().describe("员工微信昵称"),userWeChatAlias:i.string().optional().describe("员工微信号"),userWeChatPhone:i.string().optional().describe("员工微信手机号"),userWeChatHeadImg:i.string().optional().describe("员工微信头像 URL"),talkerNickName:i.string().optional().describe("对方昵称"),talkerRemark:i.string().optional().describe("对方备注名"),talkerAlias:i.string().optional().describe("对方微信号"),talkerHeadImg:i.string().optional().describe("对方头像 URL"),remark:i.string().optional().describe("备注(上游未文档化)"),nextId:i.number().optional().describe("游标 ID(上游未文档化)"),answerByPhone:i.number().optional().describe("是否电话接听(上游未文档化)"),callFileId:i.number().optional().describe("通话录音文件 ID"),from:i.number().optional().describe("来源码(上游未文档化)"),ossFileExist:i.boolean().optional().describe("录音文件是否存在"),ossFileName:i.string().optional().describe("录音文件名"),durationFile:i.number().optional().describe("录音文件时长(秒)")}).passthrough()).describe("微信语音通话行")}).passthrough(),examples:[{description:"查询微信语音通话",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:9,pageNum:1,pageSize:5,data:[{id:"vc1001",weChatId:"wxid_staff",talker:"wxid_abc",startTime:"2026-08-02 10:00:00",endTime:"2026-08-02 10:03:00",duration:"180",callType:1,callStatus:1,userId:"U1001"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("query_wechat_voice_list",{startTime:n.start_time,endTime:n.end_time,pageNum:n.page_num,pageSize:n.page_size,callSource:0,isRoom:0,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},S3={name:"crm.wechat.chatroom-list",description:"查询微信群统计。时间可传日期或日期时间(自动补齐时分秒)。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD 或 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD 或 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({page:i.number().describe("页码"),pageCount:i.number().describe("总页数"),totalCount:i.number().describe("总条数"),overviews:i.array(i.object({chatRoomId:i.string().describe("群 ID"),chatRoomName:i.string().describe("群名"),memberCount:i.number().describe("成员数"),userId:i.string().describe("所属员工用户 ID"),userName:i.string().optional().describe("员工名"),userPhone:i.string().optional().describe("员工手机号(可能脱敏)"),wechatId:i.string().describe("员工微信 ID"),wechatNickName:i.string().optional().describe("员工微信昵称"),wechatAlias:i.string().optional().describe("员工微信号"),wechatHeadImageUrl:i.string().optional().describe("员工微信头像 URL"),messageCount:i.number().optional().describe("时间窗内消息数"),ownMessageCount:i.number().optional().describe("员工发言数"),addMembers:i.number().optional().describe("新增成员数"),lossMembers:i.number().optional().describe("流失成员数"),friendRemark:i.string().optional().describe("好友备注(上游未文档化)"),memberIds:i.string().optional().describe("成员 ID 集(上游未文档化格式)"),updateTime:i.string().optional().describe("更新时间"),lastChatTime:i.string().optional().describe("最近聊天时间(无聊天则省略)"),cursorTime:i.string().optional().describe("游标时间(上游未文档化)"),partnerId:i.string().optional().describe("关联 ID(上游未文档化)")}).passthrough()).describe("群概览行(一行一个群)")}).passthrough(),examples:[{description:"查询微信群统计",input:{start_time:"2026-08-01",end_time:"2026-08-05"},output:{page:1,pageCount:2,totalCount:8,overviews:[{chatRoomId:"room1001",chatRoomName:"客户服务群",memberCount:23,userId:"U1001",wechatId:"wxid_staff",messageCount:120,addMembers:2,lossMembers:1}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_chatroom_list",{startTime:D3(n.start_time,!1),endTime:D3(n.end_time,!0),pageNum:n.page_num,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},t3={name:"crm.wechat.repeat-friend-list",description:"查询重复好友统计。resolve_type: 0=未处理 1=已处理 2=已忽略。",category:"crm",pluginName:g,parameters:i.object({page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门"),resolve_type:i.number().int().optional().default(0).describe("0=未处理 1=已处理 2=已忽略")}),returns:i.object({list:i.array(i.object({friendId:i.string().describe("客户微信 ID"),friendName:i.string().describe("客户微信昵称"),num:i.number().describe("重复添加次数"),resolveState:i.number().describe("处理状态:0未处理 1已处理 2已忽略"),alias:i.string().optional().describe("客户微信号"),friendPhone:i.string().optional().describe("客户手机号(可能脱敏)"),headerImg:i.string().optional().describe("客户头像 URL(上游键名拼写 headerImg 即此)"),sale:i.array(i.object({userId:i.string().describe("员工用户 ID"),saleName:i.string().optional().describe("员工花名"),realName:i.string().optional().describe("员工实名"),phone:i.string().optional().describe("员工手机号(可能脱敏)"),wxId:i.string().optional().describe("员工微信 ID"),alias:i.string().optional().describe("员工微信号"),headImg:i.string().optional().describe("员工头像 URL"),friendWxId:i.string().optional().describe("该员工侧的客户微信 ID"),friendWxNickname:i.string().optional().describe("该员工侧备注的客户昵称"),friendWxAlias:i.string().optional().describe("该员工侧备注的客户微信号"),friendWxRemark:i.string().optional().describe("该员工侧好友备注"),friendWxPhone:i.string().optional().describe("该员工侧备注的客户手机号"),friendHeadImageUrl:i.string().optional().describe("该员工侧备注的客户头像 URL"),createTime:i.string().optional().describe("该员工侧添加时间"),resolveState:i.number().optional().describe("该员工侧处理状态:0/1/2"),companyCode:i.string().optional().describe("公司码")}).passthrough()).describe("重复添加到的员工侧明细")}).passthrough()).describe("重复好友行")}).passthrough(),examples:[{description:"查询重复好友",input:{},output:{list:[{friendId:"wxid_abc",friendName:"客户甲",num:3,resolveState:0,sale:[{userId:"U1001",saleName:"李四"},{userId:"U1002",saleName:"王五"}]}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_repeat_friends_list",{resolveType:n.resolve_type,pageNum:n.page_num,pageSize:n.page_size,deptId:b})}},E3={name:"crm.wechat.apply-msg-verify-list",description:"查询微信验证消息(好友申请)。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码(中台工具为游标分页,暂不生效)"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageNum:i.number().optional().describe("页码"),pageSize:i.number().describe("页大小"),data:i.array(i.object({wxId:i.string().describe("员工微信 ID"),userId:i.string().optional().describe("员工用户 ID"),userName:i.string().optional().describe("员工名"),userPhone:i.string().optional().describe("员工手机号(可能脱敏)"),friendWxId:i.string().describe("申请人微信 ID"),friendWxNickname:i.string().describe("申请人昵称"),friendWxAlias:i.string().optional().describe("申请人微信号"),friendHeadImage:i.string().optional().describe("申请人头像 URL"),nickname:i.string().optional().describe("申请人昵称(与 friendWxNickname 并存)"),alias:i.string().optional().describe("申请人微信号(与 friendWxAlias 并存)"),headImage:i.string().optional().describe("申请人头像(与 friendHeadImage 并存)"),addTime:i.string().describe("好友申请时间 yyyy-MM-dd HH:mm:ss"),fromType:i.number().optional().describe("申请来源类型码(上游未文档化)"),addType:i.number().optional().describe("添加类型码(上游未文档化)"),isFriend:i.number().optional().describe("是否已是好友:0/1"),lastChatTime:i.string().optional().describe("最近聊天时间"),firstChatTime:i.string().optional().describe("首次聊天时间"),cursorWxId:i.string().optional().describe("游标:员工微信 ID(翻页透传)"),cursorFriendWxId:i.string().optional().describe("游标:申请人微信 ID(翻页透传)"),cursorTime:i.string().optional().describe("游标:时间(翻页透传)"),friendRealWxId:i.string().optional().describe("申请人真实微信 ID(上游未文档化)"),friendWxIdWithOutEncrypt:i.string().optional().describe("申请人未加密微信 ID"),friendWxIdInData:i.string().optional().describe("申请人数据侧微信 ID(上游未文档化)"),encryptUsername:i.string().optional().describe("加密用户名(上游未文档化)")}).passthrough()).describe("好友申请行")}).passthrough(),examples:[{description:"查询验证消息",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:6,pageSize:5,data:[{wxId:"wxid_staff",friendWxId:"wxid_abc",friendWxNickname:"客户甲",addTime:"2026-08-02 09:00:00",isFriend:1}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_apply_msg_talk_list",{addTimeStart:n.start_time,addTimeEnd:n.end_time,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},F3={name:"crm.wechat.risk-control-stats",description:"查询微信风控统计(看板汇总,无分页)。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始日期 YYYY-MM-DD"),end_time:i.string().describe("结束日期 YYYY-MM-DD"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({sendTransCount:i.number().describe("发出转账笔数"),sendTransAmount:i.number().describe("发出转账金额"),receiveTransCount:i.number().describe("收到转账笔数"),receiveTransAmount:i.number().describe("收到转账金额"),didSendTransCount:i.number().describe("已完成发出转账笔数(上游未文档化)"),didSendTransAmount:i.number().describe("已完成发出转账金额(上游未文档化)"),didReceiveTransCount:i.number().describe("已完成收到转账笔数(上游未文档化)"),didReceiveTransAmount:i.number().describe("已完成收到转账金额(上游未文档化)"),transDidRedSendCount:i.number().describe("转账相关发出红包数(上游未文档化)"),transDidRedRecvCount:i.number().describe("转账相关收到红包数(上游未文档化)"),wechaetunnum:i.number().describe("退群数(上游键名拼写 wechaetunnum 即此)"),wechatdelnum:i.number().describe("删好友/退群相关计数(上游未文档化)"),wechatrenum:i.number().describe("群相关计数(上游未文档化)"),useraddnum:i.number().describe("新增好友数"),groupaddnum:i.number().describe("新增群成员数"),sendnum:i.number().describe("发出消息数"),receiveNum:i.number().describe("收到消息数"),sendrednum:i.number().describe("发出红包数"),receiveredNum:i.number().describe("收到红包数"),usernum:i.number().describe("用户/微信账号数(上游未文档化)"),wechatOnLine:i.number().describe("在线微信数"),wechatOffLine:i.number().describe("离线微信数")}).passthrough(),examples:[{description:"查询风控统计",input:{start_time:"2026-08-01",end_time:"2026-08-05"},output:{sendTransCount:2,sendTransAmount:500,receiveTransCount:1,receiveTransAmount:200,didSendTransCount:2,didSendTransAmount:500,didReceiveTransCount:1,didReceiveTransAmount:200,transDidRedSendCount:1,transDidRedRecvCount:0,wechaetunnum:1,wechatdelnum:0,wechatrenum:2,useraddnum:8,groupaddnum:5,sendnum:320,receiveNum:210,sendrednum:3,receiveredNum:1,usernum:7,wechatOnLine:5,wechatOffLine:2}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_wechat_board_date",{startdate:n.start_time,enddate:n.end_time,type:"summary",departmentId:b})}},P3={name:"crm.wechat.sensitive-operate-list",description:"查询微信敏感操作统计。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),data:i.array(i.object({id:i.string().describe("记录 ID"),userId:i.string().describe("员工用户 ID"),weChatId:i.string().describe("员工微信 ID"),friendId:i.string().describe("对方微信 ID"),operateType:i.number().describe("敏感操作类型码(上游未文档化枚举)"),operateTypeDesc:i.string().describe("敏感操作类型文案(如 删除好友)"),operationTime:i.string().describe("操作时间 yyyy-MM-dd HH:mm:ss"),saleName:i.string().optional().describe("员工名"),saleNickName:i.string().optional().describe("员工微信昵称"),saleAlias:i.string().optional().describe("员工微信号"),salePhone:i.string().optional().describe("员工手机号(可能脱敏)"),saleHeadImage:i.string().optional().describe("员工头像 URL"),friendName:i.string().optional().describe("对方昵称"),friendRemark:i.string().optional().describe("对方备注名"),friendAlias:i.string().optional().describe("对方微信号"),friendHeadImage:i.string().optional().describe("对方头像 URL"),detail:i.string().optional().describe("操作详情文案"),msgSvrId:i.string().optional().describe("关联消息服务端 ID"),ctype:i.number().optional().describe("消息类型码(上游未文档化)"),dataSource:i.number().optional().describe("数据来源码(上游未文档化)"),createTime:i.string().optional().describe("记录创建时间"),companyCode:i.string().optional().describe("公司码"),deptRoute:i.array(i.unknown()).optional().describe("部门链(上游未文档化结构)")}).passthrough()).describe("敏感操作行")}).passthrough(),examples:[{description:"查询敏感操作",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:12,pageNum:1,pageSize:5,data:[{id:"so1001",userId:"U1001",weChatId:"wxid_staff",friendId:"wxid_abc",operateType:1,operateTypeDesc:"删除好友",operationTime:"2026-08-03 15:20:00",saleName:"李四",detail:"删除好友"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_sensitive_operate_list",{start:Yi(n.start_time),end:Yi(n.end_time),pageNum:n.page_num,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},T3={name:"crm.wechat.sensitive-word-list",description:"查询微信敏感词统计。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({pageNum:i.number().describe("页码"),total:i.number().describe("总条数"),data:i.array(i.object({id:i.string().describe("敏感词记录 ID"),createTime:i.string().optional().describe("消息时间 yyyy-MM-dd HH:mm:ss"),userId:i.string().optional().describe("员工用户 ID"),userName:i.string().optional().describe("员工名"),wechatId:i.string().optional().describe("员工微信 ID"),nickName:i.string().optional().describe("员工微信昵称"),alias:i.string().optional().describe("员工微信号"),headImageUrl:i.string().optional().describe("员工头像 URL"),phone:i.string().optional().describe("员工手机号"),partnerId:i.string().optional().describe("员工工号"),departmentName:i.string().optional().describe("部门名"),deptRoteName:i.string().optional().describe("部门职位名"),companyName:i.string().optional().describe("公司名"),companyCode:i.string().optional().describe("公司码"),sensitive:i.string().optional().describe("命中的敏感词"),sensitiveWord:i.string().optional().describe("命中的敏感词(后端查询键,与 sensitive 同值)"),sensitiveContent:i.string().optional().describe("消息原文(needOriginalMsg=true 时返回)"),sensitiveFlage:i.string().optional().describe("敏感标志:0或null敏感 1正常(Flage 拼写如此)"),sensitiveRemark:i.string().optional().describe("敏感词备注(无则为空串)"),cateName:i.string().optional().describe("敏感词分类名"),mesId:i.string().optional().describe("消息 ID"),msgSvrId:i.string().optional().describe("微信消息服务端 ID"),talkerId:i.string().optional().describe("会话对方 ID"),friendName:i.string().optional().describe("对方微信昵称"),friendAlias:i.string().optional().describe("对方微信号"),friendHeadImageUrl:i.string().optional().describe("对方头像 URL"),friendPIN:i.string().optional().describe("对方 PIN"),friendPhone:i.string().optional().describe("对方手机号"),isAdmin:i.string().optional().describe("员工是否管理员:0普通 1超管 2管理员"),peocount:i.number().optional().describe("群成员数"),corproomid:i.string().optional().describe("企业微信群聊 ID(corproomid 拼写如此)"),corpId:i.string().optional().describe("企业微信 corpId"),memberIds:i.string().optional().describe("群成员 ID 串"),scopeStatistics:i.number().optional().describe("统计范围:0员工 1客户 2员工+客户"),talkerlist:i.array(i.object({wxId:i.string().optional().describe("成员微信 ID"),nickName:i.string().optional().describe("成员昵称"),displayName:i.string().optional().describe("群内展示名"),alias:i.string().optional().describe("成员微信号"),headUrl:i.string().optional().describe("成员头像 URL")}).passthrough()).optional().describe("企业微信群成员列表(群聊消息时用于拼群头像/群名)")}).passthrough())}).passthrough(),examples:[{description:"查询敏感词",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageNum:1,total:1,data:[{id:"fabricated-id-0001",createTime:"2026-08-03 14:22:10",userId:"u_fabricated000000000000000000001",userName:"张三",wechatId:"wxid_fabricated0001",nickName:"客服小张",alias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",phone:"",partnerId:"E0001",departmentName:"销售一部",deptRoteName:"销售",companyName:"示例公司",companyCode:"fabricated",sensitive:"转账",sensitiveWord:"转账",sensitiveContent:"示例消息原文",sensitiveFlage:"0",sensitiveRemark:"",cateName:"资金类",mesId:"m_fabricated0001",msgSvrId:"svr_fabricated0001",talkerId:"wxid_fabricated9999",friendName:"客户李四",friendAlias:"lisi0001",friendHeadImageUrl:"https://example.invalid/b.jpg",friendPIN:"",friendPhone:"",isAdmin:"0",peocount:0,corproomid:"",corpId:"",memberIds:"",scopeStatistics:0}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_sensitive_word_list",{start:n.start_time,end:n.end_time,pageNum:n.page_num,pageSize:n.page_size,messageType:1,needOriginalMsg:!0,departmentId:b})}},y3={name:"crm.wechat.login-log-list",description:"查询微信登录日志。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),data:i.array(i.object({id:i.number().describe("日志 ID(number)"),logType:i.number().describe("登录类型码(上游未文档化)"),logTime:i.string().describe("登录时间 yyyy-MM-dd HH:mm:ss"),userId:i.string().describe("员工用户 ID"),wxId:i.string().describe("微信 ID"),userName:i.string().optional().describe("员工名"),userPhone:i.string().optional().describe("员工手机号(可能脱敏)"),weChatNickName:i.string().optional().describe("微信昵称"),weChatAlias:i.string().optional().describe("微信号"),version:i.string().optional().describe("客户端版本"),imei:i.string().optional().describe("设备 IMEI"),device:i.string().optional().describe("设备名"),companyCode:i.string().optional().describe("公司码")}).passthrough()).describe("登录日志行")}).passthrough(),examples:[{description:"查询微信登录日志",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:4,pageNum:1,pageSize:5,data:[{id:1001,logType:1,logTime:"2026-08-02 08:30:00",userId:"U1001",wxId:"wxid_staff",version:"2.1.0",device:"Pixel 6"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_wechat_login_log",{start:n.start_time,end:n.end_time,pageNum:n.page_num,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},I3={name:"crm.wechat.friend-operation-log-list",description:"查询微信好友操作日志。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),data:i.array(i.object({userId:i.string().describe("员工用户 ID"),friendWxId:i.string().describe("对方微信 ID"),type:i.number().describe("操作类型码(上游未文档化枚举)"),content:i.string().describe("操作内容描述"),lastTime:i.string().describe("操作时间 yyyy-MM-dd HH:mm:ss"),realName:i.string().optional().describe("员工名"),phone:i.string().optional().describe("员工手机号(可能脱敏)"),weChatId:i.string().optional().describe("员工微信 ID"),wxAlias:i.string().optional().describe("员工微信号"),nickname:i.string().optional().describe("员工微信昵称"),avatar:i.string().optional().describe("员工头像 URL"),friendWxAlias:i.string().optional().describe("对方微信号"),friendWxNickName:i.string().optional().describe("对方昵称"),friendAvatar:i.string().optional().describe("对方头像 URL")}).passthrough()).describe("好友操作日志行")}).passthrough(),examples:[{description:"查询好友操作日志",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:4,pageNum:1,pageSize:5,data:[{userId:"U1001",friendWxId:"wxid_abc",type:2,content:"修改了备注",lastTime:"2026-08-02 11:00:00",realName:"李四"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_friend_operation_log_list",{startTime:n.start_time,endTime:n.end_time,pageNum:n.page_num,pageSize:n.page_size,departmentId:b,...n.user_id?{userId:n.user_id}:{}})}},g3={name:"crm.wechat.words-trigger-list",description:"查询违禁词统计(仅按部门维度汇总;中台工具不收时间/员工过滤,start_time/end_time/user_id 当前不生效,仅为兼容保留)。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss(当前不生效:中台工具不收时间过滤,仅为兼容保留)"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss(当前不生效:中台工具不收时间过滤,仅为兼容保留)"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID(当前不生效:中台工具不收员工过滤,仅为兼容保留)"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({total:i.number().describe("总条数"),pageNum:i.number().describe("页码"),pageSize:i.number().describe("页大小"),pageCount:i.number().describe("总页数"),data:i.array(i.object({word:i.string().describe("违禁词"),staffTriggerTimes:i.number().describe("员工触发次数"),customerTriggerTimes:i.number().describe("客户触发次数"),id:i.string().optional().describe("记录 ID"),type:i.number().optional().describe("违禁词类型码(上游未文档化)"),createTime:i.string().optional().describe("统计时间")}).passthrough()).describe("违禁词触发统计行")}).passthrough(),examples:[{description:"查询违禁词",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:10,pageNum:1,pageSize:5,pageCount:2,data:[{word:"示例违禁词",staffTriggerTimes:3,customerTriggerTimes:1,createTime:"2026-08-05 00:00:00"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_words_trigger_list",{pageNum:n.page_num,pageSize:n.page_size,departmentId:b})}},Z3={name:"crm.wechat.risk-screenshot-list",description:"查询微信风险消息统计(截图)。",category:"crm",pluginName:g,parameters:i.object({start_time:i.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:i.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:i.string().optional().default("").describe("用户 ID"),dept_id:i.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:i.object({pageNum:i.number().describe("页码"),total:i.number().describe("总条数"),data:i.array(i.object({id:i.number().describe("截图记录 ID"),shotTime:i.number().describe("截图时间(毫秒时间戳,Long 形态)"),type:i.number().describe("截图类型:1撤回消息截图 2删除消息截图"),userId:i.string().describe("员工用户 ID"),userName:i.string().optional().describe("员工名"),usePhone:i.string().optional().describe("员工手机号"),partnerId:i.string().optional().describe("员工工号"),companyCode:i.string().optional().describe("公司码"),nickName:i.string().optional().describe("截图对话好友或群昵称"),url:i.string().optional().describe("截图地址(OSS,多图分隔符上游混用 ; 或 ,;可能经签名/CDN 改写)"),source:i.number().optional().describe("来源:0未知 1app 2pc"),packageName:i.string().optional().describe("来源应用包名:com.tencent.mm 微信 / com.whatsapp(区分微信与 WhatsApp,旧版本不传默认微信)")}).passthrough())}).passthrough(),examples:[{description:"查询风险消息",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageNum:1,total:1,data:[{id:900001,shotTime:1754200000000,type:1,userId:"u_fabricated000000000000000000001",userName:"张三",usePhone:"",partnerId:"E0001",companyCode:"fabricated",nickName:"客户李四",url:"https://example.invalid/shot0001.jpg",source:1,packageName:"com.tencent.mm"}]}}],sideEffects:["network"],handler:async(n)=>{let b=n.dept_id||await K();return await O("get_wechat_screenshot_list",{pageNum:n.page_num,size:n.page_size,timeS:Yi(n.start_time),timeE:Yi(n.end_time),department:b,...n.user_id?{userId:n.user_id}:{}})}};var X0="crm",p2=i.union([i.string(),i.number()]).transform((n)=>String(n)),Q0=i.union([i.string(),i.number()]).transform((n)=>String(n)).refine((n)=>n.length>0,"不能为空");function cn(n){return String(n).padStart(2,"0")}function vq(){let n=new Date;return`${n.getFullYear()}-${cn(n.getMonth()+1)}-${cn(n.getDate())}`}function Hq(){let n=new Date;return`${n.getFullYear()}-${cn(n.getMonth()+1)}-${cn(n.getDate())} ${cn(n.getHours())}:${cn(n.getMinutes())}:${cn(n.getSeconds())}`}function Qq(n){let b=new Date(Date.now()-n*86400000);return`${b.getFullYear()}-${cn(b.getMonth()+1)}-${cn(b.getDate())} 00:00:00`}function Xq(n){if(typeof n==="number")return n;let b=n.includes(" ")?n.replace(" ","T"):`${n}T00:00:00`,_=Date.parse(`${b}+08:00`);if(Number.isNaN(_))throw Error(`无法解析时间: ${n}(支持 YYYY-MM-DD / YYYY-MM-DD HH:mm:ss / 毫秒时间戳)`);return _}var d3=i.union([i.number(),i.string()]).transform((n)=>{try{return Xq(n)}catch{return Number.NaN}}).refine((n)=>!Number.isNaN(n),"时间格式无法解析(支持 YYYY-MM-DD / YYYY-MM-DD HH:mm:ss / 毫秒时间戳)").optional(),a3={name:"crm.wechat.search-talker",description:'按关键词模糊搜索某员工微信通讯录(匹配昵称/备注/显示名),单聊和群聊都会命中。返回 {list: [...]}(数组包在 list 键下,无分页)。行内 nickName 可能带 "(备注名)" 后缀。',category:"crm",pluginName:X0,parameters:i.object({wechat_id:Q0.describe("员工微信 ID(来自 user-sale-list 的 wechatId 字段)"),keyword:i.string().min(1).describe("模糊搜索词,单字可命中;不支持表情")}),returns:i.object({list:i.array(i.object({friendWechatId:i.string().describe("对方微信 ID(chat-history 的 friend_id 入参)"),nickName:i.string().optional().describe('昵称(可能带 "(备注名)" 后缀)'),displayName:i.string().optional().describe("显示名"),memberCount:i.number().optional().describe("群人数,0=非群"),messageCount:i.number().optional().describe("消息数"),remarkName:i.string().optional().describe("备注名"),headUrl:i.string().optional().describe("头像 URL"),originHeadUrl:i.string().optional().describe("原始头像 URL"),isCustomer:i.string().optional().describe("是否客户:0/1(字符串形态)")}).passthrough()).describe("命中行(无分页)")}).passthrough(),examples:[{description:"搜索通讯录",input:{wechat_id:"wxid_xxx",keyword:"张"},output:{list:[{friendWechatId:"wxid_fabricated0002",nickName:"张三(小张)",displayName:"张三(小张)",memberCount:0,messageCount:5,remarkName:"小张",headUrl:"https://example.invalid/b.jpg",originHeadUrl:"https://example.invalid/b.jpg",isCustomer:""}]}}],sideEffects:["network"],handler:async({wechat_id:n,keyword:b})=>{return await O("wechat_search_talker",{wechatId:n,keyword:b})}},e3={name:"crm.wechat.user-and-friend-info",description:'查"哪个员工(销售)的微信"和"指定好友"的一对一详情。friend_id 为空时只返回员工侧信息。员工头像字段为 HeadImageUrl(大写 H,后端历史拼写)。',category:"crm",pluginName:X0,parameters:i.object({wechat_id:Q0.describe("员工微信 ID"),friend_id:p2.optional().default("").describe("好友微信 ID(来自 search-talker / talker-list / friend-list),空则只查员工侧")}),returns:i.object({wechatId:i.string().describe("员工微信 ID"),userId:i.string().describe("员工用户 ID"),saleName:i.string().optional().describe("员工微信昵称"),realName:i.string().optional().describe("员工名"),salePhone:i.string().optional().describe("公司设置手机号"),alias:i.string().optional().describe("员工微信号"),departmentId:i.string().optional().describe("部门 ID"),headImageUrl:i.string().optional().describe("员工头像 URL"),HeadImageUrl:i.string().optional().describe("员工头像 URL(大写 H 拼写如此,与 headImageUrl 并存同值)"),friendId:i.string().optional().describe("好友微信 ID(带 friend_id 查询时返回)"),friendName:i.string().optional().describe("好友昵称"),friendAlias:i.string().optional().describe("好友微信号"),friendRemark:i.string().optional().describe("好友备注名"),friendHeadImageUrl:i.string().optional().describe("好友头像 URL"),friendWxPhone:i.string().optional().describe("好友微信绑定手机号")}).passthrough(),examples:[{description:"查双方信息",input:{wechat_id:"wxid_xxx",friend_id:"wxid_yyy"},output:{wechatId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",saleName:"客服小张",realName:"张三",salePhone:"",alias:"xiaozhang0001",departmentId:"D0001",headImageUrl:"https://example.invalid/a.jpg",HeadImageUrl:"https://example.invalid/a.jpg",friendId:"wxid_fabricated0002",friendName:"客户甲",friendAlias:"jia0001",friendRemark:"",friendHeadImageUrl:"https://example.invalid/b.jpg",friendWxPhone:""}}],sideEffects:["network"],handler:async({wechat_id:n,friend_id:b})=>{return await O("wechat_get_user_and_friend_info",{wechatId:n,...b?{friendId:b}:{}})}},r3={name:"crm.wechat.talker-list",description:"查某员工微信的最近会话列表:type=1 单聊会话(首行可能是文件传输助手,属正常数据),type=2 群聊。翻页只看返回的 hasMore。",category:"crm",pluginName:X0,parameters:i.object({wechat_id:Q0.describe("员工微信 ID"),type:i.number().int().refine((n)=>n===1||n===2,"type 必须为 1(单聊) 或 2(群聊)").describe("1=单聊会话 2=群聊"),page_number:i.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:i.number().int().min(1).optional().default(20).describe("每页条数"),is_del:i.number().int().optional().default(0).describe("删除标记")}),returns:i.object({topCount:i.number().optional().describe("type=1 时的会话总数"),hasMore:i.boolean().optional().describe("是否还有下一页"),page:i.array(i.object({friendWechatId:i.string().describe("对方微信 ID(单聊=好友 wxid、群=xxx@chatroom、文件传输助手=filehelper;chat-history 的 friend_id 入参)"),nickName:i.string().optional().describe("昵称(文件传输助手等系统会话也有)"),displayName:i.string().optional().describe('显示名("昵称(备注)" / "群名(人数)" 拼接格式)'),memberCount:i.number().optional().describe("群人数,0=非群"),messageCount:i.number().optional().describe("消息数"),remarkName:i.string().optional().describe("备注名"),lastChatTime:i.string().optional().describe("最近聊天时间 yyyy-MM-dd HH:mm:ss"),headUrl:i.string().optional().describe("头像 URL"),originHeadUrl:i.string().optional().describe("原始头像 URL"),originDisplayName:i.string().optional().describe("原始显示名(群聊行)"),showHead:i.number().optional().describe("置顶标记:-1 置顶 0 不置顶"),isCustomer:i.string().optional().describe("是否客户:0/1(字符串形态)")}).passthrough()).describe("会话行(type=1 单聊 / type=2 群聊)")}).passthrough(),examples:[{description:"查会话列表",input:{wechat_id:"wxid_xxx",type:1},output:{topCount:30,hasMore:!1,page:[{nickName:"文件传输助手",displayName:"文件传输助手",memberCount:0,headUrl:"https://example.invalid/f.jpg",isCustomer:"",friendWechatId:"filehelper",showHead:-1,originHeadUrl:"https://example.invalid/f.jpg"},{messageCount:2,nickName:"客户甲",displayName:"客户甲",memberCount:0,headUrl:"https://example.invalid/b.jpg",remarkName:"",isCustomer:"",friendWechatId:"wxid_fabricated0002",showHead:0,lastChatTime:"2026-09-18 16:43:44",originHeadUrl:"https://example.invalid/b.jpg"}]}}],sideEffects:["network"],handler:async(n)=>{return await O("wechat_talker_list",{wechatId:n.wechat_id,type:n.type,pageNumber:n.page_number,pageSize:n.page_size,isDel:n.is_del})}},z3={name:"crm.wechat.chat-history",description:"拉取某员工微信与指定好友(或群 xxx@chatroom、或文件传输助手 filehelper)的聊天记录,按时间升序。翻页取更早消息:直接把本页返回的 end 作为下次的 end 传入(end 游标 = 本页最早一条消息前 1ms);hasLast=false 时没有更早消息;无更早消息时 end=1514735999000(后端下限哨兵,非错误)。",category:"crm",pluginName:X0,parameters:i.object({wechat_id:Q0.describe("员工微信 ID"),friend_id:Q0.describe("好友微信 ID 或 xxx@chatroom(群)或 filehelper(文件传输助手)"),start:d3.describe("开始时间,毫秒时间戳或 YYYY-MM-DD[ HH:mm:ss](北京时间),空则 30 天前"),end:d3.describe("结束时间,毫秒时间戳或日期串,空则当前时间"),types:i.string().optional().default("").describe("消息类型筛选(逗号分隔的数字),空查全部")}),returns:i.object({messages:i.array(i.object({type:i.number().describe("消息类型(如 1 文本、-2 系统时间分隔行;行键随类型多态)"),timestamp:i.number().describe("消息毫秒时间戳"),text:i.string().optional().describe("消息内容(分隔行为时间文案)"),messageType:i.string().optional().describe("type 的字符串形态"),msgSvrId:i.string().optional().describe("消息服务端 ID"),talker:i.string().optional().describe("发送者微信 ID"),oriTalker:i.string().optional().describe("原始发送者微信 ID(群聊内为实际发言人)"),mine:i.boolean().optional().describe("是否员工本人发送"),name:i.string().optional().describe("发送者昵称"),headUrl:i.string().optional().describe("发送者头像 URL"),friendWxRemark:i.string().optional().describe("好友备注名"),roomid:i.string().optional().describe("群 ID(单聊为空串)"),wechatId:i.string().optional().describe("员工微信 ID"),isDel:i.string().optional().describe("是否删除:1 已删除 0 正常(字符串形态)"),isFriend:i.string().optional().describe("发送者是否好友:0/1(字符串形态)"),createTime:i.number().optional().describe("创建毫秒时间戳"),version:i.number().optional().describe("版本毫秒时间戳(上游未文档化)"),hasHead:i.boolean().optional().describe("是否有头像")}).passthrough()).describe("消息行(按时间升序,行键随消息类型多态)"),hasLast:i.boolean().optional().describe("是否还有更早消息(false=已到底)"),start:i.number().optional().describe("毫秒时间戳(本页最新一条 +1ms;键缺失=无更早消息)"),end:i.number().optional().describe("翻页游标:本页最早一条 -1ms,取更早一页时作为下次 end 传入;无更早消息时=1514735999000 哨兵")}).passthrough(),examples:[{description:"拉最近 30 天聊天记录",input:{wechat_id:"wxid_xxx",friend_id:"wxid_yyy"},output:{hasLast:!1,start:1789114225000,messages:[{type:-2,messageType:"-2",text:"2026-09-10 16:43",hasHead:!1,timestamp:1789029824000,roomid:"",isDel:"0"},{type:1,messageType:"1",timestamp:1789029824000,text:"请问什么时候发货?",msgSvrId:"7417629815179554246",talker:"wxid_fabricated0002",oriTalker:"wxid_fabricated0002",mine:!1,name:"客户甲",headUrl:"https://example.invalid/b.jpg",friendWxRemark:"",roomid:"",wechatId:"wxid_fabricated0001",isDel:"0",isFriend:"1",createTime:1789029824000,version:1789030709149,hasHead:!0}],end:1789029823999}}],sideEffects:["network"],handler:async(n)=>{let b=n.start??Date.now()-2592000000,_=n.end??Date.now();return await O("wechat_chat_history",{wechatId:n.wechat_id,friendId:n.friend_id,start:b,end:_,...n.types?{types:n.types}:{}})}},s3={name:"crm.wechat.chat-search",description:"跨员工/跨会话的聊天记录全文搜索(跨度不可超过 3 个月),命中行自带会话定位信息,再用 chat-history 拉全量上下文。wx_id / search_user_id / search_dept_id 三选一必填。",category:"crm",pluginName:X0,parameters:i.object({page_num:i.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:i.number().int().min(1).optional().default(20).describe("每页条数"),keyword:i.string().min(1).describe("搜索词"),start:i.string().optional().default("").describe("开始时间 YYYY-MM-DD HH:mm:ss,空则 30 天前 00:00:00"),end:i.string().optional().default("").describe("结束时间 YYYY-MM-DD HH:mm:ss,空则当前时间;与 start 跨度 ≤ 3 个月"),wx_id:p2.optional().default("").describe("范围限定:员工微信 ID(三选一)"),search_user_id:p2.optional().default("").describe("范围限定:员工用户 ID(三选一)"),search_dept_id:p2.optional().default("").describe("范围限定:部门 ID(三选一)"),friend_id:p2.optional().default("").describe("限定与某好友的会话(可选)")}).superRefine((n,b)=>{if(!n.wx_id&&!n.search_user_id&&!n.search_dept_id)b.addIssue({code:"custom",message:"wx_id / search_user_id / search_dept_id 三选一必填"})}),returns:i.object({total:i.number().describe("命中总数"),pageNumber:i.number().describe("页码"),pageSize:i.number().describe("每页条数"),page:i.array(i.object({wechatId:i.string().describe("员工微信 ID"),talker:i.string().describe("发送者微信 ID"),msgSvrId:i.string().describe("消息服务端 ID"),type:i.number().optional().describe("消息类型(1 文本等)"),messageType:i.string().optional().describe("type 的字符串形态"),timestamp:i.number().optional().describe("消息毫秒时间戳"),time:i.string().optional().describe("消息时间 yyyy-MM-dd HH:mm:ss"),text:i.string().optional().describe("消息内容"),mine:i.boolean().optional().describe("是否员工本人发送"),oriTalker:i.string().optional().describe("原始发送者微信 ID(群聊内为实际发言人)"),name:i.string().optional().describe("发送者昵称"),headUrl:i.string().optional().describe("发送者头像 URL"),friendWxRemark:i.string().optional().describe("好友备注名"),roomid:i.string().optional().describe("群 ID(单聊为空串)"),isDel:i.string().optional().describe("是否删除:1 已删除 0 正常(字符串形态)"),hasHead:i.boolean().optional().describe("是否有头像")}).passthrough()).describe("命中消息行(自带会话定位信息,chat-history 可拉全量上下文)")}).passthrough(),examples:[{description:"全局搜索关键词",input:{keyword:"退款",search_dept_id:"42977E55..."},output:{total:1,pageNumber:1,pageSize:20,page:[{wechatId:"wxid_fabricated0001",talker:"wxid_fabricated0002",msgSvrId:"255690560369352248",type:1,messageType:"1",timestamp:1789012847000,time:"2026-09-10 12:00:47",text:"这个订单可以退款吗",mine:!1,oriTalker:"wxid_fabricated0002",name:"客户甲",headUrl:"https://example.invalid/b.jpg",friendWxRemark:"",roomid:"",isDel:"0",hasHead:!0}]}}],sideEffects:["network"],handler:async(n)=>{return await O("wechat_search_content",{pageNum:n.page_num,pageSize:n.page_size,keyword:n.keyword,start:n.start||Qq(30),end:n.end||Hq(),...n.wx_id?{wxId:n.wx_id}:{},...n.search_user_id?{searchUserId:n.search_user_id}:{},...n.search_dept_id?{searchDeptId:n.search_dept_id}:{},...n.friend_id?{friendId:n.friend_id}:{}})}},n5={name:"crm.wechat.friend-list",description:"查某员工微信的好友全量列表(按最后聊天时间降序)。start_date/end_date 实测不筛行(返回全量好友),仅影响行内 sendNum/receiveNum/messageCount 统计窗口,空则窗口不限。翻页依据返回的 basicResult.total / pageNum / pageSize。行内 lastChatTime 为毫秒时间戳;friendWxId 是 chat-history / user-and-friend-info 的 friend_id 入参。",category:"crm",pluginName:X0,parameters:i.object({wechat_id:Q0.describe("员工微信 ID"),type:i.number().int().refine((n)=>n===1||n===2,"type 必须为 1(个人) 或 2(群)").optional().default(1).describe("好友类型:1 个人(默认)/ 2 群"),start_date:i.string().optional().default("").describe("加好友日期下限 YYYY-MM-DD,空则不限"),end_date:i.string().optional().default("").describe("加好友日期上限 YYYY-MM-DD,空则不限"),page:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().optional().default(20).describe("每页条数"),sales_name:i.string().optional().default("").describe("好友姓名模糊搜索(匹配昵称/备注/微信号/手机号)")}),returns:i.object({displayStatus:i.string().optional().describe('显示状态标记(上游未文档化,实测 "0")'),basicResult:i.object({pageNum:i.number().optional().describe("页码"),pageSize:i.number().optional().describe("每页条数"),total:i.number().describe("好友/群总数"),data:i.array(i.object({friendWxId:i.string().describe("好友/群微信 ID(单聊=好友 wxid、群=xxx@chatroom;chat-history 的 friend_id 入参)"),wxId:i.string().describe("所属员工微信 ID"),userId:i.string().describe("所属员工用户 ID"),friendWxNickname:i.string().optional().describe("好友昵称/群名"),friendWxNicknameReverse:i.string().optional().describe("好友昵称倒序串(排序用)"),friendWxAlias:i.string().optional().describe("好友微信号"),friendWxRemark:i.string().optional().describe("好友备注名"),friendWxPhone:i.string().optional().describe("好友微信绑定手机号"),friendHeadImageUrl:i.string().optional().describe("好友/群头像 URL"),saleName:i.string().optional().describe("员工微信昵称"),realName:i.string().optional().describe("员工名"),alias:i.string().optional().describe("员工微信号"),wechatPhone:i.string().optional().describe("员工微信绑定手机号"),phone:i.string().optional().describe("员工公司手机号"),description:i.string().optional().describe("好友个性签名"),region:i.string().optional().describe("好友地区"),gender:i.string().optional().describe("微信性别码(字符串形态)"),encryptUsername:i.string().optional().describe("加密用户名"),lastChatTime:i.number().optional().describe("最后聊天毫秒时间戳(从未聊天缺键)"),messageCount:i.number().optional().describe("窗口内消息数"),receiveNum:i.number().optional().describe("窗口内接收条数"),sendNum:i.number().optional().describe("窗口内发送条数"),friendTypeYunke:i.number().optional().describe("好友类型:1 个人 2 群"),friendType:i.string().optional().describe("同 friendTypeYunke 的字符串形态"),addTime:i.string().optional().describe("加好友时间 yyyy-MM-dd HH:mm:ss(个人好友)"),createTime:i.string().optional().describe("记录入库时间 yyyy-MM-dd HH:mm:ss"),version:i.string().optional().describe("数据版本时间 yyyy-MM-dd HH:mm:ss"),deptName:i.string().optional().describe("部门名"),deptRouteName:i.string().optional().describe("部门层级名"),deptRoute:i.array(i.string()).optional().describe("部门 ID 层级"),contactLabelIds:i.string().optional().describe("标签 ID 串"),contactLabelValues:i.string().optional().describe("标签名串"),noteDes:i.string().optional().describe("备注说明"),friendNum:i.number().optional().describe("群内自己好友数(type=2)"),friendCount:i.number().optional().describe("群人数(type=2)"),ownerWchatId:i.string().optional().describe("群主微信 ID(type=2)"),ownerName:i.string().optional().describe("群主昵称(type=2)"),ownerAlias:i.string().optional().describe("群主微信号(type=2)"),ownerImage:i.string().optional().describe("群主头像 URL(type=2)"),friendState:i.number().optional().describe("好友状态:0 未处理 1 已处理 2 忽略"),deleteFlag:i.number().optional().describe("删除标记"),resolveState:i.number().optional().describe("重复好友处理状态:0 未处理 1 忽略 2 已处理 3 取消跟进"),userStatus:i.number().optional().describe("用户状态(上游未文档化)"),verifyFlag:i.number().optional().describe("微信 verifyFlag 标记(上游未文档化)"),addType:i.number().optional().describe("添加方式码(上游未文档化)"),fromType:i.string().optional().describe("好友来源渠道码(字符串形态)"),domainList:i.string().optional().describe("上游未文档化"),bindStatus:i.number().optional().describe("绑定状态(上游未文档化)"),isBlock:i.number().optional().describe("是否拉黑(上游未文档化)"),isQyFriend:i.number().optional().describe("是否企业微信好友"),isReFriend:i.number().optional().describe("是否参与重复好友统计:0参与 1不参与(数字形态)"),dataFrom:i.number().optional().describe("数据来源:1 云客手机 2 微小助"),companyCode:i.string().optional().describe("公司码")}).passthrough()).describe("好友/群行(type=1 个人 type=2 群)")}).passthrough()}).passthrough(),examples:[{description:"查好友全量列表",input:{wechat_id:"wxid_xxx"},output:{displayStatus:"0",basicResult:{pageNum:1,pageSize:20,total:110,data:[{friendWxId:"wxid_fabricated0002",wxId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",friendWxNickname:"客户甲",friendWxNicknameReverse:"甲户客",friendWxAlias:"jia0001",friendWxRemark:"",friendWxPhone:"",friendHeadImageUrl:"https://example.invalid/b.jpg",saleName:"客服小张",realName:"张三",alias:"xiaozhang0001",wechatPhone:"",phone:"",description:"天天开心",region:"北京 朝阳",gender:"2",encryptUsername:"v3_020b3826fd0301...",lastChatTime:1789029824000,messageCount:3,receiveNum:3,sendNum:0,friendTypeYunke:1,friendType:"1",createTime:"2026-06-15 16:29:07",version:"2026-09-10 16:58:29",deptName:"销售一部",deptRouteName:"销售一部",deptRoute:["D0001"],contactLabelIds:"",friendState:0,deleteFlag:0,resolveState:0,userStatus:1,verifyFlag:0,addType:1,fromType:"15",domainList:"3",bindStatus:1,isBlock:0,isQyFriend:0,isReFriend:0,dataFrom:1,companyCode:"qeg4ep"}]}}}],sideEffects:["network"],handler:async(n)=>{return await O("wechat_friend_list_es",{wechatId:n.wechat_id,ymdStart:n.start_date||"0000-00-00",ymdEnd:n.end_date||vq(),pageNum:n.page,pageSize:n.page_size,friendTypeYunke:String(n.type),...n.sales_name?{salesname:n.sales_name}:{}})}},i5={name:"crm.wechat.friend-circle-list",description:"查某员工微信发布的朋友圈列表。翻页看返回的 hashNext(字段名拼写如此)。注意:返回行内 createTime 为秒级时间戳字符串;图片地址如为签名 URL 有效期有限,需尽快取用。",category:"crm",pluginName:X0,parameters:i.object({wechat_id:Q0.describe("员工微信 ID"),page_num:i.number().int().min(1).optional().default(1).describe("页码"),page_size:i.number().int().min(1).optional().default(10).describe("每页条数"),start_time:i.string().optional().default("").describe("开始日期 YYYY-MM-DD(与 end_time 成对传,空则不限)"),end_time:i.string().optional().default("").describe("结束日期 YYYY-MM-DD(与 start_time 成对传)")}),returns:i.object({hashNext:i.boolean().optional().describe("是否还有下一页(拼写如此)"),pageNum:i.number().optional().describe("页码回显"),saleNickName:i.string().optional().describe("员工微信昵称"),saleAlias:i.string().optional().describe("员工微信号"),headImageUrl:i.string().optional().describe("员工头像 URL"),bgImg:i.string().optional().describe("朋友圈背景图 URL(签名 URL,有效期有限)"),data:i.array(i.object({id:i.string().describe("朋友圈记录 ID"),wechatId:i.string().optional().describe("所属员工微信 ID"),friendsterWXId:i.string().optional().describe("朋友圈所属微信 ID"),friendsterName:i.string().optional().describe("朋友圈所属昵称"),friendsterWXIdImg:i.string().optional().describe("朋友圈所属头像 URL"),type:i.string().optional().describe("内容类型:1 文字+图片 2 纯文字 3 分享 15 小视频(字符串形态)"),subType:i.string().optional().describe("子类型码(上游未文档化)"),sourceType:i.string().optional().describe("来源码(上游未文档化)"),title:i.string().optional().describe("标题"),content:i.string().optional().describe("文字内容"),createTime:i.string().optional().describe("发布时间(秒级时间戳字符串)"),imgUrls:i.array(i.string()).optional().describe("图片 ID 列表"),urls:i.array(i.string()).optional().describe("图片 ID 列表(与 imgUrls 并存)"),imgUrlsList:i.array(i.unknown()).optional().describe("图片列表(实测空数组,上游未文档化)"),praise:i.array(i.object({wid:i.string().optional().describe("点赞者微信 ID"),praiseId:i.string().optional().describe("点赞者微信 ID"),name:i.string().optional().describe("点赞者昵称"),praiseName:i.string().optional().describe("点赞者昵称(与 name 并存)"),praiseImg:i.string().optional().describe("点赞者头像 URL"),delete:i.string().optional().describe("是否取消点赞:0/1(字符串形态)")}).passthrough()).optional().describe("点赞列表"),comment:i.array(i.object({wid:i.string().optional().describe("评论者微信 ID"),responseId:i.string().optional().describe("评论者微信 ID(与 wid 并存)"),displayName:i.string().optional().describe("评论者昵称"),content:i.string().optional().describe("评论内容"),responseIdHeadImg:i.string().optional().describe("评论者头像 URL"),delete:i.number().optional().describe("是否删除:0/1(数字形态)")}).passthrough()).optional().describe("评论列表"),praiseNum:i.number().optional().describe("点赞数(praise[] 派生计数)"),praiseCount:i.number().optional().describe("点赞数(统计字段)"),commentNum:i.number().optional().describe("评论数(comment[] 派生计数)"),commentCount:i.number().optional().describe("评论数(统计字段)"),likeFlag:i.string().optional().describe("当前员工是否已点赞:0/1(字符串形态)"),pravited:i.string().optional().describe("私密标记(拼写如此)"),localFlag:i.string().optional().describe("本地标记(上游未文档化)"),localPrivate:i.string().optional().describe("本地私密标记(上游未文档化)"),stringSeq:i.string().optional().describe("上游未文档化"),snsId:i.string().optional().describe("朋友圈 sns ID"),version:i.string().optional().describe("数据版本毫秒时间戳字符串"),head:i.string().optional().describe("实测为 yyyymmdd 日期串(PC 注释称头像,与实测不符)"),circleOfFriendsCount:i.number().optional().describe("朋友圈数"),companyCode:i.string().optional().describe("公司码"),pageNum:i.number().optional().describe("页码回显(行内)"),pageSize:i.number().optional().describe("每页条数回显(行内)")}).passthrough()).describe("朋友圈行(按发布时间倒序)")}).passthrough(),examples:[{description:"查朋友圈",input:{wechat_id:"wxid_xxx"},output:{hashNext:!1,pageNum:1,saleNickName:"客服小张",saleAlias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",bgImg:"https://example.invalid/bg.jpg",data:[{id:"6a2fb9cbd220827d6e78bac2",wechatId:"wxid_fabricated0001",friendsterWXId:"wxid_fabricated0001",friendsterName:"客服小张",friendsterWXIdImg:"https://example.invalid/a.jpg",type:"1",subType:"0",sourceType:"4",title:"",content:"今日上新",createTime:"1758512560",imgUrls:["14751472530557121080"],urls:["14751472530557121080"],imgUrlsList:[],praise:[{wid:"wxid_fabricated0002",praiseId:"wxid_fabricated0002",name:"客户甲",praiseName:"客户甲",praiseImg:"https://example.invalid/b.jpg",delete:"0"}],comment:[{wid:"wxid_fabricated0002",responseId:"wxid_fabricated0002",displayName:"客户甲",content:"不错",responseIdHeadImg:"https://example.invalid/b.jpg",delete:0}],praiseNum:1,praiseCount:0,commentNum:1,commentCount:0,likeFlag:"0",pravited:"0",localFlag:"2",localPrivate:"0",stringSeq:"0000014751472529862505023",snsId:"-3695271543847046593",version:"1781512651811",head:"20250922",circleOfFriendsCount:0,companyCode:"qeg4ep",pageNum:1,pageSize:10}]}}],sideEffects:["network"],handler:async(n)=>{return await O("wechat_friendster_info",{wechatId:n.wechat_id,pageNum:n.page_num,pageSize:n.page_size,...n.start_time?{startTime:n.start_time}:{},...n.end_time?{endTime:n.end_time}:{}})}};var _5="crm",b5=i.union([i.string(),i.number()]).transform((n)=>String(n)),j1=i.union([i.array(i.string()),i.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}),Jq=i.union([i.array(i.number()),i.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}).pipe(i.array(i.number())),Yq=i.object({define:i.number().describe("0=系统列,1=自定义字段列"),fieldCode:i.string().describe("列标识:系统列为语义码(customerName/cellPhone/createdTime…),自定义列为字段 id 字符串,对应 crm.customer.list 行内 customFieldValues[].fieldId"),fieldType:i.number().describe("列类型:0文本 1数值 2单选 3多选 4日期 6多联系人 7地址 8地区 9附件 20/21级联;系统列另有自身取值"),showName:i.string().describe("列显示名(中文)"),hiddens:i.number().describe("是否隐藏")}),w5={name:"crm.customer.default-head",description:"查询客户列表的动态表头(列定义,含系统列与自定义列)。解读或筛选 crm.customer.list 返回的自定义字段前先取本命令:define=1 项的 fieldCode 即字段 id,等于 list 行内 customFieldValues[].fieldId。",category:"crm",pluginName:_5,parameters:i.object({list_type:i.number().int().optional().default(1).describe("列表类型:1=客户列表(默认)2=公海列表 3=AI列表 8=企业列表 9=企业模块客户;其他值报「无效的参数」")}),returns:i.object({defaultHead:i.array(Yq)}).passthrough().describe("defaultHead 为全量列(系统列+自定义列,可达 79 项)。⚠️ 与 crm.customer.list 成对使用:list 行内 customFieldValues[].fieldId 对应本表 define=1 项的 fieldCode,用其 showName/fieldType 解释字段名与类型。另含 msg(审核通过的短信模板列表)/ otherInfo(特殊字段附加配置)/ multiContactsLimitSize / hasPrivelege* 任务按钮权限位"),examples:[{description:"查询客户列表表头(默认客户列表)",input:{},output:{defaultHead:[{define:0,fieldCode:"customerName",fieldType:0,showName:"姓名",hiddens:0},{define:1,fieldCode:"10639",fieldType:2,showName:"客户类型",hiddens:0}]}}],sideEffects:["network"],handler:async({list_type:n})=>{return await O("get_customer_default_head",{type:n})}},Wi=(n)=>i.union([i.string(),i.number()]).describe(n),Wq=i.object({fieldId:Wi("自定义字段 id = crm.customer.default-head define=1 项的 fieldCode"),fieldName:i.string().describe("字段中文名(服务端回填)"),fieldValue:i.array(i.union([i.string(),i.number()])).optional().describe("字段值(多选类字段为多元素)"),values:i.array(i.union([i.string(),i.number()])).optional().describe("字段值(与 fieldValue 并存的别名键,上游未文档化二者差异)"),intValue_int:i.number().optional().describe("数值型字段的数值形态(上游未文档化)"),type:i.number().describe("字段类型,枚举同 default-head 的 fieldType(0文本 1数值 2单选 3多选 4日期…)")}).passthrough(),lq=i.object({id:i.string().describe("客户 id"),customerName:i.string().describe("客户名(受公司脱敏配置影响可能带 *)"),customerSerial:i.union([i.string(),i.number()]).optional().describe("客户编号;无编号的行缺失该键"),cellPhone:i.string().describe("手机号(受脱敏配置影响可能带 *)"),createdTime:i.string().describe("创建时间 yyyy-MM-dd HH:mm:ss"),customerSource:i.string().optional().describe("客户来源"),groupName:i.string().optional().describe("分组名(未分组为「待分组」)"),groupId:i.union([i.string(),i.number(),i.null()]).optional().describe("分组 id(仅已入组的行出现;实测偶发 null=未入组,与省略等义)"),progress:Wi("沟通进度码").optional(),progressName:i.string().optional().describe("沟通进度名"),userName:i.string().optional().describe("跟进人名"),userKey:i.string().optional().describe("跟进人 userKey"),departmentName:i.string().optional().describe("跟进人部门名"),ownerDeptId:Wi("归属部门 id").optional(),updateTime:i.string().optional().describe("更新时间 yyyy-MM-dd HH:mm:ss"),followTime:i.string().optional().describe("最近跟进时间 yyyy-MM-dd HH:mm:ss"),firstActionTime:i.string().optional().describe("首次通话时间(无记录时字段省略)"),lastActionTime:i.string().optional().describe("最近通话时间(无记录时字段省略)"),intensionLevel:Wi("AI 意向度等级码(枚举语义见 crm.ai.customer-intention-list)").optional(),aiSummary:i.string().optional().describe("AI 分析摘要(仅已分析客户出现,上游未文档化结构)"),wechatID:i.string().optional().describe("客户微信 id(已匹配微信的行出现)"),regionName:i.string().optional().describe("地区名"),birthday:i.string().optional().describe("生日"),gender:i.string().optional().describe("性别"),email:i.string().optional().describe("邮箱"),qq:i.string().optional().describe("QQ"),position:i.string().optional().describe("职位"),customFieldValues:i.array(Wq).optional().describe("自定义字段值(动态列的载体,字段清单与类型语义对照 crm.customer.default-head)")}).passthrough(),$5={name:"crm.customer.list",description:"分页查询私海客户列表(ES 检索),支持关键词/手机号/客户编号/部门/跟进人/进度/时间范围等多条件过滤。行内 customFieldValues 为自定义字段值;字段名与类型语义对照 crm.customer.default-head(其 define=1 项 fieldCode = 本命令 fieldId)。",category:"crm",pluginName:_5,parameters:i.object({page_index:i.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:i.number().int().min(1).optional().default(20).describe("每页条数,默认 20;pageIndex×pageSize>100000 会被拒绝,深翻页改用条件收窄"),keyword:i.string().optional().default("").describe("关键词搜索"),search_phone:b5.optional().default("").describe("手机号搜索"),search_customer_name:i.string().optional().default("").describe("客户名搜索"),customer_serial:b5.optional().default("").describe("客户编号过滤,只能是数字,否则报错"),dept_id:i.string().optional().default("").describe("部门 id 过滤"),dept_ids:j1.optional().default([]).describe("部门 id 列表过滤"),follower_id:i.string().optional().default("").describe("单个跟进人 id 过滤"),follower_ids:j1.optional().default([]).describe("跟进人 id 列表过滤"),progress:i.number().int().optional().describe("沟通进度过滤"),progress_list:Jq.optional().describe("沟通进度列表过滤"),create_time_start:i.string().optional().default("").describe("创建时间下限 yyyy-MM-dd HH:mm:ss,与 create_time_end 成对传"),create_time_end:i.string().optional().default("").describe("创建时间上限 yyyy-MM-dd HH:mm:ss,与 create_time_start 成对传"),modify_time_start:i.string().optional().default("").describe("修改时间下限 yyyy-MM-dd HH:mm:ss,与 modify_time_end 成对传"),modify_time_end:i.string().optional().default("").describe("修改时间上限 yyyy-MM-dd HH:mm:ss,与 modify_time_start 成对传"),sort_field:i.string().optional().default("").describe("排序字段,如 createdTime"),sort_order:i.string().optional().default("").describe("排序方向:asc / desc"),customer_source:i.string().optional().default("").describe("客户来源过滤"),group_id:i.number().int().optional().describe("客户分组 id 过滤"),only_fetch_count:i.boolean().optional().default(!1).describe("仅取总条数;总数以返回的 total 为准(小结果集 list 仍可能带出)"),cus_ids:j1.optional().describe("指定客户 id 集合过滤")}),returns:i.object({total:i.number(),pageIndex:i.number(),pageSize:i.number(),currIndex:i.number().optional().describe("当前页起始偏移(深分页游标)"),list:i.array(lq)}).passthrough().describe("统计客户数/分布必须取全分页后汇总(total 大于已取行数时继续翻页);手机号/客户名受公司脱敏配置影响可能带 *;数据权限按登录用户派生,只能看到权限范围内的客户。行内还有大量功能位键(AI 分析/加微状态/备用字段 spareN 等,有值才出现),schema 未尽声明,靠 passthrough 透传"),examples:[{description:"按关键词分页查询客户",input:{keyword:"张",page_index:1,page_size:20},output:{total:66,pageIndex:1,pageSize:20,list:[{id:"ABF30825BA1C47008569580F2C11D81E",customerName:"张三",customerSerial:1361,cellPhone:"199****0008",customerSource:"企业导入-手动录入",groupName:"待分组",createdTime:"2026-09-08 16:52:04",userName:"李四",userKey:"U0002",departmentName:"销售一部",customFieldValues:[{fieldId:17607,fieldName:"年级",fieldValue:["一"],type:2}]}]}},{description:"仅取客户总数",input:{only_fetch_count:!0},output:{total:66,pageIndex:1,pageSize:20,list:[]}}],sideEffects:["network"],handler:async(n)=>{let b={pageIndex:n.page_index,pageSize:n.page_size};if(n.keyword)b.keyword=n.keyword;if(n.search_phone)b.searchPhone=n.search_phone;if(n.search_customer_name)b.searchCustomerName=n.search_customer_name;if(n.customer_serial)b.customerSerial=n.customer_serial;if(n.dept_id)b.deptId=n.dept_id;if(n.dept_ids.length)b.deptIds=n.dept_ids;if(n.follower_id)b.followerId=n.follower_id;if(n.follower_ids.length)b.followerIds=n.follower_ids;if(n.progress!=null)b.progress=n.progress;if(n.progress_list?.length)b.progressList=n.progress_list;if(n.customer_source)b.customerSource=n.customer_source;if(n.group_id!=null)b.groupId=n.group_id;if(n.only_fetch_count)b.onlyFetchCount=!0;if(n.cus_ids?.length)b.cusIds=n.cus_ids;if(n.create_time_start||n.create_time_end)b.createTimeRange={start:n.create_time_start,end:n.create_time_end};if(n.modify_time_start||n.modify_time_end)b.modifyTimeRange={start:n.modify_time_start,end:n.modify_time_end};if(n.sort_field||n.sort_order)b.sort={field:n.sort_field,order:n.sort_order};return await O("query_customer_list",b)}};var q5={name:"crm",version:"1.0.0",commands:[U6,C6,S6,t6,F6,P6,T6,I6,g6,d6,s6,_3,w3,q3,o3,a6,e6,r6,z6,M3,j3,f3,V3,K3,k3,N3,R3,U3,C3,S3,t3,E3,F3,P3,T3,y3,I3,g3,Z3,a3,e3,r3,z3,s3,n5,i5,v3,H3,Q3,X3,J3,Y3,W3,l3,p3,G3,O3,h3,u3,w5,$5]};var pq="ai_task_wx_circle_of_friends_config",Gq="WECHAT_MOMENTS";function o5(){let n=new Date,b=(_)=>String(_).padStart(2,"0");return`${n.getFullYear()}-${b(n.getMonth()+1)}-${b(n.getDate())} ${b(n.getHours())}:${b(n.getMinutes())}:${b(n.getSeconds())}`}function Oq(n,b){let _=new Date(n.replace(" ","T"));_.setHours(_.getHours()+b);let w=($)=>String($).padStart(2,"0");return`${_.getFullYear()}-${w(_.getMonth()+1)}-${w(_.getDate())} ${w(_.getHours())}:${w(_.getMinutes())}:${w(_.getSeconds())}`}function hq(n){let b=new Date,_=(q)=>String(q).padStart(2,"0"),w=`${b.getFullYear()}${_(b.getMonth()+1)}${_(b.getDate())}_${_(b.getHours())}${_(b.getMinutes())}${_(b.getSeconds())}`,$=n.slice(-8);return`朋友圈_${w}_${$}`}function uq(){let n=mn();if(!n?.user_id)throw new G("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login' 登录");return n.user_id}async function x5(n){let b=uq(),_=n.startTime??o5(),w=n.endTime??Oq(_,1),$={taskType:Gq,taskName:n.taskName,content:n.content,remark:n.remark,taskKey:hq(b),createTime:o5(),startTime:_,endTime:w},q=`${w0}/api/v1/weixiaozhu/message/send`,o;try{o=await fetch(q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:b,push_type:pq,text:$})})}catch(m){let v=m instanceof Error?m.message:String(m);throw new G("EXECUTION_FAILED",`微小助服务不可达: ${v}`)}if(!o.ok){let m=`HTTP ${o.status}`;try{let v=await o.json();m=v.detail??v.message??m}catch{}throw new G("EXECUTION_FAILED",`微小助服务错误: ${m}`)}return(await o.json()).data}var Bq="weixiaozhu",m5={name:"weixiaozhu.moments.send",description:"发送一条朋友圈推送任务到微小助 broker。user_id 自动从 crm 登录凭证读取。",category:"weixiaozhu",pluginName:Bq,hidden:!0,parameters:i.object({content:i.string().min(1).describe("朋友圈文案"),remark:i.string().min(1).describe("朋友圈图片 URL(微小助 broker 固定字段名为 remark)"),task_name:i.string().optional().default("测试发朋友圈").describe('任务名称,默认"测试发朋友圈"'),start_time:i.string().optional().describe("发送开始时间,格式 YYYY-MM-DD HH:mm:ss,默认当前时间"),end_time:i.string().optional().describe("发送结束时间,格式 YYYY-MM-DD HH:mm:ss,默认 start_time + 1小时")}),returns:i.object({success:i.boolean(),data:i.record(i.unknown()).nullable()}),examples:[{description:"发送朋友圈(最简调用)",input:{content:"今天天气真好!",remark:"https://example.com/img.jpg"},output:{success:!0,data:{}}},{description:"指定任务名和时间",input:{content:"新品上市!",remark:"https://example.com/product.jpg",task_name:"新品推广",start_time:"2026-04-15 10:00:00",end_time:"2026-04-15 11:00:00"},output:{success:!0,data:{}}}],sideEffects:["network"],handler:async({content:n,remark:b,task_name:_,start_time:w,end_time:$})=>{return{success:!0,data:await x5({content:n,remark:b,taskName:_,startTime:w,endTime:$})}}};var v5={name:"weixiaozhu",version:"1.0.0",featureFlag:"weixiaozhu",commands:[m5]};qn();qn();var H5=`yunke-cli/${R}`;function Q5(){return On().api_base_url.replace(/\/$/,"")}async function li(n,b){let _=`${Q5()}${n}`,w=await fetch(_,{...b,headers:{"User-Agent":H5,...b?.headers??{}}});if(!w.ok){let $=`HTTP ${w.status}`;try{let q=await w.json();if(q.error)$=q.error;else if(q.message)$=q.message}catch{}throw new G("EXECUTION_FAILED",`CLI API error: ${$}`)}return await w.json()}async function X5(n){let b=`${Q5()}${n}`,_=await fetch(b,{redirect:"manual",headers:{"User-Agent":H5}}),w=_.headers.get("location");if(!w)throw new G("EXECUTION_FAILED",`CLI API did not return a redirect for ${n} (status ${_.status})`);return w}qn();function G2(){let{platform:n,arch:b}=process;switch(n){case"darwin":return b==="arm64"?"darwin-arm64":"darwin-x64";case"linux":return"linux-x64";case"win32":return"windows-x64";default:throw Error(`不支持的平台: ${n}-${b}。`+"支持的平台: darwin-arm64, darwin-x64, linux-x64, windows-x64")}}var Mq=(()=>{return"npm"})();function dn(){return Mq==="npm"}qn();import{readFileSync as Eq,writeFileSync as Fq,mkdirSync as Pq,existsSync as G5}from"node:fs";import{homedir as Tq}from"node:os";import{join as O5}from"node:path";import{writeFile as Uq,chmod as Cq,rename as Sq,unlink as tq}from"node:fs/promises";qn();import{createHash as jq}from"node:crypto";function fq(n){return jq("sha256").update(n).digest("hex")}function J5(n,b){let _=fq(n);if(!b)return{valid:!0,actual:_,expected:null};let w=b.toLowerCase().trim();return{valid:_===w,actual:_,expected:w}}Gi();async function O2(){let n=G2();return li(`/api/v1/cli/check-update?current=${encodeURIComponent(R)}&target=${encodeURIComponent(n)}`)}async function p5(){let n=G2(),b=await O2();if(!b.hasUpdate)return{updated:!1,fromVersion:R,toVersion:b.latestVersion,message:"已是最新版本"};let _;try{_=await f1()}catch(v){throw Error(`备份当前版本失败: ${v instanceof Error?v.message:String(v)}`)}let w=await X5(`/api/v1/cli/download?target=${encodeURIComponent(n)}`),$=await fetch(w);if(!$.ok)throw Error(`下载失败: HTTP ${$.status}`);let q=Buffer.from(await $.arrayBuffer()),o=J5(q,b.checksum);if(!o.valid)throw Error(`完整性校验失败。期望: ${o.expected}, 实际: ${o.actual}`);let x=process.execPath,m=`${x}.new`;try{await Uq(m,q),await Cq(m,493),await Sq(m,x)}catch(v){try{await tq(m)}catch{}if(_)try{let{rollbackFromLatestBackup:H}=await Promise.resolve().then(() => (Gi(),l5));await H()}catch{}throw v}return{updated:!0,fromVersion:R,toVersion:b.latestVersion??"",backupPath:_,message:`已更新到 ${b.latestVersion}。请重启 CLI 以使用新版本。`}}var K1=process.env.YUNKE_CONFIG_DIR??O5(Tq(),".yunke"),D1=O5(K1,"update-check.json"),yq=86400000;function h5(){if(!G5(D1))return null;try{let n=Eq(D1,"utf-8");return JSON.parse(n)}catch{return null}}function u5(n){if(!G5(K1))Pq(K1,{recursive:!0});Fq(D1,JSON.stringify(n,null,2),"utf-8")}function Oi(n){if(!n)return!0;if(n.currentVersion!==R)return!0;return Date.now()-new Date(n.lastCheck).getTime()>=yq}function B5(){if(dn()){gq();return}let n=h5();if(n&&!Oi(n)&&n.hasUpdate){j5(n.latestVersion);return}if(Oi(n))Iq().catch(()=>{})}async function Iq(){try{let n=await O2(),b=n.hasUpdate&&n.latestVersion!=null&&f5(n.latestVersion,R),_={lastCheck:new Date().toISOString(),hasUpdate:b,latestVersion:n.latestVersion,currentVersion:R};if(u5(_),b)j5(n.latestVersion)}catch{}}function M5(n,b){return`
363
- 新版本可用: ${n} -> ${b}
355
+ </html>`;import{writeSync as i9}from"node:fs";function d2(n){i9(1,n)}function l1(n){i9(2,n)}function a0(n){process.exit(n)}var Sn="crm",iw=/^1[3-9]\d{9}$/,G4=$.string().regex(iw,"手机号格式不合法,需为 11 位中国大陆手机号"),f9=$.object({id:$.string(),cellphone:$.string(),company_id:$.string(),user_id:$.string(),user_type:$.number(),real_name:$.string(),user_bind_state:$.number(),auto_call:$.number(),download_limit:$.number(),create_time:$.string(),use_sea:$.number(),department_id:$.string(),power_type:$.number(),login_account:$.string(),role_id:$.string(),user_telephone:$.string(),user_address:$.string(),user_email:$.string(),user_status:$.number(),login_id:$.string(),role_name:$.string(),manage_department_names:$.string(),is_manager:$.boolean(),asr:$.number()}),l9={name:"crm.auth.send-code",description:"向手机号发送云客 CRM 短信验证码,登录第一步。",category:"crm",pluginName:Sn,parameters:$.object({phone:G4.describe("11 位中国大陆手机号")}),returns:$.object({success:$.boolean(),message:$.string()}),examples:[{description:"发送验证码",input:{phone:"13800138000"},output:{success:!0,message:"发送成功"}}],sideEffects:["network"],hidden:!0,handler:async({phone:n})=>{let q=await v1("/pc/sms/send",{phone:n,timestamp:Date.now()});return{success:q.success,message:q.message}}},c9={name:"crm.auth.verify",description:"验证短信验证码,返回该手机号关联的企业列表,登录第二步。",category:"crm",pluginName:Sn,parameters:$.object({phone:G4.describe("11 位中国大陆手机号"),sms_code:$.string().min(1).describe("收到的短信验证码")}),returns:$.object({companies:$.array($.object({user_id:$.string(),user_type:$.number(),company_code:$.string(),company:$.string(),domain:$.string()}))}),examples:[{description:"验证验证码,返回企业列表",input:{phone:"13800138000",sms_code:"123456"},output:{companies:[{user_id:"u001",user_type:1,company_code:"yk001",company:"云客",domain:"yunke.ai"}]}}],sideEffects:["network"],hidden:!0,handler:async({phone:n,sms_code:q})=>{return{companies:await v1("/pc/login/verify",{phone:n,sms_code:q})}}},d9={name:"crm.auth.login",description:"选择企业登录,获取 token,自动拉取用户详情,将凭证写入 ~/.yunke/crm.json,登录第三步。",category:"crm",pluginName:Sn,parameters:$.object({phone:G4.describe("11 位中国大陆手机号"),y_code:$.string().min(1).describe("短信验证码(同 sms_code)"),company_code:$.string().min(1).describe("从 verify 步骤返回的企业代码")}),returns:$.object({token:$.string(),user_id:$.string(),company:$.string(),company_code:$.string(),name:$.string(),phone:$.string(),role:$.string(),login_id:$.string(),user_info:f9}),examples:[{description:"选择企业登录",input:{phone:"13800138000",y_code:"123456",company_code:"yk001"},output:{token:"tok_xxx",user_id:"u001",company:"云客",company_code:"yk001",name:"张三",phone:"13800138000",role:"admin",login_id:"lid_001",user_info:{id:"u001",cellphone:"13800138000",company_id:"yk001",user_id:"u001",user_type:1,real_name:"张三",user_bind_state:1,auto_call:0,download_limit:100,create_time:"2026-01-01 10:00:00",use_sea:1,department_id:"dept001",power_type:1,login_account:"13800138000",role_id:"role001",user_telephone:"",user_address:"",user_email:"",user_status:1,login_id:"lid_001",role_name:"管理员",manage_department_names:"销售部",is_manager:!0,asr:1}}}],sideEffects:["filesystem","network"],hidden:!0,handler:async({phone:n,y_code:q,company_code:H})=>{let Q=await v1("/pc/login/token",{phone:n,y_code:q,company_code:H}),X={token:Q.token,user_id:Q.user_id,company:Q.company,company_code:Q.company_code,name:Q.name,phone:Q.phone,role:Q.role,login_id:Q.login_id};c2(X);let J=await v1("/pc/user/info",{user_id:Q.user_id,token:Q.token});return{...X,user_info:J}}},z9={name:"crm.auth.user-info",description:"直查 PC 获取完整用户信息(含 menus 等大字段,未过滤)。一般场景优先用 crm.user.info(走中台、已过滤大字段),仅在需要全量字段时用本命令。",category:"crm",pluginName:Sn,parameters:$.object({}),returns:f9,examples:[{description:"获取当前登录用户信息",input:{},output:{id:"u001",cellphone:"13800138000",company_id:"yk001",user_id:"u001",user_type:1,real_name:"张三",user_bind_state:1,auto_call:0,download_limit:100,create_time:"2026-01-01 10:00:00",use_sea:1,department_id:"dept001",power_type:1,login_account:"13800138000",role_id:"role001",user_telephone:"",user_address:"",user_email:"",user_status:1,login_id:"lid_001",role_name:"管理员",manage_department_names:"销售部",is_manager:!0,asr:1}}],sideEffects:["network"],handler:async()=>{let n=O0();if(!n?.token||!n?.user_id)throw new K("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login-web' 登录");return v1("/pc/user/info",{user_id:n.user_id,token:n.token})}},t9=300000;function z2(n){return n instanceof Error?n.message:String(n)}function ow(n){return new Promise((q,H)=>{n.once("error",H),n.listen(0,"127.0.0.1",()=>{n.removeListener("error",H),q()})})}async function o9(n){n.closeAllConnections?.(),await new Promise((q)=>n.close(()=>q())),await new Promise((q)=>setImmediate(q))}function _4(n){return'<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">'+"<title>登录失败 - yunke-cli</title>"+"<style>body{font-family:sans-serif;max-width:420px;margin:80px auto;padding:0 16px;text-align:center}</style>"+`</head><body><h2>登录失败</h2><p>❌ ${fw(n)}</p></body></html>`}function fw(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function lw(n,q,H){return new Promise((Q)=>{let X=setTimeout(()=>Q(null),t9);n.on("request",(J,w)=>{let W=new URL(J.url??"/","http://127.0.0.1");if(W.pathname!=="/callback"){w.statusCode=404,w.end("not found");return}clearTimeout(X);let x=W.searchParams.get("code"),Y=W.searchParams.get("state"),_=W.searchParams.get("error"),G=W.searchParams.get("iss");if(_){let O=W.searchParams.get("error_description")??_;w.end(_4(O)),Q(null);return}if(!x||Y!==q){w.statusCode=400,w.end(_4("授权回调参数无效(state 不匹配或缺 code)")),Q(null);return}Q({code:x,iss:G,reply:(O,M)=>{try{if(O)w.setHeader("Content-Type","text/html; charset=utf-8"),w.end(H);else w.end(_4(M??""))}catch{}}})})})}var r9={name:"crm.auth.login-web",description:"发起浏览器 OAuth 登录:CLI 自动打开系统浏览器(裸输出授权 URL 绕过 JSON 信封,spawn 失败时用户可手动打开打印的 URL),等待回调换 token 后落盘。",category:"crm",pluginName:Sn,parameters:$.object({}),returns:$.object({url:$.string()}),examples:[{description:"发起 OAuth 登录(CLI 自己开浏览器)",input:{},output:{url:"https://yunke-pc.example.com/pc/oauth/authorize?client_id=wb_xxx&..."}}],sideEffects:["filesystem","network"],timeout:t9+1e4,handler:async()=>{let n=x4,q=P9(),H=S9(q),Q=b9(),X=gw();try{await ow(X)}catch(G){l1(`启动本地回调服务器失败: ${z2(G)}
356
+ `),a0(1);return}let w=`http://127.0.0.1:${X.address().port}/callback`,W;try{W=(await h9(n,w)).client_id}catch(G){await o9(X),l1(`OAuth 客户端注册失败: ${z2(G)}
357
+ `),a0(1);return}let x=T9({baseUrl:n,clientId:W,redirectUri:w,state:Q,codeChallenge:H});d2(`${x}
358
+ `),p9(x);let Y=await lw(X,Q,g9),_=1;if(Y)try{let G=E9(Y.iss,n),O=await u9({baseUrl:G,code:Y.code,clientId:W,redirectUri:w,codeVerifier:q});c2({token:O.access_token,user_id:O.user_id??"",company:"",company_code:O.company_code??"",name:O.name??"",phone:"",role:"",login_id:"",refresh_token:O.refresh_token,expires_at:Date.now()+(O.expires_in??3600)*1000,client_id:W,redirect_uri:w,base_url:G}),Y.reply(!0),_=0}catch(G){let O=`登录失败: ${z2(G)}`;l1(`${O}
359
+ `),Y.reply(!1,O),_=1}await o9(X),a0(_);return}},a9={name:"crm.auth.status",description:'WorkBuddy 对接:检测登录状态。已登录 exit 0 + 输出 "Logged in as <name>";未登录 exit 非0。token 过期自动 refresh。',category:"crm",pluginName:Sn,parameters:$.object({}),returns:$.object({logged_in:$.boolean()}),examples:[{description:"已登录",input:{},output:{logged_in:!0}}],sideEffects:["filesystem","network"],handler:async()=>{let n=O0();if(!n?.token||!n?.user_id){a0(1);return}if(!(n.expires_at!=null&&Date.now()>=n.expires_at)){d2(`Logged in as ${n.name}
360
+ `),a0(0);return}if(n.refresh_token&&n.client_id){try{let H=await y9({baseUrl:n.base_url||x4,refreshToken:n.refresh_token,clientId:n.client_id});D9({token:H.access_token,expires_at:Date.now()+(H.expires_in??3600)*1000,...H.refresh_token?{refresh_token:H.refresh_token}:{}}),d2(`Logged in as ${n.name}
361
+ `),a0(0);return}catch(H){l1(`刷新凭证失败: ${z2(H)}
362
+ `)}a0(1);return}a0(1);return}},e9={name:"crm.auth.logout",description:"WorkBuddy 对接:登出,删除本地凭证(幂等,未登录也 exit 0)。",category:"crm",pluginName:Sn,parameters:$.object({}),returns:$.object({success:$.boolean()}),examples:[{description:"登出",input:{},output:{success:!0}}],sideEffects:["filesystem"],handler:async()=>{return C9(),F9(),{success:!0}}};var s9="crm",cw=$.object({id:$.string().describe("部门 ID 或员工 ID(按 is_dept 区分),可直接作为后续命令的部门/员工入参"),pid:$.string().describe("父节点 ID"),name:$.string().describe("部门名或员工姓名"),is_dept:$.boolean().describe("true=部门,false=员工(部门与员工混排在同一数组,无独立分组字段)"),bind_qywx:$.boolean().describe("是否绑定企业微信"),offline_days:$.number().describe("离线天数"),sort:$.number().describe("排序号"),account:$.string().nullable().optional().describe("员工账号(仅员工项)"),phone_number:$.string().nullable().optional().describe("员工手机号(仅员工项,可能为 null)"),user_type:$.number().nullable().optional().describe("员工类型(仅员工项,可能为 null)")}),dw=$.object({id:$.string(),pid:$.string(),name:$.string(),is_dept:$.boolean(),department_path:$.string(),routes:$.array($.string()),bind_qywx:$.boolean(),offline_days:$.number(),sort:$.number(),account:$.string().nullable().optional(),phone_number:$.string().nullable().optional(),has_phone:$.boolean().nullable().optional(),user_type:$.number().nullable().optional()}),n7={name:"crm.org.department-tree",description:"查询指定部门下的子部门和员工列表(单级,不递归)。dept_id 为空时查根节点。",category:"crm",pluginName:s9,parameters:$.object({dept_id:$.string().optional().default("").describe("父部门 ID,空字符串表示根节点"),show_user:$.boolean().optional().default(!0).describe("是否返回员工节点"),show_user_status:$.string().optional().default("").describe("过滤员工状态"),query_qywx_status:$.boolean().optional().default(!1).describe("是否查询企业微信绑定状态")}),returns:$.object({items:$.array(cw)}),examples:[{description:"查询根节点",input:{},output:{items:[{id:"dept001",pid:"",name:"销售部",is_dept:!0,bind_qywx:!1,offline_days:0,sort:1}]}},{description:"查询指定部门的子节点",input:{dept_id:"dept001"},output:{items:[{id:"u001",pid:"dept001",name:"张三",is_dept:!1,bind_qywx:!1,offline_days:0,sort:1,phone_number:"13800138000"}]}}],sideEffects:["network"],handler:async({dept_id:n,show_user:q,show_user_status:H,query_qywx_status:Q})=>{let X=await D("get_department_tree",{id:n,showUser:q,...H!==""?{showUserStatus:Number(H)}:{},queryQywxStatus:Q});return{items:(Array.isArray(X)?X:X.list??[]).map((w)=>({id:String(w.id??""),pid:String(w.pid??""),name:String(w.name??""),is_dept:Boolean(w.isDept),bind_qywx:Boolean(w.bindQywx),offline_days:Number(w.offlineDays??0),sort:Number(w.sort??0),account:w.account??null,phone_number:w.phoneNumber??null,user_type:w.userType??null}))}}},$7={name:"crm.org.search",description:"通过关键词模糊搜索部门和员工。search_type: 1=仅部门, 2=仅员工, 3=全部(默认)。",category:"crm",pluginName:s9,parameters:$.object({keyword:$.string().min(1).describe("搜索关键词"),search_type:$.number().int().min(1).max(3).optional().default(3).describe("1=仅部门 2=仅员工 3=全部"),limit:$.number().int().min(1).max(100).optional().default(20).describe("返回条数上限"),phone_only:$.boolean().optional().default(!1).describe("仅返回有手机号的员工")}),returns:$.object({total:$.number(),results:$.array(dw)}),examples:[{description:'搜索关键词"张"',input:{keyword:"张"},output:{total:1,results:[{id:"u001",pid:"dept001",name:"张三",is_dept:!1,department_path:"销售部",routes:["dept001"],bind_qywx:!1,offline_days:0,sort:1}]}}],sideEffects:["network"],handler:async({keyword:n,search_type:q,limit:H,phone_only:Q})=>{let X=await D("search_dept_employee",{keyword:n.trim(),type:q,limit:H,phoneOnly:Q,queryQywxStatus:!1}),J=Array.isArray(X)?X:X.data??X.list??[],w=Array.isArray(X)?X.length:X.total??J.length,W=J.map((x)=>{let Y=x.routes??[];return{id:String(x.id??""),pid:String(x.pid??""),name:String(x.name??""),is_dept:Boolean(x.isDept),routes:Y,department_path:Y.join("/"),bind_qywx:Boolean(x.bindQywx),offline_days:Number(x.offlineDays??0),sort:Number(x.sort??0),account:x.account??null,phone_number:x.phoneNumber??null,has_phone:Boolean(x.phoneNumber),user_type:x.userType??null}});return{total:w,results:W}}};var K1="crm";function q7(n){return String(n).padStart(2,"0")}function O4(n){return`${n.getFullYear()}-${q7(n.getMonth()+1)}-${q7(n.getDate())}`}var zw=$.object({show_name:$.string().describe("列显示名(中文)"),field_code:$.string().describe("字段码,数据行 rows 的 key 与之对应"),module:$.string().describe("所属模块(如 微信/短信/通话)"),hidden:$.boolean().describe("是否隐藏")}),tw=$.object({option:$.number(),modules:$.array($.string()),columns:$.array(zw)}),H7={name:"crm.report.custom-report-list",description:"获取员工报表统计数据。option=department 为部门维度,option=employee 为员工维度。",category:"crm",pluginName:K1,parameters:$.object({option:$.enum(["department","employee"]).optional().default("employee").describe("统计维度:department=部门维度,employee=员工维度,默认 employee"),depart_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),start_time:$.string().optional().default("").describe("开始时间,格式 YYYY-MM-DD,如 2026-04-01"),end_time:$.string().optional().default("").describe("结束时间,格式 YYYY-MM-DD,如 2026-04-08"),page:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(100).optional().default(10).describe("每页条数")}),returns:$.object({heads:tw,total:$.number(),page:$.number(),page_size:$.number(),rows:$.array($.record($.union([$.string(),$.number(),$.null()]))).describe("动态列行集:行键 = 列配置 fieldCode(企业可配,语义对照 crm.report.custom-report-columns 的 customShowHeads[].fieldCode ↔ showName)")}).describe("heads.columns 可能为空,列语义务必以 custom-report-columns 为准;total 超过当前页行数时继续翻页"),examples:[{description:"查询部门维度报表(第1页)",input:{option:"department",start_time:"2026-04-01",end_time:"2026-04-08"},output:{heads:{option:0,modules:["通话"],columns:[{show_name:"部门",field_code:"deptName",module:"通话",hidden:!1}]},total:5,page:1,page_size:10,rows:[{deptName:"销售一部",callOutVolume:120,connectionOutRate:"60.00%"}]}},{description:"查询员工维度报表",input:{option:"employee",start_time:"2026-04-01",end_time:"2026-04-08"},output:{heads:{option:1,modules:["通话"],columns:[{show_name:"姓名",field_code:"name",module:"通话",hidden:!1}]},total:20,page:1,page_size:10,rows:[{name:"张三",callOutVolume:50,connectionOutVolume:30}]}}],sideEffects:["network"],handler:async({option:n,depart_id:q,start_time:H,end_time:Q,page:X,page_size:J})=>{let w=n==="department"?0:1,W=q||await S(),x=new Date,Y=Q||O4(x),_=H||O4(new Date(x.getTime()-518400000)),[G,O]=await Promise.all([D("get_custom_report_columns",{departId:W,option:w}),D("query_custom_report",{option:w,departId:W,pageSize:J,starttime:_,endtime:Y,page:X})]),M=(G.customShowHeads??[]).map((A)=>({show_name:String(A.showName??""),field_code:String(A.fieldCode??""),module:String(A.module??""),hidden:Number(A.hiddens)===1}));return{heads:{option:G.option??w,modules:G.modules??[],columns:M},total:O.total??0,page:X,page_size:J,rows:O.list??[]}}},V4=$.union([$.array($.string()),$.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}),Q7={name:"crm.report.custom-report-columns",description:"查询员工自定义报表的列配置(已启用字段及所有可配字段)。",category:"crm",pluginName:K1,parameters:$.object({depart_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({option:$.number().describe("统计维度(与 custom-report-list 的 option 同义:0=部门 1=员工)"),modules:$.array($.string()).describe("可配置模块清单(如 微信/短信/通话/设备/企微)"),customShowHeads:$.array($.object({showName:$.string().describe("列显示名(中文)"),fieldCode:$.string().describe("字段码,crm.report.custom-report-list 行 rows 的 key 与之对应"),module:$.string().describe("所属模块(如 微信/短信/通话)"),hiddens:$.number().describe("是否隐藏:0=显示 1=隐藏"),userPower:$.boolean().describe("权限标记(实测样例 false,上游未文档化语义)"),fieldType:$.number().describe("列字段类型编码(上游未文档化语义,实测样例 0)")})).describe("全量可配列清单(可达 77 项),已启用项 = hiddens 为 0 的行"),minRank:$.number().describe("当前排名窗口下限(set-custom-report-columns 的 min_rank 对应项)"),maxRank:$.number().describe("当前排名窗口上限(set-custom-report-columns 的 max_rank 对应项)")}).passthrough().describe("set-custom-report-columns 的回喂来源:修改 customShowHeads 各行 hiddens 后作为其 custom_show_heads 传入"),examples:[{description:"查询默认部门报表列配置",input:{},output:{option:1,modules:["微信","短信","通话"],customShowHeads:[{showName:"发送消息数量",fieldCode:"wechatOutMsg",module:"微信",hiddens:0,userPower:!1,fieldType:0}],minRank:1,maxRank:8}}],sideEffects:["network"],handler:async({depart_id:n})=>{let q=n||await S();return await D("get_custom_report_columns",{departId:q})}},X7={name:"crm.report.set-custom-report-columns",description:"设置员工自定义报表的列配置(从 custom-report-columns 取得后修改 hiddens 再传入)。",category:"crm",pluginName:K1,parameters:$.object({custom_show_heads:$.string().describe("列配置 JSON 字符串(从 custom-report-columns 取得后修改)"),option:$.number().int().optional().default(1).describe("统计维度:0=部门,1=员工,默认 1"),modules:V4.optional().default(["微信","短信","通话"]).describe("启用模块"),max_rank:$.number().int().optional().default(8).describe("排名上限"),min_rank:$.number().int().optional().default(1).describe("排名下限")}),returns:$.object({}).passthrough(),examples:[{description:"设置列配置",input:{custom_show_heads:'[{"fieldCode":"wechatOutMsg","showName":"发送消息","module":"微信","hiddens":0,"userPower":false}]'},output:{}}],sideEffects:["network"],handler:async({custom_show_heads:n,option:q,modules:H,max_rank:Q,min_rank:X})=>{let J;try{J=JSON.parse(n)}catch{throw new K("VALIDATION_FAILED","custom_show_heads 不是合法 JSON")}return await D("set_custom_report_columns",{option:q,modules:H,customShowHeads:J,maxRank:Q,minRank:X})}},J7={name:"crm.report.customer-metrics",description:"查询客户统计(新增/跟进/待跟进/成交等指标,含环比对比)。",category:"crm",pluginName:K1,parameters:$.object({department_ids:V4.describe("部门 ID 列表(JSON 字符串或数组)"),user_ids:V4.optional().default([]).describe("用户 ID 列表,空则查部门下全部"),time_range:$.number().int().optional().default(2).describe("时间范围:2=昨日 3=近7日 4=近15日 5=近30日")}),returns:$.object({totalCustomerCount:$.number().describe("客户总数"),currentStats:$.object({companyCode:$.string().describe("公司码"),customerMetrics:$.object({newCount:$.number().describe("新增客户数"),followedCount:$.number().describe("已跟进数"),pendingCount:$.number().describe("待跟进数"),dealCount:$.number().describe("成交数"),totalCount:$.number().describe("客户总数")}).passthrough()}).passthrough().describe("本期统计"),compareStats:$.object({companyCode:$.string().describe("公司码"),customerMetrics:$.object({newCount:$.number().describe("新增客户数"),followedCount:$.number().describe("已跟进数"),pendingCount:$.number().describe("待跟进数"),dealCount:$.number().describe("成交数"),totalCount:$.number().describe("客户总数")}).passthrough()}).passthrough().describe("上期对比统计"),compareData:$.record($.object({diffCount:$.number().describe("环比增减量"),diffRate:$.string().describe('环比增减率(如 "94.00%")')}).passthrough()).describe("环比明细(键:new_count/followed_count/pending_count/deal_count)")}).passthrough(),examples:[{description:"查询部门客户统计(近7日)",input:{department_ids:'["DEPT001"]',time_range:3},output:{totalCustomerCount:15,currentStats:{companyCode:"qeg4ep",customerMetrics:{newCount:3,followedCount:5,pendingCount:2,dealCount:1,totalCount:15}},compareStats:{companyCode:"qeg4ep",customerMetrics:{newCount:2,followedCount:5,pendingCount:3,dealCount:0,totalCount:15}},compareData:{new_count:{diffCount:1,diffRate:"50.00%"},followed_count:{diffCount:0,diffRate:"0%"}}}}],sideEffects:["network"],handler:async({department_ids:n,user_ids:q,time_range:H})=>{let Q=q.length>0;return await D("get_customer_metrics",{type:Q?0:1,timeRange:H,departmentIds:n,userIds:q})}},w7={name:"crm.report.device-app-statistics-list",description:"查询设备/应用使用时长统计。",category:"crm",pluginName:K1,parameters:$.object({page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),search_type:$.number().int().optional().default(1).describe("搜索类型,默认 1"),sort_type:$.string().optional().default("desc").describe("排序:desc/asc"),user_id:$.string().optional().default("").describe("用户 ID,空则查部门下全部"),range:$.number().int().optional().default(0).describe("时间范围代码:0=今天 -1=昨天 -32=自定义"),range_str:$.string().optional().default("").describe('自定义时间范围,range=-32 时用,格式 "开始,结束"'),department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageIndex:$.number().describe("页码"),pageSize:$.number().describe("页大小"),list:$.array($.object({name:$.string().describe("应用名"),duration:$.number().optional().describe("使用时长(秒)"),totalDuration:$.number().optional().describe("累计使用时长(秒,跨用户累加)"),numberOfInstallers:$.number().optional().describe("安装人数")}).passthrough())}).passthrough(),examples:[{description:"查询设备应用使用时长(今天)",input:{},output:{total:2,pageIndex:1,pageSize:5,list:[{name:"微信",duration:3600,totalDuration:72000,numberOfInstallers:20}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.department_id||await S(),H=n.range_str;if(n.range===0||n.range===-1){let Q=O4(new Date(Date.now()+n.range*86400000));H=`${Q},${Q}`}return await D("get_app_statistics",{pageNum:n.page_num,pageSize:n.page_size,userId:n.user_id,departmentId:q,...H?{rangeStr:H}:{},...n.search_type!==1?{searchType:n.search_type}:{},...n.sort_type!=="desc"?{sortType:n.sort_type}:{}})}},W7={name:"crm.report.device-statistics",description:"查询设备统计(总数/已绑定/锁定/激活)。department_id 空则取默认部门。",category:"crm",pluginName:K1,parameters:$.object({department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),user_id:$.string().optional().default("").describe("用户 ID,空则查部门下全部")}),returns:$.object({total:$.number(),has_bind:$.number(),locked:$.number(),actived:$.number()}),examples:[{description:"查询默认部门设备统计",input:{},output:{total:10,has_bind:8,locked:1,actived:7}}],sideEffects:["network"],handler:async({department_id:n,user_id:q})=>{let H=n||await S(),Q=await D("get_device_statistics",{departmentId:H,userId:q});return{total:Q.total,has_bind:Q.hasBind,locked:Q.locked,actived:Q.actived}}};var _7="crm";function x7(n){return String(n).padStart(2,"0")}function Y7(n,q=!1){return`${n.getFullYear()}-${x7(n.getMonth()+1)}-${x7(n.getDate())} ${q?"23:59:59":"00:00:00"}`}var rw=$.object({user_id:$.string(),user_name:$.string(),longitude:$.number().nullable(),latitude:$.number().nullable(),addr:$.string(),created_time:$.string(),last_online_time:$.string(),active_type:$.number(),in_or_out:$.number(),in_or_out_name:$.string(),loc_duration:$.number(),location_exception:$.number()}),G7={name:"crm.location.everyone-last-location",description:"查询指定部门所有员工的最后一次定位记录。建议先用 org.search 或 org.department-tree 缩小部门范围。",category:"crm",pluginName:_7,parameters:$.object({department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门;可用 org.search / org.department-tree 选择更小范围"),device_code:$.string().optional().default("").describe("设备编码,空则不过滤")}),returns:$.object({total:$.number(),records:$.array(rw)}),examples:[{description:"查询部门员工最后定位",input:{department_id:"DEPT001"},output:{total:1,records:[{user_id:"u001",user_name:"张三",longitude:116.4,latitude:39.9,addr:"北京市",created_time:"2026-08-01 10:00:00",last_online_time:"2026-08-01 10:00:00",active_type:1,in_or_out:3,in_or_out_name:"未知",loc_duration:0,location_exception:0}]}}],sideEffects:["network"],handler:async({department_id:n,device_code:q})=>{let H=n||await S(),Q=await D("get_everyone_last_location",{departmentId:H,deviceCode:q}),X=(Array.isArray(Q)?Q:Q.list??[]).map((J)=>({user_id:String(J.userId??""),user_name:String(J.userName??""),longitude:J.longitude??null,latitude:J.latitude??null,addr:String(J.addr??""),created_time:String(J.createdTime??""),last_online_time:String(J.lastOnlineTime??""),active_type:Number(J.activeType??0),in_or_out:Number(J.inOrOut??3),in_or_out_name:String(J.inOrOutName??"未知"),loc_duration:Number(J.locDuration??0),location_exception:Number(J.locationException??0)}));return{total:X.length,records:X}}},aw=$.object({user_id:$.string(),longitude:$.number().nullable(),latitude:$.number().nullable(),addr:$.string(),created_time:$.string(),start_time:$.string(),end_time:$.string(),loc_duration:$.number(),in_or_out:$.number(),in_or_out_name:$.string(),active_type:$.number(),location_exception:$.number()}),O7={name:"crm.location.record-list",description:"查询指定员工在时间段内的定位轨迹。建议显式传入较短时间范围,不要依赖默认近30天。",category:"crm",pluginName:_7,parameters:$.object({user_id:$.string().min(1).describe("员工用户 ID(可通过 org.search 获取)"),start_time:$.string().optional().default("").describe("开始时间 YYYY-MM-DD HH:mm:ss,空则默认近30天"),end_time:$.string().optional().default("").describe("结束时间 YYYY-MM-DD HH:mm:ss,空则默认今天"),device_code:$.string().optional().default("").describe("设备编码,空则不过滤")}),returns:$.object({total:$.number(),records:$.array(aw)}),examples:[{description:"查询员工某天轨迹",input:{user_id:"u001",start_time:"2026-08-01 00:00:00",end_time:"2026-08-01 23:59:59"},output:{total:1,records:[{user_id:"u001",longitude:116.4,latitude:39.9,addr:"北京市",created_time:"2026-08-01 10:00:00",start_time:"2026-08-01 09:00:00",end_time:"2026-08-01 12:00:00",loc_duration:10800000,in_or_out:3,in_or_out_name:"未知",active_type:1,location_exception:0}]}}],sideEffects:["network"],handler:async({user_id:n,start_time:q,end_time:H,device_code:Q})=>{let X=new Date,J=H||Y7(X,!0),w=q||Y7(new Date(X.getTime()-2592000000),!1),W=await D("get_loc_record_by_user_id",{userId:n,createTimeRange:{start:w,end:J},deviceCode:Q}),x=(W?.list??[]).map((Y)=>({user_id:String(Y.userId??n),longitude:Y.longitude??null,latitude:Y.latitude??null,addr:String(Y.addr??""),created_time:String(Y.createdTime??""),start_time:String(Y.starttime??""),end_time:String(Y.endtime??""),loc_duration:Number(Y.locDuration??0),in_or_out:Number(Y.inOrOut??3),in_or_out_name:String(Y.inOrOutName??"未知"),active_type:Number(Y.activeType??0),location_exception:Number(Y.locationException??0)}));return{total:W?.total??x.length,records:x}}};var V7="crm",v4=$.union([$.string(),$.number()]).transform((n)=>String(n)),v7={name:"crm.call.log-list",description:"获取通话记录列表。后端每页最多 10 条;pageCount > 当前页时需翻页取全后再汇总。",category:"crm",pluginName:V7,parameters:$.object({page:$.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数,建议 5-10"),sales_progress:$.string().optional().default("").describe("销售进度"),start_voice_time:$.string().optional().default("").describe("语音开始时间 YYYY-MM-DD HH:mm:ss"),end_voice_time:$.string().optional().default("").describe("语音结束时间"),start_create_time:$.string().optional().default("").describe("创建开始时间"),end_create_time:$.string().optional().default("").describe("创建结束时间"),search_info:$.string().optional().default("").describe("搜索关键词(客户名/公司等)"),last_connect_time_start:$.string().optional().default("").describe("最后连接开始时间"),last_connect_time_end:$.string().optional().default("").describe("最后连接结束时间"),filter_user_id:v4.optional().default("").describe("按员工用户 ID 筛选"),tip_type:$.string().optional().default("").describe("提示类型"),progress:$.string().optional().default("").describe("进度状态"),call_seconds:$.string().optional().default("").describe("通话秒数筛选"),department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),search_phone:v4.optional().default("").describe("按电话号码搜索"),call_id:v4.optional().default("").describe("通话记录 ID"),call_type:$.string().optional().default("s").describe("通话类型过滤;取值沿用 PC 侧历史值(默认 s),上游语义未文档化,非必要不传")}),returns:$.object({page:$.number().describe("页码"),pageCount:$.number().describe("总页数"),totalCount:$.number().describe("总条数"),phoneHidden:$.boolean().optional().describe("手机号脱敏开关位(公司配置)"),hideRecordPlay:$.boolean().optional().describe("录音播放隐藏开关位(上游未文档化)"),data:$.array($.object({id:$.string().describe("通话记录 ID"),startCallTime:$.string().describe("开始通话时间 yyyy-MM-dd HH:mm:ss"),createdTime:$.string().describe("创建时间 yyyy-MM-dd HH:mm:ss"),callDuration:$.string().describe("通话时长(秒,字符串形态)"),callSeconds:$.number().describe("通话秒数"),incomingCall:$.number().describe("通话方向:0去电 1来电 3来电未接听 4来电(没有) 5来电拒接 6呼出失败 7呼出另设备接听 9呼出IMS 10来电未接IMS"),userId:$.string().describe("员工用户 ID"),userIdName:$.string().describe("员工名"),es_version:$.number().optional().describe("ES 文档版本号(上游未文档化)"),version:$.string().optional().describe("数据版本(上游未文档化)"),ringSecond:$.number().optional().describe("振铃秒数"),callStatus:$.number().optional().describe("通话状态码(上游未文档化)"),canTrans:$.number().optional().describe("可转写标记(上游未文档化)"),progress:$.number().optional().describe("销售进度码"),progressName:$.string().optional().describe("销售进度名"),progressType:$.number().optional().describe("进度来源:1人工 2AI"),channel:$.number().optional().describe("通道码(上游未文档化)"),departmentId:$.string().optional().describe("部门 ID"),departmentList:$.string().optional().describe("部门链(上游未文档化格式)"),planCustomerId:$.string().optional().describe("通话计划关联客户 ID"),planCustomerName:$.string().optional().describe("通话计划关联客户名"),planCustomerCompany:$.string().optional().describe("通话计划关联客户公司"),companyCode:$.string().optional().describe("公司码"),callNumber:$.string().optional().describe("通话号码"),simPhone:$.string().optional().describe("SIM 卡手机号"),simNumber:$.string().optional().describe("SIM 卡随机码(iccid)"),imei:$.string().optional().describe("设备 IMEI"),downloadCount:$.number().optional().describe("录音下载次数"),recordFile:$.string().optional().describe("录音文件 URL"),recordFrom:$.number().optional().describe("录音来源码(上游未文档化)"),isUpload:$.number().optional().describe("录音提交状态:0未提交 1已提交"),tipType:$.number().optional().describe("电话结果码"),ai:$.number().optional().describe("AI 分析状态:0未分析 1已分析"),aiAsr:$.number().optional().describe("ASR 转写状态码(上游未文档化)"),qcStatus:$.number().optional().describe("质检状态码(上游未文档化)"),qualityInspectionPassTime:$.string().optional().describe("质检通过时间 yyyy-MM-dd HH:mm:ss"),userKey:$.string().optional().describe("跟进人 ID"),userKeyName:$.string().optional().describe("跟进人名"),groups:$.string().optional().describe("分组(上游未文档化格式)")}).passthrough())}).passthrough(),examples:[{description:"获取第 1 页通话记录",input:{page:1,page_size:5},output:{page:1,pageCount:3,totalCount:15,data:[]}}],sideEffects:["network"],handler:async(n)=>{let q=n.department_id||await S(),H=n.sales_progress!==""?n.sales_progress:n.progress;return await D("get_call_log_list",{page:n.page,pageSize:n.page_size,departmentId:q,userId:n.filter_user_id,...n.search_info?{searchInfo:n.search_info}:{},...n.search_phone?{searchPhone:n.search_phone}:{},...n.call_id?{id:n.call_id}:{},...n.call_type?{callType:n.call_type}:{},...n.last_connect_time_start?{lastConnectTimeStart:n.last_connect_time_start}:{},...n.last_connect_time_end?{lastConnectTimeEnd:n.last_connect_time_end}:{},...n.tip_type!==""?{tipType:Number(n.tip_type)}:{},...n.call_seconds!==""?{callSeconds:Number(n.call_seconds)}:{},...H!==""?{progress:Number(H)}:{},...n.start_voice_time?{startVoiceTime:n.start_voice_time}:{},...n.end_voice_time?{endVoiceTime:n.end_voice_time}:{},...n.start_create_time?{startCreateTime:n.start_create_time}:{},...n.end_create_time?{endCreateTime:n.end_create_time}:{}})}},K7={name:"crm.call.asr-result",description:"获取通话录音的 ASR 语音转写结果。",category:"crm",pluginName:V7,parameters:$.object({call_action_id:$.string().min(1).describe("通话 ID"),audio_url:$.string().optional().default("").describe("音频文件 URL(可选)"),call_type:$.string().optional().default("1").describe("录音类型:1=通话,12=本地录音")}),returns:$.object({trans_complete:$.number(),asr_result:$.array($.unknown()),message:$.string()}),examples:[{description:"获取通话录音的 ASR 转写结果",input:{call_action_id:"123456",call_type:"1"},output:{trans_complete:1,asr_result:[],message:""}}],sideEffects:["network"],handler:async({call_action_id:n,audio_url:q,call_type:H})=>{let Q=await D("get_call_asr_result",{type:Number(H),businessId:n,...q?{url:q}:{}});return{trans_complete:Q.transComplete??0,asr_result:Q.asrResult??[],message:Q.message??""}}};var V0="crm",ew=$.union([$.string(),$.number()]).transform((n)=>String(n)),vn=$.union([$.array($.string()),$.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}),c1=$.union([$.array($.number()),$.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[Number(n)]}});function t2(n){let q=String(n),H=Date.parse(`${q.replace(" ","T")}+08:00`);if(Number.isNaN(H))throw Error(`无法解析时间: ${q}`);return H}var F0={start_time:$.string().describe("开始时间 yyyy-MM-dd HH:mm:ss(北京时间,CLI 自动转毫秒传中台)"),end_time:$.string().describe("结束时间 yyyy-MM-dd HH:mm:ss(北京时间,CLI 自动转毫秒传中台)"),page_index:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),user_id:$.string().optional().default("").describe("员工 ID"),user_ids:vn.optional().default([]).describe("员工 ID 列表"),search_type:$.number().int().optional().describe("搜索类型:1客户姓名 2客户手机号 3员工姓名 4员工手机号 5客户微信昵称 6客户微信号 7员工微信昵称 8员工微信号"),keyword:$.string().optional().default("").describe("搜索关键词"),ctype:$.number().int().optional().describe("沟通类型:1电话 2微信 3微信长语音"),sort_field:$.number().int().optional().describe("排序字段:1分析时间 2沟通时间"),sort_order:$.string().optional().default("").describe("排序:asc/desc"),range_field:$.number().int().optional().describe("过滤时间字段:1分析时间 2沟通时间"),call_second_type:$.number().int().optional().describe("通话时长类型")};function i0(n,q,H={}){return{pageIndex:n.page_index,pageSize:n.page_size,startTime:t2(n.start_time),endTime:t2(n.end_time),dptId:q,...n.user_id?{userId:n.user_id}:{},...Array.isArray(n.user_ids)&&n.user_ids.length?{userIds:n.user_ids}:{},...n.search_type!=null?{type:n.search_type}:{},...n.keyword?{keyword:n.keyword}:{},...n.ctype!=null?{ctype:n.ctype}:{},...n.sort_field!=null?{sortField:String(n.sort_field)}:{},...n.sort_order?{sortOrder:n.sort_order}:{},...n.range_field!=null?{rangeField:String(n.range_field)}:{},...n.call_second_type!=null?{callSecondType:n.call_second_type}:{},...H}}function B4(n,q){return{...n!=null?{callPercent:n}:{},...q!=null?{callSpeed:q}:{}}}var g=(n)=>$.union([$.string(),$.number()]).describe(n),M4="1喜悦 3满足 5兴奋 7希望 11耐心 13愤怒 15悲伤 17焦虑 21失望 23挫败感 25平静 27专业",B7="1满意 3高兴 5感激 7乐观 9不满意 11愤怒 13焦虑 15沮丧 17失望 21平静 23好奇",B1="1高意向 3中意向 5低意向 7需跟进 9客户评估中 11潜在意向需引导 13无意向 15预算顾虑 17产品疑问 19未联系上",M7="1电话 2微信聊天 3微信语音 5企微聊天 6企微语音 11工牌/现场录音 12现场录音",m0={id:$.string().describe("分析记录 ID"),userId:$.string().describe("员工用户 ID"),ename:$.string().describe("员工姓名"),ephone:$.string().describe("员工电话(脱敏)"),callId:$.string().describe("通话/沟通记录 ID"),createdTime:$.string().describe("分析生成时间 yyyy-MM-dd HH:mm:ss"),ctype:$.number().describe(`沟通类型:${M7}`),content:$.string().describe("完整 AI 分析结果(嵌套 JSON 字符串:意向/情绪/痛点/异议/话术/摘要等,解析后使用)")},E0={ewxId:$.string().optional().describe("员工微信 ID"),ewxName:$.string().optional().describe("员工微信昵称"),ewxAlias:$.string().optional().describe("员工微信号")},P0={customerId:$.string().optional().describe("客户 ID"),cname:$.string().optional().describe("客户姓名"),cphone:$.string().optional().describe("客户电话(脱敏)"),cwxId:$.string().optional().describe("客户微信 ID"),cwxName:$.string().optional().describe("客户微信昵称"),cwxAlias:$.string().optional().describe("客户微信号")},S0={communicationTime:$.string().optional().describe("沟通时间 yyyy-MM-dd HH:mm:ss"),recordFile:$.string().optional().describe("录音/聊天记录文件 URL(OSS 签名,有时效)"),callDuration:g("通话时长(秒)").optional(),callFileId:$.string().optional().describe("通话文件 ID"),epicFile:$.string().optional().describe("员工头像 URL"),cpicFile:$.string().optional().describe("客户头像 URL")},bn=g(`意向度:${B1}`).optional(),M1=$.string().describe("解决判定标记(如 未标记)"),kn=g("销售进度(企业自定义进度 ID)").optional(),K4=$.object({refStatus:$.number().describe("加微状态码(如 7=从未添加微信)"),refStatusMsg:$.string().describe("状态说明文案(如 从未添加微信)")}).passthrough(),Y0=(n,q)=>$.object({pageIndex:$.number().describe("页码"),pageSize:$.number().describe("页大小"),total:$.number().describe("总条数(超过当前页行数时继续翻页)"),data:$.array(n).describe(q),_pagination:$.string().optional().describe("中台注入的分页提示(还有下一页时出现)")}).passthrough(),j7={name:"crm.ai.employee-sop-analyse-list",description:"查询员工 SOP 分析列表,评估话术执行情况。",category:"crm",pluginName:V0,parameters:$.object({...F0,call_percent:$.number().int().optional().describe("通话占比"),call_speed:$.number().int().optional().describe("语速"),sop_id:$.string().optional().default("").describe("SOP 配置 ID"),sop_step_id:$.string().optional().default("").describe("SOP 步骤 ID"),sop_type:c1.optional().default([]).describe("SOP 评估类型列表")}),returns:Y0($.object({...m0,...E0,...P0,...S0,moodType:g(`员工情绪类型:${M4}`),mood:$.string().describe("员工情绪分析(JSON 字符串:情绪名/情绪类型/情绪分析)"),sopType:g("SOP 评估档位:1优秀(100%) 3较好(90-100%) 5一般(70-90%) 7较差(50-70%) 9不合格(<50%)"),sopName:$.string().describe("SOP 名称"),sopPercent:$.string().describe('SOP 整体完成率(如 "85%"),各步骤完成率在 content 内'),goodSpeechType:g("优秀话术来源:1 AI 推荐 0 人工推荐"),goodSpeech:$.string().optional().describe("优秀话术内容(该沟通被推荐时出现)"),intention:bn}).passthrough(),"SOP 分析行"),examples:[{description:"查询 SOP 分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:63,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,moodType:"25",mood:'{"情绪名":"平静","情绪类型":"中性情绪","情绪分析":"沟通平稳"}',sopType:"3",sopName:"标准接待流程",sopPercent:"85%",goodSpeechType:"1",intention:1,recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"SOP执行":{"整体完成率":"85%"}}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_employee_sop_analyse_list",i0(n,q,{...B4(n.call_percent,n.call_speed),...n.sop_id?{sopId:n.sop_id}:{},...n.sop_step_id?{sopStepId:n.sop_step_id}:{},...n.sop_type?.length?{sopType:n.sop_type}:{}}))}},L7={name:"crm.ai.good-speech-list",description:"查询优秀话术列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,call_percent:$.number().int().optional().describe("通话占比"),call_speed:$.number().int().optional().describe("语速"),good_speech_type:$.number().int().optional().describe("优秀话术类型")}),returns:Y0($.object({...m0,...E0,...P0,...S0,moodType:g(`员工情绪类型:${M4}`).optional(),mood:$.string().describe("员工情绪分析(JSON 字符串)"),sopType:g("SOP 评估档位:1优秀(100%) 3较好(90-100%) 5一般(70-90%) 7较差(50-70%) 9不合格(<50%)").optional(),sopName:$.string().optional().describe("SOP 名称"),sopPercent:$.string().optional().describe('SOP 整体完成率(如 "85%")'),goodSpeechType:g("优秀话术来源:1 AI 推荐 0 人工推荐").optional(),goodSpeech:$.string().optional().describe("优秀话术内容(该沟通被推荐时出现)"),intention:bn}).passthrough(),"优秀话术行"),examples:[{description:"查询优秀话术",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:71,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,mood:'{"情绪名":"平静","情绪类型":"中性情绪"}',sopType:"3",sopName:"标准接待流程",sopPercent:"85%",goodSpeechType:"1",goodSpeech:"您好,我们这边先给您报个价,您对比一下性价比。",intention:1,recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"优秀话术分析":{"结论":"是"}}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_good_speech_list",i0(n,q,{...B4(n.call_percent,n.call_speed),...n.good_speech_type!=null?{goodSpeechType:n.good_speech_type}:{}}))}},R7={name:"crm.ai.employee-analyse-list",description:"查询员工沟通综合分析列表(单次沟通一行:情绪、SOP 执行、优秀话术、意向、通话指标并存于行内)。mood_type 按员工情绪过滤记录。",category:"crm",pluginName:V0,parameters:$.object({...F0,call_percent:$.number().int().optional().describe("通话占比"),call_speed:$.number().int().optional().describe("语速"),mood_type:c1.optional().default([]).describe("情绪类型过滤:1喜悦 3满足 5兴奋 7希望 11耐心 13愤怒 15悲伤 17焦虑 21失望 23挫败感 25平静 27专业;空则不过滤")}),returns:Y0($.object({...m0,...E0,...P0,...S0,moodType:g(`员工情绪类型:${M4}`).optional(),mood:$.string().optional().describe("员工情绪分析(JSON 字符串)"),sopType:g("SOP 评估档位:1优秀(100%) 3较好(90-100%) 5一般(70-90%) 7较差(50-70%) 9不合格(<50%)").optional(),sopName:$.string().optional().describe("SOP 名称"),sopPercent:$.string().optional().describe('SOP 整体完成率(如 "85%")'),goodSpeechType:g("优秀话术来源:1 AI 推荐 0 人工推荐").optional(),goodSpeech:$.string().optional().describe("优秀话术内容(该沟通被推荐时出现)"),intention:bn}).passthrough(),"员工沟通综合分析行(单次沟通一行,各分析面并存)"),examples:[{description:"查询员工分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:71,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",ewxId:"wxid_demo001",ewxName:"销售小张",ewxAlias:"zhang_sales",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:2,moodType:"25",mood:'{"情绪名":"平静","情绪类型":"中性情绪"}',sopType:"3",sopName:"标准接待流程",sopPercent:"85%",intention:1,recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"员工沟通分析":{"员工语速":"280 字/分钟"}}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_employee_analyse_list",i0(n,q,{...B4(n.call_percent,n.call_speed),...n.mood_type?.length?{moodType:n.mood_type}:{}}))}},N7={name:"crm.ai.customer-objection-list",description:"查询客户异议分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,objection:vn.optional().default([]).describe("异议列表"),select_type:$.number().int().optional().describe("筛选类型"),solution_judge:$.string().optional().default("").describe("解决方案判定")}),returns:Y0($.object({...m0,...E0,...P0,...S0,objection:$.string().describe("命中的客户异议(明细见 content 的客户异议分析)"),intention:g(`意向度:${B1}`),progress:kn,solutionJudge:M1}).passthrough(),"客户异议分析行"),examples:[{description:"查询客户异议",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:30,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,objection:"价格异议",intention:"1",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户异议分析":[{"异议类型":"价格问题","客户异议":"价格比竞品高","解决方案":"说明性价比"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_customer_objection_list",i0(n,q,{...n.objection?.length?{objection:n.objection}:{},...n.select_type!=null?{selectType:n.select_type}:{},...n.solution_judge?{solutionJudge:n.solution_judge}:{}}))}},D7={name:"crm.ai.customer-pain-list",description:"查询客户痛点分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,pain:vn.optional().default([]).describe("痛点列表"),select_type:$.number().int().optional().describe("筛选类型"),solution_judge:$.string().optional().default("").describe("解决方案判定")}),returns:Y0($.object({...m0,...E0,...P0,...S0,pain:$.string().describe("命中的客户痛点(明细见 content 的客户痛点分析)"),intention:g(`意向度:${B1}`),progress:g("销售进度(企业自定义进度 ID)"),solutionJudge:M1}).passthrough(),"客户痛点分析行"),examples:[{description:"查询客户痛点",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:28,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,pain:"预算有限",intention:"5",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户痛点分析":[{"痛点类型":"价格问题","客户痛点":"预算有限","解决方案":"推荐分期方案"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_customer_pain_list",i0(n,q,{...n.pain?.length?{pain:n.pain}:{},...n.select_type!=null?{selectType:n.select_type}:{},...n.solution_judge?{solutionJudge:n.solution_judge}:{}}))}},C7={name:"crm.ai.customer-issue-list",description:"查询客户问题分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,issue:vn.optional().default([]).describe("问题列表"),select_type:$.number().int().optional().describe("筛选类型"),solution_judge:$.string().optional().default("").describe("解决方案判定")}),returns:Y0($.object({...m0,...E0,...P0,...S0,issue:$.string().describe("命中的客户问题(明细见 content 的客户问题分析)"),intention:bn,progress:kn,solutionJudge:M1}).passthrough(),"客户问题分析行"),examples:[{description:"查询客户问题",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:41,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,issue:"询问交付周期",intention:"1",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户问题分析":[{"问题类型":"交付问题","客户问题":"多久能交付","问题分析":"关注上线时间"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_customer_issue_list",i0(n,q,{...n.issue?.length?{issue:n.issue}:{},...n.select_type!=null?{selectType:n.select_type}:{},...n.solution_judge?{solutionJudge:n.solution_judge}:{}}))}},A7={name:"crm.ai.customer-mood-list",description:"查询客户情绪分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,mood_type:c1.optional().default([]).describe("情绪类型过滤:1喜悦 3满足 5兴奋 7希望 11耐心 13愤怒 15悲伤 17焦虑 21失望 23挫败感 25平静 27专业;空则不过滤"),select_type:$.number().int().optional().describe("筛选类型")}),returns:Y0($.object({...m0,...E0,...P0,...S0,moodType:g(`客户情绪类型:${B7}`),mood:$.string().describe("客户情绪分析(JSON 字符串:情绪名/情绪类型/情绪分析)"),intention:g(`意向度:${B1}`),progress:kn,solutionJudge:M1,keywords:$.string().optional().describe("沟通关键词(JSON 数组字符串)"),keywordStr:$.string().optional().describe("关键词分类汇总(JSON 字符串:情绪类/痛点类/需求类)"),issue:$.string().optional().describe("渗出键:命中的客户问题"),pain:$.string().optional().describe("渗出键:命中的客户痛点"),objection:$.string().optional().describe("渗出键:命中的客户异议")}).passthrough(),"客户情绪分析行"),examples:[{description:"查询客户情绪",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:55,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,moodType:"21",mood:'{"情绪名":"平静","情绪类型":"中性情绪","情绪分析":"沟通平稳"}',intention:"1",progress:"3",solutionJudge:"未标记",keywords:'["产品价格","优惠活动"]',recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"客户情绪分析":{"整体情绪判断":{"情绪名":"平静","情绪类型":"中性情绪"}}}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_customer_mood_list",i0(n,q,{...n.mood_type?.length?{moodType:n.mood_type}:{},...n.select_type!=null?{selectType:n.select_type}:{}}))}},U7={name:"crm.ai.competitor-analyse-list",description:"查询竞品分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,competitor:vn.optional().default([]).describe("竞品列表"),select_type:$.number().int().optional().describe("筛选类型")}),returns:Y0($.object({...m0,...E0,...P0,...S0,competitorName:$.string().describe("命中的竞品名称(明细见 content 的竞品分析)"),intention:bn,progress:kn,solutionJudge:M1}).passthrough(),"竞品分析行"),examples:[{description:"查询竞品分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:10,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",ewxId:"wxid_demo001",ewxName:"销售小张",ewxAlias:"zhang_sales",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,competitorName:"竞品A",intention:"1",progress:"3",solutionJudge:"未标记",recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"竞品分析":[{"竞品名称":"竞品A","优势劣势":"价格更低但服务弱"}]}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_competitor_analyse_list",i0(n,q,{...n.competitor?.length?{competitor:n.competitor}:{},...n.select_type!=null?{selectType:n.select_type}:{}}))}},F7={name:"crm.ai.failure-analyse-list",description:"查询战败分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,failure_reason:vn.optional().default([]).describe("战败原因列表"),detail_reason:vn.optional().default([]).describe("细分原因列表"),intention:c1.optional().default([]).describe("意向度列表"),clue_value:c1.optional().default([]).describe("线索价值列表:1高2中3低"),customer_id:$.string().optional().default("").describe("客户 ID")}),returns:Y0($.object({id:$.string().describe("分析记录 ID"),customerId:$.string().describe("客户 ID"),companyCode:$.string().describe("公司码"),cname:$.string().describe("客户姓名"),cphone:$.string().describe("客户电话(脱敏)"),userId:$.string().describe("最后沟通员工用户 ID"),createdTime:$.string().describe("创建时间"),analyseTime:$.string().describe("分析时间"),progress:g("销售进度(企业自定义进度 ID)").optional(),intention:g(`意向度:${B1}`),failureReason:$.array($.string()).describe("战败原因(多条)"),detailReason:$.array($.string()).describe("细分原因(多条)"),summaryReason:$.string().describe("综合原因"),judgeReason:$.string().describe("判定原因"),isFailure:g("是否战败:0否 1是"),clueValue:g("线索价值:1高 2中 3低"),followUp:$.string().describe("跟进人"),followUpUserId:$.string().describe("跟进人用户 ID"),headImg:$.string().optional().describe("头像 URL"),cwxId:$.string().optional().describe("客户微信 ID"),cwxName:$.string().optional().describe("客户微信昵称"),cwxAlias:$.string().optional().describe("客户微信号")}).passthrough(),"战败分析行(每客户一行)"),examples:[{description:"查询战败分析",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:7,data:[{id:"a1b2c3d4e5f6",customerId:"CUST1A2B3C4D",companyCode:"qeg4ep",cname:"李四",cphone:"139****0002",userId:"USER9F8E7D6C",createdTime:"2026-09-01 10:00:00",analyseTime:"2026-09-02 08:00:00",intention:"13",failureReason:["价格偏高","选择了竞品"],detailReason:["竞品折扣更大"],summaryReason:"价格敏感客户被竞品折扣吸引",judgeReason:"多次沟通未促成",isFailure:"1",clueValue:"2",followUp:"王五",followUpUserId:"USER5A4B3C2D1E"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_failure_analyse_list",i0(n,q,{...n.failure_reason?.length?{failureReason:n.failure_reason}:{},...n.detail_reason?.length?{detailReason:n.detail_reason}:{},...n.intention?.length?{intention:n.intention}:{},...n.clue_value?.length?{clueValue:n.clue_value}:{},...n.customer_id?{customerId:n.customer_id}:{}}))}},m7={name:"crm.ai.failure-detail-list",description:"查询战败详情列表(单通维度,customer_id 必填)。",category:"crm",pluginName:V0,parameters:$.object({...F0,customer_id:$.string().describe("客户 ID(必填)")}),returns:Y0($.object({id:$.string().describe("记录 ID"),customerId:$.string().optional().describe("客户 ID"),userId:$.string().optional().describe("员工用户 ID"),ename:$.string().optional().describe("员工姓名"),ephone:$.string().optional().describe("员工电话"),cname:$.string().optional().describe("客户姓名"),cphone:$.string().optional().describe("客户电话"),ewxId:$.string().optional().describe("员工微信 ID"),ewxName:$.string().optional().describe("员工微信昵称"),ewxAlias:$.string().optional().describe("员工微信号"),cwxId:$.string().optional().describe("客户微信 ID"),cwxName:$.string().optional().describe("客户微信昵称"),cwxAlias:$.string().optional().describe("客户微信号"),callId:$.string().optional().describe("通话/沟通记录 ID"),createdTime:$.string().optional().describe("创建时间"),communicationTime:$.string().optional().describe("沟通时间"),ctype:$.number().optional().describe("沟通类型:1电话 2微信聊天 3微信长语音 4微信汇总"),callType:g("来电/去电方向(呼出/呼入编码,上游注释自相矛盾,未实测裁决)").optional(),isFailure:g("是否战败:0否 1是").optional(),clueValue:g("线索价值:1高 2中 3低").optional(),content:$.string().optional().describe("完整分析结果(嵌套 JSON 字符串)"),recordFile:$.string().optional().describe("录音文件 URL"),callDuration:g("通话时长(秒)").optional(),cpicFile:$.string().optional().describe("客户头像 URL"),epicFile:$.string().optional().describe("员工头像 URL")}).passthrough(),"战败单通详情行(字段依据 PC 模型、未实测)"),examples:[{description:"查询战败详情",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59",customer_id:"C001"},output:{pageIndex:1,pageSize:5,total:0,data:[]}}],sideEffects:["network"],handler:async(n)=>{return await D("get_failure_detail_list",{customerId:n.customer_id,pageIndex:n.page_index,pageSize:n.page_size})}},E7={name:"crm.ai.sop-quality-analyse-list",description:"查询 SOP 质检分析列表。",category:"crm",pluginName:V0,parameters:$.object({...F0,quality_type:$.number().int().optional().describe("质检类型:1关键词2SOP"),quality_result:$.number().int().optional().describe("质检结果:1合格3不合格5好7中9差"),comm_scenario_id:$.number().int().optional().describe("沟通场景 ID"),sop_id:$.number().int().optional().describe("SOP 配置 ID"),rule_id:$.number().int().optional().describe("规则模板 ID"),task_id:$.number().int().optional().describe("任务 ID"),call_id:$.string().optional().default("").describe("通话 ID")}),returns:Y0($.object({id:$.string().describe("质检记录 ID"),userId:$.string().describe("员工用户 ID"),companyCode:$.string().describe("公司码"),ename:$.string().describe("员工姓名或员工微信"),ephone:$.string().describe("员工电话或微信号"),customerId:$.string().optional().describe("客户 ID"),cname:$.string().optional().describe("客户姓名或客户微信"),cphone:$.string().optional().describe("客户电话或客户微信号"),ewxId:$.string().optional().describe("员工微信 ID"),ewxName:$.string().optional().describe("员工微信昵称"),ewxAlias:$.string().optional().describe("员工微信号"),cwxId:$.string().optional().describe("客户微信 ID"),cwxName:$.string().optional().describe("客户微信昵称"),cwxAlias:$.string().optional().describe("客户微信号"),callId:$.string().describe("通话/沟通记录 ID"),callFileId:$.string().optional().describe("通话文件 ID"),createdTime:$.string().describe("创建时间"),communicationTime:$.string().describe("沟通时间"),evaluationType:g("评估方式:1以完成率评估 2以分值评估"),sopId:g("SOP 配置 ID").optional(),ruleId:g("规则模板 ID"),ruleName:$.string().describe("规则模板名称"),taskId:g("质检任务 ID"),taskName:$.string().describe("质检任务名称"),commScenarioId:g("沟通场景 ID").optional(),keywordNum:$.number().optional().describe("关键词命中数"),keywordData:$.string().optional().describe("关键词命中数据"),keywordDataDetail:$.string().optional().describe("关键词命中明细"),qualityType:g("质检类型:1关键词 2SOP"),qualityResult:g("质检结果:1合格 3不合格 5好 7中 9差"),qualityResultDefine:$.string().describe("质检结果定义说明"),executeInfoValue:$.string().describe("SOP 执行情况(已执行)"),executeInfoTotal:$.string().describe("SOP 执行情况(应执行)"),ctype:$.number().describe(`沟通类型:${M7}`),content:$.string().describe("完整分析结果(嵌套 JSON 字符串)"),recordFile:$.string().describe("录音文件 URL"),cpicFile:$.string().optional().describe("客户头像 URL"),epicFile:$.string().optional().describe("员工头像 URL"),callDuration:g("通话时长(秒)"),isFix:g("是否已修复"),hasDeduction:$.boolean().describe("是否有扣分"),deductionCount:$.number().describe("扣分条数"),stageId:$.string().describe("阶段 ID"),deductionStatus:$.string().optional().describe("扣分状态"),isManualAdjusted:$.boolean().optional().describe("是否人工调整过"),adjustReason:$.string().optional().describe("人工调整原因")}).passthrough(),"SOP 质检分析行"),examples:[{description:"查询 SOP 质检",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:10,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",companyCode:"qeg4ep",ename:"张三",ephone:"138****0001",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",evaluationType:1,ruleId:1001,ruleName:"接待流程质检",taskId:2001,taskName:"9月质检任务",qualityType:2,qualityResult:1,qualityResultDefine:"合格",executeInfoValue:"8",executeInfoTotal:"10",ctype:1,content:'{"SOP执行":{"整体完成率":"80%"}}',recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",isFix:0,hasDeduction:!0,deductionCount:1,stageId:"STAGE01"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_sop_quality_analyse_list",i0(n,q,{...n.quality_type!=null?{qualityType:n.quality_type}:{},...n.quality_result!=null?{qualityResult:n.quality_result}:{},...n.comm_scenario_id!=null?{commScenarioId:n.comm_scenario_id}:{},...n.rule_id!=null?{ruleId:n.rule_id}:{},...n.task_id!=null?{taskId:n.task_id}:{},...n.sop_id!=null?{sopId:n.sop_id}:{},...n.call_id?{callId:n.call_id}:{}}))}},P7={name:"crm.ai.customer-intention-list",description:"获取客户 AI 分析列表(意向/情绪/痛点/异议等)。",category:"crm",pluginName:V0,parameters:$.object({page_index:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),intension_levels:vn.optional().default([]).describe("意向等级列表(高意向/中意向/低意向/无意向/意向不明/需跟进),空则全部"),search_phone:ew.optional().default("").describe("手机号搜索"),search_name_and_company:$.string().optional().default("").describe("客户名/公司名搜索"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("客户总数"),list:$.array($.object({id:$.string().describe("客户 ID"),customerName:$.string().describe("客户姓名"),cellPhone:$.string().describe("客户手机号(脱敏)"),createdTime:$.string().describe("客户创建时间"),companyCode:$.string().describe("公司码"),userName:$.string().describe("所属员工账号"),createUserName:$.string().describe("创建人账号"),departmentId:$.string().describe("所属部门 ID"),departmentName:$.string().describe("所属部门名"),userKey:$.string().describe("所属员工用户 ID"),planId:$.string().optional().describe("跟进计划 ID(无计划的客户缺省)"),progress:$.number().describe("销售进度 ID(企业自定义 SalesProgress)"),aiProgress:$.number().describe("AI 判定的销售进度 ID"),aiProgressName:$.string().describe("AI 判定的销售进度名称(如 浏览/闲逛型)"),aiProgressTime:$.string().optional().describe("AI 进度判定时间"),isAnalyse:$.number().describe("是否已有 AI 分析:1是 0否"),keywords:$.string().describe("沟通关键词(JSON 数组字符串)"),intentionLevel:$.string().optional().describe("意向等级名称(高意向/中意向/低意向/无意向/意向不明/需跟进);AI 意向分析未完成的客户整组缺省"),aiRiskLevel:$.string().describe("流失风险等级(高/中/低)"),aiObjection:$.number().optional().describe("已解决异议条数;意向分析未完成缺省"),aiUnObjection:$.number().optional().describe("未解决异议条数;意向分析未完成缺省"),aiIssue:$.number().optional().describe("已解决问题条数;意向分析未完成缺省"),aiUnIssue:$.number().optional().describe("未解决问题条数;意向分析未完成缺省"),aiPain:$.number().optional().describe("已解决痛点条数;意向分析未完成缺省"),aiUnPain:$.number().optional().describe("未解决痛点条数;意向分析未完成缺省"),aiCusMood:$.string().optional().describe('客户情绪(如 "中性情绪:平静");意向分析未完成缺省'),aiEmpMood:$.string().optional().describe('员工情绪(如 "中性情绪:平静")'),aiCusTag:$.string().optional().describe("客户标签"),aiCusTagTime:$.string().optional().describe("客户打标时间"),compete:$.string().optional().describe("竞品信息"),nextAction:$.string().describe("AI 建议下一步动作"),actionProgress:$.string().describe("动作进度(如 AI)"),actionType:$.number().describe("动作类型"),labels:$.array($.string()).optional().describe("客户标签列表"),labelTime:$.string().optional().describe("最近打标时间"),actionLabels:$.string().optional().describe("动作标签"),customerSource:$.string().describe("客户来源"),regionName:$.string().describe("地区名"),adPlatformName:$.string().describe("广告平台名"),isDistribution:$.number().describe("是否已分配"),callDuration:$.string().describe(`累计通话时长(格式 mm'ss")`),callSeconds:$.number().describe("累计通话秒数"),followTime:$.string().describe("最近跟进时间"),qixinMatch:$.number().describe("企信匹配标记"),mailState:$.string().describe("邮件状态"),inRecycle:$.number().describe("是否在公海/回收站"),isCloudPlan:$.number().describe("云计划标记"),custLevel:$.number().optional().describe("客户等级"),isInPlan:$.number().describe("是否在跟进计划"),isPush:$.number().describe("推送标记"),isMsgPlan:$.number().describe("消息计划标记"),isDelete:$.number().describe("删除标记"),designatedStatus:$.number().describe("指定状态"),version:$.string().describe("数据版本时间(最近更新)"),comMatchScore:$.number().describe("企业匹配分"),comActiveScore:$.number().describe("企业活跃分"),comTycScore:$.number().describe("天眼查评分"),comValidity:$.number().describe("企业信息有效性分"),comDistance:$.number().describe("企业地址距离分"),canCall:$.boolean().describe("可否外呼"),canReceive:$.boolean().describe("可否领取"),delPhone:$.boolean().describe("手机号已删除"),ourCompany:$.boolean().describe("是否本公司号码"),phoneRegistProvinceId_na:$.number().describe("号码归属省 ID"),phoneRegistCityId_na:$.number().optional().describe("号码归属市 ID(部分客户缺省)"),phoneRegistAddress_ik:$.string().describe("号码归属地(如 广东省 清远市)"),toSeaNum:$.number().describe("转公海次数"),areaFlag:$.number().describe("区域标记"),planComplete:$.boolean().describe("跟进计划是否完成"),page:$.number().describe("分页回显(上游未文档化,实测恒 0)"),planCallStatus:$.number().optional().describe("计划通话状态"),planReceiveStatus:$.number().optional().describe("计划领取状态"),planFlickScreen:$.number().optional().describe("划屏状态(上游未文档化)"),isCustomerPush:$.number().describe("客户推送标记"),actState:$.number().describe("激活状态"),bookingNotice:$.number().describe("预约提醒标记"),contactState:$.string().describe("联系状态"),groupName:$.string().describe("客户分组名(如 待分组)"),wxPhoneAddRef:K4.describe("加微信状态"),qwFriendRef:K4.describe("加企微状态"),waFriendRef:K4.optional().describe("第三渠道加微状态(refStatusMsg 自带语义;部分客户缺省)")}).passthrough()).describe("客户行(档案 + AI 分析汇总)"),pageIndex:$.number().describe("页码回显(实测首页回 0)"),pageSize:$.number().describe("页大小回显(实测首页回 0)"),currIndex:$.number().describe("当前页回显(实测首页回 0)")}).passthrough(),examples:[{description:"查询客户意向",input:{},output:{total:4,list:[{id:"CUST1A2B3C4D5E6F",customerName:"李四",cellPhone:"139****0002",createdTime:"2026-03-12 13:32:08",bookingNotice:0,companyCode:"qeg4ep",userName:"16280023256",actState:0,planId:"PLAN7D559DBA275C",progress:0,aiProgress:1,aiProgressName:"浏览/闲逛型",isAnalyse:1,keywords:'["产品价格","优惠活动"]',aiRiskLevel:"低",aiObjection:1,aiUnObjection:0,aiIssue:1,aiUnIssue:0,aiPain:1,aiUnPain:0,aiCusMood:"中性情绪:平静",aiCusTag:"",customerSource:"企业导入",regionName:"",adPlatformName:"",isDistribution:1,actionType:0,callDuration:`3'15"`,callSeconds:195,userKey:"USER9F8E7D6C",qixinMatch:0,mailState:"0",inRecycle:0,isCloudPlan:0,custLevel:0,isInPlan:1,isPush:0,followTime:"2026-03-10 12:09:33",isMsgPlan:0,isDelete:0,designatedStatus:0,version:"2026-09-12 22:19:25",comMatchScore:0,comActiveScore:0,comTycScore:0,comValidity:0,comDistance:0,canCall:!0,departmentName:"销售一部",departmentId:"DEPT494397B51B76",createUserName:"16280023256",phoneRegistProvinceId_na:5,phoneRegistCityId_na:366,phoneRegistAddress_ik:"广东省 清远市",toSeaNum:0,areaFlag:-1,planComplete:!1,page:0,canReceive:!1,delPhone:!1,ourCompany:!1,nextAction:"需重新发起有效沟通,明确客户需求",planCallStatus:0,planReceiveStatus:0,planFlickScreen:-1,isCustomerPush:1,wxPhoneAddRef:{refStatus:7,refStatusMsg:"从未添加微信"},qwFriendRef:{refStatus:7,refStatusMsg:"从未添加微信"},waFriendRef:{refStatus:7,refStatusMsg:"从未添加"},contactState:"0",groupName:"待分组",actionProgress:"AI",intentionLevel:"高意向",labels:["重点客户"],aiEmpMood:"中性情绪:平静"}],pageIndex:0,pageSize:0,currIndex:0}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S(),H=n.intension_levels;return await D("get_ai_analysis_customer_list",{pageIndex:n.page_index,pageSize:n.page_size,deptId:q,...n.search_phone?{searchPhone:n.search_phone}:{},...n.search_name_and_company?{keyword:n.search_name_and_company}:{},...H.length===1?{intentionLevel:H[0]}:{},...H.length>1?{intensionLevel:H}:{}})}},S7={name:"crm.ai.communication-keywords-list",description:"分析客户沟通中的关键词(情绪/痛点/需求)。",category:"crm",pluginName:V0,parameters:$.object({page_index:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),start_time:$.string().optional().default("").describe("开始时间,空则不限制"),end_time:$.string().optional().default("").describe("结束时间,空则不限制"),keyword_types:$.string().optional().default("").describe("关键词类别过滤(短语匹配;实测:痛点/需求/情绪 有效,传具体关键词文本无效)"),communication_type:$.string().optional().default("").describe("沟通类型:1电话 2微信聊天 3微信语音 5企微聊天 6企微语音 11工牌/现场录音 12现场录音"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),filter_user_id:$.string().optional().default("").describe("员工用户 ID")}),returns:Y0($.object({...m0,...E0,...P0,...S0,keywords:$.string().describe('沟通关键词(JSON 数组字符串,如 ["产品价格","优惠活动"])'),keywordStr:$.string().optional().describe("关键词分类汇总(JSON 字符串:情绪类/痛点类/需求类)"),moodType:g(`客户情绪类型:${B7}`),mood:$.string().describe("客户情绪分析(JSON 字符串:情绪名/情绪类型/情绪分析)"),intention:g(`意向度:${B1}`),progress:kn,solutionJudge:M1,issue:$.string().optional().describe("渗出键:命中的客户问题"),pain:$.string().optional().describe("渗出键:命中的客户痛点"),objection:$.string().optional().describe("渗出键:命中的客户异议")}).passthrough(),"关键词分析行"),examples:[{description:"查询沟通关键词",input:{},output:{pageIndex:1,pageSize:5,total:551,data:[{id:"a1b2c3d4e5f6",userId:"USER9F8E7D6C",ename:"张三",ephone:"138****0001",customerId:"CUST1A2B3C4D",cname:"李四",cphone:"139****0002",callId:"CALL1122334455",createdTime:"2026-09-12 10:30:00",communicationTime:"2026-09-12 09:15:00",ctype:1,moodType:"21",intention:"1",progress:"3",solutionJudge:"未标记",keywords:'["产品价格","优惠活动"]',keywordStr:'{"情绪类":["积极"],"需求类":["产品价格","优惠活动"]}',mood:'{"情绪名":"平静","情绪类型":"中性情绪","情绪分析":"沟通平稳"}',recordFile:"https://oss.example.com/call/demo.mp3",callDuration:"95",content:'{"AI意向度":{"AI意向度等级":"高意向"},"沟通摘要":"客户询问价格,员工介绍方案"}'}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_customer_insights_keywords_list",{pageIndex:n.page_index,pageSize:n.page_size,...n.start_time?{startTime:t2(n.start_time)}:{},...n.end_time?{endTime:t2(n.end_time)}:{},...n.keyword_types?{keywordTypes:n.keyword_types}:{},dptId:q,rangeField:"1",...n.filter_user_id?{userId:n.filter_user_id}:{},...n.communication_type?{ctype:Number(n.communication_type)}:{}})}};var d1="crm",sw=$.union([$.string(),$.number()]).transform((n)=>String(n)),b7=$.union([$.array($.string()),$.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}});function r2(n){let q=n.includes(" ")?n.replace(" ","T"):`${n}T00:00:00`;return Date.parse(`${q}+08:00`)}var k7={name:"crm.order.missing-list",description:"查询飞单预警分析列表,检测员工可能的飞单行为。",category:"crm",pluginName:d1,parameters:$.object({start_time:$.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:$.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),page_index:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),user_id:$.string().optional().default("").describe("员工 ID"),user_ids:b7.optional().default([]).describe("员工 ID 列表"),search_type:$.number().int().optional().describe("搜索类型:1客户姓名 2客户手机号 3员工姓名 4员工手机号 5客户微信昵称 6客户微信号 7员工微信昵称 8员工微信号"),keyword:$.string().optional().default("").describe("搜索关键词"),ctype:$.number().int().optional().describe("沟通类型:1电话 2微信 3微信长语音"),sort_field:$.number().int().optional().describe("排序字段:1分析时间 2沟通时间"),sort_order:$.string().optional().default("").describe("排序:asc/desc"),range_field:$.number().int().optional().describe("过滤时间字段:1分析时间 2沟通时间"),call_second_type:$.number().int().optional().describe("通话时长类型"),call_percent:$.number().int().optional().describe("员工通话占比"),call_speed:$.number().int().optional().describe("语速"),missing_topic:b7.optional().default([]).describe("飞单话题筛选列表")}),returns:Y0($.object({...m0,ctype:$.number().describe("沟通类型:1电话 2微信聊天 3微信长语音 4微信汇总"),...E0,...P0,...S0,mood:$.string().optional().describe("情绪码(上游未文档化)"),missingTopic:$.string().optional().describe("命中的飞单话题"),intention:bn,progress:kn}).passthrough(),"飞单预警行:一次沟通的分析切片;PC 模型未声明媒体键(recordFile/callDuration 等),实测存在(同族 ES 文档渗出),语义同 ai 域"),examples:[{description:"查询飞单预警",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageIndex:1,pageSize:5,total:12,data:[{id:"f1001",userId:"U1001",ename:"李四",ephone:"138****0001",callId:"C2001",createdTime:"2026-08-01 10:00:00",ctype:1,content:'{"summary":"…"}',missingTopic:"私下成交",intention:3}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_order_missing_list",{pageIndex:n.page_index,pageSize:n.page_size,startTime:r2(n.start_time),endTime:r2(n.end_time),dptId:q,...n.user_id?{userId:n.user_id}:{},userIds:n.user_ids,...n.search_type!=null?{type:n.search_type}:{},...n.keyword?{keyword:n.keyword}:{},...n.ctype!=null?{ctype:n.ctype}:{},...n.sort_field!=null?{sortField:String(n.sort_field)}:{},...n.sort_order?{sortOrder:n.sort_order}:{},...n.range_field!=null?{rangeField:String(n.range_field)}:{},...n.call_second_type!=null?{callSecondType:n.call_second_type}:{},...n.call_percent!=null?{callPercent:n.call_percent}:{},...n.call_speed!=null?{callSpeed:n.call_speed}:{},missingTopic:n.missing_topic})}},h7={name:"crm.sms.log-list",description:"查询短信历史记录列表。",category:"crm",pluginName:d1,parameters:$.object({page:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),customer_id:$.string().optional().default("").describe("客户 ID"),customer_name:$.string().optional().default("").describe("客户姓名"),customer_phone:sw.optional().default("").describe("客户手机号"),start_time:$.string().optional().default("").describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:$.string().optional().default("").describe("结束时间 yyyy-MM-dd HH:mm:ss")}),returns:$.object({power:$.number().optional().describe("权限位(上游未文档化)"),dataCount:$.number().describe("总条数"),data:$.array($.object({id:$.string().describe("短信记录 ID"),createTime:$.string().describe("时间 yyyy-MM-dd HH:mm:ss"),sms:$.string().describe("短信内容"),direction:$.number().describe("方向:0=接收 1=发送"),customerPhone:$.string().optional().describe("客户手机号(可能脱敏)"),smsSub:$.string().optional().describe("短信主题/摘要"),sender:$.string().optional().describe("发送员工名"),senderDepartment:$.string().optional().describe("发送部门名"),senderDepartmentId:$.string().optional().describe("发送部门 ID"),departmentList:$.string().optional().describe("部门链(上游未文档化格式)"),source:$.number().optional().describe("来源码(上游未文档化)"),simPhone:$.string().optional().describe("SIM 卡手机号"),simNumber:$.string().optional().describe("SIM 卡随机码(iccid)"),userId:$.string().optional().describe("员工用户 ID"),receiveName:$.string().optional().describe("接收人名"),partnerId:$.string().optional().describe("关联 ID(上游未文档化)"),customerId:$.string().optional().describe("客户 ID"),customerName:$.string().optional().describe("客户名"),customerCompany:$.string().optional().describe("客户公司名"),follower:$.string().optional().describe("跟进人名"),remark:$.string().optional().describe("备注"),sourceFileName:$.string().optional().describe("来源文件名(导入类短信)"),sensitiveClassify:$.string().optional().describe("敏感词分类"),sensitiveWorld:$.string().optional().describe("命中敏感词(上游键名拼写 World 即此)"),triggerSensitive:$.number().optional().describe("是否触发敏感:0/1"),isSensitive:$.number().optional().describe("是否敏感:0/1"),sensitiveCategoriesList:$.array($.unknown()).optional().describe("敏感分类列表(上游未文档化结构)"),sensitiveWordsList:$.array($.unknown()).optional().describe("敏感词列表(上游未文档化结构)")}).passthrough())}).passthrough(),examples:[{description:"查询短信记录",input:{},output:{power:1,dataCount:35,data:[{id:"s1001",createTime:"2026-09-01 09:30:00",sms:"您好,本周产品直播链接…",direction:1,sender:"李四",simPhone:"139****0002"}]}}],sideEffects:["network"],handler:async({page:n,page_size:q,customer_id:H,customer_name:Q,customer_phone:X,start_time:J,end_time:w})=>{return await D("get_sms_log_list",{page:n,pageSize:q,...J?{sendTimeStart:J}:{},...w?{sendTimeEnd:w}:{},...H?{customerId:H}:{},...Q?{customerName:Q}:{},...X?{customerPhone:X}:{}})}},T7={name:"crm.voice.recording-list",description:"查询现场录音或工牌录音列表。",category:"crm",pluginName:d1,parameters:$.object({start_time:$.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:$.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),page_index:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),device_type:$.number().int().optional().default(0).describe("设备类型:0=现场录音 1=工牌录音"),user_id:$.string().optional().default("").describe("员工 ID"),user_name:$.string().optional().default("").describe("员工姓名"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pages:$.number().describe("总页数"),pageNum:$.number().describe("当前页码"),voices:$.array($.object({id:$.string().describe("录音 ID"),theme:$.string().describe("主题"),startTime:$.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),endTime:$.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),voiceUrl:$.string().describe("录音文件 URL"),voiceTime:$.number().describe("录音时长(秒)"),createTime:$.string().describe("创建时间 yyyy-MM-dd HH:mm:ss"),deviceType:$.number().describe("设备类型:0=现场录音 1=工牌录音"),createUserId:$.string().describe("员工用户 ID"),createUserName:$.string().describe("员工名"),companyCode:$.string().optional().describe("公司码"),progressName:$.string().optional().describe("销售进度名"),progressType:$.number().optional().describe("进度来源:1人工 2AI"),salesProgress:$.number().optional().describe("销售进度码"),customerName:$.string().optional().describe("客户名"),customerCellphone:$.string().optional().describe("客户手机号(可能脱敏)"),customerId:$.string().optional().describe("客户 ID"),mark:$.string().optional().describe("标记(上游未文档化)"),isTranslate:$.number().optional().describe("是否已转写:0/1"),isDel:$.number().optional().describe("删除标记:0/1"),location:$.string().optional().describe("录音地点"),longitude:$.number().optional().describe("经度"),latitude:$.number().optional().describe("纬度"),deviceNo:$.string().optional().describe("工牌设备 ID"),partnerId:$.string().optional().describe("关联 ID(上游未文档化)"),departmentName:$.string().optional().describe("部门名"),departmentId:$.string().optional().describe("部门 ID"),createUserCellphone:$.string().optional().describe("员工手机号(可能脱敏)")}).passthrough())}).passthrough(),examples:[{description:"查询现场录音",input:{start_time:"2026-07-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:8,pages:2,pageNum:1,voices:[{id:"v1001",theme:"客户拜访",startTime:"2026-08-01 14:00:00",endTime:"2026-08-01 14:20:00",voiceUrl:"https://oss.example.com/v/1001.mp3",voiceTime:1200,createTime:"2026-08-01 14:21:00",deviceType:0,createUserId:"U1001",createUserName:"李四",customerName:"王五"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_voice_list",{pageNum:n.page_index,pageSize:n.page_size,startCreateTime:n.start_time,endCreateTime:n.end_time,deviceType:n.device_type,deptId:q,...n.user_id?{createUserId:n.user_id}:{},...n.user_name?{userName:n.user_name}:{}})}},I7={name:"crm.device.control-log-list",description:"查询管控日志列表(开始/结束时间转毫秒时间戳传后端)。",category:"crm",pluginName:d1,parameters:$.object({start_time:$.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),end_time:$.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数")}),returns:$.object({}).passthrough(),hidden:!0,examples:[{description:"查询管控日志",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{}}],sideEffects:["network"],handler:async({start_time:n,end_time:q,page_num:H,page_size:Q})=>{return await D("get_control_log_list",{pageNum:H,pageSize:Q,startTriggerTime:r2(n),endTriggerTime:r2(q)})}},nW=new Set(["menus","themeConfig","showfieldHead","showfieldHeadShow"]),u7={name:"crm.user.info",description:"获取当前登录用户的关键信息(基础身份、权限、部门、角色),已过滤 menus/themeConfig 等大字段。可作为需要 userId/departmentId 的前置调用。查当前用户优先用本命令;需 menus 等全量字段时用 crm.auth.user-info。",category:"crm",pluginName:d1,parameters:$.object({}),returns:$.object({userId:$.string().describe("当前登录用户 ID(各命令 user_id 参数的取值来源)"),realName:$.string().describe("姓名"),roleName:$.string().describe("角色名"),isManager:$.boolean().describe("是否管理员"),departmentId:$.string().describe("主部门 ID"),userStatus:$.number().optional().describe("用户状态码(上游未文档化)"),companyId:$.string().optional().describe("公司 ID"),manageDepartmentNames:$.string().optional().describe("管理的部门名(上游未文档化格式)"),cellphone:$.string().optional().describe("登录手机号")}).passthrough(),examples:[{description:"获取当前用户信息",input:{},output:{userId:"U1001",realName:"张三",roleName:"管理员",isManager:!0,departmentId:"D100"}}],sideEffects:["network"],handler:async()=>{let n=await D("get_current_user_info",{});return Object.fromEntries(Object.entries(n).filter(([q])=>!nW.has(q)))}};var w0="crm";function b0(n){return String(n).padStart(2,"0")}function Z7(){let n=new Date;return`${n.getFullYear()}-${b0(n.getMonth()+1)}-${b0(n.getDate())}`}function p7(n){let q=new Date(Date.now()-n*86400000);return`${q.getFullYear()}-${b0(q.getMonth()+1)}-${b0(q.getDate())}`}function $W(){let n=new Date;return`${n.getFullYear()}-${b0(n.getMonth()+1)}-${b0(n.getDate())} ${b0(n.getHours())}:${b0(n.getMinutes())}:${b0(n.getSeconds())}`}function qW(n){let q=new Date(Date.now()-n*86400000);return`${q.getFullYear()}-${b0(q.getMonth()+1)}-${b0(q.getDate())} 00:00:00`}function y7(n,q){if(n.length>10)return n;return`${n} ${q?"23:59:59":"00:00:00"}`}function a2(n){let q=n.includes(" ")?n.replace(" ","T"):`${n}T00:00:00`;return Date.parse(`${q}+08:00`)}var g7=$.object({wxId:$.string().describe("客户微信 ID"),nickName:$.string().describe("客户微信昵称"),alias:$.string().optional().describe("客户微信号"),wxPhone:$.string().optional().describe("客户微信绑定手机号(可能脱敏)"),headImg:$.string().optional().describe("客户头像 URL"),addFriendTime:$.string().describe("添加好友时间 yyyy-MM-dd HH:mm:ss"),userId:$.string().describe("所属员工用户 ID"),userName:$.string().optional().describe("员工名"),userPhone:$.string().optional().describe("员工手机号(可能脱敏)"),wxIsOnline:$.number().optional().describe("客户微信在线:0/1"),uploadTime:$.string().optional().describe("数据上报时间"),companyCode:$.string().optional().describe("公司码"),statsMap:$.object({addFriendNum:$.number().optional().describe("加好友数")}).passthrough().optional().describe("统计附表"),isDuo:$.number().optional().describe("是否双开:0/1"),isOpenDuo:$.number().optional().describe("是否开启双开:0/1"),partnerId:$.string().optional().describe("关联 ID(上游未文档化)")}).passthrough(),i7={name:"crm.wechat.user-sale-list",description:"查询员工微信号列表(每员工一条统计行:收发消息数、聊天天数、联系人数等)。行内 wechatId 是会话类命令(search-talker / talker-list / chat-history 等)的 wechat_id 入参来源。",category:"crm",pluginName:w0,parameters:$.object({page:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(100).optional().default(5).describe("每页条数"),department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),start_date:$.string().optional().default("").describe("开始日期 YYYY-MM-DD,空则近3天"),end_date:$.string().optional().default("").describe("结束日期 YYYY-MM-DD,空则今天"),sales_name:$.string().optional().default("").describe("销售名称"),user_id:$.string().optional().default("").describe("用户 ID"),wechat_nick_name:$.string().optional().default("").describe("微信昵称"),is_on_job:$.number().int().optional().default(1).describe("是否在职 1=在职 0=离职")}),returns:$.object({pageNum:$.number().describe("页码"),pageSize:$.number().describe("每页条数"),total:$.number().describe("总条数"),data:$.array($.object({wechatId:$.string().describe("员工微信 ID(会话类命令 wechat_id 入参来源)"),userId:$.string().describe("所属员工用户 ID"),nickName:$.string().optional().describe("员工微信昵称"),userName:$.string().optional().describe("员工名"),salePhone:$.string().optional().describe("公司设置手机号"),alias:$.string().optional().describe("员工微信号"),phone:$.string().optional().describe("员工微信绑定手机号"),headImageUrl:$.string().optional().describe("头像 URL"),isOnJob:$.number().optional().describe("是否在职:1在职 0离职"),isDuo:$.number().optional().describe("是否双开微信:0主微信 1双开"),isOpenDuo:$.number().optional().describe("是否打开微信双开:0未开 1已开"),dataFrom:$.number().optional().describe("数据来源:1 云客手机 2 微小助"),isReFriend:$.string().optional().describe("是否参与重复好友统计:0参与 1不参与(字符串形态)"),deptRoteName:$.string().optional().describe("部门层级 ID 串(逗号分隔)"),companyCode:$.string().optional().describe("公司码"),uploadTime:$.string().optional().describe("数据上报时间 yyyy-MM-dd HH:mm:ss"),lastUpdate:$.string().optional().describe("数据最后更新时间 yyyy-MM-dd HH:mm:ss"),dbSize:$.number().optional().describe("聊天记录库大小(字节)"),contactsNum:$.number().optional().describe("联系人数"),groupNum:$.number().optional().describe("微信群数"),chatCount:$.number().optional().describe("窗口内沟通人数"),followCount:$.number().optional().describe("窗口内跟进人数"),contactCount:$.number().optional().describe("窗口内有效沟通人数"),sendNum:$.number().optional().describe("窗口内发送消息条数"),receiveNum:$.number().optional().describe("窗口内接收消息条数"),customerSendLastNum:$.number().optional().describe("窗口内客户发送条数(上游未文档化)"),saleSendLastNum:$.number().optional().describe("窗口内员工发送条数(上游未文档化)"),saleSendLastNumRate:$.string().optional().describe('员工发送占比(如 "33%")'),userChanged:$.number().optional().describe("上游未文档化")}).passthrough()).describe("员工微信号统计行(计数类字段为 start_date~end_date 窗口内统计)")}).passthrough(),examples:[{description:"查询员工微信号统计(近 3 天默认窗口)",input:{},output:{pageNum:1,pageSize:5,total:1,data:[{wechatId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",nickName:"客服小张",userName:"张三",salePhone:"",alias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",isOnJob:1,isDuo:0,isOpenDuo:1,dataFrom:1,isReFriend:"0",deptRoteName:"D0001",uploadTime:"2026-09-18 10:00:00",lastUpdate:"2026-09-18 09:00:00",dbSize:1048576,contactsNum:110,groupNum:53,chatCount:12,followCount:3,contactCount:8,sendNum:45,receiveNum:60,customerSendLastNum:30,saleSendLastNum:15,saleSendLastNumRate:"33%",userChanged:0}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.department_id||await S(),H=n.end_date||Z7(),Q=n.start_date||p7(3);return await D("get_wechat_user_sale_list",{startdate:Q,enddate:H,page:n.page,pageSize:n.page_size,isOnJob:n.is_on_job,departmentId:q,...n.sales_name?{salesname:n.sales_name}:{},...n.user_id?{userId:n.user_id}:{},...n.wechat_nick_name?{weChatNickName:n.wechat_nick_name}:{}})}},o7={name:"crm.wechat.friend-circle-statistics-list",description:"查询微信朋友圈统计数据。",category:"crm",pluginName:w0,parameters:$.object({page:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),start_date:$.string().optional().default("").describe("开始日期 YYYY-MM-DD,空则近3天"),end_date:$.string().optional().default("").describe("结束日期 YYYY-MM-DD,空则今天"),sales_name:$.string().optional().default("").describe("关键字(员工微信号/手机号/微信昵称模糊查询)"),user_id:$.string().optional().default("").describe("用户 ID"),is_on_job:$.number().int().optional().default(1).describe("是否在职 1=在职 0=离职")}),returns:$.object({pageNum:$.number().describe("页码"),pageSize:$.number().describe("每页条数"),total:$.number().describe("总条数"),data:$.array($.object({wechatId:$.string().describe("员工微信 ID"),userId:$.string().describe("所属员工用户 ID"),theLastTimeSent:$.string().optional().describe("最后发朋友圈时间 yyyy-MM-dd HH:mm:ss;从未发送的行缺失该键"),userName:$.string().optional().describe("员工名"),salePhone:$.string().optional().describe("公司设置手机号"),partnerId:$.string().optional().describe("员工工号"),nickName:$.string().optional().describe("员工微信昵称"),alias:$.string().optional().describe("员工微信号"),headImageUrl:$.string().optional().describe("头像 URL"),nowStatus:$.string().optional().describe("在线状态:0离线 1在线(7 天未更新聊天记录算离线,字符串形态)"),circleOfFriendsCount:$.number().optional().describe("朋友圈数"),praiseCount:$.number().optional().describe("朋友圈获赞条数"),commentCount:$.number().optional().describe("朋友圈评论条数"),isOnJob:$.number().optional().describe("是否在职:1在职 0离职"),isOpenDuo:$.number().optional().describe("是否打开微信双开:0未开 1已开"),isDuo:$.number().optional().describe("是否双开微信:0主微信 1双开"),lastWxOnlineStatus:$.number().optional().describe("最近微信在线状态")}).passthrough())}).passthrough(),examples:[{description:"查询近 3 天朋友圈统计",input:{},output:{pageNum:1,pageSize:5,total:1,data:[{wechatId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",theLastTimeSent:"2026-09-15 10:20:30",userName:"张三",salePhone:"",partnerId:"E0001",nickName:"客服小张",alias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",nowStatus:"1",circleOfFriendsCount:3,praiseCount:12,commentCount:5,isOnJob:1,isOpenDuo:0,isDuo:0,lastWxOnlineStatus:1}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.department_id||await S(),H=n.end_date||Z7(),Q=n.start_date||p7(3);return await D("get_friends_circle_statistics_list",{startDate:Q,endDate:H,page:n.page,pageSize:n.page_size,isOnJob:n.is_on_job,departmentId:q,...n.sales_name?{salesname:n.sales_name}:{},...n.user_id?{userId:n.user_id}:{}})}},f7={name:"crm.wechat.add-friend-list",description:"查询微信新增好友列表。",category:"crm",pluginName:w0,parameters:$.object({page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),department_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),start_time:$.string().optional().default("").describe("开始时间 YYYY-MM-DD HH:mm:ss,空则近3天"),end_time:$.string().optional().default("").describe("结束时间 YYYY-MM-DD HH:mm:ss,空则今天"),user_id:$.string().optional().default("").describe("用户 ID"),keyword:$.string().optional().default("").describe("关键词")}),returns:$.object({pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),total:$.number().describe("总条数"),data:$.array(g7).describe("新增好友行(一行为一个新好友,含所属员工与统计附表)")}).passthrough(),examples:[{description:"查询新增好友",input:{},output:{pageNum:1,pageSize:5,total:18,data:[{wxId:"wxid_abc",nickName:"客户甲",addFriendTime:"2026-09-10 10:20:30",userId:"U1001",userName:"李四",statsMap:{addFriendNum:1}}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.department_id||await S(),H=n.end_time||$W(),Q=n.start_time||qW(3);return await D("get_add_friend_list",{start:Q,end:H,pageNum:n.page_num,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{},...n.keyword?{keyword:n.keyword}:{}})}},l7={name:"crm.wechat.add-friend-hour-list",description:"查询微信新增好友按时段统计。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),total:$.number().describe("总条数"),data:$.array(g7).describe("时段内新增好友行(同 add-friend-list 行结构)")}).passthrough(),examples:[{description:"查询新增好友时段",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageNum:1,pageSize:5,total:6,data:[{wxId:"wxid_abc",nickName:"客户甲",addFriendTime:"2026-08-02 09:00:00",userId:"U1001"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_add_friend_hour_list",{start:n.start_time,end:n.end_time,pageNum:n.page,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},c7={name:"crm.wechat.voice-call-list",description:"查询微信语音通话列表。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),data:$.array($.object({id:$.string().describe("通话记录 ID"),weChatId:$.string().describe("员工微信 ID"),talker:$.string().describe("对方微信 ID"),startTime:$.string().describe("开始时间 yyyy-MM-dd HH:mm:ss"),endTime:$.string().describe("结束时间 yyyy-MM-dd HH:mm:ss"),duration:$.string().describe("通话时长(字符串形态)"),callType:$.number().describe("通话类型码(上游未文档化)"),callStatus:$.number().describe("通话状态码(上游未文档化)"),isSend:$.number().optional().describe("是否员工发起:0/1"),isRoom:$.number().optional().describe("是否群语音:0/1"),userId:$.string().describe("员工用户 ID"),userName:$.string().optional().describe("员工名"),userPhone:$.string().optional().describe("员工手机号(可能脱敏)"),userWeChatNickName:$.string().optional().describe("员工微信昵称"),userWeChatAlias:$.string().optional().describe("员工微信号"),userWeChatPhone:$.string().optional().describe("员工微信手机号"),userWeChatHeadImg:$.string().optional().describe("员工微信头像 URL"),talkerNickName:$.string().optional().describe("对方昵称"),talkerRemark:$.string().optional().describe("对方备注名"),talkerAlias:$.string().optional().describe("对方微信号"),talkerHeadImg:$.string().optional().describe("对方头像 URL"),remark:$.string().optional().describe("备注(上游未文档化)"),nextId:$.number().optional().describe("游标 ID(上游未文档化)"),answerByPhone:$.number().optional().describe("是否电话接听(上游未文档化)"),callFileId:$.number().optional().describe("通话录音文件 ID"),from:$.number().optional().describe("来源码(上游未文档化)"),ossFileExist:$.boolean().optional().describe("录音文件是否存在"),ossFileName:$.string().optional().describe("录音文件名"),durationFile:$.number().optional().describe("录音文件时长(秒)")}).passthrough()).describe("微信语音通话行")}).passthrough(),examples:[{description:"查询微信语音通话",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:9,pageNum:1,pageSize:5,data:[{id:"vc1001",weChatId:"wxid_staff",talker:"wxid_abc",startTime:"2026-08-02 10:00:00",endTime:"2026-08-02 10:03:00",duration:"180",callType:1,callStatus:1,userId:"U1001"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("query_wechat_voice_list",{startTime:n.start_time,endTime:n.end_time,pageNum:n.page_num,pageSize:n.page_size,callSource:0,isRoom:0,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},d7={name:"crm.wechat.chatroom-list",description:"查询微信群统计。时间可传日期或日期时间(自动补齐时分秒)。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD 或 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD 或 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({page:$.number().describe("页码"),pageCount:$.number().describe("总页数"),totalCount:$.number().describe("总条数"),overviews:$.array($.object({chatRoomId:$.string().describe("群 ID"),chatRoomName:$.string().describe("群名"),memberCount:$.number().describe("成员数"),userId:$.string().describe("所属员工用户 ID"),userName:$.string().optional().describe("员工名"),userPhone:$.string().optional().describe("员工手机号(可能脱敏)"),wechatId:$.string().describe("员工微信 ID"),wechatNickName:$.string().optional().describe("员工微信昵称"),wechatAlias:$.string().optional().describe("员工微信号"),wechatHeadImageUrl:$.string().optional().describe("员工微信头像 URL"),messageCount:$.number().optional().describe("时间窗内消息数"),ownMessageCount:$.number().optional().describe("员工发言数"),addMembers:$.number().optional().describe("新增成员数"),lossMembers:$.number().optional().describe("流失成员数"),friendRemark:$.string().optional().describe("好友备注(上游未文档化)"),memberIds:$.string().optional().describe("成员 ID 集(上游未文档化格式)"),updateTime:$.string().optional().describe("更新时间"),lastChatTime:$.string().optional().describe("最近聊天时间(无聊天则省略)"),cursorTime:$.string().optional().describe("游标时间(上游未文档化)"),partnerId:$.string().optional().describe("关联 ID(上游未文档化)")}).passthrough()).describe("群概览行(一行一个群)")}).passthrough(),examples:[{description:"查询微信群统计",input:{start_time:"2026-08-01",end_time:"2026-08-05"},output:{page:1,pageCount:2,totalCount:8,overviews:[{chatRoomId:"room1001",chatRoomName:"客户服务群",memberCount:23,userId:"U1001",wechatId:"wxid_staff",messageCount:120,addMembers:2,lossMembers:1}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_chatroom_list",{startTime:y7(n.start_time,!1),endTime:y7(n.end_time,!0),pageNum:n.page_num,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},z7={name:"crm.wechat.repeat-friend-list",description:"查询重复好友统计。resolve_type: 0=未处理 1=已处理 2=已忽略。",category:"crm",pluginName:w0,parameters:$.object({page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门"),resolve_type:$.number().int().optional().default(0).describe("0=未处理 1=已处理 2=已忽略")}),returns:$.object({list:$.array($.object({friendId:$.string().describe("客户微信 ID"),friendName:$.string().describe("客户微信昵称"),num:$.number().describe("重复添加次数"),resolveState:$.number().describe("处理状态:0未处理 1已处理 2已忽略"),alias:$.string().optional().describe("客户微信号"),friendPhone:$.string().optional().describe("客户手机号(可能脱敏)"),headerImg:$.string().optional().describe("客户头像 URL(上游键名拼写 headerImg 即此)"),sale:$.array($.object({userId:$.string().describe("员工用户 ID"),saleName:$.string().optional().describe("员工花名"),realName:$.string().optional().describe("员工实名"),phone:$.string().optional().describe("员工手机号(可能脱敏)"),wxId:$.string().optional().describe("员工微信 ID"),alias:$.string().optional().describe("员工微信号"),headImg:$.string().optional().describe("员工头像 URL"),friendWxId:$.string().optional().describe("该员工侧的客户微信 ID"),friendWxNickname:$.string().optional().describe("该员工侧备注的客户昵称"),friendWxAlias:$.string().optional().describe("该员工侧备注的客户微信号"),friendWxRemark:$.string().optional().describe("该员工侧好友备注"),friendWxPhone:$.string().optional().describe("该员工侧备注的客户手机号"),friendHeadImageUrl:$.string().optional().describe("该员工侧备注的客户头像 URL"),createTime:$.string().optional().describe("该员工侧添加时间"),resolveState:$.number().optional().describe("该员工侧处理状态:0/1/2"),companyCode:$.string().optional().describe("公司码")}).passthrough()).describe("重复添加到的员工侧明细")}).passthrough()).describe("重复好友行")}).passthrough(),examples:[{description:"查询重复好友",input:{},output:{list:[{friendId:"wxid_abc",friendName:"客户甲",num:3,resolveState:0,sale:[{userId:"U1001",saleName:"李四"},{userId:"U1002",saleName:"王五"}]}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_repeat_friends_list",{resolveType:n.resolve_type,pageNum:n.page_num,pageSize:n.page_size,deptId:q})}},t7={name:"crm.wechat.apply-msg-verify-list",description:"查询微信验证消息(好友申请)。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码(中台工具为游标分页,暂不生效)"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageNum:$.number().optional().describe("页码"),pageSize:$.number().describe("页大小"),data:$.array($.object({wxId:$.string().describe("员工微信 ID"),userId:$.string().optional().describe("员工用户 ID"),userName:$.string().optional().describe("员工名"),userPhone:$.string().optional().describe("员工手机号(可能脱敏)"),friendWxId:$.string().describe("申请人微信 ID"),friendWxNickname:$.string().describe("申请人昵称"),friendWxAlias:$.string().optional().describe("申请人微信号"),friendHeadImage:$.string().optional().describe("申请人头像 URL"),nickname:$.string().optional().describe("申请人昵称(与 friendWxNickname 并存)"),alias:$.string().optional().describe("申请人微信号(与 friendWxAlias 并存)"),headImage:$.string().optional().describe("申请人头像(与 friendHeadImage 并存)"),addTime:$.string().describe("好友申请时间 yyyy-MM-dd HH:mm:ss"),fromType:$.number().optional().describe("申请来源类型码(上游未文档化)"),addType:$.number().optional().describe("添加类型码(上游未文档化)"),isFriend:$.number().optional().describe("是否已是好友:0/1"),lastChatTime:$.string().optional().describe("最近聊天时间"),firstChatTime:$.string().optional().describe("首次聊天时间"),cursorWxId:$.string().optional().describe("游标:员工微信 ID(翻页透传)"),cursorFriendWxId:$.string().optional().describe("游标:申请人微信 ID(翻页透传)"),cursorTime:$.string().optional().describe("游标:时间(翻页透传)"),friendRealWxId:$.string().optional().describe("申请人真实微信 ID(上游未文档化)"),friendWxIdWithOutEncrypt:$.string().optional().describe("申请人未加密微信 ID"),friendWxIdInData:$.string().optional().describe("申请人数据侧微信 ID(上游未文档化)"),encryptUsername:$.string().optional().describe("加密用户名(上游未文档化)")}).passthrough()).describe("好友申请行")}).passthrough(),examples:[{description:"查询验证消息",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:6,pageSize:5,data:[{wxId:"wxid_staff",friendWxId:"wxid_abc",friendWxNickname:"客户甲",addTime:"2026-08-02 09:00:00",isFriend:1}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_apply_msg_talk_list",{addTimeStart:n.start_time,addTimeEnd:n.end_time,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},r7={name:"crm.wechat.risk-control-stats",description:"查询微信风控统计(看板汇总,无分页)。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始日期 YYYY-MM-DD"),end_time:$.string().describe("结束日期 YYYY-MM-DD"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({sendTransCount:$.number().describe("发出转账笔数"),sendTransAmount:$.number().describe("发出转账金额"),receiveTransCount:$.number().describe("收到转账笔数"),receiveTransAmount:$.number().describe("收到转账金额"),didSendTransCount:$.number().describe("已完成发出转账笔数(上游未文档化)"),didSendTransAmount:$.number().describe("已完成发出转账金额(上游未文档化)"),didReceiveTransCount:$.number().describe("已完成收到转账笔数(上游未文档化)"),didReceiveTransAmount:$.number().describe("已完成收到转账金额(上游未文档化)"),transDidRedSendCount:$.number().describe("转账相关发出红包数(上游未文档化)"),transDidRedRecvCount:$.number().describe("转账相关收到红包数(上游未文档化)"),wechaetunnum:$.number().describe("退群数(上游键名拼写 wechaetunnum 即此)"),wechatdelnum:$.number().describe("删好友/退群相关计数(上游未文档化)"),wechatrenum:$.number().describe("群相关计数(上游未文档化)"),useraddnum:$.number().describe("新增好友数"),groupaddnum:$.number().describe("新增群成员数"),sendnum:$.number().describe("发出消息数"),receiveNum:$.number().describe("收到消息数"),sendrednum:$.number().describe("发出红包数"),receiveredNum:$.number().describe("收到红包数"),usernum:$.number().describe("用户/微信账号数(上游未文档化)"),wechatOnLine:$.number().describe("在线微信数"),wechatOffLine:$.number().describe("离线微信数")}).passthrough(),examples:[{description:"查询风控统计",input:{start_time:"2026-08-01",end_time:"2026-08-05"},output:{sendTransCount:2,sendTransAmount:500,receiveTransCount:1,receiveTransAmount:200,didSendTransCount:2,didSendTransAmount:500,didReceiveTransCount:1,didReceiveTransAmount:200,transDidRedSendCount:1,transDidRedRecvCount:0,wechaetunnum:1,wechatdelnum:0,wechatrenum:2,useraddnum:8,groupaddnum:5,sendnum:320,receiveNum:210,sendrednum:3,receiveredNum:1,usernum:7,wechatOnLine:5,wechatOffLine:2}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_wechat_board_date",{startdate:n.start_time,enddate:n.end_time,type:"summary",departmentId:q})}},a7={name:"crm.wechat.sensitive-operate-list",description:"查询微信敏感操作统计。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),data:$.array($.object({id:$.string().describe("记录 ID"),userId:$.string().describe("员工用户 ID"),weChatId:$.string().describe("员工微信 ID"),friendId:$.string().describe("对方微信 ID"),operateType:$.number().describe("敏感操作类型码(上游未文档化枚举)"),operateTypeDesc:$.string().describe("敏感操作类型文案(如 删除好友)"),operationTime:$.string().describe("操作时间 yyyy-MM-dd HH:mm:ss"),saleName:$.string().optional().describe("员工名"),saleNickName:$.string().optional().describe("员工微信昵称"),saleAlias:$.string().optional().describe("员工微信号"),salePhone:$.string().optional().describe("员工手机号(可能脱敏)"),saleHeadImage:$.string().optional().describe("员工头像 URL"),friendName:$.string().optional().describe("对方昵称"),friendRemark:$.string().optional().describe("对方备注名"),friendAlias:$.string().optional().describe("对方微信号"),friendHeadImage:$.string().optional().describe("对方头像 URL"),detail:$.string().optional().describe("操作详情文案"),msgSvrId:$.string().optional().describe("关联消息服务端 ID"),ctype:$.number().optional().describe("消息类型码(上游未文档化)"),dataSource:$.number().optional().describe("数据来源码(上游未文档化)"),createTime:$.string().optional().describe("记录创建时间"),companyCode:$.string().optional().describe("公司码"),deptRoute:$.array($.unknown()).optional().describe("部门链(上游未文档化结构)")}).passthrough()).describe("敏感操作行")}).passthrough(),examples:[{description:"查询敏感操作",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:12,pageNum:1,pageSize:5,data:[{id:"so1001",userId:"U1001",weChatId:"wxid_staff",friendId:"wxid_abc",operateType:1,operateTypeDesc:"删除好友",operationTime:"2026-08-03 15:20:00",saleName:"李四",detail:"删除好友"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_sensitive_operate_list",{start:a2(n.start_time),end:a2(n.end_time),pageNum:n.page_num,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},e7={name:"crm.wechat.sensitive-word-list",description:"查询微信敏感词统计。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({pageNum:$.number().describe("页码"),total:$.number().describe("总条数"),data:$.array($.object({id:$.string().describe("敏感词记录 ID"),createTime:$.string().optional().describe("消息时间 yyyy-MM-dd HH:mm:ss"),userId:$.string().optional().describe("员工用户 ID"),userName:$.string().optional().describe("员工名"),wechatId:$.string().optional().describe("员工微信 ID"),nickName:$.string().optional().describe("员工微信昵称"),alias:$.string().optional().describe("员工微信号"),headImageUrl:$.string().optional().describe("员工头像 URL"),phone:$.string().optional().describe("员工手机号"),partnerId:$.string().optional().describe("员工工号"),departmentName:$.string().optional().describe("部门名"),deptRoteName:$.string().optional().describe("部门职位名"),companyName:$.string().optional().describe("公司名"),companyCode:$.string().optional().describe("公司码"),sensitive:$.string().optional().describe("命中的敏感词"),sensitiveWord:$.string().optional().describe("命中的敏感词(后端查询键,与 sensitive 同值)"),sensitiveContent:$.string().optional().describe("消息原文(needOriginalMsg=true 时返回)"),sensitiveFlage:$.string().optional().describe("敏感标志:0或null敏感 1正常(Flage 拼写如此)"),sensitiveRemark:$.string().optional().describe("敏感词备注(无则为空串)"),cateName:$.string().optional().describe("敏感词分类名"),mesId:$.string().optional().describe("消息 ID"),msgSvrId:$.string().optional().describe("微信消息服务端 ID"),talkerId:$.string().optional().describe("会话对方 ID"),friendName:$.string().optional().describe("对方微信昵称"),friendAlias:$.string().optional().describe("对方微信号"),friendHeadImageUrl:$.string().optional().describe("对方头像 URL"),friendPIN:$.string().optional().describe("对方 PIN"),friendPhone:$.string().optional().describe("对方手机号"),isAdmin:$.string().optional().describe("员工是否管理员:0普通 1超管 2管理员"),peocount:$.number().optional().describe("群成员数"),corproomid:$.string().optional().describe("企业微信群聊 ID(corproomid 拼写如此)"),corpId:$.string().optional().describe("企业微信 corpId"),memberIds:$.string().optional().describe("群成员 ID 串"),scopeStatistics:$.number().optional().describe("统计范围:0员工 1客户 2员工+客户"),talkerlist:$.array($.object({wxId:$.string().optional().describe("成员微信 ID"),nickName:$.string().optional().describe("成员昵称"),displayName:$.string().optional().describe("群内展示名"),alias:$.string().optional().describe("成员微信号"),headUrl:$.string().optional().describe("成员头像 URL")}).passthrough()).optional().describe("企业微信群成员列表(群聊消息时用于拼群头像/群名)")}).passthrough())}).passthrough(),examples:[{description:"查询敏感词",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageNum:1,total:1,data:[{id:"fabricated-id-0001",createTime:"2026-08-03 14:22:10",userId:"u_fabricated000000000000000000001",userName:"张三",wechatId:"wxid_fabricated0001",nickName:"客服小张",alias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",phone:"",partnerId:"E0001",departmentName:"销售一部",deptRoteName:"销售",companyName:"示例公司",companyCode:"fabricated",sensitive:"转账",sensitiveWord:"转账",sensitiveContent:"示例消息原文",sensitiveFlage:"0",sensitiveRemark:"",cateName:"资金类",mesId:"m_fabricated0001",msgSvrId:"svr_fabricated0001",talkerId:"wxid_fabricated9999",friendName:"客户李四",friendAlias:"lisi0001",friendHeadImageUrl:"https://example.invalid/b.jpg",friendPIN:"",friendPhone:"",isAdmin:"0",peocount:0,corproomid:"",corpId:"",memberIds:"",scopeStatistics:0}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_sensitive_word_list",{start:n.start_time,end:n.end_time,pageNum:n.page_num,pageSize:n.page_size,messageType:1,needOriginalMsg:!0,departmentId:q})}},s7={name:"crm.wechat.login-log-list",description:"查询微信登录日志。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),data:$.array($.object({id:$.number().describe("日志 ID(number)"),logType:$.number().describe("登录类型码(上游未文档化)"),logTime:$.string().describe("登录时间 yyyy-MM-dd HH:mm:ss"),userId:$.string().describe("员工用户 ID"),wxId:$.string().describe("微信 ID"),userName:$.string().optional().describe("员工名"),userPhone:$.string().optional().describe("员工手机号(可能脱敏)"),weChatNickName:$.string().optional().describe("微信昵称"),weChatAlias:$.string().optional().describe("微信号"),version:$.string().optional().describe("客户端版本"),imei:$.string().optional().describe("设备 IMEI"),device:$.string().optional().describe("设备名"),companyCode:$.string().optional().describe("公司码")}).passthrough()).describe("登录日志行")}).passthrough(),examples:[{description:"查询微信登录日志",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:4,pageNum:1,pageSize:5,data:[{id:1001,logType:1,logTime:"2026-08-02 08:30:00",userId:"U1001",wxId:"wxid_staff",version:"2.1.0",device:"Pixel 6"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_wechat_login_log",{start:n.start_time,end:n.end_time,pageNum:n.page_num,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},n$={name:"crm.wechat.friend-operation-log-list",description:"查询微信好友操作日志。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),data:$.array($.object({userId:$.string().describe("员工用户 ID"),friendWxId:$.string().describe("对方微信 ID"),type:$.number().describe("操作类型码(上游未文档化枚举)"),content:$.string().describe("操作内容描述"),lastTime:$.string().describe("操作时间 yyyy-MM-dd HH:mm:ss"),realName:$.string().optional().describe("员工名"),phone:$.string().optional().describe("员工手机号(可能脱敏)"),weChatId:$.string().optional().describe("员工微信 ID"),wxAlias:$.string().optional().describe("员工微信号"),nickname:$.string().optional().describe("员工微信昵称"),avatar:$.string().optional().describe("员工头像 URL"),friendWxAlias:$.string().optional().describe("对方微信号"),friendWxNickName:$.string().optional().describe("对方昵称"),friendAvatar:$.string().optional().describe("对方头像 URL")}).passthrough()).describe("好友操作日志行")}).passthrough(),examples:[{description:"查询好友操作日志",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:4,pageNum:1,pageSize:5,data:[{userId:"U1001",friendWxId:"wxid_abc",type:2,content:"修改了备注",lastTime:"2026-08-02 11:00:00",realName:"李四"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_friend_operation_log_list",{startTime:n.start_time,endTime:n.end_time,pageNum:n.page_num,pageSize:n.page_size,departmentId:q,...n.user_id?{userId:n.user_id}:{}})}},$$={name:"crm.wechat.words-trigger-list",description:"查询违禁词统计(仅按部门维度汇总;中台工具不收时间/员工过滤,start_time/end_time/user_id 当前不生效,仅为兼容保留)。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss(当前不生效:中台工具不收时间过滤,仅为兼容保留)"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss(当前不生效:中台工具不收时间过滤,仅为兼容保留)"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID(当前不生效:中台工具不收员工过滤,仅为兼容保留)"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({total:$.number().describe("总条数"),pageNum:$.number().describe("页码"),pageSize:$.number().describe("页大小"),pageCount:$.number().describe("总页数"),data:$.array($.object({word:$.string().describe("违禁词"),staffTriggerTimes:$.number().describe("员工触发次数"),customerTriggerTimes:$.number().describe("客户触发次数"),id:$.string().optional().describe("记录 ID"),type:$.number().optional().describe("违禁词类型码(上游未文档化)"),createTime:$.string().optional().describe("统计时间")}).passthrough()).describe("违禁词触发统计行")}).passthrough(),examples:[{description:"查询违禁词",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{total:10,pageNum:1,pageSize:5,pageCount:2,data:[{word:"示例违禁词",staffTriggerTimes:3,customerTriggerTimes:1,createTime:"2026-08-05 00:00:00"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_words_trigger_list",{pageNum:n.page_num,pageSize:n.page_size,departmentId:q})}},q$={name:"crm.wechat.risk-screenshot-list",description:"查询微信风险消息统计(截图)。",category:"crm",pluginName:w0,parameters:$.object({start_time:$.string().describe("开始时间 YYYY-MM-DD HH:mm:ss"),end_time:$.string().describe("结束时间 YYYY-MM-DD HH:mm:ss"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).max(10).optional().default(5).describe("每页条数"),user_id:$.string().optional().default("").describe("用户 ID"),dept_id:$.string().optional().default("").describe("部门 ID,空则取默认部门")}),returns:$.object({pageNum:$.number().describe("页码"),total:$.number().describe("总条数"),data:$.array($.object({id:$.number().describe("截图记录 ID"),shotTime:$.number().describe("截图时间(毫秒时间戳,Long 形态)"),type:$.number().describe("截图类型:1撤回消息截图 2删除消息截图"),userId:$.string().describe("员工用户 ID"),userName:$.string().optional().describe("员工名"),usePhone:$.string().optional().describe("员工手机号"),partnerId:$.string().optional().describe("员工工号"),companyCode:$.string().optional().describe("公司码"),nickName:$.string().optional().describe("截图对话好友或群昵称"),url:$.string().optional().describe("截图地址(OSS,多图分隔符上游混用 ; 或 ,;可能经签名/CDN 改写)"),source:$.number().optional().describe("来源:0未知 1app 2pc"),packageName:$.string().optional().describe("来源应用包名:com.tencent.mm 微信 / com.whatsapp(区分微信与 WhatsApp,旧版本不传默认微信)")}).passthrough())}).passthrough(),examples:[{description:"查询风险消息",input:{start_time:"2026-08-01 00:00:00",end_time:"2026-08-05 23:59:59"},output:{pageNum:1,total:1,data:[{id:900001,shotTime:1754200000000,type:1,userId:"u_fabricated000000000000000000001",userName:"张三",usePhone:"",partnerId:"E0001",companyCode:"fabricated",nickName:"客户李四",url:"https://example.invalid/shot0001.jpg",source:1,packageName:"com.tencent.mm"}]}}],sideEffects:["network"],handler:async(n)=>{let q=n.dept_id||await S();return await D("get_wechat_screenshot_list",{pageNum:n.page_num,size:n.page_size,timeS:a2(n.start_time),timeE:a2(n.end_time),department:q,...n.user_id?{userId:n.user_id}:{}})}};var Tn="crm",z1=$.union([$.string(),$.number()]).transform((n)=>String(n)),hn=$.union([$.string(),$.number()]).transform((n)=>String(n)).refine((n)=>n.length>0,"不能为空");function e0(n){return String(n).padStart(2,"0")}function HW(){let n=new Date;return`${n.getFullYear()}-${e0(n.getMonth()+1)}-${e0(n.getDate())}`}function QW(){let n=new Date;return`${n.getFullYear()}-${e0(n.getMonth()+1)}-${e0(n.getDate())} ${e0(n.getHours())}:${e0(n.getMinutes())}:${e0(n.getSeconds())}`}function XW(n){let q=new Date(Date.now()-n*86400000);return`${q.getFullYear()}-${e0(q.getMonth()+1)}-${e0(q.getDate())} 00:00:00`}function JW(n){if(typeof n==="number")return n;let q=n.includes(" ")?n.replace(" ","T"):`${n}T00:00:00`,H=Date.parse(`${q}+08:00`);if(Number.isNaN(H))throw Error(`无法解析时间: ${n}(支持 YYYY-MM-DD / YYYY-MM-DD HH:mm:ss / 毫秒时间戳)`);return H}var H$=$.union([$.number(),$.string()]).transform((n)=>{try{return JW(n)}catch{return Number.NaN}}).refine((n)=>!Number.isNaN(n),"时间格式无法解析(支持 YYYY-MM-DD / YYYY-MM-DD HH:mm:ss / 毫秒时间戳)").optional(),Q$={name:"crm.wechat.search-talker",description:'按关键词模糊搜索某员工微信通讯录(匹配昵称/备注/显示名),单聊和群聊都会命中。返回 {list: [...]}(数组包在 list 键下,无分页)。行内 nickName 可能带 "(备注名)" 后缀。',category:"crm",pluginName:Tn,parameters:$.object({wechat_id:hn.describe("员工微信 ID(来自 user-sale-list 的 wechatId 字段)"),keyword:$.string().min(1).describe("模糊搜索词,单字可命中;不支持表情")}),returns:$.object({list:$.array($.object({friendWechatId:$.string().describe("对方微信 ID(chat-history 的 friend_id 入参)"),nickName:$.string().optional().describe('昵称(可能带 "(备注名)" 后缀)'),displayName:$.string().optional().describe("显示名"),memberCount:$.number().optional().describe("群人数,0=非群"),messageCount:$.number().optional().describe("消息数"),remarkName:$.string().optional().describe("备注名"),headUrl:$.string().optional().describe("头像 URL"),originHeadUrl:$.string().optional().describe("原始头像 URL"),isCustomer:$.string().optional().describe("是否客户:0/1(字符串形态)")}).passthrough()).describe("命中行(无分页)")}).passthrough(),examples:[{description:"搜索通讯录",input:{wechat_id:"wxid_xxx",keyword:"张"},output:{list:[{friendWechatId:"wxid_fabricated0002",nickName:"张三(小张)",displayName:"张三(小张)",memberCount:0,messageCount:5,remarkName:"小张",headUrl:"https://example.invalid/b.jpg",originHeadUrl:"https://example.invalid/b.jpg",isCustomer:""}]}}],sideEffects:["network"],handler:async({wechat_id:n,keyword:q})=>{return await D("wechat_search_talker",{wechatId:n,keyword:q})}},X$={name:"crm.wechat.user-and-friend-info",description:'查"哪个员工(销售)的微信"和"指定好友"的一对一详情。friend_id 为空时只返回员工侧信息。员工头像字段为 HeadImageUrl(大写 H,后端历史拼写)。',category:"crm",pluginName:Tn,parameters:$.object({wechat_id:hn.describe("员工微信 ID"),friend_id:z1.optional().default("").describe("好友微信 ID(来自 search-talker / talker-list / friend-list),空则只查员工侧")}),returns:$.object({wechatId:$.string().describe("员工微信 ID"),userId:$.string().describe("员工用户 ID"),saleName:$.string().optional().describe("员工微信昵称"),realName:$.string().optional().describe("员工名"),salePhone:$.string().optional().describe("公司设置手机号"),alias:$.string().optional().describe("员工微信号"),departmentId:$.string().optional().describe("部门 ID"),headImageUrl:$.string().optional().describe("员工头像 URL"),HeadImageUrl:$.string().optional().describe("员工头像 URL(大写 H 拼写如此,与 headImageUrl 并存同值)"),friendId:$.string().optional().describe("好友微信 ID(带 friend_id 查询时返回)"),friendName:$.string().optional().describe("好友昵称"),friendAlias:$.string().optional().describe("好友微信号"),friendRemark:$.string().optional().describe("好友备注名"),friendHeadImageUrl:$.string().optional().describe("好友头像 URL"),friendWxPhone:$.string().optional().describe("好友微信绑定手机号")}).passthrough(),examples:[{description:"查双方信息",input:{wechat_id:"wxid_xxx",friend_id:"wxid_yyy"},output:{wechatId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",saleName:"客服小张",realName:"张三",salePhone:"",alias:"xiaozhang0001",departmentId:"D0001",headImageUrl:"https://example.invalid/a.jpg",HeadImageUrl:"https://example.invalid/a.jpg",friendId:"wxid_fabricated0002",friendName:"客户甲",friendAlias:"jia0001",friendRemark:"",friendHeadImageUrl:"https://example.invalid/b.jpg",friendWxPhone:""}}],sideEffects:["network"],handler:async({wechat_id:n,friend_id:q})=>{return await D("wechat_get_user_and_friend_info",{wechatId:n,...q?{friendId:q}:{}})}},J$={name:"crm.wechat.talker-list",description:"查某员工微信的最近会话列表:type=1 单聊会话(首行可能是文件传输助手,属正常数据),type=2 群聊。翻页只看返回的 hasMore。",category:"crm",pluginName:Tn,parameters:$.object({wechat_id:hn.describe("员工微信 ID"),type:$.number().int().refine((n)=>n===1||n===2,"type 必须为 1(单聊) 或 2(群聊)").describe("1=单聊会话 2=群聊"),page_number:$.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:$.number().int().min(1).optional().default(20).describe("每页条数"),is_del:$.number().int().optional().default(0).describe("删除标记")}),returns:$.object({topCount:$.number().optional().describe("type=1 时的会话总数"),hasMore:$.boolean().optional().describe("是否还有下一页"),page:$.array($.object({friendWechatId:$.string().describe("对方微信 ID(单聊=好友 wxid、群=xxx@chatroom、文件传输助手=filehelper;chat-history 的 friend_id 入参)"),nickName:$.string().optional().describe("昵称(文件传输助手等系统会话也有)"),displayName:$.string().optional().describe('显示名("昵称(备注)" / "群名(人数)" 拼接格式)'),memberCount:$.number().optional().describe("群人数,0=非群"),messageCount:$.number().optional().describe("消息数"),remarkName:$.string().optional().describe("备注名"),lastChatTime:$.string().optional().describe("最近聊天时间 yyyy-MM-dd HH:mm:ss"),headUrl:$.string().optional().describe("头像 URL"),originHeadUrl:$.string().optional().describe("原始头像 URL"),originDisplayName:$.string().optional().describe("原始显示名(群聊行)"),showHead:$.number().optional().describe("置顶标记:-1 置顶 0 不置顶"),isCustomer:$.string().optional().describe("是否客户:0/1(字符串形态)")}).passthrough()).describe("会话行(type=1 单聊 / type=2 群聊)")}).passthrough(),examples:[{description:"查会话列表",input:{wechat_id:"wxid_xxx",type:1},output:{topCount:30,hasMore:!1,page:[{nickName:"文件传输助手",displayName:"文件传输助手",memberCount:0,headUrl:"https://example.invalid/f.jpg",isCustomer:"",friendWechatId:"filehelper",showHead:-1,originHeadUrl:"https://example.invalid/f.jpg"},{messageCount:2,nickName:"客户甲",displayName:"客户甲",memberCount:0,headUrl:"https://example.invalid/b.jpg",remarkName:"",isCustomer:"",friendWechatId:"wxid_fabricated0002",showHead:0,lastChatTime:"2026-09-18 16:43:44",originHeadUrl:"https://example.invalid/b.jpg"}]}}],sideEffects:["network"],handler:async(n)=>{return await D("wechat_talker_list",{wechatId:n.wechat_id,type:n.type,pageNumber:n.page_number,pageSize:n.page_size,isDel:n.is_del})}},w$={name:"crm.wechat.chat-history",description:"拉取某员工微信与指定好友(或群 xxx@chatroom、或文件传输助手 filehelper)的聊天记录,按时间升序。翻页取更早消息:直接把本页返回的 end 作为下次的 end 传入(end 游标 = 本页最早一条消息前 1ms);hasLast=false 时没有更早消息;无更早消息时 end=1514735999000(后端下限哨兵,非错误)。",category:"crm",pluginName:Tn,parameters:$.object({wechat_id:hn.describe("员工微信 ID"),friend_id:hn.describe("好友微信 ID 或 xxx@chatroom(群)或 filehelper(文件传输助手)"),start:H$.describe("开始时间,毫秒时间戳或 YYYY-MM-DD[ HH:mm:ss](北京时间),空则 30 天前"),end:H$.describe("结束时间,毫秒时间戳或日期串,空则当前时间"),types:$.string().optional().default("").describe("消息类型筛选(逗号分隔的数字),空查全部")}),returns:$.object({messages:$.array($.object({type:$.number().describe("消息类型(如 1 文本、-2 系统时间分隔行;行键随类型多态)"),timestamp:$.number().describe("消息毫秒时间戳"),text:$.string().optional().describe("消息内容(分隔行为时间文案)"),messageType:$.string().optional().describe("type 的字符串形态"),msgSvrId:$.string().optional().describe("消息服务端 ID"),talker:$.string().optional().describe("发送者微信 ID"),oriTalker:$.string().optional().describe("原始发送者微信 ID(群聊内为实际发言人)"),mine:$.boolean().optional().describe("是否员工本人发送"),name:$.string().optional().describe("发送者昵称"),headUrl:$.string().optional().describe("发送者头像 URL"),friendWxRemark:$.string().optional().describe("好友备注名"),roomid:$.string().optional().describe("群 ID(单聊为空串)"),wechatId:$.string().optional().describe("员工微信 ID"),isDel:$.string().optional().describe("是否删除:1 已删除 0 正常(字符串形态)"),isFriend:$.string().optional().describe("发送者是否好友:0/1(字符串形态)"),createTime:$.number().optional().describe("创建毫秒时间戳"),version:$.number().optional().describe("版本毫秒时间戳(上游未文档化)"),hasHead:$.boolean().optional().describe("是否有头像")}).passthrough()).describe("消息行(按时间升序,行键随消息类型多态)"),hasLast:$.boolean().optional().describe("是否还有更早消息(false=已到底)"),start:$.number().optional().describe("毫秒时间戳(本页最新一条 +1ms;键缺失=无更早消息)"),end:$.number().optional().describe("翻页游标:本页最早一条 -1ms,取更早一页时作为下次 end 传入;无更早消息时=1514735999000 哨兵")}).passthrough(),examples:[{description:"拉最近 30 天聊天记录",input:{wechat_id:"wxid_xxx",friend_id:"wxid_yyy"},output:{hasLast:!1,start:1789114225000,messages:[{type:-2,messageType:"-2",text:"2026-09-10 16:43",hasHead:!1,timestamp:1789029824000,roomid:"",isDel:"0"},{type:1,messageType:"1",timestamp:1789029824000,text:"请问什么时候发货?",msgSvrId:"7417629815179554246",talker:"wxid_fabricated0002",oriTalker:"wxid_fabricated0002",mine:!1,name:"客户甲",headUrl:"https://example.invalid/b.jpg",friendWxRemark:"",roomid:"",wechatId:"wxid_fabricated0001",isDel:"0",isFriend:"1",createTime:1789029824000,version:1789030709149,hasHead:!0}],end:1789029823999}}],sideEffects:["network"],handler:async(n)=>{let q=n.start??Date.now()-2592000000,H=n.end??Date.now();return await D("wechat_chat_history",{wechatId:n.wechat_id,friendId:n.friend_id,start:q,end:H,...n.types?{types:n.types}:{}})}},W$={name:"crm.wechat.chat-search",description:"跨员工/跨会话的聊天记录全文搜索(跨度不可超过 3 个月),命中行自带会话定位信息,再用 chat-history 拉全量上下文。wx_id / search_user_id / search_dept_id 三选一必填。",category:"crm",pluginName:Tn,parameters:$.object({page_num:$.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:$.number().int().min(1).optional().default(20).describe("每页条数"),keyword:$.string().min(1).describe("搜索词"),start:$.string().optional().default("").describe("开始时间 YYYY-MM-DD HH:mm:ss,空则 30 天前 00:00:00"),end:$.string().optional().default("").describe("结束时间 YYYY-MM-DD HH:mm:ss,空则当前时间;与 start 跨度 ≤ 3 个月"),wx_id:z1.optional().default("").describe("范围限定:员工微信 ID(三选一)"),search_user_id:z1.optional().default("").describe("范围限定:员工用户 ID(三选一)"),search_dept_id:z1.optional().default("").describe("范围限定:部门 ID(三选一)"),friend_id:z1.optional().default("").describe("限定与某好友的会话(可选)")}).superRefine((n,q)=>{if(!n.wx_id&&!n.search_user_id&&!n.search_dept_id)q.addIssue({code:"custom",message:"wx_id / search_user_id / search_dept_id 三选一必填"})}),returns:$.object({total:$.number().describe("命中总数"),pageNumber:$.number().describe("页码"),pageSize:$.number().describe("每页条数"),page:$.array($.object({wechatId:$.string().describe("员工微信 ID"),talker:$.string().describe("发送者微信 ID"),msgSvrId:$.string().describe("消息服务端 ID"),type:$.number().optional().describe("消息类型(1 文本等)"),messageType:$.string().optional().describe("type 的字符串形态"),timestamp:$.number().optional().describe("消息毫秒时间戳"),time:$.string().optional().describe("消息时间 yyyy-MM-dd HH:mm:ss"),text:$.string().optional().describe("消息内容"),mine:$.boolean().optional().describe("是否员工本人发送"),oriTalker:$.string().optional().describe("原始发送者微信 ID(群聊内为实际发言人)"),name:$.string().optional().describe("发送者昵称"),headUrl:$.string().optional().describe("发送者头像 URL"),friendWxRemark:$.string().optional().describe("好友备注名"),roomid:$.string().optional().describe("群 ID(单聊为空串)"),isDel:$.string().optional().describe("是否删除:1 已删除 0 正常(字符串形态)"),hasHead:$.boolean().optional().describe("是否有头像")}).passthrough()).describe("命中消息行(自带会话定位信息,chat-history 可拉全量上下文)")}).passthrough(),examples:[{description:"全局搜索关键词",input:{keyword:"退款",search_dept_id:"42977E55..."},output:{total:1,pageNumber:1,pageSize:20,page:[{wechatId:"wxid_fabricated0001",talker:"wxid_fabricated0002",msgSvrId:"255690560369352248",type:1,messageType:"1",timestamp:1789012847000,time:"2026-09-10 12:00:47",text:"这个订单可以退款吗",mine:!1,oriTalker:"wxid_fabricated0002",name:"客户甲",headUrl:"https://example.invalid/b.jpg",friendWxRemark:"",roomid:"",isDel:"0",hasHead:!0}]}}],sideEffects:["network"],handler:async(n)=>{return await D("wechat_search_content",{pageNum:n.page_num,pageSize:n.page_size,keyword:n.keyword,start:n.start||XW(30),end:n.end||QW(),...n.wx_id?{wxId:n.wx_id}:{},...n.search_user_id?{searchUserId:n.search_user_id}:{},...n.search_dept_id?{searchDeptId:n.search_dept_id}:{},...n.friend_id?{friendId:n.friend_id}:{}})}},x$={name:"crm.wechat.friend-list",description:"查某员工微信的好友全量列表(按最后聊天时间降序)。start_date/end_date 实测不筛行(返回全量好友),仅影响行内 sendNum/receiveNum/messageCount 统计窗口,空则窗口不限。翻页依据返回的 basicResult.total / pageNum / pageSize。行内 lastChatTime 为毫秒时间戳;friendWxId 是 chat-history / user-and-friend-info 的 friend_id 入参。",category:"crm",pluginName:Tn,parameters:$.object({wechat_id:hn.describe("员工微信 ID"),type:$.number().int().refine((n)=>n===1||n===2,"type 必须为 1(个人) 或 2(群)").optional().default(1).describe("好友类型:1 个人(默认)/ 2 群"),start_date:$.string().optional().default("").describe("加好友日期下限 YYYY-MM-DD,空则不限"),end_date:$.string().optional().default("").describe("加好友日期上限 YYYY-MM-DD,空则不限"),page:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().optional().default(20).describe("每页条数"),sales_name:$.string().optional().default("").describe("好友姓名模糊搜索(匹配昵称/备注/微信号/手机号)")}),returns:$.object({displayStatus:$.string().optional().describe('显示状态标记(上游未文档化,实测 "0")'),basicResult:$.object({pageNum:$.number().optional().describe("页码"),pageSize:$.number().optional().describe("每页条数"),total:$.number().describe("好友/群总数"),data:$.array($.object({friendWxId:$.string().describe("好友/群微信 ID(单聊=好友 wxid、群=xxx@chatroom;chat-history 的 friend_id 入参)"),wxId:$.string().describe("所属员工微信 ID"),userId:$.string().describe("所属员工用户 ID"),friendWxNickname:$.string().optional().describe("好友昵称/群名"),friendWxNicknameReverse:$.string().optional().describe("好友昵称倒序串(排序用)"),friendWxAlias:$.string().optional().describe("好友微信号"),friendWxRemark:$.string().optional().describe("好友备注名"),friendWxPhone:$.string().optional().describe("好友微信绑定手机号"),friendHeadImageUrl:$.string().optional().describe("好友/群头像 URL"),saleName:$.string().optional().describe("员工微信昵称"),realName:$.string().optional().describe("员工名"),alias:$.string().optional().describe("员工微信号"),wechatPhone:$.string().optional().describe("员工微信绑定手机号"),phone:$.string().optional().describe("员工公司手机号"),description:$.string().optional().describe("好友个性签名"),region:$.string().optional().describe("好友地区"),gender:$.string().optional().describe("微信性别码(字符串形态)"),encryptUsername:$.string().optional().describe("加密用户名"),lastChatTime:$.number().optional().describe("最后聊天毫秒时间戳(从未聊天缺键)"),messageCount:$.number().optional().describe("窗口内消息数"),receiveNum:$.number().optional().describe("窗口内接收条数"),sendNum:$.number().optional().describe("窗口内发送条数"),friendTypeYunke:$.number().optional().describe("好友类型:1 个人 2 群"),friendType:$.string().optional().describe("同 friendTypeYunke 的字符串形态"),addTime:$.string().optional().describe("加好友时间 yyyy-MM-dd HH:mm:ss(个人好友)"),createTime:$.string().optional().describe("记录入库时间 yyyy-MM-dd HH:mm:ss"),version:$.string().optional().describe("数据版本时间 yyyy-MM-dd HH:mm:ss"),deptName:$.string().optional().describe("部门名"),deptRouteName:$.string().optional().describe("部门层级名"),deptRoute:$.array($.string()).optional().describe("部门 ID 层级"),contactLabelIds:$.string().optional().describe("标签 ID 串"),contactLabelValues:$.string().optional().describe("标签名串"),noteDes:$.string().optional().describe("备注说明"),friendNum:$.number().optional().describe("群内自己好友数(type=2)"),friendCount:$.number().optional().describe("群人数(type=2)"),ownerWchatId:$.string().optional().describe("群主微信 ID(type=2)"),ownerName:$.string().optional().describe("群主昵称(type=2)"),ownerAlias:$.string().optional().describe("群主微信号(type=2)"),ownerImage:$.string().optional().describe("群主头像 URL(type=2)"),friendState:$.number().optional().describe("好友状态:0 未处理 1 已处理 2 忽略"),deleteFlag:$.number().optional().describe("删除标记"),resolveState:$.number().optional().describe("重复好友处理状态:0 未处理 1 忽略 2 已处理 3 取消跟进"),userStatus:$.number().optional().describe("用户状态(上游未文档化)"),verifyFlag:$.number().optional().describe("微信 verifyFlag 标记(上游未文档化)"),addType:$.number().optional().describe("添加方式码(上游未文档化)"),fromType:$.string().optional().describe("好友来源渠道码(字符串形态)"),domainList:$.string().optional().describe("上游未文档化"),bindStatus:$.number().optional().describe("绑定状态(上游未文档化)"),isBlock:$.number().optional().describe("是否拉黑(上游未文档化)"),isQyFriend:$.number().optional().describe("是否企业微信好友"),isReFriend:$.number().optional().describe("是否参与重复好友统计:0参与 1不参与(数字形态)"),dataFrom:$.number().optional().describe("数据来源:1 云客手机 2 微小助"),companyCode:$.string().optional().describe("公司码")}).passthrough()).describe("好友/群行(type=1 个人 type=2 群)")}).passthrough()}).passthrough(),examples:[{description:"查好友全量列表",input:{wechat_id:"wxid_xxx"},output:{displayStatus:"0",basicResult:{pageNum:1,pageSize:20,total:110,data:[{friendWxId:"wxid_fabricated0002",wxId:"wxid_fabricated0001",userId:"u_fabricated000000000000000000001",friendWxNickname:"客户甲",friendWxNicknameReverse:"甲户客",friendWxAlias:"jia0001",friendWxRemark:"",friendWxPhone:"",friendHeadImageUrl:"https://example.invalid/b.jpg",saleName:"客服小张",realName:"张三",alias:"xiaozhang0001",wechatPhone:"",phone:"",description:"天天开心",region:"北京 朝阳",gender:"2",encryptUsername:"v3_020b3826fd0301...",lastChatTime:1789029824000,messageCount:3,receiveNum:3,sendNum:0,friendTypeYunke:1,friendType:"1",createTime:"2026-06-15 16:29:07",version:"2026-09-10 16:58:29",deptName:"销售一部",deptRouteName:"销售一部",deptRoute:["D0001"],contactLabelIds:"",friendState:0,deleteFlag:0,resolveState:0,userStatus:1,verifyFlag:0,addType:1,fromType:"15",domainList:"3",bindStatus:1,isBlock:0,isQyFriend:0,isReFriend:0,dataFrom:1,companyCode:"qeg4ep"}]}}}],sideEffects:["network"],handler:async(n)=>{return await D("wechat_friend_list_es",{wechatId:n.wechat_id,ymdStart:n.start_date||"0000-00-00",ymdEnd:n.end_date||HW(),pageNum:n.page,pageSize:n.page_size,friendTypeYunke:String(n.type),...n.sales_name?{salesname:n.sales_name}:{}})}},Y$={name:"crm.wechat.friend-circle-list",description:"查某员工微信发布的朋友圈列表。翻页看返回的 hashNext(字段名拼写如此)。注意:返回行内 createTime 为秒级时间戳字符串;图片地址如为签名 URL 有效期有限,需尽快取用。",category:"crm",pluginName:Tn,parameters:$.object({wechat_id:hn.describe("员工微信 ID"),page_num:$.number().int().min(1).optional().default(1).describe("页码"),page_size:$.number().int().min(1).optional().default(10).describe("每页条数"),start_time:$.string().optional().default("").describe("开始日期 YYYY-MM-DD(与 end_time 成对传,空则不限)"),end_time:$.string().optional().default("").describe("结束日期 YYYY-MM-DD(与 start_time 成对传)")}),returns:$.object({hashNext:$.boolean().optional().describe("是否还有下一页(拼写如此)"),pageNum:$.number().optional().describe("页码回显"),saleNickName:$.string().optional().describe("员工微信昵称"),saleAlias:$.string().optional().describe("员工微信号"),headImageUrl:$.string().optional().describe("员工头像 URL"),bgImg:$.string().optional().describe("朋友圈背景图 URL(签名 URL,有效期有限)"),data:$.array($.object({id:$.string().describe("朋友圈记录 ID"),wechatId:$.string().optional().describe("所属员工微信 ID"),friendsterWXId:$.string().optional().describe("朋友圈所属微信 ID"),friendsterName:$.string().optional().describe("朋友圈所属昵称"),friendsterWXIdImg:$.string().optional().describe("朋友圈所属头像 URL"),type:$.string().optional().describe("内容类型:1 文字+图片 2 纯文字 3 分享 15 小视频(字符串形态)"),subType:$.string().optional().describe("子类型码(上游未文档化)"),sourceType:$.string().optional().describe("来源码(上游未文档化)"),title:$.string().optional().describe("标题"),content:$.string().optional().describe("文字内容"),createTime:$.string().optional().describe("发布时间(秒级时间戳字符串)"),imgUrls:$.array($.string()).optional().describe("图片 ID 列表"),urls:$.array($.string()).optional().describe("图片 ID 列表(与 imgUrls 并存)"),imgUrlsList:$.array($.unknown()).optional().describe("图片列表(实测空数组,上游未文档化)"),praise:$.array($.object({wid:$.string().optional().describe("点赞者微信 ID"),praiseId:$.string().optional().describe("点赞者微信 ID"),name:$.string().optional().describe("点赞者昵称"),praiseName:$.string().optional().describe("点赞者昵称(与 name 并存)"),praiseImg:$.string().optional().describe("点赞者头像 URL"),delete:$.string().optional().describe("是否取消点赞:0/1(字符串形态)")}).passthrough()).optional().describe("点赞列表"),comment:$.array($.object({wid:$.string().optional().describe("评论者微信 ID"),responseId:$.string().optional().describe("评论者微信 ID(与 wid 并存)"),displayName:$.string().optional().describe("评论者昵称"),content:$.string().optional().describe("评论内容"),responseIdHeadImg:$.string().optional().describe("评论者头像 URL"),delete:$.number().optional().describe("是否删除:0/1(数字形态)")}).passthrough()).optional().describe("评论列表"),praiseNum:$.number().optional().describe("点赞数(praise[] 派生计数)"),praiseCount:$.number().optional().describe("点赞数(统计字段)"),commentNum:$.number().optional().describe("评论数(comment[] 派生计数)"),commentCount:$.number().optional().describe("评论数(统计字段)"),likeFlag:$.string().optional().describe("当前员工是否已点赞:0/1(字符串形态)"),pravited:$.string().optional().describe("私密标记(拼写如此)"),localFlag:$.string().optional().describe("本地标记(上游未文档化)"),localPrivate:$.string().optional().describe("本地私密标记(上游未文档化)"),stringSeq:$.string().optional().describe("上游未文档化"),snsId:$.string().optional().describe("朋友圈 sns ID"),version:$.string().optional().describe("数据版本毫秒时间戳字符串"),head:$.string().optional().describe("实测为 yyyymmdd 日期串(PC 注释称头像,与实测不符)"),circleOfFriendsCount:$.number().optional().describe("朋友圈数"),companyCode:$.string().optional().describe("公司码"),pageNum:$.number().optional().describe("页码回显(行内)"),pageSize:$.number().optional().describe("每页条数回显(行内)")}).passthrough()).describe("朋友圈行(按发布时间倒序)")}).passthrough(),examples:[{description:"查朋友圈",input:{wechat_id:"wxid_xxx"},output:{hashNext:!1,pageNum:1,saleNickName:"客服小张",saleAlias:"xiaozhang0001",headImageUrl:"https://example.invalid/a.jpg",bgImg:"https://example.invalid/bg.jpg",data:[{id:"6a2fb9cbd220827d6e78bac2",wechatId:"wxid_fabricated0001",friendsterWXId:"wxid_fabricated0001",friendsterName:"客服小张",friendsterWXIdImg:"https://example.invalid/a.jpg",type:"1",subType:"0",sourceType:"4",title:"",content:"今日上新",createTime:"1758512560",imgUrls:["14751472530557121080"],urls:["14751472530557121080"],imgUrlsList:[],praise:[{wid:"wxid_fabricated0002",praiseId:"wxid_fabricated0002",name:"客户甲",praiseName:"客户甲",praiseImg:"https://example.invalid/b.jpg",delete:"0"}],comment:[{wid:"wxid_fabricated0002",responseId:"wxid_fabricated0002",displayName:"客户甲",content:"不错",responseIdHeadImg:"https://example.invalid/b.jpg",delete:0}],praiseNum:1,praiseCount:0,commentNum:1,commentCount:0,likeFlag:"0",pravited:"0",localFlag:"2",localPrivate:"0",stringSeq:"0000014751472529862505023",snsId:"-3695271543847046593",version:"1781512651811",head:"20250922",circleOfFriendsCount:0,companyCode:"qeg4ep",pageNum:1,pageSize:10}]}}],sideEffects:["network"],handler:async(n)=>{return await D("wechat_friendster_info",{wechatId:n.wechat_id,pageNum:n.page_num,pageSize:n.page_size,...n.start_time?{startTime:n.start_time}:{},...n.end_time?{endTime:n.end_time}:{}})}};var G$="crm",_$=$.union([$.string(),$.number()]).transform((n)=>String(n)),j4=$.union([$.array($.string()),$.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}),wW=$.union([$.array($.number()),$.string()]).transform((n)=>{if(Array.isArray(n))return n;try{return JSON.parse(n)}catch{return[n]}}).pipe($.array($.number())),WW=$.object({define:$.number().describe("0=系统列,1=自定义字段列"),fieldCode:$.string().describe("列标识:系统列为语义码(customerName/cellPhone/createdTime…),自定义列为字段 id 字符串,对应 crm.customer.list 行内 customFieldValues[].fieldId"),fieldType:$.number().describe("列类型:0文本 1数值 2单选 3多选 4日期 6多联系人 7地址 8地区 9附件 20/21级联;系统列另有自身取值"),showName:$.string().describe("列显示名(中文)"),hiddens:$.number().describe("是否隐藏")}),O$={name:"crm.customer.default-head",description:"查询客户列表的动态表头(列定义,含系统列与自定义列)。解读或筛选 crm.customer.list 返回的自定义字段前先取本命令:define=1 项的 fieldCode 即字段 id,等于 list 行内 customFieldValues[].fieldId。",category:"crm",pluginName:G$,parameters:$.object({list_type:$.number().int().optional().default(1).describe("列表类型:1=客户列表(默认)2=公海列表 3=AI列表 8=企业列表 9=企业模块客户;其他值报「无效的参数」")}),returns:$.object({defaultHead:$.array(WW)}).passthrough().describe("defaultHead 为全量列(系统列+自定义列,可达 79 项)。⚠️ 与 crm.customer.list 成对使用:list 行内 customFieldValues[].fieldId 对应本表 define=1 项的 fieldCode,用其 showName/fieldType 解释字段名与类型。另含 msg(审核通过的短信模板列表)/ otherInfo(特殊字段附加配置)/ multiContactsLimitSize / hasPrivelege* 任务按钮权限位"),examples:[{description:"查询客户列表表头(默认客户列表)",input:{},output:{defaultHead:[{define:0,fieldCode:"customerName",fieldType:0,showName:"姓名",hiddens:0},{define:1,fieldCode:"10639",fieldType:2,showName:"客户类型",hiddens:0}]}}],sideEffects:["network"],handler:async({list_type:n})=>{return await D("get_customer_default_head",{type:n})}},e2=(n)=>$.union([$.string(),$.number()]).describe(n),xW=$.object({fieldId:e2("自定义字段 id = crm.customer.default-head define=1 项的 fieldCode"),fieldName:$.string().describe("字段中文名(服务端回填)"),fieldValue:$.array($.union([$.string(),$.number()])).optional().describe("字段值(多选类字段为多元素)"),values:$.array($.union([$.string(),$.number()])).optional().describe("字段值(与 fieldValue 并存的别名键,上游未文档化二者差异)"),intValue_int:$.number().optional().describe("数值型字段的数值形态(上游未文档化)"),type:$.number().describe("字段类型,枚举同 default-head 的 fieldType(0文本 1数值 2单选 3多选 4日期…)")}).passthrough(),YW=$.object({id:$.string().describe("客户 id"),customerName:$.string().describe("客户名(受公司脱敏配置影响可能带 *)"),customerSerial:$.union([$.string(),$.number()]).optional().describe("客户编号;无编号的行缺失该键"),cellPhone:$.string().describe("手机号(受脱敏配置影响可能带 *)"),createdTime:$.string().describe("创建时间 yyyy-MM-dd HH:mm:ss"),customerSource:$.string().optional().describe("客户来源"),groupName:$.string().optional().describe("分组名(未分组为「待分组」)"),groupId:$.union([$.string(),$.number(),$.null()]).optional().describe("分组 id(仅已入组的行出现;实测偶发 null=未入组,与省略等义)"),progress:e2("沟通进度码").optional(),progressName:$.string().optional().describe("沟通进度名"),userName:$.string().optional().describe("跟进人名"),userKey:$.string().optional().describe("跟进人 userKey"),departmentName:$.string().optional().describe("跟进人部门名"),ownerDeptId:e2("归属部门 id").optional(),updateTime:$.string().optional().describe("更新时间 yyyy-MM-dd HH:mm:ss"),followTime:$.string().optional().describe("最近跟进时间 yyyy-MM-dd HH:mm:ss"),firstActionTime:$.string().optional().describe("首次通话时间(无记录时字段省略)"),lastActionTime:$.string().optional().describe("最近通话时间(无记录时字段省略)"),intensionLevel:e2("AI 意向度等级码(枚举语义见 crm.ai.customer-intention-list)").optional(),aiSummary:$.string().optional().describe("AI 分析摘要(仅已分析客户出现,上游未文档化结构)"),wechatID:$.string().optional().describe("客户微信 id(已匹配微信的行出现)"),regionName:$.string().optional().describe("地区名"),birthday:$.string().optional().describe("生日"),gender:$.string().optional().describe("性别"),email:$.string().optional().describe("邮箱"),qq:$.string().optional().describe("QQ"),position:$.string().optional().describe("职位"),customFieldValues:$.array(xW).optional().describe("自定义字段值(动态列的载体,字段清单与类型语义对照 crm.customer.default-head)")}).passthrough(),V$={name:"crm.customer.list",description:"分页查询私海客户列表(ES 检索),支持关键词/手机号/客户编号/部门/跟进人(user_query 额外含协作人维度)/进度/时间范围等多条件过滤。行内 customFieldValues 为自定义字段值;字段名与类型语义对照 crm.customer.default-head(其 define=1 项 fieldCode = 本命令 fieldId)。",category:"crm",pluginName:G$,parameters:$.object({page_index:$.number().int().min(1).optional().default(1).describe("页码,从 1 开始"),page_size:$.number().int().min(1).optional().default(20).describe("每页条数,默认 20;pageIndex×pageSize>100000 会被拒绝,深翻页改用条件收窄"),keyword:$.string().optional().default("").describe("关键词搜索"),search_phone:_$.optional().default("").describe("手机号搜索"),search_customer_name:$.string().optional().default("").describe("客户名搜索"),customer_serial:_$.optional().default("").describe("客户编号过滤,只能是数字,否则报错"),dept_id:$.string().optional().default("").describe("部门 id 过滤"),dept_ids:j4.optional().default([]).describe("部门 id 列表过滤"),follower_id:$.string().optional().default("").describe("单个跟进人 id 过滤"),follower_ids:j4.optional().default([]).describe("跟进人 id 列表过滤"),user_query:$.string().optional().default("").describe("用户 id 过滤:匹配跟进人 OR 协作人为该用户的客户(与 follower_id 仅跟进人不同,本参数含协作人维度);用户 id 取自 crm.org.department-tree 员工项(is_dept=false)或 crm.org.search"),progress:$.number().int().optional().describe("沟通进度过滤"),progress_list:wW.optional().describe("沟通进度列表过滤"),create_time_start:$.string().optional().default("").describe("创建时间下限 yyyy-MM-dd HH:mm:ss,与 create_time_end 成对传"),create_time_end:$.string().optional().default("").describe("创建时间上限 yyyy-MM-dd HH:mm:ss,与 create_time_start 成对传"),modify_time_start:$.string().optional().default("").describe("修改时间下限 yyyy-MM-dd HH:mm:ss,与 modify_time_end 成对传"),modify_time_end:$.string().optional().default("").describe("修改时间上限 yyyy-MM-dd HH:mm:ss,与 modify_time_start 成对传"),sort_field:$.string().optional().default("").describe("排序字段,如 createdTime"),sort_order:$.string().optional().default("").describe("排序方向:asc / desc"),customer_source:$.string().optional().default("").describe("客户来源过滤"),group_id:$.number().int().optional().describe("客户分组 id 过滤"),only_fetch_count:$.boolean().optional().default(!1).describe("仅取总条数;总数以返回的 total 为准(小结果集 list 仍可能带出)"),cus_ids:j4.optional().describe("指定客户 id 集合过滤")}),returns:$.object({total:$.number(),pageIndex:$.number(),pageSize:$.number(),currIndex:$.number().optional().describe("当前页起始偏移(深分页游标)"),list:$.array(YW)}).passthrough().describe("统计客户数/分布必须取全分页后汇总(total 大于已取行数时继续翻页);手机号/客户名受公司脱敏配置影响可能带 *;数据权限按登录用户派生,只能看到权限范围内的客户。行内还有大量功能位键(AI 分析/加微状态/备用字段 spareN 等,有值才出现),schema 未尽声明,靠 passthrough 透传"),examples:[{description:"按关键词分页查询客户",input:{keyword:"张",page_index:1,page_size:20},output:{total:66,pageIndex:1,pageSize:20,list:[{id:"ABF30825BA1C47008569580F2C11D81E",customerName:"张三",customerSerial:1361,cellPhone:"199****0008",customerSource:"企业导入-手动录入",groupName:"待分组",createdTime:"2026-09-08 16:52:04",userName:"李四",userKey:"U0002",departmentName:"销售一部",customFieldValues:[{fieldId:17607,fieldName:"年级",fieldValue:["一"],type:2}]}]}},{description:"仅取客户总数",input:{only_fetch_count:!0},output:{total:66,pageIndex:1,pageSize:20,list:[]}}],sideEffects:["network"],handler:async(n)=>{let q={pageIndex:n.page_index,pageSize:n.page_size};if(n.keyword)q.keyword=n.keyword;if(n.search_phone)q.searchPhone=n.search_phone;if(n.search_customer_name)q.searchCustomerName=n.search_customer_name;if(n.customer_serial)q.customerSerial=n.customer_serial;if(n.dept_id)q.deptId=n.dept_id;if(n.dept_ids.length)q.deptIds=n.dept_ids;if(n.follower_id)q.followerId=n.follower_id;if(n.follower_ids.length)q.followerIds=n.follower_ids;if(n.user_query)q.userQuery=n.user_query;if(n.progress!=null)q.progress=n.progress;if(n.progress_list?.length)q.progressList=n.progress_list;if(n.customer_source)q.customerSource=n.customer_source;if(n.group_id!=null)q.groupId=n.group_id;if(n.only_fetch_count)q.onlyFetchCount=!0;if(n.cus_ids?.length)q.cusIds=n.cus_ids;if(n.create_time_start||n.create_time_end)q.createTimeRange={start:n.create_time_start,end:n.create_time_end};if(n.modify_time_start||n.modify_time_end)q.modifyTimeRange={start:n.modify_time_start,end:n.modify_time_end};if(n.sort_field||n.sort_order)q.sort={field:n.sort_field,order:n.sort_order};return await D("query_customer_list",q)}};var v$={name:"crm",version:"1.0.0",commands:[l9,c9,d9,z9,r9,a9,e9,n7,$7,H7,W7,G7,O7,v7,K7,Q7,X7,J7,w7,k7,h7,T7,I7,u7,i7,o7,f7,l7,c7,d7,z7,t7,r7,a7,e7,s7,n$,$$,q$,Q$,X$,J$,w$,W$,x$,Y$,j7,L7,R7,N7,D7,C7,A7,U7,F7,m7,E7,P7,S7,O$,V$]};var _W="ai_task_wx_circle_of_friends_config",GW="WECHAT_MOMENTS";function K$(){let n=new Date,q=(H)=>String(H).padStart(2,"0");return`${n.getFullYear()}-${q(n.getMonth()+1)}-${q(n.getDate())} ${q(n.getHours())}:${q(n.getMinutes())}:${q(n.getSeconds())}`}function OW(n,q){let H=new Date(n.replace(" ","T"));H.setHours(H.getHours()+q);let Q=(X)=>String(X).padStart(2,"0");return`${H.getFullYear()}-${Q(H.getMonth()+1)}-${Q(H.getDate())} ${Q(H.getHours())}:${Q(H.getMinutes())}:${Q(H.getSeconds())}`}function VW(n){let q=new Date,H=(J)=>String(J).padStart(2,"0"),Q=`${q.getFullYear()}${H(q.getMonth()+1)}${H(q.getDate())}_${H(q.getHours())}${H(q.getMinutes())}${H(q.getSeconds())}`,X=n.slice(-8);return`朋友圈_${Q}_${X}`}function vW(){let n=O0();if(!n?.user_id)throw new K("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login' 登录");return n.user_id}async function B$(n){let q=vW(),H=n.startTime??K$(),Q=n.endTime??OW(H,1),X={taskType:GW,taskName:n.taskName,content:n.content,remark:n.remark,taskKey:VW(q),createTime:K$(),startTime:H,endTime:Q},J=`${Un}/api/v1/weixiaozhu/message/send`,w;try{w=await fetch(J,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:q,push_type:_W,text:X})})}catch(x){let Y=x instanceof Error?x.message:String(x);throw new K("EXECUTION_FAILED",`微小助服务不可达: ${Y}`)}if(!w.ok){let x=`HTTP ${w.status}`;try{let Y=await w.json();x=Y.detail??Y.message??x}catch{}throw new K("EXECUTION_FAILED",`微小助服务错误: ${x}`)}return(await w.json()).data}var KW="weixiaozhu",M$={name:"weixiaozhu.moments.send",description:"发送一条朋友圈推送任务到微小助 broker。user_id 自动从 crm 登录凭证读取。",category:"weixiaozhu",pluginName:KW,hidden:!0,parameters:$.object({content:$.string().min(1).describe("朋友圈文案"),remark:$.string().min(1).describe("朋友圈图片 URL(微小助 broker 固定字段名为 remark)"),task_name:$.string().optional().default("测试发朋友圈").describe('任务名称,默认"测试发朋友圈"'),start_time:$.string().optional().describe("发送开始时间,格式 YYYY-MM-DD HH:mm:ss,默认当前时间"),end_time:$.string().optional().describe("发送结束时间,格式 YYYY-MM-DD HH:mm:ss,默认 start_time + 1小时")}),returns:$.object({success:$.boolean(),data:$.record($.unknown()).nullable()}),examples:[{description:"发送朋友圈(最简调用)",input:{content:"今天天气真好!",remark:"https://example.com/img.jpg"},output:{success:!0,data:{}}},{description:"指定任务名和时间",input:{content:"新品上市!",remark:"https://example.com/product.jpg",task_name:"新品推广",start_time:"2026-04-15 10:00:00",end_time:"2026-04-15 11:00:00"},output:{success:!0,data:{}}}],sideEffects:["network"],handler:async({content:n,remark:q,task_name:H,start_time:Q,end_time:X})=>{return{success:!0,data:await B$({content:n,remark:q,taskName:H,startTime:Q,endTime:X})}}};var j$={name:"weixiaozhu",version:"1.0.0",featureFlag:"weixiaozhu",commands:[M$]};import{readFileSync as mW,existsSync as EW}from"node:fs";import{basename as PW,join as SW,resolve as bW}from"node:path";import{Buffer as kW}from"node:buffer";import{randomBytes as hW}from"node:crypto";import{Buffer as L4}from"node:buffer";import{writeFileSync as BW,mkdirSync as MW}from"node:fs";import{dirname as jW}from"node:path";var t1=10240,s2=50,LW=/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)/,RW=/"timestamp"\s*:\s*"([^"]+)"/,NW=/"timestamp"\s*:\s*(\d{9,14})/;function L$(n){let q=LW.exec(n);if(q){let X=Date.parse(q[1]);if(!Number.isNaN(X))return X}let H=RW.exec(n);if(H){let X=Date.parse(H[1]);if(!Number.isNaN(X))return X}let Q=NW.exec(n);if(Q){let X=Number(Q[1]);return X>1000000000000?X:X*1000}return null}function DW(n,q){let H=[];for(let Q=0;Q<n.length;Q++){let X=L$(n[Q]);if(X===null||X>=q)H.push(Q)}return H}function CW(n,q,H=s2){let Q=[];for(let w=0;w<n.length;w++)if(n[w].includes(q))Q.push(w);if(Q.length===0)return{indices:[],hits:0};let X=[];for(let w of Q){let W=Math.max(0,w-H),x=Math.min(n.length-1,w+H),Y=X[X.length-1];if(Y&&W<=Y[1]+1)Y[1]=Math.max(Y[1],x);else X.push([W,x])}let J=[];for(let[w,W]of X)for(let x=w;x<=W;x++)J.push(x);return{indices:J,hits:Q.length}}function AW(n,q=t1){if(L4.byteLength(n,"utf-8")<=q)return{line:n,truncated:!1};let H=Math.floor(q*0.6),Q=Math.floor(q*0.2),X=L4.byteLength(n,"utf-8");return{line:`${n.slice(0,H)}…[truncated ${X} bytes]…${n.slice(n.length-Q)}`,truncated:!0}}var R$="=== SLICE META ===",N$="=== END META ===";function D$(n,q){let{content:H,sinceMs:Q,grep:X,around:J=s2,maxLineBytes:w=t1}=q,W=H.split(/\r?\n/);if(W.length>0&&W[W.length-1]==="")W.pop();let x,Y,_;if(X!==void 0){let m=CW(W,X,J);x=m.indices,Y=m.hits,_=`grep:${X} around=${J}`}else x=DW(W,Q??0),Y=null,_=`since:${new Date(Q??0).toISOString()}`;let G=0,O=1/0,M=-1/0,A=[];for(let m of x){let{line:Z,truncated:f}=AW(W[m],w);if(f)G++;let i=L$(W[m]);if(i!==null){if(i<O)O=i;if(i>M)M=i}A.push(Z)}let L={source:n,rule:_,original_size:L4.byteLength(H,"utf-8"),original_lines:W.length,lines:A.length,hits:Y,time_range:O===1/0?null:[new Date(O).toISOString(),new Date(M).toISOString()],truncated_lines:G};return{content:[R$,JSON.stringify(L),N$,...A].join(`
363
+ `)+`
364
+ `,meta:L}}function n6(n){let q=n.split(/\r?\n/);if(q[0]!==R$||q[2]!==N$)return null;try{return JSON.parse(q[1])}catch{return null}}function C$(n,q){MW(jW(n),{recursive:!0}),BW(n,q.content,"utf-8")}import{homedir as UW}from"node:os";import{join as R4}from"node:path";function FW(){return process.env.YUNKE_CONFIG_DIR??R4(process.env.YUNKE_HOME_OVERRIDE??UW(),".yunke")}function N4(){return R4(FW(),"reports")}function $6(){return R4(N4(),"staging")}var TW="report";function IW(n){let q=new Date,H=(J,w=2)=>String(J).padStart(w,"0"),Q=`${q.getFullYear()}${H(q.getMonth()+1)}${H(q.getDate())}-${H(q.getHours())}${H(q.getMinutes())}${H(q.getSeconds())}`,X=hW(2).toString("hex").toUpperCase();return SW($6(),`${PW(n)}-${Q}-${X}.slice`)}var A$={name:"report.slice",description:"从日志/会话文件机械切片(--since 时间起点 或 --grep 关键词邻域,二选一),产物带 SLICE META 溯源头(源路径/切法/原始规模/时间范围),供 report.submit 打包上报。",category:"report",pluginName:TW,parameters:$.object({file:$.string().min(1).describe("源文件绝对路径(cli.log / wb main.log / 会话 jsonl 均可)"),since:$.string().optional().describe("时间起点切法:ISO 时间(含),保留该时刻至文件尾的行及所有无法提取时间的行;与 --grep 二选一"),grep:$.string().min(1).optional().describe("关键词切法:子串匹配(区分大小写),命中行 ± --around 行,重叠区间合并;与 --since 二选一"),around:$.number().int().min(0).max(1e4).optional().describe(`grep 邻域行数,默认 ${s2}`),out:$.string().optional().describe("输出文件路径,默认 ~/.yunke/reports/staging/ 自动命名"),max_line_bytes:$.number().int().min(64).optional().describe(`超长行截断阈值(字节,保头尾去中间),默认 ${t1}`)}).superRefine((n,q)=>{if(!n.since&&!n.grep)q.addIssue({code:"custom",message:"--since 与 --grep 必须二选一"});if(n.since&&n.grep)q.addIssue({code:"custom",message:"--since 与 --grep 只能二选一"});if(n.since&&Number.isNaN(Date.parse(n.since)))q.addIssue({code:"custom",message:`--since 不是合法时间: ${n.since}`})}),returns:$.object({out:$.string(),bytes:$.number(),lines:$.number(),hits:$.number().nullable(),time_range:$.array($.string()).nullable()}),examples:[{description:"按关键词切 wb 主进程日志(相关性锚定,围绕报错行取邻域)",input:{file:"C:/Users/me/AppData/Local/WorkBuddy/logs/main.log",grep:"VALIDATION_FAILED",around:50},output:{out:"~/.yunke/reports/staging/main.log-20260921-091503-A1B2.slice",bytes:20480,lines:210,hits:3,time_range:["2026-09-21T01:10:00.000Z","2026-09-21T01:15:30.000Z"]}},{description:"按时间起点切会话 JSONL(从最早相关轮次起全保留)",input:{file:"C:/Users/me/.workbuddy/projects/-d-work-abc/0e1f….jsonl",since:"2026-09-20T14:30:00+08:00"},output:{out:"~/.yunke/reports/staging/0e1f….jsonl-20260921-092000-C3D4.slice",bytes:51200,lines:88,hits:null,time_range:["2026-09-20T06:30:12.000Z","2026-09-20T07:02:40.000Z"]}}],sideEffects:["filesystem"],handler:async({file:n,since:q,grep:H,around:Q,out:X,max_line_bytes:J})=>{if(!EW(n))throw new K("VALIDATION_FAILED",`源文件不存在: ${n}`);let w=mW(n,"utf-8"),W=D$(bW(n),{content:w,sinceMs:q!==void 0?Date.parse(q):void 0,grep:H,around:Q,maxLineBytes:J??t1}),x=X??IW(n);return C$(x,W),{out:x,bytes:kW.byteLength(W.content,"utf-8"),lines:W.meta.lines,hits:W.meta.hits,time_range:W.meta.time_range}}};import{existsSync as Lx}from"node:fs";import{platform as Rx,release as Nx}from"node:os";import{randomBytes as uW}from"node:crypto";var yW="0123456789ABCDEFGHJKMNPQRSTVWXYZ",U$=6;function F$(n=new Date){let q=(w,W=2)=>String(w).padStart(W,"0"),H=`${n.getFullYear()}${q(n.getMonth()+1)}${q(n.getDate())}`,Q=`${q(n.getHours())}${q(n.getMinutes())}${q(n.getSeconds())}`,X=uW(U$),J="";for(let w=0;w<U$;w++)J+=yW[X[w]%32];return`RPT-${H}-${Q}-${J}`}function m$(n){return/^[A-Za-z0-9_-]{1,128}$/.test(n)}import{createRequire as ZW}from"module";var pW=ZW("/"),j1,gW,iW;try{j1=pW("worker_threads"),gW=j1.Worker,iW=j1.isMarkedAsUntransferable}catch(n){}var X0=Uint8Array,v0=Uint16Array,m4=Int32Array,E4=new X0([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),P4=new X0([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),E$=new X0([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),T$=function(n,q){var H=new v0(31);for(var Q=0;Q<31;++Q)H[Q]=q+=1<<n[Q-1];var X=new m4(H[30]);for(var Q=1;Q<30;++Q)for(var J=H[Q];J<H[Q+1];++J)X[J]=J-H[Q]<<5|Q;return{b:H,r:X}},j1=T$(E4,2),oW=j1.b,C4=j1.r;oW[28]=258,C4[258]=28;var I$=T$(P4,0),nj=I$.b,P$=I$.r,A4=new v0(32768);for(y=0;y<32768;++y)o0=(y&43690)>>1|(y&21845)<<1,o0=(o0&52428)>>2|(o0&13107)<<2,o0=(o0&61680)>>4|(o0&3855)<<4,A4[y]=((o0&65280)>>8|(o0&255)<<8)>>1;var o0,y,e1=function(n,q,H){var Q=n.length,X=0,J=new v0(q);for(;X<Q;++X)if(n[X])++J[n[X]-1];var w=new v0(q);for(X=1;X<q;++X)w[X]=w[X-1]+J[X-1]<<1;var W;if(H){W=new v0(1<<q);var x=15-q;for(X=0;X<Q;++X)if(n[X]){var Y=X<<4|n[X],_=q-n[X],G=w[n[X]-1]++<<_;for(var O=G|(1<<_)-1;G<=O;++G)W[A4[G]>>x]=Y}}else{W=new v0(Q);for(X=0;X<Q;++X)if(n[X])W[X]=A4[w[n[X]-1]++]>>15-n[X]}return W},In=new X0(288);for(y=0;y<144;++y)In[y]=8;var y;for(y=144;y<256;++y)In[y]=9;var y;for(y=256;y<280;++y)In[y]=7;var y;for(y=280;y<288;++y)In[y]=8;var y,q6=new X0(32);for(y=0;y<32;++y)q6[y]=5;var y,fW=e1(In,9,0);var lW=e1(q6,5,0);var u$=function(n){return(n+7)/8|0},y$=function(n,q,H){if(q==null||q<0)q=0;if(H==null||H>n.length)H=n.length;return new X0(n.subarray(q,H))};var cW=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],H6=function(n,q,H){var Q=Error(q||cW[n]);if(Q.code=n,Error.captureStackTrace)Error.captureStackTrace(Q,H6);if(!H)throw Q;return Q};var s0=function(n,q,H){H<<=q&7;var Q=q/8|0;n[Q]|=H,n[Q+1]|=H>>8},r1=function(n,q,H){H<<=q&7;var Q=q/8|0;n[Q]|=H,n[Q+1]|=H>>8,n[Q+2]|=H>>16},D4=function(n,q){var H=[];for(var Q=0;Q<n.length;++Q)if(n[Q])H.push({s:Q,f:n[Q]});var X=H.length,J=H.slice();if(!X)return{t:p$,l:0};if(X==1){var w=new X0(H[0].s+1);return w[H[0].s]=1,{t:w,l:1}}H.sort(function(d,z){return d.f-z.f}),H.push({s:-1,f:25001});var W=H[0],x=H[1],Y=0,_=1,G=2;H[0]={s:-1,f:W.f+x.f,l:W,r:x};while(_!=X-1)W=H[H[Y].f<H[G].f?Y++:G++],x=H[Y!=_&&H[Y].f<H[G].f?Y++:G++],H[_++]={s:-1,f:W.f+x.f,l:W,r:x};var O=J[0].s;for(var Q=1;Q<X;++Q)if(J[Q].s>O)O=J[Q].s;var M=new v0(O+1),A=U4(H[_-1],M,0);if(A>q){var Q=0,L=0,N=A-q,m=1<<N;J.sort(function(z,l){return M[l.s]-M[z.s]||z.f-l.f});for(;Q<X;++Q){var Z=J[Q].s;if(M[Z]>q)L+=m-(1<<A-M[Z]),M[Z]=q;else break}L>>=N;while(L>0){var f=J[Q].s;if(M[f]<q)L-=1<<q-M[f]++-1;else++Q}for(;Q>=0&&L;--Q){var i=J[Q].s;if(M[i]==q)--M[i],++L}A=q}return{t:new X0(M),l:A}},U4=function(n,q,H){return n.s==-1?Math.max(U4(n.l,q,H+1),U4(n.r,q,H+1)):q[n.s]=H},S$=function(n){var q=n.length;while(q&&!n[--q]);var H=new v0(++q),Q=0,X=n[0],J=1,w=function(x){H[Q++]=x};for(var W=1;W<=q;++W)if(n[W]==X&&W!=q)++J;else{if(!X&&J>2){for(;J>138;J-=138)w(32754);if(J>2)w(J>10?J-11<<5|28690:J-3<<5|12305),J=0}else if(J>3){w(X),--J;for(;J>6;J-=6)w(8304);if(J>2)w(J-3<<5|8208),J=0}while(J--)w(X);J=1,X=n[W]}return{c:H.subarray(0,Q),n:q}},a1=function(n,q){var H=0;for(var Q=0;Q<q.length;++Q)H+=n[Q]*q[Q];return H},Z$=function(n,q,H){var Q=H.length,X=u$(q+2);n[X]=Q&255,n[X+1]=Q>>8,n[X+2]=n[X]^255,n[X+3]=n[X+1]^255;for(var J=0;J<Q;++J)n[X+J+4]=H[J];return(X+4+Q)*8},b$=function(n,q,H,Q,X,J,w,W,x,Y,_){s0(q,_++,H),++X[256];var G=D4(X,15),O=G.t,M=G.l,A=D4(J,15),L=A.t,N=A.l,m=S$(O),Z=m.c,f=m.n,i=S$(L),d=i.c,z=i.n,l=new v0(19);for(var b=0;b<Z.length;++b)++l[Z[b]&31];for(var b=0;b<d.length;++b)++l[d[b]&31];var h=D4(l,7),k=h.t,r=h.l,e=19;for(;e>4&&!k[E$[e-1]];--e);var Zn=Y+5<<3,B0=a1(X,In)+a1(J,q6)+w,M0=a1(X,O)+a1(J,L)+w+14+3*e+a1(l,k)+2*l[16]+3*l[17]+7*l[18];if(x>=0&&Zn<=B0&&Zn<=M0)return Z$(q,_,n.subarray(x,x+Y));var k0,s,j0,nn;if(s0(q,_,1+(M0<B0)),_+=2,M0<B0){k0=e1(O,M,0),s=O,j0=e1(L,N,0),nn=L;var x6=e1(k,r,0);s0(q,_,f-257),s0(q,_+5,z-1),s0(q,_+10,e-4),_+=14;for(var b=0;b<e;++b)s0(q,_+3*b,k[E$[b]]);_+=3*e;var h0=[Z,d];for(var N1=0;N1<2;++N1){var pn=h0[N1];for(var b=0;b<pn.length;++b){var T0=pn[b]&31;if(s0(q,_,x6[T0]),_+=k[T0],T0>15)s0(q,_,pn[b]>>5&127),_+=pn[b]>>12}}}else k0=fW,s=In,j0=lW,nn=q6;for(var b=0;b<W;++b){var q0=Q[b];if(q0>255){var T0=q0>>18&31;if(r1(q,_,k0[T0+257]),_+=s[T0+257],T0>7)s0(q,_,q0>>23&31),_+=E4[T0];var gn=q0&31;if(r1(q,_,j0[gn]),_+=nn[gn],gn>3)r1(q,_,q0>>5&8191),_+=P4[gn]}else r1(q,_,k0[q0]),_+=s[q0]}return r1(q,_,k0[256]),_+s[256]},dW=new m4([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),p$=new X0(0),zW=function(n,q,H,Q,X,J){var w=J.z||n.length,W=new X0(Q+w+5*(1+Math.ceil(w/7000))+X),x=W.subarray(Q,W.length-X),Y=J.l,_=(J.r||0)&7;if(q){if(_)x[0]=J.r>>3;var G=dW[q-1],O=G>>13,M=G&8191,A=(1<<H)-1,L=J.p||new v0(32768),N=J.h||new v0(A+1),m=Math.ceil(H/3),Z=2*m,f=function(G6){return(n[G6]^n[G6+1]<<m^n[G6+2]<<Z)&A},i=new m4(25000),d=new v0(288),z=new v0(32),l=0,b=0,h=J.i||0,k=0,r=J.w||0,e=0;for(;h+2<w;++h){var Zn=f(h),B0=h&32767,M0=N[Zn];if(L[B0]=M0,N[Zn]=B0,r<=h){var k0=w-h;if((l>7000||k>24576)&&(k0>423||!Y)){_=b$(n,x,0,i,d,z,b,k,e,h-e,_),k=l=b=0,e=h;for(var s=0;s<286;++s)d[s]=0;for(var s=0;s<30;++s)z[s]=0}var j0=2,nn=0,x6=M,h0=B0-M0&32767;if(k0>2&&Zn==f(h-h0)){var N1=Math.min(O,k0)-1,pn=Math.min(32767,h),T0=Math.min(258,k0);while(h0<=pn&&--x6&&B0!=M0){if(n[h+j0]==n[h+j0-h0]){var q0=0;for(;q0<T0&&n[h+q0]==n[h+q0-h0];++q0);if(q0>j0){if(j0=q0,nn=h0,q0>N1)break;var gn=Math.min(h0,q0-2),I4=0;for(var s=0;s<gn;++s){var Y6=h-h0+s&32767,Pq=L[Y6],u4=Y6-Pq&32767;if(u4>I4)I4=u4,M0=Y6}}}B0=M0,M0=L[B0],h0+=B0-M0&32767}}if(nn){i[k++]=268435456|C4[j0]<<18|P$[nn];var y4=C4[j0]&31,Z4=P$[nn]&31;b+=E4[y4]+P4[Z4],++d[257+y4],++z[Z4],r=h+j0,++l}else i[k++]=n[h],++d[n[h]]}}for(h=Math.max(h,r);h<w;++h)i[k++]=n[h],++d[n[h]];if(_=b$(n,x,Y,i,d,z,b,k,e,h-e,_),!Y)J.r=_&7|x[_/8|0]<<3,_-=7,J.h=N,J.p=L,J.i=h,J.w=r}else{for(var h=J.w||0;h<w+Y;h+=65535){var _6=h+65535;if(_6>=w)x[_/8|0]=Y,_6=w;_=Z$(x,_+1,n.subarray(h,_6))}J.i=w}return y$(W,0,Q+u$(_)+X)},tW=function(){var n=new Int32Array(256);for(var q=0;q<256;++q){var H=q,Q=9;while(--Q)H=(H&1&&-306674912)^H>>>1;n[q]=H}return n}(),rW=function(){var n=-1;return{p:function(q){var H=n;for(var Q=0;Q<q.length;++Q)H=tW[H&255^q[Q]]^H>>>8;n=H},d:function(){return~n}}};var aW=function(n,q,H,Q,X){if(!X){if(X={l:1},q.dictionary){var J=q.dictionary.subarray(-32768),w=new X0(J.length+n.length);w.set(J),w.set(n,J.length),n=w,X.w=J.length}}return zW(n,q.level==null?6:q.level,q.mem==null?X.l?Math.ceil(Math.max(8,Math.min(13,Math.log(n.length)))*1.5):20:12+q.mem,H,Q,X)},g$=function(n,q){var H={};for(var Q in n)H[Q]=n[Q];for(var Q in q)H[Q]=q[Q];return H};var $0=function(n,q,H){for(;H;++q)n[q]=H,H>>>=8};function eW(n,q){return aW(n,q||{},0,0)}var i$=function(n,q,H,Q){for(var X in n){var J=n[X],w=q+X,W=Q;if(Array.isArray(J))W=g$(Q,J[1]),J=J[0];if(ArrayBuffer.isView(J))H[w]=[J,W];else H[w+="/"]=[new X0(0),W],i$(J,w,H,Q)}},k$=typeof TextEncoder<"u"&&new TextEncoder,sW=typeof TextDecoder<"u"&&new TextDecoder,nx=0;try{sW.decode(p$,{stream:!0}),nx=1}catch(n){}function un(n,q){if(q){var H=new X0(n.length);for(var Q=0;Q<n.length;++Q)H[Q]=n.charCodeAt(Q);return H}if(k$)return k$.encode(n);var X=n.length,J=new X0(n.length+(n.length>>1)),w=0,W=function(_){J[w++]=_};for(var Q=0;Q<X;++Q){if(w+5>J.length){var x=new X0(w+8+(X-Q<<1));x.set(J),J=x}var Y=n.charCodeAt(Q);if(Y<128||q)W(Y);else if(Y<2048)W(192|Y>>6),W(128|Y&63);else if(Y>55295&&Y<57344)Y=65536+(Y&1047552)|n.charCodeAt(++Q)&1023,W(240|Y>>18),W(128|Y>>12&63),W(128|Y>>6&63),W(128|Y&63);else W(224|Y>>12),W(128|Y>>6&63),W(128|Y&63)}return y$(J,0,w)}var F4=function(n){var q=0;if(n)for(var H in n){var Q=n[H].length;if(Q>65535)H6(9);q+=Q+4}return q},h$=function(n,q,H,Q,X,J,w,W){var x=Q.length,Y=H.extra,_=W&&W.length,G=F4(Y);if($0(n,q,w!=null?33639248:67324752),q+=4,w!=null)n[q++]=20,n[q++]=H.os;n[q]=20,q+=2,n[q++]=H.flag<<1|(J<0&&8),n[q++]=X&&8,n[q++]=H.compression&255,n[q++]=H.compression>>8;var O=new Date(H.mtime==null?Date.now():H.mtime),M=O.getFullYear()-1980;if(M<0||M>119)H6(10);if($0(n,q,M<<25|O.getMonth()+1<<21|O.getDate()<<16|O.getHours()<<11|O.getMinutes()<<5|O.getSeconds()>>1),q+=4,J!=-1)$0(n,q,H.crc),$0(n,q+4,J<0?-J-2:J),$0(n,q+8,H.size);if($0(n,q+12,x),$0(n,q+14,G),q+=16,w!=null)$0(n,q,_),$0(n,q+6,H.attrs),$0(n,q+10,w),q+=14;if(n.set(Q,q),q+=x,G)for(var A in Y){var L=Y[A],N=L.length;$0(n,q,+A),$0(n,q+2,N),n.set(L,q+4),q+=4+N}if(_)n.set(W,q),q+=_;return q},$x=function(n,q,H,Q,X){$0(n,q,101010256),$0(n,q+8,H),$0(n,q+10,H),$0(n,q+12,Q),$0(n,q+16,X)};function o$(n,q){if(!q)q={};var H={},Q=[];i$(n,"",H,q);var X=0,J=0;for(var w in H){var W=H[w],x=W[0],Y=W[1],_=Y.level==0?0:8,G=un(w),O=G.length,M=Y.comment,A=M&&un(M),L=A&&A.length,N=F4(Y.extra);if(O>65535)H6(11);var m=_?eW(x,Y):x,Z=m.length,f=rW();f.p(x),Q.push(g$(Y,{size:x.length,crc:f.d(),c:m,f:G,m:A,u:O!=w.length||A&&M.length!=L,o:X,compression:_})),X+=30+O+N+Z,J+=76+2*(O+N)+(L||0)+Z}var i=new X0(J+22),d=X,z=J-X;for(var l=0;l<Q.length;++l){var G=Q[l];h$(i,G.o,G,G.f,G.u,G.c.length);var b=30+G.f.length+F4(G.extra);i.set(G.c,G.o+b),h$(i,X,G,G.f,G.u,G.c.length,G.o,G.m),X+=16+b+(G.m?G.m.length:0)}return $x(i,X,Q.length,z,d),i}import{readFileSync as e$,readdirSync as s$,writeFileSync as Jx,mkdirSync as wx,unlinkSync as nq,statSync as Wx}from"node:fs";import{basename as c$,join as s1,resolve as xx}from"node:path";import{platform as Yx,release as _x}from"node:os";import{Buffer as Gx}from"node:buffer";var L1="[REDACTED]",qx=/(--[A-Za-z_][A-Za-z0-9_-]*)(?:=([^\s"',;&]+)|["']?\s*[, ]\s*["']?([A-Za-z0-9._~+/=-]+))/g,Hx=/"([A-Za-z_][A-Za-z0-9_-]*)"\s*:\s*(?:"([^"]*)"|([A-Za-z0-9_.+-]+))/g,f$=String.raw`(?:^|[\s,({"[])`,Qx=new RegExp(`${f$}([A-Za-z_][A-Za-z0-9_-]*)=([^\\s,;"'}\\]]+)`,"gm"),Xx=new RegExp(`${f$}([A-Za-z_][A-Za-z0-9_-]*)[ \\t]*:[ \\t]*([^\\s,;"'}\\]]+)`,"gm");function l$(n){let q=n;return q=q.replace(qx,(H,Q,X,J)=>{let w=Q.slice(2);if(!fn(w))return H;return X!==void 0?`${Q}=${L1}`:`${Q} ${L1}`}),q=q.replace(Hx,(H,Q,X,J)=>{if(!fn(Q))return H;return X!==void 0?`"${Q}":"${L1}"`:`"${Q}":${L1}`}),q=q.replace(Qx,(H,Q)=>fn(Q)?H.replace(/=.*$/,`=${L1}`):H),q=q.replace(Xx,(H,Q)=>fn(Q)?H.replace(/:[ \t]*.*$/,`: ${L1}`):H),j6(q)}var d$=102400,z$=2097152,t$=1048576,Ox=20971520,r$=20,Kn=(n)=>`${(n/1024).toFixed(1)}KB`;function S4(n){let q;try{q=e$(n,"utf-8")}catch{throw new K("VALIDATION_FAILED",`文件不可读: ${n}`)}let H=l$(q);return{text:H,bytes:Gx.byteLength(H,"utf-8")}}function a$(n,q,H){let Q=`${q}/${H}`,X=1;while(n.has(Q))Q=`${q}/${X}-${H}`,X++;return n.add(Q),Q}function Vx(){try{return s$(w2()).filter((q)=>/^cli\.log(\.\d+)?$/.test(q)).map((q)=>({name:q,data:e$(s1(w2(),q))}))}catch{return[]}}function vx(n){let q;try{q=s$(n).filter((Q)=>Q.endsWith(".zip"))}catch{return}if(q.length<=r$)return;let H=q.map((Q)=>{let X=0;try{X=Wx(s1(n,Q)).mtimeMs}catch{}return{n:Q,mtime:X}});H.sort((Q,X)=>Q.mtime-X.mtime);for(let{n:Q}of H.slice(0,H.length-r$))try{nq(s1(n,Q))}catch{}}function $q(n){let{reportId:q,description:H,analysisPath:Q,contextPaths:X,wbLogPaths:J,user:w,cliVersion:W,distType:x}=n,Y=[],_=S4(Q);if(_.bytes>d$)throw new K("VALIDATION_FAILED",`analysis.md 脱敏后 ${Kn(_.bytes)} 超过上限 ${Kn(d$)},请精简(时间线保留关键节点即可)`);let G=X.map((k)=>({path:k,...S4(k)})),O=G.reduce((k,r)=>k+r.bytes,0);if(O>z$)throw new K("VALIDATION_FAILED",`context 切片合计 ${Kn(O)} 超过上限 ${Kn(z$)},请用 report.slice --grep 缩小邻域或换更晚的 --since 起点`);let M=J.map((k)=>({path:k,...S4(k)})),A=M.reduce((k,r)=>k+r.bytes,0);if(A>t$)throw new K("VALIDATION_FAILED",`wb 日志切片合计 ${Kn(A)} 超过上限 ${Kn(t$)},请用 report.slice --grep 缩小邻域`);let L=Vx();if(L.length===0)Y.push("本机无 cli.log 命令流水(首次使用或日志目录被清理)");let N={},m=[],Z=new Set;N["analysis.md"]=un(_.text),m.push({path:"analysis.md",bytes:_.bytes,meta:n6(_.text)});let f=null,i=(k)=>{if(k?.time_range?.[0]){let r=Date.parse(k.time_range[0]);if(!Number.isNaN(r)&&(f===null||r<f))f=r}};for(let k of G){let r=a$(Z,"context",c$(k.path)),e=n6(k.text);N[r]=un(k.text),m.push({path:r,bytes:k.bytes,meta:e}),i(e)}for(let k of M){let r=a$(Z,"wb",c$(k.path)),e=n6(k.text);N[r]=un(k.text),m.push({path:r,bytes:k.bytes,meta:e}),i(e)}for(let k of L){let r=`cli/${k.name}`;N[r]=k.data,m.push({path:r,bytes:k.data.byteLength,meta:null})}let d={report_id:q,created_at:new Date().toISOString(),description:H,log_type:1,user:w,cli_version:W,dist_type:x,os:`${Yx()} ${_x()}`,files:m,earliest_traceable_time:f===null?null:new Date(f).toISOString(),note:"report_id 中时间段为上报时刻(本地时区);问题发生时间、时间线与归因猜测见 analysis.md"};N["manifest.json"]=un(JSON.stringify(d,null,2));let z=o$(N,{level:6}),l=n.zipMaxBytes??Ox;if(z.byteLength>l)throw new K("VALIDATION_FAILED",`zip 后 ${Kn(z.byteLength)} 超过上传上限 ${Kn(l)},请缩小 wb/context 切片范围`);let b=N4();wx(b,{recursive:!0});let h=s1(b,`${q}.zip`);return Jx(h,z),vx(b),{zipPath:h,totalBytes:z.byteLength,files:m,warnings:Y,earliestTraceableTime:d.earliest_traceable_time}}function qq(n){let q=[],H=$6(),Q=s1("a","b").slice(1,-1);for(let X of n){let J=xx(X);if(!J.startsWith(H+Q))continue;try{nq(J),q.push(J)}catch{}}return q}import{readFileSync as Kx}from"node:fs";import{basename as Bx}from"node:path";var Mx=120000,jx="/api/v1/cli-logs/upload";async function Hq(n){let{bundlePath:q,fields:H}=n,Q;try{Q=Kx(q)}catch{throw new K("VALIDATION_FAILED",`上报包不可读: ${q}`)}let X=async(x)=>{let Y=new FormData;Y.append("file",new Blob([new Uint8Array(Q)],{type:"application/zip"}),Bx(q));for(let[_,G]of Object.entries(H))if(G!==void 0&&G!=="")Y.append(_,G);return globalThis.fetch(`${W4()}${jx}`,{method:"POST",headers:{Authorization:`Bearer ${x}`},body:Y,signal:AbortSignal.timeout(Mx)})},J=await X(await f1());if(J.status===401)J=await X(await f1(!0));let w={};try{w=await J.json()}catch{w={}}if(J.status===200)return{uploadedAt:new Date().toISOString()};let W=w.message||"";if(J.status===401||J.status===403)throw new K("CONFIG_ERROR",`上传鉴权失败: ${W||`HTTP ${J.status}`},请重新运行 yunke crm.auth.login-web 登录`);if(J.status===413)throw new K("EXECUTION_FAILED","上报包超过服务端 20MB 上限(file too large),请缩小切片范围后重试");if(J.status===422)throw new K("VALIDATION_FAILED",`服务端校验失败(缺少 file 字段?): ${W||`HTTP ${J.status}`}`);throw new K("EXECUTION_FAILED",`上传失败: HTTP ${J.status} ${W||"服务端无响应体"}`.trim())}K0();var Q6=(()=>{return"npm"})();function Bn(){return Q6==="npm"}var Dx="report",Qq=$.union([$.string(),$.number()]).transform((n)=>String(n)),Xq=$.union([$.string(),$.number(),$.array($.union([$.string(),$.number()]))]).transform((n)=>[n].flat().map(String)),Jq={name:"report.submit",description:"打包并上报问题包:analysis + 会话/context 切片 + wb 日志切片 + 本机 cli 日志 → zip → multipart 上传中台(走 CRM 登录 JWT 链路)。产物 RPT-YYYYMMDD-HHMMSS-XXXXXX 可复用于失败重试(--report_id)。--dry_run 只打包不上传。",category:"report",pluginName:Dx,parameters:$.object({description:Qq.pipe($.string().min(1,"问题描述不能为空").max(50,"问题描述不超过 50 字")).describe("问题简短描述(≤50 字,管理后台列表页展示)"),analysis:$.string().min(1).describe("analysis.md 路径(agent 按模板写的问题分析,脱敏后打包)"),context:Xq.optional().describe("会话/上下文切片路径(report.slice 产物),可重复传多个"),wb_log:Xq.optional().describe("宿主 agent 日志切片路径(report.slice 产物),可重复传多个"),report_id:Qq.optional().refine(m$,"report_id 字符集限 [A-Za-z0-9_-]、长度 1~128").describe("复用已有上报 ID(失败重试场景,同 ID 重复上报服务端幂等),缺省自动生成"),dry_run:$.boolean().optional().describe("只打包不上传(校验内容/封顶/结构,产物落在 ~/.yunke/reports/)")}),returns:$.object({report_id:$.string(),dry_run:$.boolean(),bundle_path:$.string(),total_bytes:$.number(),files:$.array($.object({path:$.string(),bytes:$.number(),meta:$.unknown().nullable()})),warnings:$.array($.string()),earliest_traceable_time:$.string().nullable(),uploaded:$.boolean().optional(),uploaded_at:$.string().optional()}),examples:[{description:"打包并真实上传(切片由 report.slice 产出,analysis 由 agent 写好)",input:{description:"客户列表打开空白",analysis:"~/.yunke/reports/staging/analysis.md",context:["~/.yunke/reports/staging/session-abc.slice"],wb_log:["~/.yunke/reports/staging/main-FAIL.slice"]},output:{report_id:"RPT-20260921-143005-7K2M9A",dry_run:!1,bundle_path:"~/.yunke/reports/RPT-20260921-143005-7K2M9A.zip",total_bytes:88064,files:[{path:"analysis.md",bytes:512,meta:null}],warnings:[],earliest_traceable_time:"2026-09-20T06:30:00.000Z",uploaded:!0,uploaded_at:"2026-09-21T06:30:20.000Z"}},{description:"失败重试:复用同一 report_id(服务端幂等去重)",input:{description:"客户列表打开空白",analysis:"…",report_id:"RPT-20260921-143005-7K2M9A"},output:{report_id:"RPT-20260921-143005-7K2M9A",dry_run:!1,uploaded:!0}}],sideEffects:["network","filesystem"],handler:async({description:n,analysis:q,context:H,wb_log:Q,report_id:X,dry_run:J})=>{let w=[q,...H??[],...Q??[]].filter((M)=>!Lx(M));if(w.length>0)throw new K("VALIDATION_FAILED",`以下输入文件不存在: ${w.join("; ")}`);let W=O0();if(!W?.token||!W.user_id)throw new K("CONFIG_ERROR","未登录,请先运行 'yunke crm.auth.login-web' 登录");let x={user_id:W.user_id,name:W.name,company_code:W.company_code,login_id:W.login_id,role:W.role},Y=X??F$(),_=$q({reportId:Y,description:n,analysisPath:q,contextPaths:H??[],wbLogPaths:Q??[],user:x,cliVersion:u,distType:Q6});qq([q,...H??[],...Q??[]]);let G={report_id:Y,dry_run:J===!0,bundle_path:_.zipPath,total_bytes:_.totalBytes,files:_.files,warnings:_.warnings,earliest_traceable_time:_.earliestTraceableTime};if(J)return G;let{uploadedAt:O}=await Hq({bundlePath:_.zipPath,fields:{client_log_id:Y,log_type:"1",description:n,user_name:W.name??W.login_id??W.user_id,login_id:W.login_id,role:W.role,cli_version:u,dist_type:Q6,os:`${Rx()} ${Nx()}`}});return{...G,uploaded:!0,uploaded_at:O}}};var wq={name:"report",version:"1.0.0",commands:[A$,Jq]};K0();K0();var Wq=`yunke-cli/${u}`;function xq(){return p0().api_base_url.replace(/\/$/,"")}async function X6(n,q){let H=`${xq()}${n}`,Q=await fetch(H,{...q,headers:{"User-Agent":Wq,...q?.headers??{}}});if(!Q.ok){let X=`HTTP ${Q.status}`;try{let J=await Q.json();if(J.error)X=J.error;else if(J.message)X=J.message}catch{}throw new K("EXECUTION_FAILED",`CLI API error: ${X}`)}return await Q.json()}async function Yq(n){let q=`${xq()}${n}`,H=await fetch(q,{redirect:"manual",headers:{"User-Agent":Wq}}),Q=H.headers.get("location");if(!Q)throw new K("EXECUTION_FAILED",`CLI API did not return a redirect for ${n} (status ${H.status})`);return Q}K0();function n2(){let{platform:n,arch:q}=process;switch(n){case"darwin":return q==="arm64"?"darwin-arm64":"darwin-x64";case"linux":return"linux-x64";case"win32":return"windows-x64";default:throw Error(`不支持的平台: ${n}-${q}。`+"支持的平台: darwin-arm64, darwin-x64, linux-x64, windows-x64")}}K0();import{readFileSync as Zx,writeFileSync as px,mkdirSync as gx,existsSync as Kq}from"node:fs";import{homedir as ix}from"node:os";import{join as Bq}from"node:path";import{writeFile as Tx,chmod as Ix,rename as ux,unlink as yx}from"node:fs/promises";K0();import{createHash as Cx}from"node:crypto";function Ax(n){return Cx("sha256").update(n).digest("hex")}function _q(n,q){let H=Ax(n);if(!q)return{valid:!0,actual:H,expected:null};let Q=q.toLowerCase().trim();return{valid:H===Q,actual:H,expected:Q}}w6();async function $2(){let n=n2();return X6(`/api/v1/cli/check-update?current=${encodeURIComponent(u)}&target=${encodeURIComponent(n)}`)}async function vq(){let n=n2(),q=await $2();if(!q.hasUpdate)return{updated:!1,fromVersion:u,toVersion:q.latestVersion,message:"已是最新版本"};let H;try{H=await b4()}catch(Y){throw Error(`备份当前版本失败: ${Y instanceof Error?Y.message:String(Y)}`)}let Q=await Yq(`/api/v1/cli/download?target=${encodeURIComponent(n)}`),X=await fetch(Q);if(!X.ok)throw Error(`下载失败: HTTP ${X.status}`);let J=Buffer.from(await X.arrayBuffer()),w=_q(J,q.checksum);if(!w.valid)throw Error(`完整性校验失败。期望: ${w.expected}, 实际: ${w.actual}`);let W=process.execPath,x=`${W}.new`;try{await Tx(x,J),await Ix(x,493),await ux(x,W)}catch(Y){try{await yx(x)}catch{}if(H)try{let{rollbackFromLatestBackup:_}=await Promise.resolve().then(() => (w6(),Vq));await _()}catch{}throw Y}return{updated:!0,fromVersion:u,toVersion:q.latestVersion??"",backupPath:H,message:`已更新到 ${q.latestVersion}。请重启 CLI 以使用新版本。`}}var h4=process.env.YUNKE_CONFIG_DIR??Bq(ix(),".yunke"),T4=Bq(h4,"update-check.json"),ox=86400000;function Mq(){if(!Kq(T4))return null;try{let n=Zx(T4,"utf-8");return JSON.parse(n)}catch{return null}}function jq(n){if(!Kq(h4))gx(h4,{recursive:!0});px(T4,JSON.stringify(n,null,2),"utf-8")}function W6(n){if(!n)return!0;if(n.currentVersion!==u)return!0;return Date.now()-new Date(n.lastCheck).getTime()>=ox}function Lq(){if(Bn()){lx();return}let n=Mq();if(n&&!W6(n)&&n.hasUpdate){Nq(n.latestVersion);return}if(W6(n))fx().catch(()=>{})}async function fx(){try{let n=await $2(),q=n.hasUpdate&&n.latestVersion!=null&&Dq(n.latestVersion,u),H={lastCheck:new Date().toISOString(),hasUpdate:q,latestVersion:n.latestVersion,currentVersion:u};if(jq(H),q)Nq(n.latestVersion)}catch{}}function Rq(n,q){return`
365
+ 新版本可用: ${n} -> ${q}
364
366
  `+` 运行以下命令更新:
365
367
  `+` npm install -g @yunkeai/yunke-cli
366
368
 
367
- `}function j5(n){if(!n)return;process.stderr.write(`
368
- 新版本可用: ${R} -> ${n}
369
+ `}function Nq(n){if(!n)return;process.stderr.write(`
370
+ 新版本可用: ${u} -> ${n}
369
371
  `+` 运行 yunke self.update 进行更新
370
372
 
371
- `)}function gq(){let n=h5();if(n&&!Oi(n)&&n.hasUpdate){if(n.latestVersion)process.stderr.write(M5(R,n.latestVersion));return}if(Oi(n))Zq().catch(()=>{})}async function Zq(){try{let n=await h2(),b=n!==null&&f5(n,R),_={lastCheck:new Date().toISOString(),hasUpdate:b,latestVersion:n,currentVersion:R};if(u5(_),b&&n)process.stderr.write(M5(R,n))}catch{}}function f5(n,b){let _=(v)=>v.split(".").map(Number),[w,$,q]=_(n),[o,x,m]=_(b);if(w!==o)return w>o;if($!==x)return $>x;return q>m}async function h2(){try{let n=await fetch("https://registry.npmjs.org/@yunkeai/yunke-cli/latest",{headers:{Accept:"application/json"}});if(!n.ok)return null;return(await n.json()).version??null}catch{return null}}var V5={name:"self.check",description:"Check if a newer version of yunke-cli is available",category:"self",pluginName:"self",parameters:i.object({}),returns:i.object({hasUpdate:i.boolean(),currentVersion:i.string(),latestVersion:i.string().nullable()}),examples:[{description:"Check for updates",input:{},output:{hasUpdate:!0,currentVersion:"1.0.0",latestVersion:"1.1.0"}}],sideEffects:["network"],handler:async()=>{if(dn()){let _=await h2();return{hasUpdate:_!==null&&_!==R,currentVersion:R,latestVersion:_??null}}let n=G2(),b=await li(`/api/v1/cli/check-update?current=${encodeURIComponent(R)}&target=${encodeURIComponent(n)}`);return{hasUpdate:b.hasUpdate,currentVersion:R,latestVersion:b.latestVersion}}};qn();var K5={name:"self.update",description:"Download and install the latest version of yunke-cli (with backup & integrity check)",category:"self",pluginName:"self",parameters:i.object({check_only:i.boolean().default(!1).describe("只检查是否有更新,不实际安装")}),returns:i.object({updated:i.boolean(),fromVersion:i.string(),toVersion:i.string().nullable(),message:i.string().optional(),backupPath:i.string().optional()}),examples:[{description:"Check and install update",input:{},output:{updated:!0,fromVersion:"1.0.0",toVersion:"1.1.0"}}],sideEffects:["network","filesystem"],handler:async(n)=>{if(dn()){let b=await h2();return{updated:!1,fromVersion:R,toVersion:b??null,message:b!==null&&b!==R?`发现新版本 ${b},请运行: npm install -g @yunkeai/yunke-cli`:"已是最新版本"}}if(n.check_only){let b=await O2();return{updated:!1,fromVersion:R,toVersion:b.latestVersion,message:b.hasUpdate?`发现新版本 ${b.latestVersion},使用 self.update 安装`:"已是最新版本"}}return p5()}};Gi();var D5={name:"self.rollback",description:"Rollback yunke-cli to the previous backed-up version",category:"self",pluginName:"self",parameters:i.object({}),returns:i.object({rolledBack:i.boolean(),restoredFrom:i.string().nullable(),message:i.string(),availableBackups:i.array(i.string())}),examples:[{description:"Rollback to previous version",input:{},output:{rolledBack:!0,restoredFrom:"yunke-1.0.0-2024-01-01T00-00-00-000Z",message:"已回滚,请重启 CLI",availableBackups:[]}}],sideEffects:["filesystem"],handler:async()=>{if(dn())return{rolledBack:!1,restoredFrom:null,message:`npm 分发版本不支持本地回滚。如需回滚,请运行:
372
- npm install -g @yunkeai/yunke-cli@<目标版本>`,availableBackups:[]};if((await I0()).length===0)return{rolledBack:!1,restoredFrom:null,message:`没有可用的备份。备份目录: ${an}`,availableBackups:[]};let b=await V1(),_=await I0();return{rolledBack:!0,restoredFrom:b,message:"已回滚到上一个备份版本。请重启 CLI 以使用恢复的版本。",availableBackups:_}}};var L5={name:"self",version:R,commands:[V5,K5,D5]};qn();var J0=new rn,c5=()=>J0,A5=()=>mn()?.user_id;async function dq(){let n=[tb(c5,A5),Eb(c5,A5),Fb(),Pb(),H6,L5,q5],b=[w4,v5].filter((q)=>!q.featureFlag||_b(q.featureFlag));J0=(await Li([...n,...b],J0)).registry;let $=_0().plugins.filter((q)=>q.enabled);for(let q of $)try{let o=await import(q.path),x=o.default??o,m=await Li([x],J0);if(J0=m.registry,m.errors.length>0)process.stderr.write(`Warning: Failed to load plugin '${q.name}': ${m.errors[0].error.message}
373
- `)}catch(o){process.stderr.write(`Warning: Failed to import plugin '${q.name}' from '${q.path}': ${o instanceof Error?o.message:String(o)}
374
- `)}}async function aq(){await dq(),B5();let n=process.argv.slice(2);if(n.length===0||n[0]==="--help"||n[0]==="-h"){let q=await new c2(J0).execute({command:"help",args:{}});process.stdout.write(q+`
375
- `);return}if(n[0]==="--version"||n[0]==="-v"){process.stdout.write(JSON.stringify({version:R})+`
376
- `);return}let b=a1(n),w=await new c2(J0).execute(b);process.stdout.write(w+`
377
- `),process.exit(0)}aq().catch((n)=>{let b=kn("main","core",n instanceof Error?n:new G("EXECUTION_FAILED",String(n)),0);f2({parsed:{command:"main",args:{}},output:b}),process.stdout.write(JSON.stringify(b)+`
373
+ `)}function lx(){let n=Mq();if(n&&!W6(n)&&n.hasUpdate){if(n.latestVersion)process.stderr.write(Rq(u,n.latestVersion));return}if(W6(n))cx().catch(()=>{})}async function cx(){try{let n=await q2(),q=n!==null&&Dq(n,u),H={lastCheck:new Date().toISOString(),hasUpdate:q,latestVersion:n,currentVersion:u};if(jq(H),q&&n)process.stderr.write(Rq(u,n))}catch{}}function Dq(n,q){let H=(Y)=>Y.split(".").map(Number),[Q,X,J]=H(n),[w,W,x]=H(q);if(Q!==w)return Q>w;if(X!==W)return X>W;return J>x}async function q2(){try{let n=await fetch("https://registry.npmjs.org/@yunkeai/yunke-cli/latest",{headers:{Accept:"application/json"}});if(!n.ok)return null;return(await n.json()).version??null}catch{return null}}var Cq={name:"self.check",description:"Check if a newer version of yunke-cli is available",category:"self",pluginName:"self",parameters:$.object({}),returns:$.object({hasUpdate:$.boolean(),currentVersion:$.string(),latestVersion:$.string().nullable()}),examples:[{description:"Check for updates",input:{},output:{hasUpdate:!0,currentVersion:"1.0.0",latestVersion:"1.1.0"}}],sideEffects:["network"],handler:async()=>{if(Bn()){let H=await q2();return{hasUpdate:H!==null&&H!==u,currentVersion:u,latestVersion:H??null}}let n=n2(),q=await X6(`/api/v1/cli/check-update?current=${encodeURIComponent(u)}&target=${encodeURIComponent(n)}`);return{hasUpdate:q.hasUpdate,currentVersion:u,latestVersion:q.latestVersion}}};K0();var Aq={name:"self.update",description:"Download and install the latest version of yunke-cli (with backup & integrity check)",category:"self",pluginName:"self",parameters:$.object({check_only:$.boolean().default(!1).describe("只检查是否有更新,不实际安装")}),returns:$.object({updated:$.boolean(),fromVersion:$.string(),toVersion:$.string().nullable(),message:$.string().optional(),backupPath:$.string().optional()}),examples:[{description:"Check and install update",input:{},output:{updated:!0,fromVersion:"1.0.0",toVersion:"1.1.0"}}],sideEffects:["network","filesystem"],handler:async(n)=>{if(Bn()){let q=await q2();return{updated:!1,fromVersion:u,toVersion:q??null,message:q!==null&&q!==u?`发现新版本 ${q},请运行: npm install -g @yunkeai/yunke-cli`:"已是最新版本"}}if(n.check_only){let q=await $2();return{updated:!1,fromVersion:u,toVersion:q.latestVersion,message:q.hasUpdate?`发现新版本 ${q.latestVersion},使用 self.update 安装`:"已是最新版本"}}return vq()}};w6();var Uq={name:"self.rollback",description:"Rollback yunke-cli to the previous backed-up version",category:"self",pluginName:"self",parameters:$.object({}),returns:$.object({rolledBack:$.boolean(),restoredFrom:$.string().nullable(),message:$.string(),availableBackups:$.array($.string())}),examples:[{description:"Rollback to previous version",input:{},output:{rolledBack:!0,restoredFrom:"yunke-1.0.0-2024-01-01T00-00-00-000Z",message:"已回滚,请重启 CLI",availableBackups:[]}}],sideEffects:["filesystem"],handler:async()=>{if(Bn())return{rolledBack:!1,restoredFrom:null,message:`npm 分发版本不支持本地回滚。如需回滚,请运行:
374
+ npm install -g @yunkeai/yunke-cli@<目标版本>`,availableBackups:[]};if((await R1()).length===0)return{rolledBack:!1,restoredFrom:null,message:`没有可用的备份。备份目录: ${Mn}`,availableBackups:[]};let q=await k4(),H=await R1();return{rolledBack:!0,restoredFrom:q,message:"已回滚到上一个备份版本。请重启 CLI 以使用恢复的版本。",availableBackups:H}}};var Fq={name:"self",version:u,commands:[Cq,Aq,Uq]};K0();var yn=new jn,mq=()=>yn,Eq=()=>O0()?.user_id;async function dx(){let n=[t8(mq,Eq),r8(mq,Eq),a8(),e8(),R9,Fq,v$,wq],q=[V5,j$].filter((J)=>!J.featureFlag||O8(J.featureFlag));yn=(await D6([...n,...q],yn)).registry;let X=An().plugins.filter((J)=>J.enabled);for(let J of X)try{let w=await import(J.path),W=w.default??w,x=await D6([W],yn);if(yn=x.registry,x.errors.length>0)process.stderr.write(`Warning: Failed to load plugin '${J.name}': ${x.errors[0].error.message}
375
+ `)}catch(w){process.stderr.write(`Warning: Failed to import plugin '${J.name}' from '${J.path}': ${w instanceof Error?w.message:String(w)}
376
+ `)}}async function zx(){await dx(),Lq();let n=process.argv.slice(2);if(n.length===0||n[0]==="--help"||n[0]==="-h"){let J=await new O2(yn).execute({command:"help",args:{}});process.stdout.write(J+`
377
+ `);return}if(n[0]==="--version"||n[0]==="-v"){process.stdout.write(JSON.stringify({version:u})+`
378
+ `);return}let q=X8(n),Q=await new O2(yn).execute(q);process.stdout.write(Q+`
379
+ `),process.exit(0)}zx().catch((n)=>{let q=$n("main","core",n instanceof Error?n:new K("EXECUTION_FAILED",String(n)),0);W2({parsed:{command:"main",args:{}},output:q}),process.stdout.write(JSON.stringify(q)+`
378
380
  `),process.exit(1)});