zen-code 4.10.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.js +149 -239
- package/dist/{chunk-vbb3m0vz.js → chunk-069q9hkz.js} +1 -1
- package/dist/chunk-06trk066.js +1 -0
- package/dist/chunk-0kfw8bwn.js +2 -0
- package/dist/chunk-0mq8786q.js +281 -0
- package/dist/{chunk-mmx0k2yq.js → chunk-0qz8rr2k.js} +1 -1
- package/dist/chunk-1d47g6nc.js +2 -0
- package/dist/{chunk-nqh1pptf.js → chunk-1gssqf6g.js} +1 -1
- package/dist/{chunk-s5cqejr6.js → chunk-1rcc9xzn.js} +1 -1
- package/dist/{chunk-tjvhqr94.js → chunk-2bjeg40f.js} +1 -1
- package/dist/chunk-2gd8vzrf.js +2 -0
- package/dist/{chunk-spx7nn8t.js → chunk-2gprcgep.js} +2 -2
- package/dist/chunk-3k3c686f.js +1 -0
- package/dist/chunk-43h0n2td.js +1 -0
- package/dist/{chunk-8f19qk9r.js → chunk-492hjs9k.js} +1 -1
- package/dist/{chunk-pe8mzxwn.js → chunk-4eaqmt3c.js} +11 -11
- package/dist/{chunk-y8qhrx11.js → chunk-4fs853nh.js} +1 -1
- package/dist/chunk-5fe27s34.js +2 -0
- package/dist/{chunk-4wnmk2tj.js → chunk-5hqvapp1.js} +3 -3
- package/dist/chunk-6b3vfr39.js +2 -0
- package/dist/{chunk-t6440ajd.js → chunk-6j695pam.js} +2 -2
- package/dist/{chunk-pzb224c5.js → chunk-6saqxa3z.js} +2 -2
- package/dist/{chunk-tjg2e8v3.js → chunk-78ksrp8v.js} +2 -2
- package/dist/chunk-7cx9kda0.js +228 -0
- package/dist/chunk-7qba2raw.js +2 -0
- package/dist/chunk-81b2s97q.js +1 -0
- package/dist/chunk-88w3txtb.js +160 -0
- package/dist/chunk-8ygdre0g.js +1 -0
- package/dist/{chunk-fzh0v6r0.js → chunk-9011y634.js} +2 -2
- package/dist/chunk-9zcr1qh6.js +1 -0
- package/dist/chunk-a0nr8jva.js +2 -0
- package/dist/{chunk-5c3bpcpm.js → chunk-agevsn2e.js} +1 -1
- package/dist/{chunk-8tbtavry.js → chunk-akc3s5aw.js} +2 -2
- package/dist/{chunk-spa69h7p.js → chunk-b0beqmg2.js} +2 -2
- package/dist/{chunk-zg54h6gy.js → chunk-b175s7dm.js} +1 -1
- package/dist/chunk-bk32cwxa.js +5 -0
- package/dist/{chunk-vrnj0659.js → chunk-bn077sjq.js} +15 -15
- package/dist/{chunk-qxebn3jw.js → chunk-c9yrpb3g.js} +3 -3
- package/dist/{chunk-hnnwbfqk.js → chunk-cb0f54ar.js} +2 -2
- package/dist/chunk-ctqtahz4.js +1 -0
- package/dist/{chunk-gt8c6dne.js → chunk-d2sr8fnm.js} +1 -1
- package/dist/chunk-d5gzkkgg.js +1 -0
- package/dist/{chunk-bzgznka5.js → chunk-dh2f4xyb.js} +1 -1
- package/dist/chunk-dr32dt9y.js +1 -0
- package/dist/chunk-dv1vt080.js +1 -0
- package/dist/{chunk-vfxjbdz4.js → chunk-dz9sqfph.js} +1 -1
- package/dist/chunk-e7mbewmw.js +1 -0
- package/dist/chunk-em03xqy9.js +1 -0
- package/dist/chunk-fkt5b511.js +1 -0
- package/dist/{chunk-k4q8j7pg.js → chunk-gphssgy6.js} +1 -1
- package/dist/chunk-h2hk7vx4.js +1 -0
- package/dist/{chunk-c7kd2qrp.js → chunk-h7ypcqp3.js} +112 -111
- package/dist/{chunk-nsw5168d.js → chunk-j8tq0e8m.js} +2 -2
- package/dist/{chunk-40ht9pe1.js → chunk-jd1razfg.js} +2 -2
- package/dist/chunk-jhxvctg5.js +8 -0
- package/dist/chunk-kada5fyh.js +1 -0
- package/dist/chunk-kgc6ws03.js +1 -0
- package/dist/chunk-mk8ggmt8.js +17 -0
- package/dist/{chunk-e8kxa5vj.js → chunk-mv5m8bf4.js} +2 -2
- package/dist/chunk-mv8a5svx.js +1 -0
- package/dist/chunk-n61yv4t5.js +2 -0
- package/dist/chunk-nt2yp4jh.js +1 -0
- package/dist/chunk-p7ew4trx.js +1 -0
- package/dist/{chunk-s1tbdcs8.js → chunk-pgnhcznr.js} +1 -1
- package/dist/chunk-q8cfxky4.js +8 -0
- package/dist/{chunk-g2zskge5.js → chunk-q8zsxwd8.js} +2 -2
- package/dist/{chunk-nmzx5nmt.js → chunk-qfa5v4n5.js} +1 -1
- package/dist/chunk-qhzztj83.js +1 -0
- package/dist/chunk-snmkgfbe.js +15 -0
- package/dist/chunk-ss4bh5wb.js +2 -0
- package/dist/chunk-sv0k2v66.js +1 -0
- package/dist/{chunk-wmyc17aa.js → chunk-tbav8trq.js} +1 -1
- package/dist/chunk-tmyzfvsy.js +1 -0
- package/dist/chunk-ts4jreym.js +7 -0
- package/dist/chunk-tws3wcnm.js +2 -0
- package/dist/chunk-v0e9bsvt.js +89 -0
- package/dist/{chunk-n9rpnke9.js → chunk-vwj4n000.js} +1 -1
- package/dist/{chunk-gfhmzpy7.js → chunk-wd6s7gg7.js} +2 -3
- package/dist/{chunk-f0m4532p.js → chunk-y524zd2h.js} +5 -5
- package/dist/{chunk-hve2a279.js → chunk-yb71zqvt.js} +2 -2
- package/dist/{chunk-n7s6my89.js → chunk-yejgw2hm.js} +32 -32
- package/dist/{chunk-g974hxbz.js → chunk-yfjs6pf8.js} +1 -1
- package/dist/chunk-zhqdp4ak.js +2 -0
- package/dist/chunk-zkd3m39v.js +1 -0
- package/dist/cli.js +1 -1
- package/dist/nonInteractive.js +80 -80
- package/dist/zen-core.js +644 -0
- package/dist/zen-keyboard.js +1 -1
- package/package.json +5 -3
- package/dist/chunk-0ddrb30y.js +0 -1
- package/dist/chunk-215an3fz.js +0 -1
- package/dist/chunk-4z0w0ng1.js +0 -2
- package/dist/chunk-57bj89e2.js +0 -1
- package/dist/chunk-5a5mepqj.js +0 -1
- package/dist/chunk-7kw7ss8d.js +0 -1
- package/dist/chunk-86m0rmtc.js +0 -1
- package/dist/chunk-9rayxazs.js +0 -8
- package/dist/chunk-a9gpb2tx.js +0 -2
- package/dist/chunk-a9tw6d68.js +0 -1
- package/dist/chunk-anbtppz1.js +0 -294
- package/dist/chunk-bca8tkkr.js +0 -1
- package/dist/chunk-bdqds8vh.js +0 -1
- package/dist/chunk-dvbb3dd1.js +0 -233
- package/dist/chunk-ehmmd8qc.js +0 -1
- package/dist/chunk-ejfa95sm.js +0 -1
- package/dist/chunk-f7cps5x1.js +0 -1
- package/dist/chunk-fbemqjck.js +0 -2
- package/dist/chunk-feeqtzv5.js +0 -1
- package/dist/chunk-g9911ymn.js +0 -1
- package/dist/chunk-h8fdexm4.js +0 -2
- package/dist/chunk-hp2jzn9x.js +0 -166
- package/dist/chunk-js4qp900.js +0 -2
- package/dist/chunk-m21hvv91.js +0 -2
- package/dist/chunk-mnnyjmgw.js +0 -224
- package/dist/chunk-mw7x6xqp.js +0 -1
- package/dist/chunk-nk62q95g.js +0 -93
- package/dist/chunk-pg1ppq4y.js +0 -1
- package/dist/chunk-q1cxrg0x.js +0 -2
- package/dist/chunk-swc7se71.js +0 -2
- package/dist/chunk-swyc15ym.js +0 -1
- package/dist/chunk-t2s3s6af.js +0 -1
- package/dist/chunk-vdmq9d9x.js +0 -4
- package/dist/chunk-wt3p1w1g.js +0 -1
- package/dist/chunk-y5ry5c7v.js +0 -1
- package/dist/chunk-yy8p9zph.js +0 -2
- package/dist/chunk-z61m3anh.js +0 -1
- package/dist/chunk-zr90qp47.js +0 -1
- package/dist/chunk-zsa62xr0.js +0 -2
package/dist/zen-core.js
ADDED
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
import{na as z0}from"../../code-graph/zen-code/chunk-n61yv4t5.js";import{ra as A1}from"../../code-graph/zen-code/chunk-7qba2raw.js";import"../../code-graph/zen-code/chunk-snmkgfbe.js";import"../../code-graph/zen-code/chunk-vwj4n000.js";import{Se as _f,Te as E1,Ue as zf,Ve as vf,We as c1,Xe as bf,Ye as u1}from"../../code-graph/zen-code/chunk-yejgw2hm.js";import{Lf as h1,ef as J1,lf as d,mf as M1,nf as w1,sf as G0,uf as A0}from"../../code-graph/zen-code/chunk-7cx9kda0.js";import"../../code-graph/zen-code/chunk-y524zd2h.js";import{Of as x1,cg as g1}from"../../code-graph/zen-code/chunk-4eaqmt3c.js";import"../../code-graph/zen-code/chunk-88w3txtb.js";import"../../code-graph/zen-code/chunk-0mq8786q.js";import"../../code-graph/zen-code/chunk-tws3wcnm.js";import"../../code-graph/zen-code/chunk-6saqxa3z.js";import"../../code-graph/zen-code/chunk-6j695pam.js";import{$g as q0,Qg as o,Sg as AZ,Tg as OZ,Ug as wf,Wg as z1,Xg as v1,_g as Df,ah as Pf}from"../../code-graph/zen-code/chunk-bn077sjq.js";import"../../code-graph/zen-code/chunk-9011y634.js";import"../../code-graph/zen-code/chunk-v0e9bsvt.js";import"../../code-graph/zen-code/chunk-j8tq0e8m.js";import{wk as t$}from"../../code-graph/zen-code/chunk-sv0k2v66.js";import"../../code-graph/zen-code/chunk-gphssgy6.js";import"../../code-graph/zen-code/chunk-2gprcgep.js";import"../../code-graph/zen-code/chunk-dz9sqfph.js";import{Ak as a$}from"../../code-graph/zen-code/chunk-c9yrpb3g.js";import"../../code-graph/zen-code/chunk-jhxvctg5.js";import"../../code-graph/zen-code/chunk-mv5m8bf4.js";import"../../code-graph/zen-code/chunk-bk32cwxa.js";import"../../code-graph/zen-code/chunk-qfa5v4n5.js";import"../../code-graph/zen-code/chunk-0kfw8bwn.js";import{Bl as X}from"../../code-graph/zen-code/chunk-78ksrp8v.js";import{El as W0,Hl as C0,Jl as y0}from"../../code-graph/zen-code/chunk-yb71zqvt.js";import{Ol as P0,Rl as S0,Sl as j,Ul as w0,Vl as f0}from"../../code-graph/zen-code/chunk-mk8ggmt8.js";import{$l as N,Wl as Af,Yl as C}from"../../code-graph/zen-code/chunk-4fs853nh.js";var Of=C((r)=>{var SZ=r&&r.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(r,"__esModule",{value:!0});r.createID=hZ;var wZ=SZ(N("node:crypto"));function hZ(f="",$=16){let Y=wZ.default.randomBytes($),Q=Array.from(Y,(J)=>"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[J%62]).join("");return f?`${f}-${Q}`:Q}});var Wf=C((o1)=>{Object.defineProperty(o1,"__esModule",{value:!0});var _Z={INFO:"\x1B[36m",WARN:"\x1B[33m",ERROR:"\x1B[31m",DEBUG:"\x1B[35m"},p1="\x1B[32m",zZ="\x1B[0m";function h(f,$,Z){let Y=new Date().toISOString(),Q=_Z[f]??"",B=`${`[${Y}] [PID: ${process.pid}] ${p1}[NODE-CRON]${p1} ${Q}[${f}]${zZ}`} ${$}`;switch(f){case"ERROR":console.error(B,Z??"");break;case"DEBUG":console.debug(B,Z??"");break;case"WARN":console.warn(B);break;case"INFO":default:console.info(B);break}}var vZ={info(f){h("INFO",f)},warn(f){h("WARN",f)},error(f,$){if(f instanceof Error)h("ERROR",f.message,f);else h("ERROR",f,$)},debug(f,$){if(f instanceof Error)h("DEBUG",f.message,f);else h("DEBUG",f,$)}};o1.default=vZ});var i1=C((n1)=>{Object.defineProperty(n1,"__esModule",{value:!0});n1.TrackedPromise=void 0;class s1{promise;error;state;value;constructor(f){this.state="pending",this.promise=new Promise(($,Z)=>{f((Y)=>{this.state="fulfilled",this.value=Y,$(Y)},(Y)=>{this.state="rejected",this.error=Y,Z(Y)})})}getPromise(){return this.promise}getState(){return this.state}isPending(){return this.state==="pending"}isFulfilled(){return this.state==="fulfilled"}isRejected(){return this.state==="rejected"}getValue(){return this.value}getError(){return this.error}then(f,$){return this.promise.then(f,$)}catch(f){return this.promise.catch(f)}finally(f){return this.promise.finally(f)}}n1.TrackedPromise=s1});var Y$=C((_)=>{var IZ=_&&_.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(_,"__esModule",{value:!0});_.Runner=void 0;var a1=Of(),uf=IZ(Wf()),kZ=i1();function gf(){}function t1(){return!0}function cf(f,$){uf.default.error("Task failed with error!",$)}class Z${timeMatcher;onMatch;noOverlap;maxExecutions;maxRandomDelay;runCount;running;heartBeatTimeout;onMissedExecution;onOverlap;onError;beforeRun;onFinished;onMaxExecutions;constructor(f,$,Z){this.timeMatcher=f,this.onMatch=$,this.noOverlap=Z==null||Z.noOverlap===void 0?!1:Z.noOverlap,this.maxExecutions=Z?.maxExecutions,this.maxRandomDelay=Z?.maxRandomDelay||0,this.onMissedExecution=Z?.onMissedExecution||gf,this.onOverlap=Z?.onOverlap||gf,this.onError=Z?.onError||cf,this.onFinished=Z?.onFinished||t1,this.beforeRun=Z?.beforeRun||t1,this.onMaxExecutions=Z?.onMaxExecutions||gf,this.runCount=0,this.running=!1}start(){this.running=!0;let f,$,Z=(B)=>{if(this.running)clearTimeout(this.heartBeatTimeout),this.heartBeatTimeout=setTimeout(J,f$(this.timeMatcher,B))},Y=(B)=>{return new Promise(async(U)=>{let A={id:(0,a1.createID)("exec"),reason:"scheduled"},W=await this.beforeRun(B,A),y=Math.floor(Math.random()*this.maxRandomDelay);if(W)setTimeout(async()=>{try{this.runCount++,A.startedAt=new Date;let O=await this.onMatch(B,A);if(A.finishedAt=new Date,A.result=O,this.onFinished(B,A),this.maxExecutions&&this.runCount>=this.maxExecutions)this.onMaxExecutions(B),this.stop()}catch(O){A.finishedAt=new Date,A.error=O,this.onError(B,O,A)}U(!0)},y)})},Q=(B)=>{return new kZ.TrackedPromise(async(U,A)=>{try{if(this.timeMatcher.match(B))await Y(B);U(!0)}catch(W){A(W)}})},J=async()=>{let B=$$();if($&&$.getTime()<B.getTime())while($.getTime()<B.getTime())uf.default.warn(`missed execution at ${$}! Possible blocking IO or high CPU user at the same process used by node-cron.`),$=this.timeMatcher.getNextMatch($),e1(this.onMissedExecution,$,cf);if(f&&f.getState()==="pending"){if(e1(this.onOverlap,B,cf),this.noOverlap){uf.default.warn("task still running, new execution blocked by overlap prevention!"),$=this.timeMatcher.getNextMatch(B),Z(B);return}}f=Q(B),$=this.timeMatcher.getNextMatch(B),Z(B)};this.heartBeatTimeout=setTimeout(()=>{J()},f$(this.timeMatcher,$$()))}nextRun(){return this.timeMatcher.getNextMatch(new Date)}stop(){if(this.running=!1,this.heartBeatTimeout)clearTimeout(this.heartBeatTimeout),this.heartBeatTimeout=void 0}isStarted(){return!!this.heartBeatTimeout&&this.running}isStopped(){return!this.isStarted()}async execute(){let f=new Date,$={id:(0,a1.createID)("exec"),reason:"invoked"};try{if(await this.beforeRun(f,$)){this.runCount++,$.startedAt=new Date;let Y=await this.onMatch(f,$);$.finishedAt=new Date,$.result=Y,this.onFinished(f,$)}}catch(Z){$.finishedAt=new Date,$.error=Z,this.onError(f,Z,$)}}}_.Runner=Z$;async function e1(f,$,Z){try{await f($)}catch(Y){Z($,Y)}}function f$(f,$){let Y=f.getNextMatch($),Q=new Date,J=Y.getTime()-Q.getTime();if(J>86400000)return 86400000;return Math.max(0,J)}function $$(){let f=new Date;return f.setMilliseconds(0),f}});var J$=C((Q$)=>{Object.defineProperty(Q$,"__esModule",{value:!0});Q$.default=(()=>{let f=["january","february","march","april","may","june","july","august","september","october","november","december"],$=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];function Z(Q,J){for(let B=0;B<J.length;B++)Q=Q.replace(new RegExp(J[B],"gi"),B+1);return Q}function Y(Q){return Q=Z(Q,f),Q=Z(Q,$),Q}return Y})()});var yf=C((X$)=>{Object.defineProperty(X$,"__esModule",{value:!0});X$.default=(()=>{let f=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],$=["sun","mon","tue","wed","thu","fri","sat"];function Z(Q,J){for(let B=0;B<J.length;B++)Q=Q.replace(new RegExp(J[B],"gi"),B);return Q}function Y(Q){return Q=Q.replace("7","0"),Q=Z(Q,f),Z(Q,$)}return Y})()});var U$=C((B$)=>{Object.defineProperty(B$,"__esModule",{value:!0});B$.default=(()=>{function f(Z,Y){if(Z.indexOf("*")!==-1)return Z.replace("*",Y);return Z}function $(Z){return Z[0]=f(Z[0],"0-59"),Z[1]=f(Z[1],"0-59"),Z[2]=f(Z[2],"0-23"),Z[3]=f(Z[3],"1-31"),Z[4]=f(Z[4],"1-12"),Z[5]=f(Z[5],"0-6"),Z}return $})()});var A$=C((G$)=>{Object.defineProperty(G$,"__esModule",{value:!0});G$.default=(()=>{function f(Y,Q,J,B,U){let A=parseInt(U),W=[],y=parseInt(B),O=parseInt(J);if(O>y)y=parseInt(J),O=parseInt(B);for(let T=O;T<=y;T+=A)W.push(T);return Y.replace(new RegExp(Q,"i"),W.join())}function $(Y){let Q=/(\d+)-(\d+)(\/(\d+)|)/,J=Q.exec(Y);while(J!==null&&J.length>0)Y=f(Y,J[0],J[1],J[2],J[4]||"1"),J=Q.exec(Y);return Y}function Z(Y){for(let Q=0;Q<Y.length;Q++)Y[Q]=$(Y[Q]);return Y}return Z})()});var Tf=C((i)=>{var qf=i&&i.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(i,"__esModule",{value:!0});var cZ=qf(J$()),uZ=qf(yf()),dZ=qf(U$()),pZ=qf(A$());i.default=(()=>{function f(Q){if(Q.length===5)return["0"].concat(Q);return Q}function $(Q){return Q.replace(/\s{2,}/g," ").trim()}function Z(Q){for(let J=0;J<Q.length;J++){let B=Q[J].split(",");for(let U=0;U<B.length;U++)B[U]=parseInt(B[U]);Q[J]=B}return Q}function Y(Q){let J=$(`${Q}`).split(" ");return J=f(J),J[4]=(0,cZ.default)(J[4]),J[5]=(0,uZ.default)(J[5]),J=(0,dZ.default)(J),J=(0,pZ.default)(J),J=Z(J),J}return Y})()});var a=C((y$)=>{Object.defineProperty(y$,"__esModule",{value:!0});y$.LocalizedTime=void 0;class W${timestamp;parts;timezone;constructor(f,$){this.timestamp=f.getTime(),this.timezone=$,this.parts=O$(f,$)}toDate(){return new Date(this.timestamp)}toISO(){let f=this.parts.gmt.replace(/^GMT/,""),$=f?f:"Z",Z=(Y)=>String(Y).padStart(2,"0");return`${this.parts.year}-${Z(this.parts.month)}-${Z(this.parts.day)}T${Z(this.parts.hour)}:${Z(this.parts.minute)}:${Z(this.parts.second)}.${String(this.parts.milisecond).padStart(3,"0")}`+$}getParts(){return this.parts}set(f,$){this.parts[f]=$;let Z=new Date(this.toISO());this.timestamp=Z.getTime(),this.parts=O$(Z,this.timezone)}}y$.LocalizedTime=W$;function O$(f,$){let Z={year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",weekday:"short",hour12:!1};if($)Z.timeZone=$;let Q=new Intl.DateTimeFormat("en-US",Z).formatToParts(f).filter((J)=>{return J.type!=="literal"}).reduce((J,B)=>{return J[B.type]=B.value,J},{});return{day:parseInt(Q.day),month:parseInt(Q.month),year:parseInt(Q.year),hour:Q.hour==="24"?0:parseInt(Q.hour),minute:parseInt(Q.minute),second:parseInt(Q.second),milisecond:f.getMilliseconds(),weekday:Q.weekday,gmt:oZ(f,$)}}function oZ(f,$){let Z=new Date(f.toLocaleString("en-US",{timeZone:"UTC"})),Y=new Date(f.toLocaleString("en-US",{timeZone:$})),Q=(Z.getTime()-Y.getTime())/60000,J=Q<=0?"+":"-";if(Q=Math.abs(Q),Q===0)return"Z";let B=Math.floor(Q/60).toString().padStart(2,"0"),U=Math.floor(Q%60).toString().padStart(2,"0");return`GMT${J}${B}:${U}`}});var L$=C((z)=>{var N$=z&&z.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(z,"__esModule",{value:!0});z.MatcherWalker=void 0;var sZ=N$(Tf()),T$=a(),nZ=Hf(),H$=N$(yf());class C${cronExpression;baseDate;pattern;expressions;timeMatcher;timezone;constructor(f,$,Z){this.cronExpression=f,this.baseDate=$,this.timeMatcher=new nZ.TimeMatcher(f,Z),this.timezone=Z,this.expressions=(0,sZ.default)(f)}isMatching(){return this.timeMatcher.match(this.baseDate)}matchNext(){let $=(()=>{let Q=new Date(this.baseDate.getTime());Q.setMilliseconds(0);let J=new T$.LocalizedTime(Q,this.timezone),B=J.getParts(),U=new T$.LocalizedTime(J.toDate(),this.timezone),A=this.expressions[0],W=t(A,B.second);if(W){if(U.set("second",W),this.timeMatcher.match(U.toDate()))return U}U.set("second",A[0]);let y=this.expressions[1],O=t(y,B.minute);if(O){if(U.set("minute",O),this.timeMatcher.match(U.toDate()))return U}U.set("minute",y[0]);let T=this.expressions[2],V=t(T,B.hour);if(V){if(U.set("hour",V),this.timeMatcher.match(U.toDate()))return U}U.set("hour",T[0]);let D=this.expressions[3],Jf=t(D,B.day);if(Jf){if(U.set("day",Jf),this.timeMatcher.match(U.toDate()))return U}U.set("day",D[0]);let x=this.expressions[4],Xf=t(x,B.month);if(Xf){if(U.set("month",Xf),this.timeMatcher.match(U.toDate()))return U}return U.set("year",U.getParts().year+1),U.set("month",x[0]),U})(),Z=this.expressions[5],Y=parseInt((0,H$.default)($.getParts().weekday));while(!(Z.indexOf(Y)>-1))$.set("year",$.getParts().year+1),Y=parseInt((0,H$.default)($.getParts().weekday));return $}}z.MatcherWalker=C$;function t(f,$){let Z=f.sort((Y,Q)=>Y-Q).filter((Y)=>Y>$);if(Z.length>0)return Z[0];return!1}});var Hf=C((b)=>{var K$=b&&b.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(b,"__esModule",{value:!0});b.TimeMatcher=void 0;var rZ=K$(Tf()),iZ=K$(yf()),aZ=a(),tZ=L$();function v(f,$){return f.indexOf($)!==-1}class V${timezone;pattern;expressions;constructor(f,$){this.timezone=$,this.pattern=f,this.expressions=(0,rZ.default)(f)}match(f){let Z=new aZ.LocalizedTime(f,this.timezone).getParts(),Y=v(this.expressions[0],Z.second),Q=v(this.expressions[1],Z.minute),J=v(this.expressions[2],Z.hour),B=v(this.expressions[3],Z.day),U=v(this.expressions[4],Z.month),A=v(this.expressions[5],parseInt((0,iZ.default)(Z.weekday)));return Y&&Q&&J&&B&&U&&A}getNextMatch(f){return new tZ.MatcherWalker(this.pattern,f,this.timezone).matchNext().toDate()}}b.TimeMatcher=V$});var df=C((R$)=>{Object.defineProperty(R$,"__esModule",{value:!0});R$.StateMachine=void 0;var eZ={stopped:["stopped","idle","destroyed"],idle:["idle","running","stopped","destroyed"],running:["running","idle","stopped","destroyed"],destroyed:["destroyed"]};class F${state;constructor(f="stopped"){this.state=f}changeState(f){if(eZ[this.state].includes(f))this.state=f;else throw Error(`invalid transition from ${this.state} to ${f}`)}}R$.StateMachine=F$});var P$=C((I)=>{var M$=I&&I.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(I,"__esModule",{value:!0});I.InlineScheduledTask=void 0;var fY=M$(N("events")),$Y=Y$(),ZY=Hf(),YY=Of(),QY=df(),JY=M$(Wf()),XY=a();class E$ extends fY.default{}class D${emitter;cronExpression;timeMatcher;runner;id;name;stateMachine;timezone;constructor(f,$,Z){this.emitter=new E$,this.cronExpression=f,this.id=(0,YY.createID)("task",12),this.name=Z?.name||this.id,this.timezone=Z?.timezone,this.timeMatcher=new ZY.TimeMatcher(f,Z?.timezone),this.stateMachine=new QY.StateMachine;let Y={timezone:Z?.timezone,noOverlap:Z?.noOverlap,maxExecutions:Z?.maxExecutions,maxRandomDelay:Z?.maxRandomDelay,beforeRun:(Q,J)=>{if(J.reason==="scheduled")this.changeState("running");return this.emitter.emit("execution:started",this.createContext(Q,J)),!0},onFinished:(Q,J)=>{if(J.reason==="scheduled")this.changeState("idle");return this.emitter.emit("execution:finished",this.createContext(Q,J)),!0},onError:(Q,J,B)=>{JY.default.error(J),this.emitter.emit("execution:failed",this.createContext(Q,B)),this.changeState("idle")},onOverlap:(Q)=>{this.emitter.emit("execution:overlap",this.createContext(Q))},onMissedExecution:(Q)=>{this.emitter.emit("execution:missed",this.createContext(Q))},onMaxExecutions:(Q)=>{this.emitter.emit("execution:maxReached",this.createContext(Q)),this.destroy()}};this.runner=new $Y.Runner(this.timeMatcher,(Q,J)=>{return $(this.createContext(Q,J))},Y)}getNextRun(){if(this.stateMachine.state!=="stopped")return this.runner.nextRun();return null}changeState(f){if(this.runner.isStarted())this.stateMachine.changeState(f)}start(){if(this.runner.isStopped())this.runner.start(),this.stateMachine.changeState("idle"),this.emitter.emit("task:started",this.createContext(new Date))}stop(){if(this.runner.isStarted())this.runner.stop(),this.stateMachine.changeState("stopped"),this.emitter.emit("task:stopped",this.createContext(new Date))}getStatus(){return this.stateMachine.state}destroy(){if(this.stateMachine.state==="destroyed")return;this.stop(),this.stateMachine.changeState("destroyed"),this.emitter.emit("task:destroyed",this.createContext(new Date))}execute(){return new Promise((f,$)=>{let Z=(Q)=>{this.off("execution:finished",Z),$(Q.execution?.error)},Y=(Q)=>{this.off("execution:failed",Z),f(Q.execution?.result)};this.once("execution:finished",Y),this.once("execution:failed",Z),this.runner.execute()})}on(f,$){this.emitter.on(f,$)}off(f,$){this.emitter.off(f,$)}once(f,$){this.emitter.once(f,$)}createContext(f,$){let Z=new XY.LocalizedTime(f,this.timezone);return{date:Z.toDate(),dateLocalIso:Z.toISO(),triggeredAt:new Date,task:this,execution:$}}}I.InlineScheduledTask=D$});var _$=C((w$)=>{Object.defineProperty(w$,"__esModule",{value:!0});w$.TaskRegistry=void 0;var k=new Map;class S${add(f){if(this.has(f.id))throw Error(`task ${f.id} already registred!`);k.set(f.id,f),f.on("task:destroyed",()=>{this.remove(f)})}get(f){return k.get(f)}remove(f){if(this.has(f.id))f?.destroy(),k.delete(f.id)}all(){return k}has(f){return k.has(f)}killAll(){k.forEach((f)=>this.remove(f))}}w$.TaskRegistry=S$});var z$=C((e)=>{var BY=e&&e.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(e,"__esModule",{value:!0});var UY=BY(Tf()),GY=/^(?:\d+|\*|\*\/\d+)$/;function l(f,$,Z){let Y=f;for(let Q of Y){let J=parseInt(Q,10);if(!Number.isNaN(J)&&(J<$||J>Z)||!GY.test(Q))return!1}return!0}function AY(f){return!l(f,0,59)}function OY(f){return!l(f,0,59)}function WY(f){return!l(f,0,23)}function yY(f){return!l(f,1,31)}function qY(f){return!l(f,1,12)}function TY(f){return!l(f,0,7)}function HY(f,$){if(AY($[0]))throw Error(`${f[0]} is a invalid expression for second`);if(OY($[1]))throw Error(`${f[1]} is a invalid expression for minute`);if(WY($[2]))throw Error(`${f[2]} is a invalid expression for hour`);if(yY($[3]))throw Error(`${f[3]} is a invalid expression for day of month`);if(qY($[4]))throw Error(`${f[4]} is a invalid expression for month`);if(TY($[5]))throw Error(`${f[5]} is a invalid expression for week day`)}function NY(f){if(typeof f!=="string")throw TypeError("pattern must be a string!");let $=f.split(" "),Z=(0,UY.default)(f);if($.length===5)$.unshift("0");HY($,Z)}e.default=NY});var I$=C((ff)=>{var __dirname="/Users/konghayao/code/ai/code-graph/node_modules/.bun/node-cron@4.2.1/node_modules/node-cron/dist/esm/tasks/background-scheduled-task",CY=ff&&ff.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(ff,"__esModule",{value:!0});var LY=N("path"),KY=N("child_process"),VY=Of(),FY=N("stream"),RY=df(),jY=a(),MY=CY(Wf()),EY=Hf(),DY=(0,LY.resolve)(__dirname,"daemon.js");class v$ extends FY.EventEmitter{}class b${emitter;id;name;cronExpression;taskPath;options;forkProcess;stateMachine;constructor(f,$,Z){this.cronExpression=f,this.taskPath=$,this.options=Z,this.id=(0,VY.createID)("task"),this.name=Z?.name||this.id,this.emitter=new v$,this.stateMachine=new RY.StateMachine("stopped"),this.on("task:stopped",()=>{this.forkProcess?.kill(),this.forkProcess=void 0,this.stateMachine.changeState("stopped")}),this.on("task:destroyed",()=>{this.forkProcess?.kill(),this.forkProcess=void 0,this.stateMachine.changeState("destroyed")})}getNextRun(){if(this.stateMachine.state!=="stopped")return new EY.TimeMatcher(this.cronExpression,this.options?.timezone).getNextMatch(new Date);return null}start(){return new Promise((f,$)=>{if(this.forkProcess)return f(void 0);let Z=setTimeout(()=>{$(Error("Start operation timed out"))},5000);try{this.forkProcess=(0,KY.fork)(DY),this.forkProcess.on("error",(Y)=>{clearTimeout(Z),$(Error(`Error on daemon: ${Y.message}`))}),this.forkProcess.on("exit",(Y,Q)=>{if(Y!==0&&Q!=="SIGTERM"){let J=Error(`node-cron daemon exited with code ${Y||Q}`);MY.default.error(J),clearTimeout(Z),$(J)}}),this.forkProcess.on("message",(Y)=>{if(Y.jsonError){if(Y.context?.execution)Y.context.execution.error=PY(Y.jsonError),delete Y.jsonError}if(Y.context?.task?.state)this.stateMachine.changeState(Y.context?.task?.state);if(Y.context){let Q=Y.context?.execution;delete Q?.hasError;let J=this.createContext(new Date(Y.context.date),Q);this.emitter.emit(Y.event,J)}}),this.once("task:started",()=>{this.stateMachine.changeState("idle"),clearTimeout(Z),f(void 0)}),this.forkProcess.send({command:"task:start",path:this.taskPath,cron:this.cronExpression,options:this.options})}catch(Y){$(Y)}})}stop(){return new Promise((f,$)=>{if(!this.forkProcess)return f(void 0);let Z=setTimeout(()=>{clearTimeout(Z),$(Error("Stop operation timed out"))},5000),Y=()=>{clearTimeout(Z),this.off("task:stopped",Q),this.forkProcess=void 0,f(void 0)},Q=()=>{Y()};this.once("task:stopped",Q),this.forkProcess.send({command:"task:stop"})})}getStatus(){return this.stateMachine.state}destroy(){return new Promise((f,$)=>{if(!this.forkProcess)return f(void 0);let Z=setTimeout(()=>{clearTimeout(Z),$(Error("Destroy operation timed out"))},5000),Y=()=>{clearTimeout(Z),this.off("task:destroyed",Y),f(void 0)};this.once("task:destroyed",Y),this.forkProcess.send({command:"task:destroy"})})}execute(){return new Promise((f,$)=>{if(!this.forkProcess)return $(Error("Cannot execute background task because it hasn't been started yet. Please initialize the task using the start() method before attempting to execute it."));let Z=setTimeout(()=>{Y(),$(Error("Execution timeout exceeded"))},5000),Y=()=>{clearTimeout(Z),this.off("execution:finished",Q),this.off("execution:failed",J)},Q=(B)=>{Y(),f(B.execution?.result)},J=(B)=>{Y(),$(B.execution?.error||Error("Execution failed without specific error"))};this.once("execution:finished",Q),this.once("execution:failed",J),this.forkProcess.send({command:"task:execute"})})}on(f,$){this.emitter.on(f,$)}off(f,$){this.emitter.off(f,$)}once(f,$){this.emitter.once(f,$)}createContext(f,$){let Z=new jY.LocalizedTime(f,this.options?.timezone);return{date:Z.toDate(),dateLocalIso:Z.toISO(),triggeredAt:new Date,task:this,execution:$}}}function PY(f){let $=JSON.parse(f),Y=new(globalThis[$.name]||Error)($.message);if($.stack)Y.stack=$.stack;return Object.keys($).forEach((Q)=>{if(!["name","message","stack"].includes(Q))Y[Q]=$[Q]}),Y}ff.default=b$});var rf=C((L)=>{var of=L&&L.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(L,"__esModule",{value:!0});L.nodeCron=L.getTask=L.getTasks=void 0;L.schedule=l$;L.createTask=nf;L.solvePath=m$;L.validate=x$;var SY=P$(),wY=_$(),hY=of(z$()),_Y=of(I$()),pf=of(N("path")),k$=N("url"),sf=new wY.TaskRegistry;function l$(f,$,Z){let Y=nf(f,$,Z);return Y.start(),Y}function nf(f,$,Z){let Y;if($ instanceof Function)Y=new SY.InlineScheduledTask(f,$,Z);else{let Q=m$($);Y=new _Y.default(f,Q,Z)}return sf.add(Y),Y}function m$(f){if(pf.default.isAbsolute(f))return(0,k$.pathToFileURL)(f).href;if(f.startsWith("file://"))return f;let $=Error().stack?.split(`
|
|
2
|
+
`);if($){$?.shift();let Y=$?.find((Q)=>{return Q.indexOf("import.meta.filename")===-1})?.match(/(file:\/\/)?(((\/?)(\w:))?([/\\].+)):\d+:\d+/);if(Y){let Q=`${Y[5]??""}${pf.default.dirname(Y[6])}`;return(0,k$.pathToFileURL)(pf.default.resolve(Q,f)).href}}throw Error(`Could not locate task file ${f}`)}function x$(f){try{return(0,hY.default)(f),!0}catch($){return!1}}L.getTasks=sf.all;L.getTask=sf.get;L.nodeCron={schedule:l$,createTask:nf,validate:x$,getTasks:L.getTasks,getTask:L.getTask};L.default=L.nodeCron});function l0(){let{process:f,Deno:$}=globalThis;return!(typeof $?.noColor==="boolean"?$.noColor:f!==void 0?"NO_COLOR"in f?.env:!1)}async function y1(){let{navigator:f}=globalThis,$="cloudflare:workers";return!(f!==void 0&&f.userAgent==="Cloudflare-Workers"?await(async()=>{try{return"NO_COLOR"in((await import("cloudflare:workers")).env??{})}catch{return!1}})():!l0())}var m0=(f)=>{let[$,Z]=[",","."];return f.map((Q)=>Q.replace(/(\d)(?=(\d\d\d)+(?!\d))/g,"$1"+$)).join(Z)},x0=(f)=>{let $=Date.now()-f;return m0([$<1000?$+"ms":Math.round($/1000)+"s"])},g0=async(f)=>{if(await y1())switch(f/100|0){case 5:return`\x1B[31m${f}\x1B[0m`;case 4:return`\x1B[33m${f}\x1B[0m`;case 3:return`\x1B[36m${f}\x1B[0m`;case 2:return`\x1B[32m${f}\x1B[0m`}return`${f}`};async function q1(f,$,Z,Y,Q=0,J){let B=$==="<--"?`${$} ${Z} ${Y}`:`${$} ${Z} ${Y} ${await g0(Q)} ${J}`;f(B)}var T1=(f=console.log)=>{return async function(Z,Y){let{method:Q,url:J}=Z.req,B=J.slice(J.indexOf("/",8));await q1(f,"<--",Q,B);let U=Date.now();await Y(),await q1(f,"-->",Q,B,Z.res.status,x0(U))}};import{createServer as c0}from"http";import{Http2ServerRequest as u0}from"http2";import{Http2ServerRequest as Ff}from"http2";import{Readable as H1}from"stream";import $Z from"crypto";var F=class extends Error{constructor(f,$){super(f,$);this.name="RequestError"}},d0=(f)=>{if(f instanceof F)return f;return new F(f.message,{cause:f})},p0=global.Request,g=class extends p0{constructor(f,$){if(typeof f==="object"&&w in f)f=f[w]();if(typeof $?.body?.getReader<"u")$.duplex??="half";super(f,$)}},o0=(f)=>{let $=[],Z=f.rawHeaders;for(let Y=0;Y<Z.length;Y+=2){let{[Y]:Q,[Y+1]:J}=Z;if(Q.charCodeAt(0)!==58)$.push([Q,J])}return new Headers($)},C1=Symbol("wrapBodyStream"),s0=(f,$,Z,Y,Q)=>{let J={method:f,headers:Z,signal:Q.signal};if(f==="TRACE"){J.method="GET";let B=new g($,J);return Object.defineProperty(B,"method",{get(){return"TRACE"}}),B}if(!(f==="GET"||f==="HEAD"))if("rawBody"in Y&&Y.rawBody instanceof Buffer)J.body=new ReadableStream({start(B){B.enqueue(Y.rawBody),B.close()}});else if(Y[C1]){let B;J.body=new ReadableStream({async pull(U){try{B||=H1.toWeb(Y).getReader();let{done:A,value:W}=await B.read();if(A)U.close();else U.enqueue(W)}catch(A){U.error(A)}}})}else J.body=H1.toWeb(Y);return new g($,J)},w=Symbol("getRequestCache"),n0=Symbol("requestCache"),Bf=Symbol("incomingKey"),Uf=Symbol("urlKey"),r0=Symbol("headersKey"),S=Symbol("abortControllerKey"),i0=Symbol("getAbortController"),Gf={get method(){return this[Bf].method||"GET"},get url(){return this[Uf]},get headers(){return this[r0]||=o0(this[Bf])},[i0](){return this[w](),this[S]},[w](){return this[S]||=new AbortController,this[n0]||=s0(this.method,this[Uf],this.headers,this[Bf],this[S])}};["body","bodyUsed","cache","credentials","destination","integrity","mode","redirect","referrer","referrerPolicy","signal","keepalive"].forEach((f)=>{Object.defineProperty(Gf,f,{get(){return this[w]()[f]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach((f)=>{Object.defineProperty(Gf,f,{value:function(){return this[w]()[f]()}})});Object.setPrototypeOf(Gf,g.prototype);var a0=(f,$)=>{let Z=Object.create(Gf);Z[Bf]=f;let Y=f.url||"";if(Y[0]!=="/"&&(Y.startsWith("http://")||Y.startsWith("https://"))){if(f instanceof Ff)throw new F("Absolute URL for :path is not allowed in HTTP/2");try{let U=new URL(Y);Z[Uf]=U.href}catch(U){throw new F("Invalid absolute URL",{cause:U})}return Z}let Q=(f instanceof Ff?f.authority:f.headers.host)||$;if(!Q)throw new F("Missing host header");let J;if(f instanceof Ff){if(J=f.scheme,!(J==="http"||J==="https"))throw new F("Unsupported scheme")}else J=f.socket&&f.socket.encrypted?"https":"http";let B=new URL(`${J}://${Q}${Y}`);if(B.hostname.length!==Q.length&&B.hostname!==Q.replace(/:\d+$/,""))throw new F("Invalid host header");return Z[Uf]=B.href,Z},N1=Symbol("responseCache"),P=Symbol("getResponseCache"),R=Symbol("cache"),Mf=global.Response,c=class f{#$;#f;[P](){return delete this[R],this[N1]||=new Mf(this.#$,this.#f)}constructor($,Z){let Y;if(this.#$=$,Z instanceof f){let Q=Z[N1];if(Q){this.#f=Q,this[P]();return}else this.#f=Z.#f,Y=new Headers(Z.#f.headers)}else this.#f=Z;if(typeof $==="string"||typeof $?.getReader<"u"||$ instanceof Blob||$ instanceof Uint8Array)this[R]=[Z?.status||200,$,Y||Z?.headers]}get headers(){let $=this[R];if($){if(!($[2]instanceof Headers))$[2]=new Headers($[2]||{"content-type":"text/plain; charset=UTF-8"});return $[2]}return this[P]().headers}get status(){return this[R]?.[0]??this[P]().status}get ok(){let $=this.status;return $>=200&&$<300}};["body","bodyUsed","redirected","statusText","trailers","type","url"].forEach((f)=>{Object.defineProperty(c.prototype,f,{get(){return this[P]()[f]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach((f)=>{Object.defineProperty(c.prototype,f,{value:function(){return this[P]()[f]()}})});Object.setPrototypeOf(c,Mf);Object.setPrototypeOf(c.prototype,Mf.prototype);async function t0(f){return Promise.race([f,Promise.resolve().then(()=>Promise.resolve(void 0))])}function L1(f,$,Z){let Y=(U)=>{f.cancel(U).catch(()=>{})};return $.on("close",Y),$.on("error",Y),(Z??f.read()).then(B,Q),f.closed.finally(()=>{$.off("close",Y),$.off("error",Y)});function Q(U){if(U)$.destroy(U)}function J(){f.read().then(B,Q)}function B({done:U,value:A}){try{if(U)$.end();else if(!$.write(A))$.once("drain",J);else return f.read().then(B,Q)}catch(W){Q(W)}}}function e0(f,$){if(f.locked)throw TypeError("ReadableStream is locked.");else if($.destroyed)return;return L1(f.getReader(),$)}var Rf=(f)=>{let $={};if(!(f instanceof Headers))f=new Headers(f??void 0);let Z=[];for(let[Y,Q]of f)if(Y==="set-cookie")Z.push(Q);else $[Y]=Q;if(Z.length>0)$["set-cookie"]=Z;return $["content-type"]??="text/plain; charset=UTF-8",$},fZ="x-hono-already-sent";if(typeof global.crypto>"u")global.crypto=$Z;var Ef=Symbol("outgoingEnded"),ZZ=()=>new Response(null,{status:400}),K1=(f)=>new Response(null,{status:f instanceof Error&&(f.name==="TimeoutError"||f.constructor.name==="TimeoutError")?504:500}),jf=(f,$)=>{let Z=f instanceof Error?f:Error("unknown error",{cause:f});if(Z.code==="ERR_STREAM_PREMATURE_CLOSE")console.info("The user aborted a request.");else{if(console.error(f),!$.headersSent)$.writeHead(500,{"Content-Type":"text/plain"});$.end(`Error: ${Z.message}`),$.destroy(Z)}},V1=(f)=>{if("flushHeaders"in f&&f.writable)f.flushHeaders()},F1=async(f,$)=>{let[Z,Y,Q]=f[R],J=!1;if(!Q)Q={"content-type":"text/plain; charset=UTF-8"};else if(Q instanceof Headers)J=Q.has("content-length"),Q=Rf(Q);else if(Array.isArray(Q)){let B=new Headers(Q);J=B.has("content-length"),Q=Rf(B)}else for(let B in Q)if(B.length===14&&B.toLowerCase()==="content-length"){J=!0;break}if(!J){if(typeof Y==="string")Q["Content-Length"]=Buffer.byteLength(Y);else if(Y instanceof Uint8Array)Q["Content-Length"]=Y.byteLength;else if(Y instanceof Blob)Q["Content-Length"]=Y.size}if($.writeHead(Z,Q),typeof Y==="string"||Y instanceof Uint8Array)$.end(Y);else if(Y instanceof Blob)$.end(new Uint8Array(await Y.arrayBuffer()));else V1($),await e0(Y,$)?.catch((B)=>jf(B,$));$[Ef]?.()},YZ=(f)=>typeof f.then==="function",QZ=async(f,$,Z={})=>{if(YZ(f))if(Z.errorHandler)try{f=await f}catch(Q){let J=await Z.errorHandler(Q);if(!J)return;f=J}else f=await f.catch(K1);if(R in f)return F1(f,$);let Y=Rf(f.headers);if(f.body){let Q=f.body.getReader(),J=[],B=!1,U=void 0;if(Y["transfer-encoding"]!=="chunked"){let A=2;for(let W=0;W<A;W++){U||=Q.read();let y=await t0(U).catch((O)=>{console.error(O),B=!0});if(!y){if(W===1){await new Promise((O)=>setTimeout(O)),A=3;continue}break}if(U=void 0,y.value)J.push(y.value);if(y.done){B=!0;break}}if(B&&!("content-length"in Y))Y["content-length"]=J.reduce((W,y)=>W+y.length,0)}if($.writeHead(f.status,Y),J.forEach((A)=>{$.write(A)}),B)$.end();else{if(J.length===0)V1($);await L1(Q,$,U)}}else if(Y[fZ]);else $.writeHead(f.status,Y),$.end();$[Ef]?.()},JZ=(f,$={})=>{let Z=$.autoCleanupIncoming??!0;if($.overrideGlobalObjects!==!1&&global.Request!==g)Object.defineProperty(global,"Request",{value:g}),Object.defineProperty(global,"Response",{value:c});return async(Y,Q)=>{let J,B;try{B=a0(Y,$.hostname);let U=!Z||Y.method==="GET"||Y.method==="HEAD";if(!U){if(Y[C1]=!0,Y.on("end",()=>{U=!0}),Y instanceof u0)Q[Ef]=()=>{if(!U)setTimeout(()=>{if(!U)setTimeout(()=>{Y.destroy(),Q.destroy()})})}}if(Q.on("close",()=>{if(B[S]){if(Y.errored)B[S].abort(Y.errored.toString());else if(!Q.writableFinished)B[S].abort("Client connection prematurely closed.")}if(!U)setTimeout(()=>{if(!U)setTimeout(()=>{Y.destroy()})})}),J=f(B,{incoming:Y,outgoing:Q}),R in J)return F1(J,Q)}catch(U){if(!J)if($.errorHandler){if(J=await $.errorHandler(B?U:d0(U)),!J)return}else if(!B)J=ZZ();else J=K1(U);else return jf(U,Q)}try{return await QZ(J,Q,$)}catch(U){return jf(U,Q)}}},XZ=(f)=>{let $=f.fetch,Z=JZ($,{hostname:f.hostname,overrideGlobalObjects:f.overrideGlobalObjects,autoCleanupIncoming:f.autoCleanupIncoming});return(f.createServer||c0)(f.serverOptions||{},Z)},R1=(f,$)=>{let Z=XZ(f);return Z.listen(f?.port??3000,f.hostname,()=>{let Y=Z.address();$&&$(Y)}),Z};import{writeFileSync as U3,unlinkSync as G3,existsSync as v0,readFileSync as A3,mkdirSync as O3}from"node:fs";import{join as b0}from"node:path";import{homedir as I0}from"node:os";import uY from"bun:sqlite";import{mkdirSync as dY}from"node:fs";import{homedir as pY}from"node:os";import{join as i$}from"node:path";import j1 from"bun:sqlite";import{join as BZ}from"path";class u extends M1{db;dbPath;_ownsDb;constructor(f){super();if(f instanceof j1)this.db=f,this.dbPath="",this._ownsDb=!1;else this.dbPath=f||u.getDefaultPath(),this.db=new j1(this.dbPath,{create:!0}),this.db.run("PRAGMA foreign_keys = ON"),this._ownsDb=!0}static getDefaultPath(){let f=process.env.HOME||process.env.USERPROFILE||".";return BZ(f,".zen-code","agents.db")}static default(){return new u}async initialize(){this.createTables(),this.runMigrations(),this.createIndexes()}createTables(){this.db.run(`
|
|
3
|
+
-- Models table (with provider_id foreign key)
|
|
4
|
+
CREATE TABLE IF NOT EXISTS models (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
name TEXT,
|
|
7
|
+
provider_id TEXT NOT NULL,
|
|
8
|
+
model_name TEXT NOT NULL,
|
|
9
|
+
stream_usage INTEGER NOT NULL DEFAULT 0,
|
|
10
|
+
enable_thinking INTEGER NOT NULL DEFAULT 0,
|
|
11
|
+
temperature REAL NOT NULL DEFAULT 0.7,
|
|
12
|
+
max_tokens INTEGER NOT NULL DEFAULT 4096,
|
|
13
|
+
top_p REAL NOT NULL DEFAULT 1.0,
|
|
14
|
+
frequency_penalty REAL NOT NULL DEFAULT 0.0,
|
|
15
|
+
presence_penalty REAL NOT NULL DEFAULT 0.0,
|
|
16
|
+
created_at TEXT NOT NULL,
|
|
17
|
+
updated_at TEXT NOT NULL
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
-- Prompts table (main table)
|
|
21
|
+
CREATE TABLE IF NOT EXISTS prompts (
|
|
22
|
+
id TEXT PRIMARY KEY,
|
|
23
|
+
name TEXT NOT NULL UNIQUE,
|
|
24
|
+
current_version INTEGER NOT NULL DEFAULT 1,
|
|
25
|
+
created_at TEXT NOT NULL,
|
|
26
|
+
updated_at TEXT NOT NULL
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
-- Prompt versions table (content storage)
|
|
30
|
+
CREATE TABLE IF NOT EXISTS prompt_versions (
|
|
31
|
+
id TEXT PRIMARY KEY,
|
|
32
|
+
prompt_id TEXT NOT NULL,
|
|
33
|
+
version INTEGER NOT NULL,
|
|
34
|
+
content TEXT NOT NULL,
|
|
35
|
+
metadata TEXT,
|
|
36
|
+
change_note TEXT,
|
|
37
|
+
created_at TEXT NOT NULL,
|
|
38
|
+
FOREIGN KEY (prompt_id) REFERENCES prompts(id) ON DELETE CASCADE,
|
|
39
|
+
UNIQUE(prompt_id, version)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
-- Middlewares table
|
|
43
|
+
CREATE TABLE IF NOT EXISTS middlewares (
|
|
44
|
+
id TEXT PRIMARY KEY,
|
|
45
|
+
name TEXT NOT NULL,
|
|
46
|
+
description TEXT NOT NULL,
|
|
47
|
+
parameters TEXT,
|
|
48
|
+
created_at TEXT NOT NULL,
|
|
49
|
+
updated_at TEXT NOT NULL
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
-- Agents table
|
|
53
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
54
|
+
id TEXT PRIMARY KEY,
|
|
55
|
+
name TEXT NOT NULL,
|
|
56
|
+
description TEXT NOT NULL,
|
|
57
|
+
system_prompt_id TEXT NOT NULL,
|
|
58
|
+
model_id TEXT NOT NULL,
|
|
59
|
+
created_at TEXT NOT NULL,
|
|
60
|
+
updated_at TEXT NOT NULL,
|
|
61
|
+
FOREIGN KEY (system_prompt_id) REFERENCES prompts(id),
|
|
62
|
+
FOREIGN KEY (model_id) REFERENCES models(id)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
-- Agent-Middlewares junction table
|
|
66
|
+
CREATE TABLE IF NOT EXISTS agent_middlewares (
|
|
67
|
+
agent_id TEXT NOT NULL,
|
|
68
|
+
middleware_id TEXT NOT NULL,
|
|
69
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
70
|
+
custom_params TEXT,
|
|
71
|
+
PRIMARY KEY (agent_id, middleware_id),
|
|
72
|
+
FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE CASCADE,
|
|
73
|
+
FOREIGN KEY (middleware_id) REFERENCES middlewares(id) ON DELETE CASCADE
|
|
74
|
+
);
|
|
75
|
+
`)}createIndexes(){this.db.run(`
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_prompts_name ON prompts(name);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_versions ON prompt_versions(prompt_id, version DESC);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_agents_model_id ON agents(model_id);
|
|
79
|
+
CREATE INDEX IF NOT EXISTS idx_agents_system_prompt_id ON agents(system_prompt_id);
|
|
80
|
+
CREATE INDEX IF NOT EXISTS idx_models_provider_id ON models(provider_id);
|
|
81
|
+
`)}runMigrations(){if(this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='tools'").get())this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("DROP TABLE IF EXISTS agent_tools"),this.db.run("DROP TABLE IF EXISTS tools"),this.db.run("PRAGMA foreign_keys = ON");let $=()=>this.db.prepare("PRAGMA table_info(models)").all().map((U)=>U.name);if($().includes("model_provider")){this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("DROP TABLE IF EXISTS models_migration_new"),this.db.run(`
|
|
82
|
+
CREATE TABLE models_migration_new (
|
|
83
|
+
id TEXT PRIMARY KEY,
|
|
84
|
+
name TEXT,
|
|
85
|
+
provider_id TEXT NOT NULL DEFAULT '',
|
|
86
|
+
model_name TEXT NOT NULL,
|
|
87
|
+
stream_usage INTEGER NOT NULL DEFAULT 0,
|
|
88
|
+
enable_thinking INTEGER NOT NULL DEFAULT 0,
|
|
89
|
+
temperature REAL NOT NULL DEFAULT 0.7,
|
|
90
|
+
max_tokens INTEGER NOT NULL DEFAULT 4096,
|
|
91
|
+
top_p REAL NOT NULL DEFAULT 1.0,
|
|
92
|
+
frequency_penalty REAL NOT NULL DEFAULT 0.0,
|
|
93
|
+
presence_penalty REAL NOT NULL DEFAULT 0.0,
|
|
94
|
+
created_at TEXT NOT NULL,
|
|
95
|
+
updated_at TEXT NOT NULL
|
|
96
|
+
)
|
|
97
|
+
`),this.db.run(`
|
|
98
|
+
INSERT INTO models_migration_new
|
|
99
|
+
(id, name, provider_id, model_name, stream_usage, enable_thinking,
|
|
100
|
+
temperature, max_tokens, top_p, frequency_penalty, presence_penalty,
|
|
101
|
+
created_at, updated_at)
|
|
102
|
+
SELECT
|
|
103
|
+
id,
|
|
104
|
+
name,
|
|
105
|
+
COALESCE(NULLIF(provider_id, ''), '') as provider_id,
|
|
106
|
+
model_name,
|
|
107
|
+
stream_usage, enable_thinking,
|
|
108
|
+
temperature, max_tokens, top_p, frequency_penalty, presence_penalty,
|
|
109
|
+
created_at, updated_at
|
|
110
|
+
FROM models
|
|
111
|
+
`),this.db.run("DROP TABLE models"),this.db.run("ALTER TABLE models_migration_new RENAME TO models"),this.db.run("PRAGMA foreign_keys = ON");return}if(!$().includes("provider_id"))this.db.run("ALTER TABLE models ADD COLUMN provider_id TEXT NOT NULL DEFAULT ''");if(!$().includes("name"))this.db.run("ALTER TABLE models ADD COLUMN name TEXT");let Z=this.db.prepare("PRAGMA table_info(prompts)").all();if(!Z.some((U)=>U.name==="current_version"))this.db.run("ALTER TABLE prompts ADD COLUMN current_version INTEGER NOT NULL DEFAULT 1");if(!Z.some((U)=>U.name==="content"))return;if(!this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='prompt_versions'").get())this.db.run(`
|
|
112
|
+
CREATE TABLE IF NOT EXISTS prompt_versions (
|
|
113
|
+
id TEXT PRIMARY KEY,
|
|
114
|
+
prompt_id TEXT NOT NULL,
|
|
115
|
+
version INTEGER NOT NULL,
|
|
116
|
+
content TEXT NOT NULL,
|
|
117
|
+
metadata TEXT,
|
|
118
|
+
change_note TEXT,
|
|
119
|
+
created_at TEXT NOT NULL,
|
|
120
|
+
FOREIGN KEY (prompt_id) REFERENCES prompts(id) ON DELETE CASCADE,
|
|
121
|
+
UNIQUE(prompt_id, version)
|
|
122
|
+
)
|
|
123
|
+
`);if(this.db.prepare("SELECT COUNT(*) as count FROM prompt_versions").get().count===0){let U=this.db.prepare("SELECT id, content, metadata, created_at FROM prompts WHERE content IS NOT NULL").all();for(let A of U)this.db.prepare("INSERT INTO prompt_versions (id, prompt_id, version, content, metadata, created_at) VALUES (?, ?, 1, ?, ?, ?)").run(`${A.id}-v1`,A.id,A.content,A.metadata,A.created_at)}this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("DROP TABLE IF EXISTS prompts_new"),this.db.run(`
|
|
124
|
+
CREATE TABLE prompts_new (
|
|
125
|
+
id TEXT PRIMARY KEY,
|
|
126
|
+
name TEXT NOT NULL UNIQUE,
|
|
127
|
+
current_version INTEGER NOT NULL DEFAULT 1,
|
|
128
|
+
created_at TEXT NOT NULL,
|
|
129
|
+
updated_at TEXT NOT NULL
|
|
130
|
+
)
|
|
131
|
+
`),this.db.run(`
|
|
132
|
+
INSERT INTO prompts_new (id, name, current_version, created_at, updated_at)
|
|
133
|
+
SELECT id, name, COALESCE(current_version, 1), created_at, updated_at FROM prompts
|
|
134
|
+
`),this.db.run("DROP TABLE prompts"),this.db.run("ALTER TABLE prompts_new RENAME TO prompts"),this.db.run("CREATE INDEX IF NOT EXISTS idx_prompts_name ON prompts(name)"),this.db.run("PRAGMA foreign_keys = ON")}close(){if(this._ownsDb)return Promise.resolve(this.db.close());return Promise.resolve()}async transaction(f){return this.db.transaction(f)()}insertModel(f){return this.db.prepare(`
|
|
135
|
+
INSERT INTO models (id, name, provider_id, model_name, stream_usage, enable_thinking,
|
|
136
|
+
temperature, max_tokens, top_p, frequency_penalty, presence_penalty,
|
|
137
|
+
created_at, updated_at)
|
|
138
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
139
|
+
`).run(f.id,f.name??null,f.provider_id,f.model_name,this.boolToInt(f.stream_usage),this.boolToInt(f.enable_thinking),f.temperature,f.max_tokens,f.top_p,f.frequency_penalty,f.presence_penalty,this.now(),this.now()),Promise.resolve()}getModel(f){let Z=this.db.prepare("SELECT * FROM models WHERE id = ?").get(f);return Promise.resolve(Z??void 0)}getAllModels(){let $=this.db.prepare("SELECT * FROM models ORDER BY created_at DESC").all();return Promise.resolve($)}updateModel(f){if(this.db.prepare(`
|
|
140
|
+
UPDATE models
|
|
141
|
+
SET name = ?, provider_id = ?, model_name = ?, stream_usage = ?, enable_thinking = ?,
|
|
142
|
+
temperature = ?, max_tokens = ?, top_p = ?, frequency_penalty = ?, presence_penalty = ?,
|
|
143
|
+
updated_at = ?
|
|
144
|
+
WHERE id = ?
|
|
145
|
+
`).run(f.name??null,f.provider_id,f.model_name,this.boolToInt(f.stream_usage),this.boolToInt(f.enable_thinking),f.temperature,f.max_tokens,f.top_p,f.frequency_penalty,f.presence_penalty,this.now(),f.id).changes===0)throw Error(`Model with id ${f.id} not found`);return Promise.resolve()}getModelWithProvider(f){let Z=this.db.prepare(`
|
|
146
|
+
SELECT m.*, p.id as provider_id, p.name as provider_name, p.type as provider_type,
|
|
147
|
+
p.base_url as provider_base_url, p.is_active as provider_is_active
|
|
148
|
+
FROM models m
|
|
149
|
+
LEFT JOIN providers p ON m.provider_id = p.id
|
|
150
|
+
WHERE m.id = ?
|
|
151
|
+
`).get(f);return Promise.resolve(Z)}getAllModelsWithProviders(){let $=this.db.prepare(`
|
|
152
|
+
SELECT m.*, p.id as provider_id, p.name as provider_name, p.type as provider_type,
|
|
153
|
+
p.base_url as provider_base_url, p.is_active as provider_is_active
|
|
154
|
+
FROM models m
|
|
155
|
+
LEFT JOIN providers p ON m.provider_id = p.id
|
|
156
|
+
ORDER BY m.created_at DESC
|
|
157
|
+
`).all();return Promise.resolve($)}deleteModel(f){return this.transaction(()=>{let $=this.db.prepare("SELECT COUNT(*) as count FROM agents WHERE model_id = ?"),{count:Z}=$.get(f);if(Z>0)throw Error(`Cannot delete model ${f}: it is referenced by ${Z} agent(s)`);if(this.db.prepare("DELETE FROM models WHERE id = ?").run(f).changes===0)throw Error(`Model with id ${f} not found`)})}insertPrompt(f,$,Z){return this.transaction(()=>{this.db.prepare(`
|
|
158
|
+
INSERT INTO prompts (id, name, current_version, created_at, updated_at)
|
|
159
|
+
VALUES (?, ?, 1, ?, ?)
|
|
160
|
+
`).run(f.id,f.name,this.now(),this.now());let Q=this.db.prepare(`
|
|
161
|
+
INSERT INTO prompt_versions (id, prompt_id, version, content, change_note, created_at)
|
|
162
|
+
VALUES (?, ?, 1, ?, ?, ?)
|
|
163
|
+
`),J=`${f.id}-v1`;Q.run(J,f.id,$,Z||null,this.now())})}getPrompt(f){let Z=this.db.prepare("SELECT * FROM prompts WHERE id = ?").get(f);return Promise.resolve(Z)}getPromptByName(f){let Z=this.db.prepare("SELECT * FROM prompts WHERE name = ?").get(f);return Promise.resolve(Z)}getPromptWithCurrentVersion(f){let Z=this.db.prepare(`
|
|
164
|
+
SELECT p.*, pv.content, pv.metadata, pv.change_note
|
|
165
|
+
FROM prompts p
|
|
166
|
+
JOIN prompt_versions pv ON p.id = pv.prompt_id AND p.current_version = pv.version
|
|
167
|
+
WHERE p.id = ?
|
|
168
|
+
`).get(f);return Promise.resolve(Z)}getPromptWithCurrentVersionByName(f){let Z=this.db.prepare(`
|
|
169
|
+
SELECT p.*, pv.content, pv.metadata, pv.change_note
|
|
170
|
+
FROM prompts p
|
|
171
|
+
JOIN prompt_versions pv ON p.id = pv.prompt_id AND p.current_version = pv.version
|
|
172
|
+
WHERE p.name = ?
|
|
173
|
+
`).get(f);return Promise.resolve(Z)}getAllPrompts(){let $=this.db.prepare("SELECT * FROM prompts ORDER BY created_at DESC").all();return Promise.resolve($)}getAllPromptsWithCurrentVersion(){let $=this.db.prepare(`
|
|
174
|
+
SELECT p.*, pv.content, pv.metadata, pv.change_note
|
|
175
|
+
FROM prompts p
|
|
176
|
+
JOIN prompt_versions pv ON p.id = pv.prompt_id AND p.current_version = pv.version
|
|
177
|
+
ORDER BY p.created_at DESC
|
|
178
|
+
`).all();return Promise.resolve($)}updatePrompt(f){if(this.db.prepare(`
|
|
179
|
+
UPDATE prompts SET name = ?, updated_at = ? WHERE id = ?
|
|
180
|
+
`).run(f.name,this.now(),f.id).changes===0)throw Error(`Prompt with id ${f.id} not found`);return Promise.resolve()}deletePrompt(f){return this.transaction(()=>{let $=this.db.prepare("SELECT COUNT(*) as count FROM agents WHERE system_prompt_id = ?"),{count:Z}=$.get(f);if(Z>0)throw Error(`Cannot delete prompt ${f}: it is referenced by ${Z} agent(s)`);if(this.db.prepare("DELETE FROM prompts WHERE id = ?").run(f).changes===0)throw Error(`Prompt with id ${f} not found`)})}createPromptVersion(f,$,Z){return this.transaction(()=>{let Y=this.db.prepare("SELECT * FROM prompts WHERE id = ?").get(f);if(!Y)throw Error(`Prompt with id ${f} not found`);let Q=Y.current_version+1,J=`${f}-v${Q}`,B=this.now();return this.db.prepare(`
|
|
181
|
+
INSERT INTO prompt_versions (id, prompt_id, version, content, change_note, created_at)
|
|
182
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
183
|
+
`).run(J,f,Q,$,Z||null,B),this.db.prepare(`
|
|
184
|
+
UPDATE prompts SET current_version = ?, updated_at = ? WHERE id = ?
|
|
185
|
+
`).run(Q,B,f),{id:J,prompt_id:f,version:Q,content:$,metadata:null,change_note:Z||null,created_at:B}})}getPromptVersion(f,$){let Y=this.db.prepare(`
|
|
186
|
+
SELECT * FROM prompt_versions WHERE prompt_id = ? AND version = ?
|
|
187
|
+
`).get(f,$);return Promise.resolve(Y)}getPromptVersions(f){let Z=this.db.prepare(`
|
|
188
|
+
SELECT * FROM prompt_versions WHERE prompt_id = ? ORDER BY version DESC
|
|
189
|
+
`).all(f);return Promise.resolve(Z)}rollbackPromptVersion(f,$){return this.transaction(()=>{if(!this.db.prepare(`
|
|
190
|
+
SELECT * FROM prompt_versions WHERE prompt_id = ? AND version = ?
|
|
191
|
+
`).get(f,$))throw Error(`Version ${$} not found for prompt ${f}`);if(this.db.prepare(`
|
|
192
|
+
UPDATE prompts SET current_version = ?, updated_at = ? WHERE id = ?
|
|
193
|
+
`).run($,this.now(),f).changes===0)throw Error(`Prompt with id ${f} not found`)})}insertMiddleware(f){return this.db.prepare(`
|
|
194
|
+
INSERT OR IGNORE INTO middlewares (id, name, description, parameters, created_at, updated_at)
|
|
195
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
196
|
+
`).run(f.id,f.name,f.description,null,this.now(),this.now()),Promise.resolve()}getMiddleware(f){let Z=this.db.prepare("SELECT * FROM middlewares WHERE id = ?").get(f);return Promise.resolve(Z)}getAllMiddlewares(){let $=this.db.prepare("SELECT * FROM middlewares ORDER BY created_at DESC").all();return Promise.resolve($)}updateMiddleware(f){if(this.db.prepare(`
|
|
197
|
+
UPDATE middlewares
|
|
198
|
+
SET name = ?, description = ?, updated_at = ?
|
|
199
|
+
WHERE id = ?
|
|
200
|
+
`).run(f.name,f.description,this.now(),f.id).changes===0)throw Error(`Middleware with id ${f.id} not found`);return Promise.resolve()}deleteMiddleware(f){if(this.db.prepare("DELETE FROM middlewares WHERE id = ?").run(f).changes===0)throw Error(`Middleware with id ${f} not found`);return Promise.resolve()}insertAgent(f){return this.transaction(()=>{if(!f.system_prompt||f.system_prompt.trim()==="")throw Error("system_prompt is required and cannot be empty");if(!f.model||f.model.trim()==="")throw Error("model is required and cannot be empty");this.db.prepare(`
|
|
201
|
+
INSERT INTO agents (id, name, description, system_prompt_id, model_id, created_at, updated_at)
|
|
202
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
203
|
+
`).run(f.id,f.name,f.description,f.system_prompt,f.model,this.now(),this.now());let Z=this.db.prepare(`
|
|
204
|
+
INSERT INTO agent_middlewares (agent_id, middleware_id, enabled, custom_params)
|
|
205
|
+
VALUES (?, ?, ?, ?)
|
|
206
|
+
`);for(let[Y,Q]of Object.entries(f.middlewares)){if(Y.trim()==="")continue;Z.run(f.id,Y,typeof Q==="boolean"?this.boolToInt(Q):1,typeof Q==="boolean"?null:this.safeStringify(Q))}})}async getAgent(f){let Z=this.db.prepare("SELECT * FROM agents WHERE id = ?").get(f);if(!Z)return;let Q=this.db.prepare("SELECT * FROM agent_middlewares WHERE agent_id = ? AND enabled = 1").all(f),J={};for(let B of Q)if(B.custom_params)J[B.middleware_id]=this.safeParse(B.custom_params);else J[B.middleware_id]=!0;return{...Z,middlewares:J}}async getAllAgents(){let $=this.db.prepare("SELECT * FROM agents ORDER BY created_at DESC").all(),Z=[];for(let Y of $){let Q=await this.getAgent(Y.id);if(Q)Z.push(Q)}return Z}updateAgent(f){return this.transaction(()=>{if(!f.system_prompt||f.system_prompt.trim()==="")throw Error("system_prompt is required and cannot be empty");if(!f.model||f.model.trim()==="")throw Error("model is required and cannot be empty");if(this.db.prepare(`
|
|
207
|
+
UPDATE agents
|
|
208
|
+
SET name = ?, description = ?, system_prompt_id = ?, model_id = ?, updated_at = ?
|
|
209
|
+
WHERE id = ?
|
|
210
|
+
`).run(f.name,f.description,f.system_prompt,f.model,this.now(),f.id).changes===0)throw Error(`Agent with id ${f.id} not found`);this.db.prepare("DELETE FROM agent_middlewares WHERE agent_id = ?").run(f.id);let Q=this.db.prepare(`
|
|
211
|
+
INSERT INTO agent_middlewares (agent_id, middleware_id, enabled, custom_params)
|
|
212
|
+
VALUES (?, ?, ?, ?)
|
|
213
|
+
`);for(let[J,B]of Object.entries(f.middlewares)){if(J.trim()==="")continue;Q.run(f.id,J,typeof B==="boolean"?this.boolToInt(B):1,typeof B==="boolean"?null:this.safeStringify(B))}})}deleteAgent(f){return this.transaction(()=>{if(this.db.prepare("DELETE FROM agents WHERE id = ?").run(f).changes===0)throw Error(`Agent with id ${f} not found`)})}async getAgentWithDependencies(f){let $=this.db.prepare("SELECT * FROM agents WHERE id = ?").get(f);if(!$)return;let Z=this.db.prepare("SELECT * FROM models WHERE id = ?").get($.model_id);if(!Z)throw Error(`Model ${$.model_id} not found`);let Y=this.db.prepare(`
|
|
214
|
+
SELECT p.*, pv.content, pv.metadata, pv.change_note
|
|
215
|
+
FROM prompts p
|
|
216
|
+
JOIN prompt_versions pv ON p.id = pv.prompt_id AND p.current_version = pv.version
|
|
217
|
+
WHERE p.id = ?
|
|
218
|
+
`).get($.system_prompt_id);if(!Y)throw Error(`Prompt ${$.system_prompt_id} not found`);return{agent:$,model:Z,systemPrompt:Y}}}async function D1(f){let $=(O)=>{return O.stateSchema=E1,O},Z={id:"filesystem",name:"filesystem",description:"File and directory operations (read, write, search, glob)",execute:async()=>{return $(new Df)}};await f.addMiddleware(Z),f.middlewares.registerImplementation(Z);let Y={id:"terminal",name:"terminal",description:"Terminal command execution (Bash/CMD, background processes)",execute:async()=>{return $(new Pf)}};await f.addMiddleware(Y),f.middlewares.registerImplementation(Y);let Q={id:"subagents",name:"subagents",description:"Task delegation to specialized agents",execute:async()=>{let{createSubAgentsMiddleware:O}=await import("../../code-graph/zen-code/chunk-06trk066.js");return await O(f)}};await f.addMiddleware(Q),f.middlewares.registerImplementation(Q);let J={id:"skills",name:"skills",description:"Progressive skills disclosure",execute:async(O)=>{if(O.projectSkillsDir=O.projectSkillsDir||"./.claude/skills",!O.skillsDir){let V=await import("os"),D=await import("path");O.skillsDir=D.join(V.homedir(),".claude","skills")}let{SkillsMiddleware:T}=await import("../../code-graph/zen-code/chunk-d5gzkkgg.js");return new T(O)}};await f.addMiddleware(J),f.middlewares.registerImplementation(J);let B={id:"agents_md",name:"agents_md",description:"Inject agent documentation",execute:async(O)=>{let{AgentsMdMiddleware:T}=await import("../../code-graph/zen-code/chunk-d5gzkkgg.js");return new T({projectRoot:O?.projectRoot})}};await f.addMiddleware(B),f.middlewares.registerImplementation(B);let U={id:"interactive",name:"interactive",description:"User interaction for approval and input",execute:async()=>{let{InteractiveMiddleware:O}=await import("../../code-graph/zen-code/chunk-nt2yp4jh.js");return O}};await f.addMiddleware(U),f.middlewares.registerImplementation(U);let A={id:"task",name:"task",description:"Task management for todo lists",execute:async()=>{let{taskMiddleware:O}=await import("../../code-graph/zen-code/chunk-wd6s7gg7.js");return O}};await f.addMiddleware(A),f.middlewares.registerImplementation(A);let W={id:"mcp",name:"mcp",description:"Task management for todo lists",execute:async()=>{let{MCPWithConfigMiddleware:O}=await import("../../code-graph/zen-code/chunk-dr32dt9y.js");return new O}};await f.addMiddleware(W),f.middlewares.registerImplementation(W);let y={id:"web",name:"web",description:"Fetch and extract readable content from URLs",execute:async()=>{let{WebMiddleware:O}=await import("../../code-graph/zen-code/chunk-dv1vt080.js");return O}};await f.addMiddleware(y),f.middlewares.registerImplementation(y)}var P1=`# Manager - 项目经理
|
|
219
|
+
|
|
220
|
+
你是 **Manager**,用户与整个 AI 系统的主要交流窗口。你的职责是理解用户需求、拆解任务、协调子 agent 执行,并汇总结果。
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 核心职责
|
|
225
|
+
|
|
226
|
+
**你做的事**:
|
|
227
|
+
1. **需求澄清** - 与用户深入沟通,确保完全理解需求
|
|
228
|
+
2. **任务拆解** - 将复杂需求分解为清晰、可执行的子任务
|
|
229
|
+
3. **任务派发** - 通过 \`task\` 工具将子任务委派给 \`agents/default\`
|
|
230
|
+
4. **进度追踪** - 使用 \`todo_write\` 追踪任务状态
|
|
231
|
+
5. **决策协调** - 根据子任务返回结果决定下一步行动
|
|
232
|
+
6. **结果汇总** - 向用户报告整体进度和最终结果
|
|
233
|
+
|
|
234
|
+
**你不做的事**:
|
|
235
|
+
- ❌ 不直接编写代码
|
|
236
|
+
- ❌ 不直接读取/修改文件
|
|
237
|
+
- ❌ 不执行终端命令
|
|
238
|
+
- ❌ 不做具体的技术实现
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 工作流程
|
|
243
|
+
|
|
244
|
+
### 阶段一:需求理解
|
|
245
|
+
|
|
246
|
+
收到用户请求后,评估是否需要澄清:
|
|
247
|
+
|
|
248
|
+
**需要澄清的情况**:
|
|
249
|
+
- 需求模糊或有歧义
|
|
250
|
+
- 技术方案有多个选择
|
|
251
|
+
- 影响范围不清晰
|
|
252
|
+
- 优先级未明确
|
|
253
|
+
|
|
254
|
+
**使用 \`ask_user_questions\` 工具进行澄清**:
|
|
255
|
+
- 一次性提出关键问题,不要逐一追问
|
|
256
|
+
- 问题要具体,提供可选项
|
|
257
|
+
- 充分理解后才开始规划
|
|
258
|
+
|
|
259
|
+
### 阶段二:任务规划
|
|
260
|
+
|
|
261
|
+
根据需求制定执行计划:
|
|
262
|
+
|
|
263
|
+
\`\`\`markdown
|
|
264
|
+
## 任务分析
|
|
265
|
+
|
|
266
|
+
**用户需求**:{用户原始请求}
|
|
267
|
+
|
|
268
|
+
**任务拆解**:
|
|
269
|
+
1. [任务 A] - 描述 + 预期产出
|
|
270
|
+
2. [任务 B] - 描述 + 预期产出(依赖任务 A)
|
|
271
|
+
3. [任务 C] - 描述 + 预期产出
|
|
272
|
+
|
|
273
|
+
**执行顺序**:A → B → C(B 依赖 A 的结果)
|
|
274
|
+
\`\`\`
|
|
275
|
+
|
|
276
|
+
使用 \`todo_write\` 记录任务列表。
|
|
277
|
+
|
|
278
|
+
### 阶段三:任务执行
|
|
279
|
+
|
|
280
|
+
按计划派发任务给 \`agents/default\`:
|
|
281
|
+
|
|
282
|
+
\`\`\`typescript
|
|
283
|
+
// 通过 task 工具派发
|
|
284
|
+
{
|
|
285
|
+
subagent_id: "agents/default",
|
|
286
|
+
subagent_type: "general-purpose",
|
|
287
|
+
task_description: "具体、完整的任务描述",
|
|
288
|
+
data_transfer: {
|
|
289
|
+
// 传递必要的上下文信息
|
|
290
|
+
context: "相关背景",
|
|
291
|
+
requirements: "具体要求",
|
|
292
|
+
constraints: "约束条件"
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
\`\`\`
|
|
296
|
+
|
|
297
|
+
**派发原则**:
|
|
298
|
+
- 任务描述要完整,包含所有必要上下文
|
|
299
|
+
- 明确期望的产出格式
|
|
300
|
+
- 传递前序任务的关键结果
|
|
301
|
+
|
|
302
|
+
### 阶段四:结果决策
|
|
303
|
+
|
|
304
|
+
收到子任务结果后,根据结果决定下一步:
|
|
305
|
+
|
|
306
|
+
| 结果状态 | 处理方式 |
|
|
307
|
+
|---------|---------|
|
|
308
|
+
| ✅ 成功 | 继续派发下一个任务,或进行最终汇总 |
|
|
309
|
+
| ⚠️ 部分完成 | 评估是否需要补充任务 |
|
|
310
|
+
| ❌ 失败 | 分析原因,调整任务描述后重新派发 |
|
|
311
|
+
| \uD83D\uDD04 需要更多信息 | 向用户确认,获取信息后继续 |
|
|
312
|
+
|
|
313
|
+
### 阶段五:结果汇总
|
|
314
|
+
|
|
315
|
+
所有任务完成后向用户报告:
|
|
316
|
+
|
|
317
|
+
\`\`\`markdown
|
|
318
|
+
## 执行结果
|
|
319
|
+
|
|
320
|
+
**已完成**:
|
|
321
|
+
- ✅ 任务 A:{关键产出摘要}
|
|
322
|
+
- ✅ 任务 B:{关键产出摘要}
|
|
323
|
+
|
|
324
|
+
**总结**:{整体结果,用户最关心的信息}
|
|
325
|
+
|
|
326
|
+
**后续建议**:(如有必要)
|
|
327
|
+
\`\`\`
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 沟通风格
|
|
332
|
+
|
|
333
|
+
- **简洁专业**:直接切入主题,避免冗余
|
|
334
|
+
- **主动澄清**:不确定时及时确认,而非假设
|
|
335
|
+
- **透明进度**:让用户了解当前执行到哪一步
|
|
336
|
+
- **诚实汇报**:如遇问题,客观说明原因和解决方案
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 任务拆解原则
|
|
341
|
+
|
|
342
|
+
**好的子任务**:
|
|
343
|
+
- 单一职责,边界清晰
|
|
344
|
+
- 产出物明确(代码文件、测试、文档等)
|
|
345
|
+
- 相互独立或依赖关系明确
|
|
346
|
+
- 粒度适中(不过大,不过碎)
|
|
347
|
+
|
|
348
|
+
**拆解示例**:
|
|
349
|
+
|
|
350
|
+
> 用户:重构用户模块并添加完整测试
|
|
351
|
+
|
|
352
|
+
拆解为:
|
|
353
|
+
1. 分析现有用户模块结构 → 输出:分析报告
|
|
354
|
+
2. 重构用户模块代码 → 输出:修改后的文件列表
|
|
355
|
+
3. 为用户模块编写单元测试 → 输出:测试文件
|
|
356
|
+
4. 验证重构后所有测试通过 → 输出:测试执行结果
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 重要约束
|
|
361
|
+
|
|
362
|
+
1. **需求优先**:充分理解需求后再行动,避免返工
|
|
363
|
+
2. **完整上下文**:给子 agent 的任务必须包含足够的背景信息
|
|
364
|
+
3. **有序执行**:有依赖关系的任务按顺序执行
|
|
365
|
+
4. **保持专注**:每次只追踪一个进行中的任务
|
|
366
|
+
`;var S1=({cwd:f,env:$})=>`You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
|
|
367
|
+
|
|
368
|
+
IMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.
|
|
369
|
+
IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.
|
|
370
|
+
|
|
371
|
+
# Tone and style
|
|
372
|
+
You should be concise, direct, and to the point.
|
|
373
|
+
You MUST answer concisely with fewer than 4 lines (not including tool use or code generation), unless user asks for detail.
|
|
374
|
+
IMPORTANT: You should minimize output tokens as much as possible while maintaining helpfulness, quality, and accuracy. Only address the specific query or task at hand, avoiding tangential information unless absolutely critical for completing the request. If you can answer in 1-3 sentences or a short paragraph, please do.
|
|
375
|
+
IMPORTANT: You should NOT answer with unnecessary preamble or postamble (such as explaining your code or summarizing your action), unless the user asks you to.
|
|
376
|
+
Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.
|
|
377
|
+
Answer the user's question directly, without elaboration, explanation, or details. One word answers are best. Avoid introductions, conclusions, and explanations. You MUST avoid text before/after your response, such as "The answer is <answer>.", "Here is the content of the file..." or "Based on the information provided, the answer is..." or "Here is what I will do next...". Here are some examples to demonstrate appropriate verbosity:
|
|
378
|
+
|
|
379
|
+
<example>
|
|
380
|
+
user: 2 + 2
|
|
381
|
+
assistant: 4
|
|
382
|
+
</example>
|
|
383
|
+
|
|
384
|
+
<example>
|
|
385
|
+
user: what is 2+2?
|
|
386
|
+
assistant: 4
|
|
387
|
+
</example>
|
|
388
|
+
|
|
389
|
+
<example>
|
|
390
|
+
user: is 11 a prime number?
|
|
391
|
+
assistant: Yes
|
|
392
|
+
</example>
|
|
393
|
+
|
|
394
|
+
<example>
|
|
395
|
+
user: what command should I run to list files in the current directory?
|
|
396
|
+
assistant: ls
|
|
397
|
+
</example>
|
|
398
|
+
|
|
399
|
+
<example>
|
|
400
|
+
user: what command should I run to watch files in the current directory?
|
|
401
|
+
assistant: [runs ls to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]
|
|
402
|
+
npm run dev
|
|
403
|
+
</example>
|
|
404
|
+
|
|
405
|
+
<example>
|
|
406
|
+
user: How many golf balls fit inside a jetta?
|
|
407
|
+
assistant: 150000
|
|
408
|
+
</example>
|
|
409
|
+
|
|
410
|
+
<example>
|
|
411
|
+
user: what files are in the directory src/?
|
|
412
|
+
assistant: [runs ls and sees foo.c, bar.c, baz.c]
|
|
413
|
+
user: which file contains the implementation of foo?
|
|
414
|
+
assistant: src/foo.c
|
|
415
|
+
</example>
|
|
416
|
+
|
|
417
|
+
When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system).
|
|
418
|
+
|
|
419
|
+
Remember that your output will be displayed on a command line interface. Your responses can use Github-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.
|
|
420
|
+
|
|
421
|
+
Output text to communicate with the user; all text you output outside of tool use is displayed to the user. Only use tools to complete tasks. Never use tools like Bash or code comments as means to communicate with the user during the session.
|
|
422
|
+
|
|
423
|
+
If you cannot or will not help the user with something, please do not say why or what it could lead to, since this comes across as preachy and annoying. Please offer helpful alternatives if possible, and otherwise keep your response to 1-2 sentences.
|
|
424
|
+
|
|
425
|
+
Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.
|
|
426
|
+
|
|
427
|
+
IMPORTANT: Keep your responses short, since they will be displayed on a command line interface.
|
|
428
|
+
|
|
429
|
+
# Proactiveness
|
|
430
|
+
You are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:
|
|
431
|
+
- Doing the right thing when asked, including taking actions and follow-up actions
|
|
432
|
+
- Not surprising the user with actions you take without asking
|
|
433
|
+
For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.
|
|
434
|
+
|
|
435
|
+
# Following conventions
|
|
436
|
+
When making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.
|
|
437
|
+
- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).
|
|
438
|
+
- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.
|
|
439
|
+
- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.
|
|
440
|
+
- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.
|
|
441
|
+
|
|
442
|
+
# Doing tasks
|
|
443
|
+
The user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:
|
|
444
|
+
- Use the TodoWrite tool to plan the task if required
|
|
445
|
+
- Use the available search tools to understand the codebase and the user's query. You are encouraged to use the search tools extensively both in parallel and sequentially.
|
|
446
|
+
- Implement the solution using all tools available to you
|
|
447
|
+
- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.
|
|
448
|
+
- VERY IMPORTANT: When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) with Bash if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CLAUDE.md so that you will know to run it next time.
|
|
449
|
+
NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.
|
|
450
|
+
|
|
451
|
+
# Tool usage policy
|
|
452
|
+
- When doing file search, prefer to use the Task tool in order to reduce context usage.
|
|
453
|
+
- You should proactively use the Task tool with specialized agents when the task at hand matches the agent's description.
|
|
454
|
+
- When WebFetch returns a message about a redirect to a different host, you should immediately make a new WebFetch request with the redirect URL provided in the response.
|
|
455
|
+
- You have the capability to call multiple tools in a single response. When multiple independent pieces of information are requested, batch your tool calls together for optimal performance. When making multiple bash tool calls, you MUST send a single message with multiple tools calls to run the calls in parallel. For example, if you need to run "git status" and "git diff", send a single message with two tool calls to run the calls in parallel.
|
|
456
|
+
|
|
457
|
+
Here is useful information about the environment you are running in:
|
|
458
|
+
|
|
459
|
+
<env>
|
|
460
|
+
Working directory: ${f}
|
|
461
|
+
Is directory a git repo: ${$.isGitRepo?"Yes":"No"}
|
|
462
|
+
Platform: ${$.platform}
|
|
463
|
+
OS Version: ${$.osVersion}
|
|
464
|
+
Today's date: ${$.date}
|
|
465
|
+
</env>
|
|
466
|
+
|
|
467
|
+
# Code References
|
|
468
|
+
|
|
469
|
+
When referencing specific functions or pieces of code include the pattern \`file_path:line_number\` to allow the user to easily navigate to the source code location.
|
|
470
|
+
|
|
471
|
+
<example>
|
|
472
|
+
user: Where are errors from the client handled?
|
|
473
|
+
assistant: Clients are marked as failed in the \`connectToServer\` function in src/services/process.ts:712.
|
|
474
|
+
</example>
|
|
475
|
+
`;var UZ={filesystem:!0,terminal:!0,agents_md:!0,skills:!0,subagents:!0,interactive:!0,task:!0,mcp:!0,web:!0};async function p(){let f=new w1,$=new d(f);await $.addModel({id:"glm-4.7",model_name:"glm-4.7",provider_id:process.env.MODEL_PROVIDER||"openai",stream_usage:!0,enable_thinking:!0,temperature:0.7,max_tokens:4096,top_p:1,frequency_penalty:0,presence_penalty:0}),await D1($);let Y=await new h1().loadAllAgents(process.cwd()),Q=new Set(Y.map((J)=>`agents/${J.name}`));for(let J of Y){let B=`agents/${J.name}`,U=`prompts/${J.name}`;await $.addPrompt({id:U,name:J.name},J.systemPrompt),await $.addAgent({id:B,name:J.name,description:J.description,system_prompt:U,model:"glm-4.7",middlewares:UZ})}if(await $.addPrompt({id:"prompts/default",name:"default"},S1({cwd:process.cwd(),env:{isGitRepo:!0,platform:process.platform,osVersion:process.version,date:new Date().toISOString().split("T")[0]}})),await $.addPrompt({id:"prompts/manager",name:"manager"},P1),!Q.has("agents/default"))await $.addAgent({id:"agents/default",name:"Jarvis",description:"代码实现助手",system_prompt:"prompts/default",model:"glm-4.7",middlewares:{filesystem:!0,terminal:!0,agents_md:!0,skills:!0,subagents:!0,interactive:!0,task:!0,mcp:!0,web:!0}});if(!Q.has("agents/manager"))await $.addAgent({id:"agents/manager",name:"Manager",description:"任务管理员",system_prompt:"prompts/manager",model:"glm-4.7",middlewares:{filesystem:!1,terminal:!1,agents_md:!0,skills:!0,subagents:!0,interactive:!0,task:!0,mcp:!1,web:!1}});return $}var GZ=await p(),_1=GZ;var b1=Af(AZ(),1),I1=Af(OZ(),1);import*as s from"node:os";import{dirname as k1,join as WZ}from"node:path";import{pipeline as yZ}from"node:stream/promises";import{fileURLToPath as qZ}from"node:url";var{mkdir:hf,createWriteStream:TZ,move:HZ}=I1.default,l1=k1(qZ(import.meta.url)),NZ="microsoft/ripgrep-prebuilt",Sf=process.env.RIPGREP_VERSION||"v15.0.0",CZ=()=>{let f=process.env.npm_config_arch||s.arch(),$=process.env.platform||s.platform();switch($){case"darwin":switch(f){case"arm64":return"aarch64-apple-darwin.tar.gz";default:return"x86_64-apple-darwin.tar.gz"}case"win32":switch(f){case"x64":return"x86_64-pc-windows-msvc.zip";case"arm":return"aarch64-pc-windows-msvc.zip";default:return"i686-pc-windows-msvc.zip"}case"linux":switch(f){case"x64":return"x86_64-unknown-linux-musl.tar.gz";case"arm":case"armv7l":return"arm-unknown-linux-gnueabihf.tar.gz";case"arm64":return"aarch64-unknown-linux-gnu.tar.gz";case"ppc64":return"powerpc64le-unknown-linux-gnu.tar.gz";case"s390x":return"s390x-unknown-linux-gnu.tar.gz";default:return"i686-unknown-linux-musl.tar.gz"}default:throw Error("Unknown platform: "+$)}},LZ=async(f,$)=>{try{let Z=z1(),Y=await fetch(f);if(!Y.ok)throw Error(`HTTP ${Y.status}: ${Y.statusText}`);await yZ(Y.body,TZ(Z)),await hf(k1($),{recursive:!0}),await HZ(Z,$)}catch(Z){throw console.error(`Failed to download "${f}"`),Z}},KZ=async(f,$)=>{try{await hf($,{recursive:!0}),await b1.default(f,{dir:$})}catch(Z){throw console.error(`Failed to unzip "${f}"`),Z}},VZ=async(f,$)=>{try{await hf($,{recursive:!0}),await o("tar",["xvf",f,"-C",$])}catch(Z){throw console.error(`Failed to extract "${f}"`),Z}},FZ=async(f)=>{if(f==="android")try{return await o("pkg",["install","ripgrep","-y"]),!0}catch($){return console.info("Could not install ripgrep via pkg. Falling back to download."),!1}return!1},RZ=WZ(l1,`rg${process.platform==="win32"?".exe":""}`),m1=async(f)=>{if(await wf(RZ)){console.log("rg cached");return}let $=process.env.platform||s.platform();if($==="android"){if(await FZ($))return}let Z=CZ(),Q=`${process.env.RIPGREP_PREBUILT_BINARIES_MIRROR||`https://v6.gh-proxy.org/https://github.com/${NZ}/releases/download`}/${Sf}/ripgrep-${Sf}-${Z}`,J=`${v1}/vscode-ripgrep/ripgrep-${Sf}-${Z}`,B=f??l1;if(!await wf(J))await LZ(Q,J);else console.info(`File ${J} has been cached`);if(J.endsWith(".tar.gz"))await VZ(J,B);else if(J.endsWith(".zip"))await KZ(J,B);else throw Error(`Invalid downloadPath ${J}`)};async function jZ(f,$,Z,Y,Q){let J=await zf(f,Z,{pkg:$,providerResolver:Q?.providerResolver,initModel:bf,stateSchema:_f,enhanceSystemPrompt:async(U,A)=>{return U+`
|
|
476
|
+
|
|
477
|
+
`+await u1(A)}});Z.thread_id=c1(Y);let B=await J.invoke(Z,{recursionLimit:500,configurable:Y.configurable,context:Y.context});return{active_agent:"",task_store:B.task_store,messages:B.messages}}await m1();function If(f,$){return new g1(_f).addNode("graph",async(Z,Y)=>{let{active_agent:Q}=Z,J=f??_1,B=await vf(J),U=(Q&&Q!=="default"?Q:null)??Z.agent_id??"agents/default";if(!B.includes(U))throw Error(`Unknown agent: ${U}. Available: ${B.join(", ")}`);return await jZ(U,J,Z,Y,$)}).addEdge(x1,"graph").compile()}function n(f,$){let Z=new Map;for(let Y of f)Z.set(Y.id,Y);for(let Y of $)Z.set(Y.id,Y);return Array.from(Z.values())}class kf{base;db;constructor(f,$){this.base=f;this.db=$}async isBuiltin(f){if(!await this.base.getAgent(f))return!1;return await this.db.getAgent(f)===void 0}async hasDbOverride(f,$){switch(f){case"model":return await this.db.getModel($)!==void 0;case"prompt":return await this.db.getPrompt($)!==void 0;case"middleware":return await this.db.getMiddleware($)!==void 0;case"agent":return await this.db.getAgent($)!==void 0}}async _ensureModelInDb(f){if(await this.db.getModel(f))return;let $=await this.base.getModel(f);if(!$)throw Error(`Model '${f}' not found in base storage`);await this.db.insertModel({id:$.id,name:$.name??void 0,provider_id:$.provider_id,model_name:$.model_name,stream_usage:$.stream_usage===1,enable_thinking:$.enable_thinking===1,temperature:$.temperature,max_tokens:$.max_tokens,top_p:$.top_p,frequency_penalty:$.frequency_penalty,presence_penalty:$.presence_penalty})}async _ensurePromptInDb(f){if(await this.db.getPrompt(f))return;let $=await this.base.getPromptWithCurrentVersion(f);if(!$)throw Error(`Prompt '${f}' not found in base storage`);await this.db.insertPrompt({id:$.id,name:$.name},$.content)}async _ensureMiddlewaresInDb(f){for(let $ of f){if($.trim()==="")continue;if(await this.db.getMiddleware($))continue;let Z=await this.base.getMiddleware($);if(!Z)throw Error(`Middleware '${$}' not found in base storage`);await this.db.insertMiddleware({id:Z.id,name:Z.name,description:Z.description})}}async initialize(){}async close(){}async transaction(f){return this.db.transaction(f)}async insertModel(f){return this.db.insertModel(f)}async getModel(f){return await this.db.getModel(f)??await this.base.getModel(f)}async getAllModels(){let f=await this.db.getAllModels(),$=await this.base.getAllModels();return n($,f)}async updateModel(f){return await this._ensureModelInDb(f.id),this.db.updateModel(f)}async deleteModel(f){return this.db.deleteModel(f)}async insertPrompt(f,$,Z){return this.db.insertPrompt(f,$,Z)}async getPrompt(f){return await this.db.getPrompt(f)??await this.base.getPrompt(f)}async getPromptByName(f){return await this.db.getPromptByName(f)??await this.base.getPromptByName(f)}async getPromptWithCurrentVersion(f){return await this.db.getPromptWithCurrentVersion(f)??await this.base.getPromptWithCurrentVersion(f)}async getPromptWithCurrentVersionByName(f){return await this.db.getPromptWithCurrentVersionByName(f)??await this.base.getPromptWithCurrentVersionByName(f)}async getAllPrompts(){let f=await this.db.getAllPrompts(),$=await this.base.getAllPrompts();return n($,f)}async getAllPromptsWithCurrentVersion(){let f=await this.db.getAllPromptsWithCurrentVersion(),$=await this.base.getAllPromptsWithCurrentVersion();return n($,f)}async updatePrompt(f){return await this._ensurePromptInDb(f.id),this.db.updatePrompt(f)}async deletePrompt(f){return this.db.deletePrompt(f)}async createPromptVersion(f,$,Z){return await this._ensurePromptInDb(f),this.db.createPromptVersion(f,$,Z)}async getPromptVersion(f,$){return await this.db.getPromptVersion(f,$)??await this.base.getPromptVersion(f,$)}async getPromptVersions(f){let $=await this.db.getPromptVersions(f);if($.length>0)return $;return this.base.getPromptVersions(f)}async rollbackPromptVersion(f,$){return await this._ensurePromptInDb(f),this.db.rollbackPromptVersion(f,$)}async insertMiddleware(f){return this.db.insertMiddleware(f)}async getMiddleware(f){return await this.db.getMiddleware(f)??await this.base.getMiddleware(f)}async getAllMiddlewares(){let f=await this.db.getAllMiddlewares(),$=await this.base.getAllMiddlewares();return n($,f)}async updateMiddleware(f){return await this._ensureMiddlewaresInDb([f.id]),this.db.updateMiddleware(f)}async deleteMiddleware(f){return this.db.deleteMiddleware(f)}async insertAgent(f){return await this._ensureModelInDb(f.model),await this._ensurePromptInDb(f.system_prompt),await this._ensureMiddlewaresInDb(Object.keys(f.middlewares)),this.db.insertAgent(f)}async getAgent(f){return await this.db.getAgent(f)??await this.base.getAgent(f)}async getAllAgents(){let f=await this.db.getAllAgents(),$=await this.base.getAllAgents();return n($,f)}async updateAgent(f){if(await this.db.getAgent(f.id))return await this._ensureModelInDb(f.model),await this._ensurePromptInDb(f.system_prompt),await this._ensureMiddlewaresInDb(Object.keys(f.middlewares)),this.db.updateAgent(f);else return this.insertAgent(f)}async deleteAgent(f){return this.db.deleteAgent(f)}async getAgentWithDependencies(f){let $=await this.db.getAgentWithDependencies(f);if($)return $;return this.base.getAgentWithDependencies(f)}}import MZ from"bun:sqlite";class lf{db;_ownsDb;constructor(f="./data/index.db"){if(typeof f==="string")this.db=new MZ(f,{create:!0}),this.db.run("PRAGMA foreign_keys = ON"),this._ownsDb=!0;else this.db=f,this._ownsDb=!1}async initialize(){this.createMcpConfigTable(),this.createMcpConfigIndexes()}createMcpConfigTable(){this.db.run(`
|
|
478
|
+
CREATE TABLE IF NOT EXISTS mcp_config (
|
|
479
|
+
id TEXT PRIMARY KEY,
|
|
480
|
+
name TEXT NOT NULL UNIQUE,
|
|
481
|
+
config TEXT NOT NULL,
|
|
482
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
483
|
+
created_at TEXT NOT NULL,
|
|
484
|
+
updated_at TEXT NOT NULL
|
|
485
|
+
);
|
|
486
|
+
`)}createMcpConfigIndexes(){this.db.run(`
|
|
487
|
+
CREATE INDEX IF NOT EXISTS idx_mcp_config_name ON mcp_config(name);
|
|
488
|
+
CREATE INDEX IF NOT EXISTS idx_mcp_config_enabled ON mcp_config(enabled);
|
|
489
|
+
`)}insertMcpConfig(f){if(this.db.prepare("SELECT id FROM mcp_config WHERE name = ?").get(f.name))throw Error(`MCP config with name "${f.name}" already exists`);return this.db.prepare(`
|
|
490
|
+
INSERT INTO mcp_config (id, name, config, enabled, created_at, updated_at)
|
|
491
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
492
|
+
`).run(f.id,f.name,JSON.stringify(f.config),this.boolToInt(f.enabled),this.now(),this.now()),Promise.resolve()}getMcpConfig(f){let Z=this.db.prepare("SELECT * FROM mcp_config WHERE id = ?").get(f);return Promise.resolve(Z??null)}getMcpConfigByName(f){let Z=this.db.prepare("SELECT * FROM mcp_config WHERE name = ?").get(f);return Promise.resolve(Z??null)}getAllMcpConfigs(){let $=this.db.prepare("SELECT * FROM mcp_config ORDER BY created_at DESC").all();return Promise.resolve($)}getEnabledMcpConfigs(){let $=this.db.prepare("SELECT * FROM mcp_config WHERE enabled = 1 ORDER BY created_at DESC").all();return Promise.resolve($)}updateMcpConfig(f){if(this.db.prepare("SELECT id FROM mcp_config WHERE name = ? AND id != ?").get(f.name,f.id))throw Error(`MCP config with name "${f.name}" already exists`);if(this.db.prepare(`
|
|
493
|
+
UPDATE mcp_config
|
|
494
|
+
SET name = ?, config = ?, enabled = ?, updated_at = ?
|
|
495
|
+
WHERE id = ?
|
|
496
|
+
`).run(f.name,JSON.stringify(f.config),this.boolToInt(f.enabled),this.now(),f.id).changes===0)throw Error(`MCP config with id ${f.id} not found`);return Promise.resolve()}deleteMcpConfig(f){if(this.db.prepare("DELETE FROM mcp_config WHERE id = ?").run(f).changes===0)throw Error(`MCP config with id ${f} not found`);return Promise.resolve()}async getMcpConfigAsObject(){let f=await this.getEnabledMcpConfigs(),$={};for(let Z of f)try{let Y=JSON.parse(Z.config);$[Z.name]=Y}catch(Y){console.warn(`Failed to parse MCP config ${Z.name}:`,Y)}return $}now(){return new Date().toISOString()}boolToInt(f){return f?1:0}close(){if(this._ownsDb)this.db.close()}}var EZ=null;function d1(f){EZ=f}import DZ from"bun:sqlite";class mf{db;_ownsDb;constructor(f="./data/index.db"){if(typeof f==="string")this.db=new DZ(f,{create:!0}),this.db.run("PRAGMA foreign_keys = ON"),this._ownsDb=!0;else this.db=f,this._ownsDb=!1}async initialize(){this.createWorkspaceTable(),this.createWorkspaceIndexes()}createWorkspaceTable(){this.db.run(`
|
|
497
|
+
CREATE TABLE IF NOT EXISTS workspaces (
|
|
498
|
+
id TEXT PRIMARY KEY,
|
|
499
|
+
name TEXT NOT NULL UNIQUE,
|
|
500
|
+
root_path TEXT NOT NULL,
|
|
501
|
+
description TEXT,
|
|
502
|
+
created_at TEXT NOT NULL,
|
|
503
|
+
last_accessed_at TEXT,
|
|
504
|
+
updated_at TEXT NOT NULL
|
|
505
|
+
);
|
|
506
|
+
`)}createWorkspaceIndexes(){this.db.run(`
|
|
507
|
+
CREATE INDEX IF NOT EXISTS idx_workspaces_name ON workspaces(name);
|
|
508
|
+
`),this.db.run(`
|
|
509
|
+
CREATE INDEX IF NOT EXISTS idx_workspaces_last_accessed ON workspaces(last_accessed_at DESC);
|
|
510
|
+
`)}async getAllWorkspaces(){return this.db.prepare(`
|
|
511
|
+
SELECT * FROM workspaces
|
|
512
|
+
ORDER BY COALESCE(last_accessed_at, created_at) DESC
|
|
513
|
+
`).all().map((Z)=>this.rowToWorkspace(Z))}async getWorkspaceById(f){let Z=this.db.prepare("SELECT * FROM workspaces WHERE id = ?").get(f);return Z?this.rowToWorkspace(Z):null}async getWorkspaceByName(f){let Z=this.db.prepare("SELECT * FROM workspaces WHERE name = ?").get(f);return Z?this.rowToWorkspace(Z):null}async createWorkspace(f){if(await this.getWorkspaceByName(f.name))throw Error(`Workspace with name "${f.name}" already exists`);let Z=await import("fs/promises");try{if(!(await Z.stat(f.rootPath)).isDirectory())throw Error(`Path "${f.rootPath}" is not a directory`)}catch(U){throw Error(`Path "${f.rootPath}" does not exist or is not accessible`)}let Y=f.id||crypto.randomUUID(),Q=this.now();this.db.prepare(`
|
|
514
|
+
INSERT INTO workspaces (id, name, root_path, description, created_at, last_accessed_at, updated_at)
|
|
515
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
516
|
+
`).run(Y,f.name,f.rootPath,f.description??null,Q,Q,Q);let B=await this.getWorkspaceById(Y);if(!B)throw Error("Failed to create workspace");return B}async updateWorkspace(f){let $=await this.getWorkspaceById(f.id);if(!$)throw Error(`Workspace with id "${f.id}" not found`);if(f.name&&f.name!==$.name){if(await this.getWorkspaceByName(f.name))throw Error(`Workspace with name "${f.name}" already exists`)}this.db.prepare(`
|
|
517
|
+
UPDATE workspaces
|
|
518
|
+
SET name = ?, description = ?, updated_at = ?
|
|
519
|
+
WHERE id = ?
|
|
520
|
+
`).run(f.name??$.name,f.description??$.description??null,this.now(),f.id);let Y=await this.getWorkspaceById(f.id);if(!Y)throw Error("Failed to update workspace");return Y}async deleteWorkspace(f){if(!await this.getWorkspaceById(f))throw Error(`Workspace with id "${f}" not found`);if(this.db.prepare("DELETE FROM workspaces WHERE id = ?").run(f).changes===0)throw Error(`Failed to delete workspace with id "${f}"`)}async validatePath(f){let $=await import("fs/promises");try{if(!(await $.stat(f)).isDirectory())return{valid:!1,error:"Path is not a directory"};return{valid:!0}}catch(Z){return{valid:!1,error:"Path does not exist or is not accessible"}}}async touchWorkspace(f){this.db.prepare("UPDATE workspaces SET last_accessed_at = ? WHERE id = ?").run(this.now(),f)}rowToWorkspace(f){return{id:f.id,name:f.name,rootPath:f.root_path,description:f.description??void 0,createdAt:f.created_at,lastAccessedAt:f.last_accessed_at??void 0,updatedAt:f.updated_at}}now(){return new Date().toISOString()}close(){if(this._ownsDb)this.db.close()}}import PZ from"bun:sqlite";class xf{db;_ownsDb;constructor(f="./data/index.db"){if(typeof f==="string")this.db=new PZ(f,{create:!0}),this.db.run("PRAGMA foreign_keys = ON"),this.db.run("PRAGMA journal_mode = WAL"),this._ownsDb=!0;else this.db=f,this._ownsDb=!1}async initialize(){this.createTables()}createTables(){this.db.run(`
|
|
521
|
+
CREATE TABLE IF NOT EXISTS cron_tasks (
|
|
522
|
+
id TEXT PRIMARY KEY,
|
|
523
|
+
name TEXT NOT NULL,
|
|
524
|
+
description TEXT,
|
|
525
|
+
cron_expression TEXT NOT NULL,
|
|
526
|
+
prompt TEXT NOT NULL,
|
|
527
|
+
agent_id TEXT NOT NULL,
|
|
528
|
+
initial_state TEXT NOT NULL DEFAULT '{}',
|
|
529
|
+
enabled INTEGER DEFAULT 1,
|
|
530
|
+
max_retries INTEGER DEFAULT 0,
|
|
531
|
+
variables TEXT DEFAULT '{}',
|
|
532
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
533
|
+
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
534
|
+
);
|
|
535
|
+
`),this.db.run(`
|
|
536
|
+
CREATE TABLE IF NOT EXISTS cron_logs (
|
|
537
|
+
id TEXT PRIMARY KEY,
|
|
538
|
+
cron_task_id TEXT NOT NULL,
|
|
539
|
+
thread_id TEXT,
|
|
540
|
+
status TEXT NOT NULL,
|
|
541
|
+
started_at TEXT NOT NULL,
|
|
542
|
+
finished_at TEXT,
|
|
543
|
+
error_message TEXT,
|
|
544
|
+
retry_count INTEGER DEFAULT 0,
|
|
545
|
+
queued_at TEXT,
|
|
546
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
547
|
+
FOREIGN KEY (cron_task_id) REFERENCES cron_tasks(id) ON DELETE CASCADE
|
|
548
|
+
);
|
|
549
|
+
`),this.db.run("CREATE INDEX IF NOT EXISTS idx_cron_tasks_enabled ON cron_tasks(enabled);"),this.db.run("CREATE INDEX IF NOT EXISTS idx_cron_logs_task_id ON cron_logs(cron_task_id);"),this.db.run("CREATE INDEX IF NOT EXISTS idx_cron_logs_status ON cron_logs(status);"),this.db.run("CREATE INDEX IF NOT EXISTS idx_cron_logs_created_at ON cron_logs(created_at);"),this.migrateIfNeeded()}migrateIfNeeded(){if(!this.db.prepare("PRAGMA table_info(cron_tasks)").all().some((Z)=>Z.name==="initial_state"))this.db.run("ALTER TABLE cron_tasks ADD COLUMN initial_state TEXT NOT NULL DEFAULT '{}'"),console.log("[Cron] Migrated: added initial_state column to cron_tasks")}async getAllTasks(){return this.db.prepare("SELECT * FROM cron_tasks ORDER BY created_at DESC").all().map((Z)=>this.rowToTask(Z))}async getTask(f){let Z=this.db.prepare("SELECT * FROM cron_tasks WHERE id = ?").get(f);return Z?this.rowToTask(Z):null}async getEnabledTasks(){return this.db.prepare("SELECT * FROM cron_tasks WHERE enabled = 1 ORDER BY created_at DESC").all().map((Z)=>this.rowToTask(Z))}async insertTask(f){if(this.db.prepare("SELECT id FROM cron_tasks WHERE id = ?").get(f.id))throw Error(`Cron task with id "${f.id}" already exists`);let Y=this.db.prepare(`
|
|
550
|
+
INSERT INTO cron_tasks (id, name, description, cron_expression, prompt, agent_id, initial_state, enabled, max_retries, variables, created_at, updated_at)
|
|
551
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
552
|
+
`),Q=this.now();Y.run(f.id,f.name,f.description??null,f.cron_expression,f.prompt,f.agent_id,JSON.stringify(f.initial_state??{}),this.boolToInt(f.enabled??!0),f.max_retries??0,JSON.stringify(f.variables??{}),Q,Q)}async updateTask(f){let $=await this.getTask(f.id);if(!$)throw Error(`Cron task with id ${f.id} not found`);this.db.prepare(`
|
|
553
|
+
UPDATE cron_tasks
|
|
554
|
+
SET name = ?, description = ?, cron_expression = ?, prompt = ?, agent_id = ?, initial_state = ?, enabled = ?, max_retries = ?, variables = ?, updated_at = ?
|
|
555
|
+
WHERE id = ?
|
|
556
|
+
`).run(f.name??$.name,f.description??$.description??null,f.cron_expression??$.cron_expression,f.prompt??$.prompt,f.agent_id??$.agent_id,JSON.stringify(f.initial_state??$.initial_state),this.boolToInt(f.enabled??$.enabled),f.max_retries??$.max_retries,JSON.stringify(f.variables??$.variables),this.now(),f.id)}async deleteTask(f){if(this.db.prepare("DELETE FROM cron_tasks WHERE id = ?").run(f).changes===0)throw Error(`Cron task with id ${f} not found`)}async getLogsByTaskId(f,$=50,Z=0){return this.db.prepare("SELECT * FROM cron_logs WHERE cron_task_id = ? ORDER BY created_at DESC LIMIT ? OFFSET ?").all(f,$,Z).map((J)=>this.rowToLog(J))}async getRecentLogs(f=50){return this.db.prepare("SELECT * FROM cron_logs ORDER BY created_at DESC LIMIT ?").all(f).map((Y)=>this.rowToLog(Y))}async getLog(f){let Z=this.db.prepare("SELECT * FROM cron_logs WHERE id = ?").get(f);return Z?this.rowToLog(Z):null}async insertLog(f){let $=crypto.randomUUID();return this.db.prepare(`
|
|
557
|
+
INSERT INTO cron_logs (id, cron_task_id, thread_id, status, started_at, finished_at, error_message, retry_count, queued_at, created_at)
|
|
558
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
559
|
+
`).run($,f.cron_task_id,f.thread_id??null,f.status,f.started_at,f.finished_at??null,f.error_message??null,f.retry_count,f.queued_at??null,this.now()),$}async updateLog(f,$){let Z=await this.getLog(f);if(!Z)throw Error(`Cron log with id ${f} not found`);this.db.prepare(`
|
|
560
|
+
UPDATE cron_logs
|
|
561
|
+
SET thread_id = ?, status = ?, finished_at = ?, error_message = ?, retry_count = ?, queued_at = ?
|
|
562
|
+
WHERE id = ?
|
|
563
|
+
`).run($.thread_id??Z.thread_id??null,$.status??Z.status,$.finished_at??Z.finished_at??null,$.error_message??Z.error_message??null,$.retry_count??Z.retry_count,$.queued_at??Z.queued_at??null,f)}async deleteLogsBefore(f,$){return this.db.prepare("DELETE FROM cron_logs WHERE cron_task_id = ? AND created_at < ?").run(f,$).changes}async clearLogsByTaskId(f){return this.db.prepare("DELETE FROM cron_logs WHERE cron_task_id = ?").run(f).changes}async resetStuckLogs(f){return this.db.prepare(`
|
|
564
|
+
UPDATE cron_logs
|
|
565
|
+
SET status = 'failed',
|
|
566
|
+
error_message = ?,
|
|
567
|
+
finished_at = ?
|
|
568
|
+
WHERE status IN ('running', 'queued', 'pending')
|
|
569
|
+
`).run(f,new Date().toISOString()).changes}async pruneLogsPerTask(f=100){return this.db.prepare(`
|
|
570
|
+
DELETE FROM cron_logs
|
|
571
|
+
WHERE id IN (
|
|
572
|
+
SELECT cl.id FROM cron_logs cl
|
|
573
|
+
WHERE (
|
|
574
|
+
SELECT COUNT(*) FROM cron_logs cl2
|
|
575
|
+
WHERE cl2.cron_task_id = cl.cron_task_id
|
|
576
|
+
AND cl2.created_at >= cl.created_at
|
|
577
|
+
) > ?
|
|
578
|
+
)
|
|
579
|
+
`).run(f).changes}rowToTask(f){return{id:f.id,name:f.name,description:f.description??void 0,cron_expression:f.cron_expression,prompt:f.prompt,agent_id:f.agent_id,initial_state:JSON.parse(f.initial_state||"{}"),enabled:f.enabled===1,max_retries:f.max_retries,variables:JSON.parse(f.variables||"{}"),created_at:f.created_at,updated_at:f.updated_at}}rowToLog(f){return{id:f.id,cron_task_id:f.cron_task_id,thread_id:f.thread_id??void 0,status:f.status,started_at:f.started_at,finished_at:f.finished_at??void 0,error_message:f.error_message??void 0,retry_count:f.retry_count,queued_at:f.queued_at??void 0,created_at:f.created_at}}now(){return new Date().toISOString()}boolToInt(f){return f?1:0}close(){if(this._ownsDb)this.db.close()}}var tf=Af(rf(),1);class af{running=new Map;queue=[];canExecute(f){return!this.running.has(f)}markRunning(f,$){this.running.set(f,$)}markCompleted(f){this.running.delete(f)}tryDequeueAndMarkRunning(f){if(this.running.has(f))return null;let $=this.queue.findIndex((Y)=>Y.taskId===f);if($===-1)return null;let[Z]=this.queue.splice($,1);return this.running.set(Z.taskId,Z.logId),Z}tryDequeueAnyAndMarkRunning(){for(let f=0;f<this.queue.length;f++){let $=this.queue[f];if(!this.running.has($.taskId))return this.queue.splice(f,1),this.running.set($.taskId,$.logId),$}return null}enqueue(f,$){this.queue.push({taskId:f,logId:$,queuedAt:new Date().toISOString()})}enqueueFirst(f){this.queue.unshift(f)}dequeue(){return this.queue.shift()??null}dequeueByTaskId(f){let $=this.queue.findIndex((Y)=>Y.taskId===f);if($===-1)return null;let[Z]=this.queue.splice($,1);return Z}getQueuePosition(f){return this.queue.findIndex(($)=>$.taskId===f)}getQueueLength(){return this.queue.length}getRunningCount(){return this.running.size}getRunningLogId(f){return this.running.get(f)??null}clear(){this.queue=[]}getStatus(){return{running:Array.from(this.running.entries()).map(([f,$])=>({taskId:f,logId:$})),queued:[...this.queue]}}removeFromQueue(f){let $=this.queue.findIndex((Z)=>Z.taskId===f);if($!==-1)return this.queue.splice($,1),!0;return!1}}class ef{storage;executor;queue;scheduledJobs=new Map;isRunning=!1;constructor(f,$){this.storage=f,this.executor=$,this.queue=new af}async start(){if(this.isRunning){console.log("[Cron] Scheduler is already running");return}console.log("[Cron] Starting scheduler...");let f=await this.storage.resetStuckLogs("Server restart: execution interrupted");if(f>0)console.log(`[Cron] Reset ${f} stuck log(s) from previous run`);let $=await this.storage.pruneLogsPerTask(100);if($>0)console.log(`[Cron] Pruned ${$} old log(s)`);this.isRunning=!0;let Z=await this.storage.getEnabledTasks();console.log(`[Cron] Found ${Z.length} enabled tasks`);for(let Y of Z)this.scheduleTask(Y);console.log("[Cron] Scheduler started")}async stop(){console.log("[Cron] Stopping scheduler..."),this.isRunning=!1;for(let[f,$]of this.scheduledJobs)$.stop();this.scheduledJobs.clear(),console.log("[Cron] Scheduler stopped")}scheduleTask(f){if(this.scheduledJobs.has(f.id))this.scheduledJobs.get(f.id).stop(),this.scheduledJobs.delete(f.id);if(!f.enabled){console.log(`[Cron] Task "${f.name}" is disabled, skipping`);return}if(!tf.default.validate(f.cron_expression)){console.error(`[Cron] Invalid cron expression for task "${f.name}": ${f.cron_expression}`);return}let $=tf.default.schedule(f.cron_expression,async()=>{let Z=await this.storage.getTask(f.id);if(!Z){console.warn(`[Cron] Task "${f.id}" no longer exists, skipping`);return}if(!Z.enabled){console.log(`[Cron] Task "${Z.name}" was disabled, skipping`);return}this.onTrigger(Z)});this.scheduledJobs.set(f.id,$),console.log(`[Cron] Scheduled task "${f.name}" with expression: ${f.cron_expression}`)}unscheduleTask(f){if(this.scheduledJobs.has(f))this.scheduledJobs.get(f).stop(),this.scheduledJobs.delete(f),console.log(`[Cron] Unscheduled task: ${f}`)}async rescheduleTask(f){let $=await this.storage.getTask(f);if($)this.scheduleTask($)}async onTrigger(f){console.log(`[Cron] Task "${f.name}" triggered at ${new Date().toISOString()}`);try{let $=await this.storage.insertLog({cron_task_id:f.id,status:"pending",started_at:new Date().toISOString(),retry_count:0});if(this.queue.canExecute(f.id))this.queue.markRunning(f.id,$),await this.storage.updateLog($,{status:"running"}),await this.executeWithRetry(f,$);else console.log(`[Cron] Task "${f.name}" is already running, queuing...`),await this.storage.updateLog($,{status:"queued",queued_at:new Date().toISOString()}),this.queue.enqueue(f.id,$)}catch($){console.error(`[Cron] Error triggering task "${f.name}":`,$)}}async executeWithRetry(f,$){let Z=0,Y=f.max_retries;while(Z<=Y)try{if((await this.executor.execute(f,$)).success){await this.markSuccess(f.id,$);return}if(Z<Y){Z++,console.log(`[Cron] Retrying task "${f.name}" (${Z}/${Y})`),await this.storage.updateLog($,{status:"running",retry_count:Z}),await this.sleep(Math.min(1000*Math.pow(2,Z),30000));continue}throw Error(`Max retries (${Y}) exceeded`)}catch(Q){let J=Q instanceof Error?Q.message:String(Q);console.error(`[Cron] Execution error for task "${f.name}":`,J),await this.markFailed(f.id,$,J);return}}async markSuccess(f,$){this.queue.markCompleted(f),await this.storage.updateLog($,{status:"success",finished_at:new Date().toISOString()}),await this.processQueue(f)}async markFailed(f,$,Z){this.queue.markCompleted(f),await this.storage.updateLog($,{status:"failed",error_message:Z,finished_at:new Date().toISOString()}),await this.processQueue(f)}async processQueue(f){let $=this.queue.tryDequeueAndMarkRunning(f);if($){console.log(`[Cron] Processing queued execution for task "${f}"`),await this.storage.updateLog($.logId,{status:"running"});let Y=await this.storage.getTask($.taskId);if(Y)await this.executeWithRetry(Y,$.logId);return}let Z=this.queue.tryDequeueAnyAndMarkRunning();if(Z){console.log(`[Cron] Processing queued execution for task "${Z.taskId}"`),await this.storage.updateLog(Z.logId,{status:"running"});let Y=await this.storage.getTask(Z.taskId);if(Y)await this.executeWithRetry(Y,Z.logId)}}async triggerManually(f){let $=await this.storage.getTask(f);if(!$)throw Error(`Task not found: ${f}`);console.log(`[Cron] Manually triggering task "${$.name}"`);let Z=await this.storage.insertLog({cron_task_id:$.id,status:"pending",started_at:new Date().toISOString(),retry_count:0});if(this.queue.canExecute($.id))this.queue.markRunning($.id,Z),await this.storage.updateLog(Z,{status:"running"}),this.executeWithRetry($,Z).catch((Y)=>{console.error("[Cron] Manual trigger error:",Y)});else console.log(`[Cron] Task "${$.name}" is already running, queuing...`),await this.storage.updateLog(Z,{status:"queued",queued_at:new Date().toISOString()}),this.queue.enqueue($.id,Z);return Z}getQueueStatus(){return this.queue.getStatus()}getScheduledCount(){return this.scheduledJobs.size}isActive(){return this.isRunning}sleep(f){return new Promise(($)=>setTimeout($,f))}}function g$(f,$){return f.replace(/\{\{(\w+)\}\}/g,(Z,Y)=>{if(Y in $)return $[Y];return console.warn(`[Cron] Variable "${Y}" not found in task variables`),Z})}var zY=Number(process.env.ZEN_CORE_PORT||8125);class f1{storage;apiBaseUrl;maxExecutionTime;constructor(f,$={}){this.storage=f,this.apiBaseUrl=$.apiBaseUrl??process.env.LANGGRAPH_API_URL??`http://127.0.0.1:${zY}`,this.maxExecutionTime=$.maxExecutionTime??600000}async execute(f,$){try{let Z=f.initial_state?.agent_id??f.agent_id,Y=f.initial_state?.cwd,Q=f.initial_state?.model_id;if(!Z)return await this.storage.updateLog($,{status:"failed",error_message:"Task is missing agent_id, skipping execution",finished_at:new Date().toISOString()}),{success:!1,error:"Missing agent_id"};if(!Y)return await this.storage.updateLog($,{status:"failed",error_message:"Task is missing cwd (workspace path) in initial_state, skipping execution",finished_at:new Date().toISOString()}),{success:!1,error:"Missing cwd"};if(!Q)console.warn(`[Cron] Task "${f.name}" has no model_id in initial_state, falling back to agent's default model`);let J=g$(f.prompt,f.variables);console.log(`[Cron] Executing task "${f.name}" with prompt: ${J.substring(0,100)}...`);let B=await this.createThread({cwd:Y});return console.log(`[Cron] Created thread: ${B.thread_id}`),await this.storage.updateLog($,{thread_id:B.thread_id}),await this.runAgent(B.thread_id,Z,J,f.initial_state),await this.storage.updateLog($,{status:"success",finished_at:new Date().toISOString()}),{success:!0,threadId:B.thread_id}}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);return console.error("[Cron] Task execution failed:",Y),await this.storage.updateLog($,{status:"failed",error_message:Y,finished_at:new Date().toISOString()}),{success:!1,error:Y}}}async fetchWithTimeout(f,$={},Z=30000){let Y=new AbortController,Q=setTimeout(()=>Y.abort(),Z);try{return await fetch(f,{...$,signal:Y.signal})}finally{clearTimeout(Q)}}async createThread(f){let $=await this.fetchWithTimeout(`${this.apiBaseUrl}/api/langgraph/threads`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({assistant_id:"swarm",metadata:{path:f.cwd,source:"cron",created_at:new Date().toISOString()}})});if(!$.ok){let Z=await $.text();throw Error(`Failed to create thread: ${$.status} ${Z}`)}return $.json()}async runAgent(f,$,Z,Y={}){let Q=Y.agent_id??$,J=await this.fetchWithTimeout(`${this.apiBaseUrl}/api/langgraph/threads/${f}/runs`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({assistant_id:"swarm",input:{...Y,messages:[{type:"human",content:Z}],agent_id:Q}})});if(!J.ok){let B=await J.text();throw Error(`Failed to run agent: ${J.status} ${B}`)}await this.waitForCompletion(f)}async waitForCompletion(f){let $=Date.now();while(Date.now()-$<this.maxExecutionTime)try{let Z=await this.fetchWithTimeout(`${this.apiBaseUrl}/api/langgraph/threads/${f}/state`,{},1e4);if(!Z.ok)throw Error(`Failed to get thread state: ${Z.status}`);let Y=await Z.json();if(Y.next&&Y.next.length===0)return;await this.sleep(1000)}catch(Z){console.warn("[Cron] Error checking thread state:",Z),await this.sleep(2000)}throw Error(`Execution timeout after ${this.maxExecutionTime}ms`)}sleep(f){return new Promise(($)=>setTimeout($,f))}}import cY from"bun:sqlite";import{createCipheriv as vY,createDecipheriv as bY,randomBytes as d$,scryptSync as c$}from"crypto";import{readFileSync as IY,writeFileSync as kY,mkdirSync as lY,existsSync as mY}from"fs";import{join as p$}from"path";import{homedir as xY}from"os";var o$="aes-256-gcm",s$=p$(xY(),".zen-swarm"),Nf=p$(s$,"encryption.key"),u$="zen-swarm-provider-v2-salt",gY=()=>{let f=process.env.PROVIDER_ENCRYPTION_KEY;if(f)return c$(f,u$,32);if(!mY(Nf)){lY(s$,{recursive:!0});let Z=d$(32).toString("hex");kY(Nf,Z,{encoding:"utf-8",mode:384})}let $=IY(Nf,"utf-8").trim();if(!$||$.length<32)throw Error(`Invalid encryption key in ${Nf}. Delete the file to regenerate, or set PROVIDER_ENCRYPTION_KEY env var.`);return c$($,u$,32)},$1=null,n$=()=>{if(!$1)$1=gY();return $1};function Z1(f){let $=n$(),Z=d$(16),Y=vY(o$,$,Z),Q=Y.update(f,"utf8","hex");Q+=Y.final("hex");let J=Y.getAuthTag();return{encrypted:Q,iv:Z.toString("hex"),authTag:J.toString("hex")}}function Cf(f,$,Z){let Y=n$(),Q=bY(o$,Y,Buffer.from($,"hex"));Q.setAuthTag(Buffer.from(Z,"hex"));let J=Q.update(f,"hex","utf8");return J+=Q.final("utf8"),J}function r$(f){if(!f)return"";if(f.length<=8)return"****";return`${f.slice(0,4)}${"*".repeat(Math.min(f.length-8,20))}${f.slice(-4)}`}class Y1{db;_ownsDb;constructor(f="./data/index.db"){if(typeof f==="string")this.db=new cY(f,{create:!0}),this.db.run("PRAGMA foreign_keys = ON"),this.db.run("PRAGMA journal_mode = WAL"),this._ownsDb=!0;else this.db=f,this._ownsDb=!1}async initialize(){this.createTables()}createTables(){this.db.run(`
|
|
580
|
+
CREATE TABLE IF NOT EXISTS providers (
|
|
581
|
+
id TEXT PRIMARY KEY,
|
|
582
|
+
name TEXT NOT NULL UNIQUE,
|
|
583
|
+
type TEXT NOT NULL CHECK(type IN (
|
|
584
|
+
'openai',
|
|
585
|
+
'anthropic',
|
|
586
|
+
'gemini',
|
|
587
|
+
'deepseek',
|
|
588
|
+
'moonshot',
|
|
589
|
+
'zhipu',
|
|
590
|
+
'custom'
|
|
591
|
+
)),
|
|
592
|
+
api_key_encrypted TEXT NOT NULL,
|
|
593
|
+
api_key_iv TEXT NOT NULL,
|
|
594
|
+
api_key_auth_tag TEXT NOT NULL,
|
|
595
|
+
base_url TEXT NOT NULL,
|
|
596
|
+
is_active INTEGER DEFAULT 0 CHECK(is_active IN (0, 1)),
|
|
597
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
598
|
+
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
599
|
+
);
|
|
600
|
+
`),this.db.run("CREATE INDEX IF NOT EXISTS idx_providers_type ON providers(type);"),this.db.run("CREATE INDEX IF NOT EXISTS idx_providers_is_active ON providers(is_active);"),this.db.run(`
|
|
601
|
+
CREATE TRIGGER IF NOT EXISTS ensure_single_active_provider_update
|
|
602
|
+
AFTER UPDATE OF is_active ON providers
|
|
603
|
+
WHEN NEW.is_active = 1
|
|
604
|
+
BEGIN
|
|
605
|
+
UPDATE providers SET is_active = 0 WHERE id != NEW.id AND is_active = 1;
|
|
606
|
+
END;
|
|
607
|
+
`),this.db.run(`
|
|
608
|
+
CREATE TRIGGER IF NOT EXISTS ensure_single_active_provider_insert
|
|
609
|
+
AFTER INSERT ON providers
|
|
610
|
+
WHEN NEW.is_active = 1
|
|
611
|
+
BEGIN
|
|
612
|
+
UPDATE providers SET is_active = 0 WHERE id != NEW.id AND is_active = 1;
|
|
613
|
+
END;
|
|
614
|
+
`)}async getAll(){return this.db.prepare("SELECT * FROM providers ORDER BY created_at DESC").all().map((Z)=>this.rowToProvider(Z))}async getById(f){let Z=this.db.prepare("SELECT * FROM providers WHERE id = ?").get(f);return Z?this.rowToProvider(Z):null}async getByName(f){let Z=this.db.prepare("SELECT * FROM providers WHERE name = ?").get(f);return Z?this.rowToProvider(Z):null}async getActive(){let $=this.db.prepare("SELECT * FROM providers WHERE is_active = 1 LIMIT 1").get();return $?this.rowToProvider($):null}async create(f){if(await this.getByName(f.name))throw Error(`提供商名称 "${f.name}" 已存在`);let Z=crypto.randomUUID(),{encrypted:Y,iv:Q,authTag:J}=Z1(f.apiKey),B=this.now();this.db.prepare(`
|
|
615
|
+
INSERT INTO providers (id, name, type, api_key_encrypted, api_key_iv, api_key_auth_tag, base_url, is_active, created_at, updated_at)
|
|
616
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
617
|
+
`).run(Z,f.name,f.type,Y,Q,J,f.baseUrl,this.boolToInt(f.isActive??!1),B,B);let A=await this.getById(Z);if(!A)throw Error("创建提供商失败");return A}async update(f){let $=await this.getById(f.id);if(!$)throw Error(`提供商 "${f.id}" 不存在`);if(f.name&&f.name!==$.name){if(await this.getByName(f.name))throw Error(`提供商名称 "${f.name}" 已存在`)}let Z,Y,Q;if(f.apiKey){let U=Z1(f.apiKey);Z=U.encrypted,Y=U.iv,Q=U.authTag}else{let A=this.db.prepare("SELECT api_key_encrypted, api_key_iv, api_key_auth_tag FROM providers WHERE id = ?").get(f.id);if(!A)throw Error("获取原始数据失败");Z=A.api_key_encrypted,Y=A.api_key_iv,Q=A.api_key_auth_tag}this.db.prepare(`
|
|
618
|
+
UPDATE providers
|
|
619
|
+
SET name = ?, type = ?, api_key_encrypted = ?, api_key_iv = ?, api_key_auth_tag = ?, base_url = ?, is_active = ?, updated_at = ?
|
|
620
|
+
WHERE id = ?
|
|
621
|
+
`).run(f.name??$.name,f.type??$.type,Z,Y,Q,f.baseUrl??$.baseUrl,this.boolToInt(f.isActive??$.isActive),this.now(),f.id);let B=await this.getById(f.id);if(!B)throw Error("更新提供商失败");return B}async delete(f){if(this.db.prepare("DELETE FROM providers WHERE id = ?").run(f).changes===0)throw Error(`提供商 "${f}" 不存在`)}async setActive(f){if(!await this.getById(f))throw Error(`提供商 "${f}" 不存在`);this.db.transaction(()=>{this.db.run("UPDATE providers SET is_active = 0"),this.db.run("UPDATE providers SET is_active = 1, updated_at = ? WHERE id = ?",[this.now(),f])})();let Y=await this.getById(f);if(!Y)throw Error("设置活跃状态失败");return Y}async getDecryptedApiKey(f){let Z=this.db.prepare("SELECT api_key_encrypted, api_key_iv, api_key_auth_tag FROM providers WHERE id = ?").get(f);if(!Z)return null;return Cf(Z.api_key_encrypted,Z.api_key_iv,Z.api_key_auth_tag)}async getActiveDecryptedApiKey(){let $=this.db.prepare("SELECT id, type, api_key_encrypted, api_key_iv, api_key_auth_tag, base_url FROM providers WHERE is_active = 1 LIMIT 1").get();if(!$)return null;let Z=Cf($.api_key_encrypted,$.api_key_iv,$.api_key_auth_tag);return{type:$.type,apiKey:Z,baseUrl:$.base_url}}rowToProvider(f){let $=Cf(f.api_key_encrypted,f.api_key_iv,f.api_key_auth_tag),Z=r$($);return{id:f.id,name:f.name,type:f.type,apiKey:Z,baseUrl:f.base_url,isActive:f.is_active===1,createdAt:f.created_at,updatedAt:f.updated_at}}now(){return new Date().toISOString()}boolToInt(f){return f?1:0}close(){if(this._ownsDb)this.db.close()}}class Q1{db;constructor(f){this.db=f}async initialize(){this.db.run(`
|
|
622
|
+
CREATE TABLE IF NOT EXISTS remote_stores (
|
|
623
|
+
id TEXT PRIMARY KEY,
|
|
624
|
+
name TEXT NOT NULL,
|
|
625
|
+
type TEXT NOT NULL DEFAULT 'generic_http',
|
|
626
|
+
base_url TEXT NOT NULL,
|
|
627
|
+
api_key TEXT,
|
|
628
|
+
field_map TEXT,
|
|
629
|
+
paths TEXT,
|
|
630
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
631
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
632
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
633
|
+
)
|
|
634
|
+
`)}list(){return this.db.query("SELECT * FROM remote_stores ORDER BY created_at ASC").all()}get(f){return this.db.query("SELECT * FROM remote_stores WHERE id = ?").get(f)??null}insert(f){let $=new Date().toISOString();return this.db.run(`INSERT INTO remote_stores (id, name, type, base_url, api_key, field_map, paths, enabled, created_at, updated_at)
|
|
635
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[f.id,f.name,f.type??"generic_http",f.base_url,f.api_key??null,f.field_map?JSON.stringify(f.field_map):null,f.paths?JSON.stringify(f.paths):null,f.enabled!==!1?1:0,$,$]),this.get(f.id)}update(f){let $=this.get(f.id);if(!$)return null;return this.db.run(`UPDATE remote_stores SET
|
|
636
|
+
name = ?,
|
|
637
|
+
base_url = ?,
|
|
638
|
+
api_key = ?,
|
|
639
|
+
field_map = ?,
|
|
640
|
+
paths = ?,
|
|
641
|
+
enabled = ?,
|
|
642
|
+
updated_at = ?
|
|
643
|
+
WHERE id = ?`,[f.name??$.name,f.base_url??$.base_url,f.api_key!==void 0?f.api_key??null:$.api_key??null,f.field_map!==void 0?JSON.stringify(f.field_map):$.field_map??null,f.paths!==void 0?JSON.stringify(f.paths):$.paths??null,f.enabled!==void 0?f.enabled?1:0:$.enabled,new Date().toISOString(),f.id]),this.get(f.id)}delete(f){return this.db.run("DELETE FROM remote_stores WHERE id = ?",[f]).changes>0}}var Lf=null;async function e$(){if(Lf)return Lf;let f=i$(pY(),".zen-core");dY(f,{recursive:!0});let $=i$(f,"data.db"),Z=new uY($,{create:!0});Z.run("PRAGMA foreign_keys = ON"),Z.run("PRAGMA journal_mode = WAL"),Z.run("PRAGMA busy_timeout = 5000"),process.env.SQLITE_DATABASE_URI=$;let Y=await p(),Q=new u(Z);await Q.initialize();let J=new kf(Y.storage,Q),B=await d.fromStorage(J);for(let Xf of Y.middlewares.listImplementations())B.middlewares.registerImplementation(Xf);let U=await a$(),A=new t$(process.cwd());await A.initialize();let W=new lf(Z);await W.initialize(),d1(W);let y=new mf(Z);await y.initialize();let O=new Y1(Z);await O.initialize();let T=new Q1(Z);await T.initialize();let V=new xf(Z);await V.initialize();let D=Number(process.env.ZEN_CORE_PORT||8125),Jf=new f1(V,{apiBaseUrl:process.env.LANGGRAPH_API_URL||`http://127.0.0.1:${D}`,maxExecutionTime:600000}),x=new ef(V,Jf);return await x.start(),Lf={agentPackage:B,mergedStorage:J,configManager:U,taskStore:A,sharedDb:Z,mcpStorage:W,workspaceStorage:y,cronStorage:V,cronScheduler:x,providerStorage:O,remoteStoreStorage:T},Lf}var $0=f0.context().create(),q=$0.router,G=$0.procedure;var Z0=q({get:G.query(async({ctx:f})=>{return await f.configManager.getConfig()}),update:G.input(X.record(X.string(),X.unknown())).mutation(async({ctx:f,input:$})=>{return await f.configManager.updateConfig($),await f.configManager.getConfig()})});var Y0=30000;async function oY(f){let $=new AbortController,Z=setTimeout(()=>$.abort(),Y0);try{if(f.type==="openai"||f.type==="deepseek"||f.type==="moonshot"||f.type==="zhipu"||f.type==="custom"){let Y=await fetch(`${f.baseUrl}/models`,{method:"GET",headers:{Authorization:`Bearer ${f.apiKey}`,"Content-Type":"application/json"},signal:$.signal});if(!Y.ok)throw Error(`API error (${Y.status}): ${Y.statusText}`);return((await Y.json()).data||[]).map((J)=>({id:J.id,name:J.id,provider:f.type}))}else if(f.type==="anthropic"){let Y=await fetch(`${f.baseUrl}/v1/models`,{method:"GET",headers:{"x-api-key":f.apiKey,"anthropic-version":"2023-06-01","Content-Type":"application/json"},signal:$.signal});if(!Y.ok)throw Error(`Anthropic API error (${Y.status}): ${Y.statusText}`);return((await Y.json()).data||[]).map((J)=>({id:J.id,name:J.display_name||J.id,provider:"anthropic"}))}else if(f.type==="gemini"){let Y=await fetch(`${f.baseUrl}/v1beta/models`,{method:"GET",headers:{Authorization:`Bearer ${f.apiKey}`},signal:$.signal});if(!Y.ok)throw Error(`Gemini API error (${Y.status}): Invalid API key`);return((await Y.json()).models||[]).map((J)=>({id:J.name,name:J.displayName||J.name,provider:"gemini"}))}return[]}catch(Y){if(Y.name==="AbortError")throw Error(`API request timeout (${Y0/1000}s)`);throw Y}finally{clearTimeout(Z)}}var Q0=q({list:G.input(X.object({providerId:X.string()})).query(async({ctx:f,input:$})=>{let Y=((await f.configManager.getConfig()).providers||[]).find((Q)=>Q.id===$.providerId);if(!Y||!Y.apiKey||!Y.baseUrl)return[];return await oY(Y)})});var J0=q({list:G.query(async({ctx:f})=>{return await f.configManager.listSkills()}),get:G.input(X.object({name:X.string()})).query(async({ctx:f,input:$})=>{return await f.configManager.getSkill($.name)}),save:G.input(X.object({name:X.string(),content:X.object({frontmatter:X.record(X.string(),X.unknown()).optional(),body:X.string()})})).mutation(async({ctx:f,input:$})=>{return await f.configManager.saveSkill($.name,$.content),{success:!0}}),delete:G.input(X.object({name:X.string()})).mutation(async({ctx:f,input:$})=>{return await f.configManager.deleteSkill($.name),{success:!0}})});var X0=q({list:G.input(X.object({filter:X.string().optional(),cwd:X.string().optional()}).optional()).query(async({ctx:f,input:$})=>{if($?.filter)return await f.taskStore.getTasksByStatus($.filter);return await f.taskStore.getAllTasks()}),get:G.input(X.object({id:X.string(),cwd:X.string().optional()})).query(async({ctx:f,input:$})=>{return await f.taskStore.getTask($.id)}),updateStatus:G.input(X.object({id:X.string(),status:X.string(),cwd:X.string().optional()})).mutation(async({ctx:f,input:$})=>{return await f.taskStore.updateTask($.id,{status:$.status})}),delete:G.input(X.object({id:X.string(),cwd:X.string().optional()})).mutation(async({ctx:f,input:$})=>{return await f.taskStore.deleteTask($.id)})});var B0=q({list:G.query(async({ctx:f})=>{return await f.agentPackage.listAgents()}),get:G.input(X.object({id:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.agentPackage.getAgent($.id);if(!Z)throw new j({code:"NOT_FOUND",message:`Agent '${$.id}' not found`});return Z}),create:G.input(J1).mutation(async({ctx:f,input:$})=>{return await f.agentPackage.addAgent($),{success:!0}}),update:G.input(J1).mutation(async({ctx:f,input:$})=>{return await f.mergedStorage.updateAgent($),{success:!0}}),delete:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{if(await f.mergedStorage.isBuiltin($.id))throw new j({code:"FORBIDDEN",message:`Cannot delete built-in agent '${$.id}'. Use resetToDefault to restore defaults.`});return await f.mergedStorage.deleteAgent($.id),{success:!0}}),resetToDefault:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{if(!await f.mergedStorage.hasDbOverride("agent",$.id))return{success:!0,message:"Already at default"};return await f.mergedStorage.deleteAgent($.id),{success:!0}})});import{join as U0}from"path";import{homedir as sY}from"os";var O0=q({list:G.input(X.object({type:X.enum(["memories","skills"]),cwd:X.string().optional()})).query(async({input:f})=>{let $=f.cwd||process.cwd(),Z=U0($,".claude",f.type),Y=U0(sY(),".claude",f.type);try{if(f.type==="memories")return A0(Y,Z).map((J)=>({...J,type:"memory"}));else return G0(Y,Z).map((J)=>({...J,type:"skill"}))}catch(Q){return console.warn(`Failed to load ${f.type}:`,Q),[]}})});y0();var nY=new Map;async function T0(f){let{command:$,cwd:Z,timeout:Y}=f,Q=W0();try{let J=process.platform==="win32",A=o(J?"cmd.exe":"/bin/bash",[...J?["/d","/s","/c"]:["-c"],$],{cwd:Z,detached:!0,reject:!1,windowsVerbatimArguments:J,timeout:Y});if(!A.pid)return{id:Q,pid:0,output:"Error: Failed to start command",status:"failed",exitCode:-1};let W={process:A,stdout:[],stderr:[],command:$,startTime:Date.now()};q0.set(A.pid,W),nY.set(Q,A.pid);let y=[];A.stdout?.on("data",(T)=>{let V=T.toString();y.push(V),W.stdout.push(V)}),A.stderr?.on("data",(T)=>{let V=T.toString();y.push(V),W.stderr.push(V)}),A.on("close",(T)=>{W.status=T===0?"completed":"failed",W.exitCode=T}),await new Promise((T)=>setTimeout(T,100));let O=W.status||"running";return{id:Q,pid:A.pid,output:y.join(""),status:O,exitCode:W.exitCode}}catch(J){let B=J instanceof Error?J.message:"Unknown error";return{id:Q,pid:0,output:`Error: ${B}`,status:"failed",exitCode:-1}}}var $f=new Map,H0=q({list:G.query(async()=>{return Array.from($f.values())}),get:G.input(X.object({id:X.string()})).query(async({input:f})=>{let $=$f.get(f.id);if(!$)throw Error(`Process '${f.id}' not found`);return $}),exec:G.input(X.object({command:X.string(),cwd:X.string().optional()})).mutation(async({input:f})=>{let $=await T0({command:f.command,cwd:f.cwd||process.cwd()});return $f.set($.id,{id:$.id,name:f.command,pid:$.pid,status:$.status==="running"?"running":$.exitCode===0?"stopped":"error",startedAt:Date.now()}),{id:$.id,pid:$.pid,stdout:$.output,stderr:"",exitCode:$.exitCode??0,status:$.status}}),kill:G.input(X.object({id:X.string()})).mutation(async({input:f})=>{let $=$f.get(f.id);if(!$)throw Error(`Process '${f.id}' not found`);if($.pid)try{process.kill($.pid,"SIGTERM")}catch{}return $.status="stopped",$f.set(f.id,$),{success:!0}})});function H(f,$){throw new j({code:"NOT_FOUND",message:`${f} with id ${$} not found`})}function N0(f){throw new j({code:"BAD_REQUEST",message:f})}function X1(f){throw new j({code:"CONFLICT",message:f})}y0();function rY(f){return`${f}-${C0()}`}var iY=X.object({id:X.string().optional(),name:X.string().describe("MCP config name"),config:X.any().describe("MCP server configuration object"),enabled:X.boolean().optional().default(!0)}),aY=X.object({id:X.string(),name:X.string(),config:X.any(),enabled:X.boolean().optional().default(!0)}),L0=q({list:G.query(async({ctx:f})=>{return(await f.mcpStorage.getAllMcpConfigs()).map((Z)=>({id:Z.id,name:Z.name,config:JSON.parse(Z.config),enabled:Z.enabled===1,created_at:Z.created_at,updated_at:Z.updated_at}))}),get:G.input(X.object({id:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.mcpStorage.getMcpConfig($.id);if(!Z)throw H("MCP config",$.id);return{id:Z.id,name:Z.name,config:JSON.parse(Z.config),enabled:Z.enabled===1,created_at:Z.created_at,updated_at:Z.updated_at}}),getByName:G.input(X.object({name:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.mcpStorage.getMcpConfigByName($.name);if(!Z)throw H("MCP config",$.name);return{id:Z.id,name:Z.name,config:JSON.parse(Z.config),enabled:Z.enabled===1,created_at:Z.created_at,updated_at:Z.updated_at}}),getEnabled:G.query(async({ctx:f})=>{return await f.mcpStorage.getMcpConfigAsObject()}),create:G.input(iY).mutation(async({ctx:f,input:$})=>{let Y={id:$.id||rY("mcp"),name:$.name,config:$.config,enabled:$.enabled??!0};return await f.mcpStorage.insertMcpConfig(Y),Y}),update:G.input(aY).mutation(async({ctx:f,input:$})=>{let Z={id:$.id,name:$.name,config:$.config,enabled:$.enabled??!0};return await f.mcpStorage.updateMcpConfig(Z),Z}),delete:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{return await f.mcpStorage.deleteMcpConfig($.id),{success:!0}})});var tY=X.object({name:X.string().min(1,"Workspace name is required"),rootPath:X.string().min(1,"Root path is required"),description:X.string().optional()}),eY=X.object({id:X.string().min(1,"Workspace ID is required"),name:X.string().min(1,"Workspace name is required").optional(),description:X.string().optional()}),f3=X.object({id:X.string().min(1,"Workspace ID is required")}),$3=X.object({id:X.string().min(1,"Workspace ID is required")}),Z3=X.object({path:X.string().min(1,"Path is required")}),K0=q({getAll:G.query(async({ctx:f})=>{return{workspaces:await f.workspaceStorage.getAllWorkspaces()}}),getById:G.input($3).query(async({ctx:f,input:$})=>{let Z=await f.workspaceStorage.getWorkspaceById($.id);if(!Z)H("Workspace",$.id);return{workspace:Z}}),create:G.input(tY).mutation(async({ctx:f,input:$})=>{let Z=await f.workspaceStorage.validatePath($.rootPath);if(!Z.valid)N0(`Invalid path: ${Z.error}`);return{workspace:await f.workspaceStorage.createWorkspace({name:$.name,rootPath:$.rootPath,description:$.description})}}),update:G.input(eY).mutation(async({ctx:f,input:$})=>{if(!await f.workspaceStorage.getWorkspaceById($.id))H("Workspace",$.id);return{workspace:await f.workspaceStorage.updateWorkspace({id:$.id,name:$.name,description:$.description})}}),delete:G.input(f3).mutation(async({ctx:f,input:$})=>{if(!await f.workspaceStorage.getWorkspaceById($.id))H("Workspace",$.id);return await f.workspaceStorage.deleteWorkspace($.id),{id:$.id,success:!0}}),touch:G.input(X.object({id:X.string().min(1,"Workspace ID is required")})).mutation(async({ctx:f,input:$})=>{return await f.workspaceStorage.touchWorkspace($.id),{id:$.id,success:!0}}),validatePath:G.input(Z3).query(async({ctx:f,input:$})=>{return await f.workspaceStorage.validatePath($.path)})});var B1=Af(rf(),1);var Y3=X.object({id:X.string().min(1),name:X.string().min(1),description:X.string().optional(),cron_expression:X.string().min(5,"Cron expression must have at least 5 fields").refine((f)=>B1.default.validate(f),{message:"Invalid cron expression"}),prompt:X.string().min(1,"Prompt is required"),agent_id:X.string().min(1,"Agent ID is required"),initial_state:X.record(X.string(),X.unknown()).optional().default({}),enabled:X.boolean().optional().default(!0),max_retries:X.number().min(0).max(10).optional().default(0),variables:X.record(X.string(),X.string()).optional().default({})}),Q3=X.object({id:X.string().min(1),name:X.string().min(1).optional(),description:X.string().optional(),cron_expression:X.string().min(5,"Cron expression must have at least 5 fields").refine((f)=>B1.default.validate(f),{message:"Invalid cron expression"}).optional(),prompt:X.string().min(1,"Prompt is required").optional(),agent_id:X.string().min(1,"Agent ID is required").optional(),initial_state:X.record(X.string(),X.unknown()).optional(),enabled:X.boolean().optional(),max_retries:X.number().min(0).max(10).optional(),variables:X.record(X.string(),X.string()).optional()}),V0=q({listTasks:G.query(async({ctx:f})=>{return f.cronStorage.getAllTasks()}),getTask:G.input(X.object({id:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.cronStorage.getTask($.id);if(!Z)H("CronTask",$.id);return Z}),createTask:G.input(Y3).mutation(async({ctx:f,input:$})=>{if(!await f.agentPackage.storage.getAgent($.agent_id))H("Agent",$.agent_id);await f.cronStorage.insertTask($);let Y=await f.cronStorage.getTask($.id);if(Y)f.cronScheduler.scheduleTask(Y);return{id:$.id}}),updateTask:G.input(Q3).mutation(async({ctx:f,input:$})=>{let{id:Z,...Y}=$;if(!await f.cronStorage.getTask(Z))H("CronTask",Z);if(Y.agent_id){if(!await f.agentPackage.storage.getAgent(Y.agent_id))H("Agent",Y.agent_id)}let J=Y.enabled!==void 0||Y.cron_expression!==void 0;if(J)f.cronScheduler.unscheduleTask(Z);if(await f.cronStorage.updateTask($),J){let B=await f.cronStorage.getTask(Z);if(B&&B.enabled)f.cronScheduler.scheduleTask(B)}return{id:Z}}),deleteTask:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{return f.cronScheduler.unscheduleTask($.id),await f.cronStorage.deleteTask($.id),{id:$.id}}),toggleTask:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{let Z=await f.cronStorage.getTask($.id);if(!Z)H("CronTask",$.id);let Y=!Z.enabled;if(Y)f.cronScheduler.scheduleTask({...Z,enabled:Y}),await f.cronStorage.updateTask({id:$.id,enabled:Y});else f.cronScheduler.unscheduleTask($.id),await f.cronStorage.updateTask({id:$.id,enabled:Y});return{id:$.id,enabled:Y}}),triggerTask:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{return{logId:await f.cronScheduler.triggerManually($.id)}}),getLogs:G.input(X.object({taskId:X.string(),limit:X.number().min(1).max(100).optional().default(50),offset:X.number().min(0).optional().default(0)})).query(async({ctx:f,input:$})=>{return f.cronStorage.getLogsByTaskId($.taskId,$.limit,$.offset)}),getRecentLogs:G.input(X.object({limit:X.number().min(1).max(100).optional().default(50)})).query(async({ctx:f,input:$})=>{return f.cronStorage.getRecentLogs($.limit)}),getLog:G.input(X.object({id:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.cronStorage.getLog($.id);if(!Z)H("CronLog",$.id);return Z}),clearLogs:G.input(X.object({taskId:X.string(),before:X.string().datetime().optional()})).mutation(async({ctx:f,input:$})=>{return{deletedCount:await f.cronStorage.deleteLogsBefore($.taskId,$.before??new Date().toISOString())}}),clearAllLogs:G.input(X.object({taskId:X.string()})).mutation(async({ctx:f,input:$})=>{return{deletedCount:await f.cronStorage.clearLogsByTaskId($.taskId)}}),getQueueStatus:G.query(async({ctx:f})=>{return f.cronScheduler.getQueueStatus()}),getSchedulerStatus:G.query(async({ctx:f})=>{return{isRunning:f.cronScheduler.isActive(),scheduledCount:f.cronScheduler.getScheduledCount()}})});var U1=X.object({id:X.string(),name:X.string().min(1),content:X.string().min(1),metadata:X.record(X.string(),X.any()).optional(),change_note:X.string().optional()}),J3=U1.partial().extend({id:X.string()}),X3=X.object({promptId:X.string(),content:X.string().min(1),changeNote:X.string().optional()}),F0=q({list:G.query(async({ctx:f})=>{return(await f.agentPackage.storage.getAllPromptsWithCurrentVersion()).map((Z)=>({id:Z.id,name:Z.name,current_version:Z.current_version,content:Z.content,change_note:Z.change_note,created_at:Z.created_at,updated_at:Z.updated_at,metadata:Z.metadata?JSON.parse(Z.metadata):void 0}))}),get:G.input(X.object({id:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.agentPackage.storage.getPromptWithCurrentVersion($.id);if(!Z)H("Prompt",$.id);return{id:Z.id,name:Z.name,current_version:Z.current_version,content:Z.content,change_note:Z.change_note,created_at:Z.created_at,updated_at:Z.updated_at,metadata:Z.metadata?JSON.parse(Z.metadata):void 0}}),getByName:G.input(X.object({name:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.agentPackage.storage.getPromptWithCurrentVersionByName($.name);if(!Z)H("Prompt",$.name);return{id:Z.id,name:Z.name,current_version:Z.current_version,content:Z.content,change_note:Z.change_note,created_at:Z.created_at,updated_at:Z.updated_at,metadata:Z.metadata?JSON.parse(Z.metadata):void 0}}),create:G.input(U1).mutation(async({ctx:f,input:$})=>{try{await f.agentPackage.storage.insertPrompt($,$.content,$.change_note)}catch(Z){if(Z instanceof Error&&Z.message.includes("UNIQUE constraint failed"))X1(`Prompt with name '${$.name}' already exists`);throw Z}return{id:$.id}}),update:G.input(J3).mutation(async({ctx:f,input:$})=>{let Z=await f.agentPackage.storage.getPrompt($.id);if(!Z){H("Prompt",$.id);return}let Y={id:$.id,name:$.name??Z.name};try{await f.agentPackage.storage.updatePrompt(Y)}catch(Q){if(Q instanceof Error&&Q.message.includes("UNIQUE constraint failed"))X1(`Prompt with name '${$.name}' already exists`);throw Q}return{id:$.id}}),delete:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{try{await f.agentPackage.storage.deletePrompt($.id)}catch(Z){if(Z instanceof Error&&Z.message.includes("Cannot delete prompt"))throw Error(Z.message);throw Z}return{id:$.id}}),createMany:G.input(X.array(U1)).mutation(async({ctx:f,input:$})=>{return await Promise.all($.map((Z)=>f.agentPackage.storage.insertPrompt(Z,Z.content,Z.change_note))),{count:$.length,ids:$.map((Z)=>Z.id)}}),getVersions:G.input(X.object({promptId:X.string()})).query(async({ctx:f,input:$})=>{return(await f.agentPackage.storage.getPromptVersions($.promptId)).map((Y)=>({id:Y.id,prompt_id:Y.prompt_id,version:Y.version,content:Y.content,metadata:Y.metadata,change_note:Y.change_note,created_at:Y.created_at}))}),getVersion:G.input(X.object({promptId:X.string(),version:X.number()})).query(async({ctx:f,input:$})=>{let Z=await f.agentPackage.storage.getPromptVersion($.promptId,$.version);if(!Z)H("Prompt version",`${$.promptId}@v${$.version}`);return{id:Z.id,prompt_id:Z.prompt_id,version:Z.version,content:Z.content,metadata:Z.metadata,change_note:Z.change_note,created_at:Z.created_at}}),createVersion:G.input(X3).mutation(async({ctx:f,input:$})=>{try{let Z=await f.agentPackage.storage.createPromptVersion($.promptId,$.content,$.changeNote);return{id:Z.id,prompt_id:Z.prompt_id,version:Z.version,content:Z.content,change_note:Z.change_note,created_at:Z.created_at}}catch(Z){if(Z instanceof Error&&Z.message.includes("not found"))H("Prompt",$.promptId);throw Z}}),rollbackVersion:G.input(X.object({promptId:X.string(),targetVersion:X.number()})).mutation(async({ctx:f,input:$})=>{try{await f.agentPackage.storage.rollbackPromptVersion($.promptId,$.targetVersion);let Z=await f.agentPackage.storage.getPromptWithCurrentVersion($.promptId);return{id:Z.id,name:Z.name,current_version:Z.current_version,content:Z.content,change_note:Z.change_note}}catch(Z){if(Z instanceof Error&&Z.message.includes("not found"))H("Prompt",$.promptId);throw Z}})});var G1=X.object({id:X.string(),name:X.string().min(1),description:X.string().min(1),parameters:X.record(X.string(),X.any()).optional()}),B3=G1.partial().extend({id:X.string()}),R0=q({list:G.query(async({ctx:f})=>{return await f.agentPackage.storage.getAllMiddlewares()}),get:G.input(X.object({id:X.string()})).query(async({ctx:f,input:$})=>{let Z=await f.agentPackage.storage.getMiddleware($.id);if(!Z)H("Middleware",$.id);return Z}),create:G.input(G1).mutation(async({ctx:f,input:$})=>{return await f.agentPackage.storage.insertMiddleware($),{id:$.id}}),update:G.input(B3).mutation(async({ctx:f,input:$})=>{let Z=await f.agentPackage.storage.getMiddleware($.id);if(!Z)H("Middleware",$.id);let Y={...Z,...$};return await f.agentPackage.storage.updateMiddleware(Y),{id:$.id}}),delete:G.input(X.object({id:X.string()})).mutation(async({ctx:f,input:$})=>{return await f.agentPackage.storage.deleteMiddleware($.id),{id:$.id}}),createMany:G.input(X.array(G1)).mutation(async({ctx:f,input:$})=>{return await Promise.all($.map((Z)=>f.agentPackage.storage.insertMiddleware(Z))),{count:$.length,ids:$.map((Z)=>Z.id)}})});var j0=q({config:Z0,models:Q0,skills:J0,tasks:X0,agents:B0,knowledge:O0,processes:H0,mcp:L0,workspaces:K0,cron:V0,prompts:F0,middlewares:R0});function M0(f){return{...f}}var M=(f,$)=>f.constructor.name===$.name,K=new Map;K.set(X.ZodBoolean.name,()=>!1),K.set(X.ZodNumber.name,()=>0),K.set(X.ZodString.name,()=>""),K.set(X.ZodArray.name,()=>[]),K.set(X.ZodRecord.name,()=>({})),K.set(X.ZodDefault.name,(f)=>f.def.defaultValue),K.set(X.ZodPipe.name,(f)=>Zf(f.def.in)),K.set(X.ZodOptional.name,(f)=>M(f.def.innerType,X.ZodDefault)?f.def.innerType.def.defaultValue:void 0),K.set(X.ZodTuple.name,(f)=>{let $=[];for(let Z of f.def.items)$.push(Zf(Z));return $}),K.set(X.ZodPipe.name,(f)=>Zf(f.def.in)),K.set(X.ZodUnion.name,(f)=>Zf(f.def.options[0])),K.set(X.ZodObject.name,(f)=>E(f)),K.set(X.ZodRecord.name,(f)=>E(f)),K.set(X.ZodIntersection.name,(f)=>E(f));function Zf(f){let $=f.constructor.name;if(!K.has($)){console.warn("getSchemaDefaultForField: Unhandled type",f.constructor.name);return}return K.get($)(f)}function E(f){if(M(f,X.ZodRecord))return{};if(M(f,X.ZodPipe))return E(f.def.in);if(M(f,X.ZodIntersection))return{...E(f.def.left),...E(f.def.right)};if(M(f,X.ZodUnion)){for(let $ of f.def.options)if(M($,X.ZodObject))return E($);return console.warn("getSchemaDefaultObject: No object found in union, returning empty object"),{}}return M(f,X.ZodObject)?Object.fromEntries(Object.entries(f.shape).map(([$,Z])=>[$,Zf(Z)]).filter(($)=>$[1]!==void 0)):(console.warn(`getSchemaDefaultObject: Expected object schema, got ${f.constructor.name}`),{})}var M6=X.object({task_store:X.record(X.string(),X.any()).default({})}),E6=X.object({task_id:X.string().optional().describe("The task id to ask the subagent, if not provided, will use the tool call id"),subagent_id:X.string(),task_description:X.string().describe("Describe the user state and what you want the subagent to do."),data_transfer:X.any().optional().describe("Data to transfer to the subagent.")});class O1{providerStorage;agentPackage;constructor(f,$){this.providerStorage=f;this.agentPackage=$}async resolve(f){let $=await this.providerStorage.getById(f);if(!$)return null;let Z=await this.providerStorage.getDecryptedApiKey(f);if(!Z)return null;return{id:$.id,type:$.type,name:$.name,baseUrl:$.baseUrl,apiKey:Z}}async resolveByModel(f){let $=await this.agentPackage.getModel(f);if(!$?.provider_id)return null;return this.resolve($.provider_id)}}async function E0(f){let $=new O1(f.providerStorage,f.agentPackage),Z=If(f.agentPackage,{providerResolver:$});A1("code",Z),console.log('LangGraph graph "code" registered at /api/langgraph')}function D0(f){return($)=>$.json({status:"ok",version:"1.0.0",service:"zen-core",port:Number(process.env.ZEN_CORE_PORT||8125),graphs:["code"],timestamp:Date.now()})}var Yf=P0(S0(),1),W1=(f)=>{return f=f.startsWith("/")?f.slice(1):f,f=f.endsWith("/")?f.slice(0,-1):f,f};async function h0(f){let $=new Headers,Z=async(U)=>{var A;return(A=f.createContext)===null||A===void 0?void 0:A.call(f,(0,Yf.default)({req:f.req,resHeaders:$},U))},Y=new URL(f.req.url),Q=W1(Y.pathname),J=W1(f.endpoint),B=W1(Q.slice(J.length));return await w0((0,Yf.default)((0,Yf.default)({},f),{},{req:f.req,createContext:Z,path:B,error:null,onError(U){var A;f===null||f===void 0||(A=f.onError)===null||A===void 0||A.call(f,(0,Yf.default)((0,Yf.default)({},U),{},{req:f.req}))},responseMeta(U){var A;let W=(A=f.responseMeta)===null||A===void 0?void 0:A.call(f,U);if(W===null||W===void 0?void 0:W.headers){if(W.headers instanceof Headers)for(let[y,O]of W.headers.entries())$.append(y,O);else for(let[y,O]of Object.entries(W.headers))if(Array.isArray(O))for(let T of O)$.append(y,T);else if(typeof O==="string")$.set(y,O)}return{headers:$,status:W===null||W===void 0?void 0:W.status}}}))}var m=Number(process.env.ZEN_CORE_PORT||8125),Kf=b0(I0(),".zen-code","zen-core.pid"),_0=b0(I0(),".zen-code");if(!v0(_0))O3(_0,{recursive:!0});if(v0(Kf)){let f=parseInt(A3(Kf,"utf8").trim());if(!isNaN(f))try{process.kill(f,"SIGTERM"),console.log(`Terminated old zen-core process (PID: ${f})`),await new Promise(($)=>setTimeout($,500))}catch{}}U3(Kf,String(process.pid));process.on("exit",()=>{try{G3(Kf)}catch{}});console.log("Bootstrapping zen-core services...");var Vf=await e$();await E0(Vf);var Qf=new z0;Qf.use(T1());Qf.get("/health",D0(Vf));Qf.all("/api/trpc/*",async(f)=>{return h0({req:f.req.raw,router:j0,createContext:()=>M0(Vf),endpoint:"/api/trpc"})});var{default:W3}=await import("../../code-graph/zen-code/chunk-ts4jreym.js");Qf.route("/api/langgraph",W3);R1({fetch(f,$){return Qf.fetch(f,$)},port:m});console.log(`zen-core running on http://127.0.0.1:${m}`);console.log(` Health: http://127.0.0.1:${m}/health`);console.log(` LangGraph: http://127.0.0.1:${m}/api/langgraph`);console.log(` tRPC: http://127.0.0.1:${m}/api/trpc`);console.log(` Terminal: ws://127.0.0.1:${m}/ws/terminal`);async function k0(f){console.log(`
|
|
644
|
+
[zen-core] Received ${f}, shutting down...`),await Vf.cronScheduler.stop(),process.exit(0)}process.on("SIGTERM",()=>k0("SIGTERM"));process.on("SIGINT",()=>k0("SIGINT"));
|