zen-code 5.0.0 → 5.0.1
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 +3 -3
- package/dist/{chunk-6saqxa3z.js → chunk-0p3df51n.js} +1 -1
- package/dist/{chunk-78ksrp8v.js → chunk-0pzpg2ra.js} +2 -2
- package/dist/{chunk-tbav8trq.js → chunk-142wmdx8.js} +1 -1
- package/dist/chunk-1t3rabge.js +1 -0
- package/dist/{chunk-bn077sjq.js → chunk-2z45fjmt.js} +51 -51
- package/dist/{chunk-6b3vfr39.js → chunk-3gn0c0j2.js} +1 -1
- package/dist/{chunk-9zcr1qh6.js → chunk-3nhw50tg.js} +1 -1
- package/dist/{chunk-yfjs6pf8.js → chunk-4260bzp9.js} +1 -1
- package/dist/{chunk-agevsn2e.js → chunk-4vh3dxeg.js} +1 -1
- package/dist/{chunk-cb0f54ar.js → chunk-5e2s5jvw.js} +1 -1
- package/dist/{chunk-1rcc9xzn.js → chunk-5kcxxes1.js} +1 -1
- package/dist/{chunk-5fe27s34.js → chunk-6t0qzren.js} +1 -1
- package/dist/{chunk-7qba2raw.js → chunk-74k5n8f5.js} +1 -1
- package/dist/chunk-780j97nd.js +1 -0
- package/dist/chunk-78t2g3ht.js +1 -0
- package/dist/{chunk-7cx9kda0.js → chunk-7d48d71t.js} +1 -1
- package/dist/{chunk-ctqtahz4.js → chunk-96b00ygr.js} +1 -1
- package/dist/{chunk-v0e9bsvt.js → chunk-9kbktaf8.js} +2 -2
- package/dist/{chunk-kgc6ws03.js → chunk-a4rvf135.js} +1 -1
- package/dist/{chunk-81b2s97q.js → chunk-ahsvdb98.js} +1 -1
- package/dist/{chunk-gphssgy6.js → chunk-an34z8wv.js} +1 -1
- package/dist/chunk-arm90pny.js +1 -0
- package/dist/{chunk-jd1razfg.js → chunk-avqzptcg.js} +2 -2
- package/dist/{chunk-pgnhcznr.js → chunk-b0yk07x5.js} +1 -1
- package/dist/{chunk-1gssqf6g.js → chunk-be8n8w26.js} +1 -1
- package/dist/{chunk-h7ypcqp3.js → chunk-bqkrynm6.js} +2 -2
- package/dist/chunk-bv28r5cf.js +1 -0
- package/dist/{chunk-0qz8rr2k.js → chunk-c59eqb10.js} +1 -1
- package/dist/{chunk-6j695pam.js → chunk-cbr2vrpt.js} +1 -1
- package/dist/{chunk-9011y634.js → chunk-csn4vg3d.js} +2 -2
- package/dist/{chunk-nt2yp4jh.js → chunk-df36fv24.js} +1 -1
- package/dist/{chunk-sv0k2v66.js → chunk-e3jv1c1w.js} +1 -1
- package/dist/{chunk-069q9hkz.js → chunk-e6m161vn.js} +1 -1
- package/dist/{chunk-dz9sqfph.js → chunk-eqetcfer.js} +1 -1
- package/dist/{chunk-492hjs9k.js → chunk-eze2fzrq.js} +1 -1
- package/dist/{chunk-qfa5v4n5.js → chunk-femf7e4d.js} +1 -1
- package/dist/{chunk-d2sr8fnm.js → chunk-fvg6pct8.js} +1 -1
- package/dist/{chunk-bk32cwxa.js → chunk-g2n6hnjp.js} +2 -2
- package/dist/{chunk-mv5m8bf4.js → chunk-ge071wp4.js} +2 -2
- package/dist/{chunk-mv8a5svx.js → chunk-h9w6y105.js} +1 -1
- package/dist/{chunk-e7mbewmw.js → chunk-hzxg9kx6.js} +1 -1
- package/dist/{chunk-q8zsxwd8.js → chunk-j2qd9mfs.js} +2 -2
- package/dist/{chunk-1d47g6nc.js → chunk-j40cj742.js} +1 -1
- package/dist/chunk-jbqqb1ht.js +2 -0
- package/dist/{chunk-zhqdp4ak.js → chunk-jz0kw4yt.js} +1 -1
- package/dist/{chunk-fkt5b511.js → chunk-kknfcsyy.js} +1 -1
- package/dist/{chunk-b175s7dm.js → chunk-kvnw06wg.js} +1 -1
- package/dist/{chunk-a0nr8jva.js → chunk-kyb15dg8.js} +1 -1
- package/dist/{chunk-snmkgfbe.js → chunk-mq4m1w4w.js} +1 -1
- package/dist/{chunk-tmyzfvsy.js → chunk-mqcbjght.js} +1 -1
- package/dist/{chunk-4eaqmt3c.js → chunk-mqm8wnc8.js} +1 -1
- package/dist/{chunk-h2hk7vx4.js → chunk-n7bpjcb0.js} +1 -1
- package/dist/{chunk-88w3txtb.js → chunk-ncaqgas1.js} +1 -1
- package/dist/{chunk-y524zd2h.js → chunk-nh11afw0.js} +1 -1
- package/dist/{chunk-2gprcgep.js → chunk-nwmvyez4.js} +2 -2
- package/dist/{chunk-3k3c686f.js → chunk-nzyvqxt4.js} +1 -1
- package/dist/{chunk-j8tq0e8m.js → chunk-p6c1xbd5.js} +2 -2
- package/dist/chunk-p75m7q2h.js +1 -0
- package/dist/{chunk-b0beqmg2.js → chunk-pffdbhs6.js} +1 -1
- package/dist/{chunk-em03xqy9.js → chunk-phw7yp5t.js} +1 -1
- package/dist/{chunk-akc3s5aw.js → chunk-q0452p0f.js} +1 -1
- package/dist/{chunk-jhxvctg5.js → chunk-r133z8tq.js} +1 -1
- package/dist/{chunk-c9yrpb3g.js → chunk-rqymdmqg.js} +3 -3
- package/dist/{chunk-ts4jreym.js → chunk-rr7h6wdp.js} +1 -1
- package/dist/{chunk-wd6s7gg7.js → chunk-s04zfe57.js} +1 -1
- package/dist/{chunk-kada5fyh.js → chunk-twhnh3dc.js} +1 -1
- package/dist/{chunk-d5gzkkgg.js → chunk-txnezkkt.js} +1 -1
- package/dist/{chunk-2bjeg40f.js → chunk-vttq7sqg.js} +1 -1
- package/dist/{chunk-0mq8786q.js → chunk-vvs5da2x.js} +2 -2
- package/dist/{chunk-5hqvapp1.js → chunk-w4tbr5h7.js} +1 -1
- package/dist/{chunk-yejgw2hm.js → chunk-wts8db9p.js} +1 -1
- package/dist/{chunk-4fs853nh.js → chunk-x17jyjan.js} +1 -1
- package/dist/{chunk-q8cfxky4.js → chunk-x7x7esvz.js} +2 -2
- package/dist/{chunk-mk8ggmt8.js → chunk-xprg4hxp.js} +6 -6
- package/dist/{chunk-ss4bh5wb.js → chunk-xrfpz1vw.js} +1 -1
- package/dist/{chunk-yb71zqvt.js → chunk-xtr6s7kh.js} +2 -2
- package/dist/{chunk-dh2f4xyb.js → chunk-y807k0kw.js} +1 -1
- package/dist/{chunk-43h0n2td.js → chunk-ycp2e43r.js} +1 -1
- package/dist/{chunk-n61yv4t5.js → chunk-yfv1xeeh.js} +1 -1
- package/dist/chunk-zxpb45tb.js +1 -0
- package/dist/cli.js +1 -1
- package/dist/nonInteractive.js +1 -1
- package/dist/zen-core.js +11 -394
- package/dist/zen-keyboard.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-06trk066.js +0 -1
- package/dist/chunk-0kfw8bwn.js +0 -2
- package/dist/chunk-8ygdre0g.js +0 -1
- package/dist/chunk-dr32dt9y.js +0 -1
- package/dist/chunk-dv1vt080.js +0 -1
- package/dist/chunk-p7ew4trx.js +0 -1
- package/dist/chunk-qhzztj83.js +0 -1
- package/dist/chunk-zkd3m39v.js +0 -1
package/dist/zen-core.js
CHANGED
|
@@ -1,221 +1,4 @@
|
|
|
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 - 项目经理
|
|
1
|
+
import{na as ee}from"./chunk-yfv1xeeh.js";import{ra as g}from"./chunk-74k5n8f5.js";import"./chunk-mq4m1w4w.js";import"./chunk-vwj4n000.js";import{Se as L,Te as ht,Ue as I,Ve as _,We as Ut,Xe as p,Ye as Ot}from"./chunk-wts8db9p.js";import{Lf as At,lf as V,nf as $t,sf as Gt,uf as Rt}from"./chunk-7d48d71t.js";import"./chunk-nh11afw0.js";import{Of as dt,cg as vt}from"./chunk-mqm8wnc8.js";import"./chunk-ncaqgas1.js";import"./chunk-vvs5da2x.js";import"./chunk-tws3wcnm.js";import"./chunk-0p3df51n.js";import"./chunk-cbr2vrpt.js";import{Qg as Et,Tg as Nt,Wg as k,Xg as jt,Yg as H}from"./chunk-2z45fjmt.js";import"./chunk-csn4vg3d.js";import"./chunk-9kbktaf8.js";import"./chunk-p6c1xbd5.js";import{sk as Bt}from"./chunk-e3jv1c1w.js";import"./chunk-an34z8wv.js";import"./chunk-nwmvyez4.js";import"./chunk-eqetcfer.js";import{wk as Yt}from"./chunk-rqymdmqg.js";import"./chunk-r133z8tq.js";import"./chunk-ge071wp4.js";import"./chunk-g2n6hnjp.js";import"./chunk-femf7e4d.js";import"./chunk-jbqqb1ht.js";import{xl as n}from"./chunk-0pzpg2ra.js";import{Al as Dt,Fl as ze}from"./chunk-xtr6s7kh.js";import{Kl as It,Nl as _t,Pl as pt,Ql as Wt}from"./chunk-xprg4hxp.js";import{Wl as T}from"./chunk-x17jyjan.js";function re(){let{process:t,Deno:e}=globalThis;return!(typeof e?.noColor==="boolean"?e.noColor:t!==void 0?"NO_COLOR"in t?.env:!1)}async function lt(){let{navigator:t}=globalThis,e="cloudflare:workers";return!(t!==void 0&&t.userAgent==="Cloudflare-Workers"?await(async()=>{try{return"NO_COLOR"in((await import("cloudflare:workers")).env??{})}catch{return!1}})():!re())}var ue=(t)=>{let[e,o]=[",","."];return t.map((l)=>l.replace(/(\d)(?=(\d\d\d)+(?!\d))/g,"$1"+e)).join(o)},fe=(t)=>{let e=Date.now()-t;return ue([e<1000?e+"ms":Math.round(e/1000)+"s"])},ie=async(t)=>{if(await lt())switch(t/100|0){case 5:return`\x1B[31m${t}\x1B[0m`;case 4:return`\x1B[33m${t}\x1B[0m`;case 3:return`\x1B[36m${t}\x1B[0m`;case 2:return`\x1B[32m${t}\x1B[0m`}return`${t}`};async function ot(t,e,o,s,l=0,a){let r=e==="<--"?`${e} ${o} ${s}`:`${e} ${o} ${s} ${await ie(l)} ${a}`;t(r)}var at=(t=console.log)=>{return async function(o,s){let{method:l,url:a}=o.req,r=a.slice(a.indexOf("/",8));await ot(t,"<--",l,r);let u=Date.now();await s(),await ot(t,"-->",l,r,o.res.status,fe(u))}};import{createServer as ye}from"http";import{Http2ServerRequest as me}from"http2";import{Http2ServerRequest as E}from"http2";import{Readable as nt}from"stream";import Ue from"crypto";var A=class extends Error{constructor(t,e){super(t,e);this.name="RequestError"}},we=(t)=>{if(t instanceof A)return t;return new A(t.message,{cause:t})},he=global.Request,K=class extends he{constructor(t,e){if(typeof t==="object"&&O in t)t=t[O]();if(typeof e?.body?.getReader<"u")e.duplex??="half";super(t,e)}},ce=(t)=>{let e=[],o=t.rawHeaders;for(let s=0;s<o.length;s+=2){let{[s]:l,[s+1]:a}=o;if(l.charCodeAt(0)!==58)e.push([l,a])}return new Headers(e)},ut=Symbol("wrapBodyStream"),xe=(t,e,o,s,l)=>{let a={method:t,headers:o,signal:l.signal};if(t==="TRACE"){a.method="GET";let r=new K(e,a);return Object.defineProperty(r,"method",{get(){return"TRACE"}}),r}if(!(t==="GET"||t==="HEAD"))if("rawBody"in s&&s.rawBody instanceof Buffer)a.body=new ReadableStream({start(r){r.enqueue(s.rawBody),r.close()}});else if(s[ut]){let r;a.body=new ReadableStream({async pull(u){try{r||=nt.toWeb(s).getReader();let{done:f,value:y}=await r.read();if(f)u.close();else u.enqueue(y)}catch(f){u.error(f)}}})}else a.body=nt.toWeb(s);return new K(e,a)},O=Symbol("getRequestCache"),Te=Symbol("requestCache"),z=Symbol("incomingKey"),X=Symbol("urlKey"),$e=Symbol("headersKey"),U=Symbol("abortControllerKey"),Ae=Symbol("getAbortController"),G={get method(){return this[z].method||"GET"},get url(){return this[X]},get headers(){return this[$e]||=ce(this[z])},[Ae](){return this[O](),this[U]},[O](){return this[U]||=new AbortController,this[Te]||=xe(this.method,this[X],this.headers,this[z],this[U])}};["body","bodyUsed","cache","credentials","destination","integrity","mode","redirect","referrer","referrerPolicy","signal","keepalive"].forEach((t)=>{Object.defineProperty(G,t,{get(){return this[O]()[t]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach((t)=>{Object.defineProperty(G,t,{value:function(){return this[O]()[t]()}})});Object.setPrototypeOf(G,K.prototype);var Ze=(t,e)=>{let o=Object.create(G);o[z]=t;let s=t.url||"";if(s[0]!=="/"&&(s.startsWith("http://")||s.startsWith("https://"))){if(t instanceof E)throw new A("Absolute URL for :path is not allowed in HTTP/2");try{let u=new URL(s);o[X]=u.href}catch(u){throw new A("Invalid absolute URL",{cause:u})}return o}let l=(t instanceof E?t.authority:t.headers.host)||e;if(!l)throw new A("Missing host header");let a;if(t instanceof E){if(a=t.scheme,!(a==="http"||a==="https"))throw new A("Unsupported scheme")}else a=t.socket&&t.socket.encrypted?"https":"http";let r=new URL(`${a}://${l}${s}`);if(r.hostname.length!==l.length&&r.hostname!==l.replace(/:\d+$/,""))throw new A("Invalid host header");return o[X]=r.href,o},rt=Symbol("responseCache"),v=Symbol("getResponseCache"),Z=Symbol("cache"),P=global.Response,W=class t{#e;#t;[v](){return delete this[Z],this[rt]||=new P(this.#e,this.#t)}constructor(e,o){let s;if(this.#e=e,o instanceof t){let l=o[rt];if(l){this.#t=l,this[v]();return}else this.#t=o.#t,s=new Headers(o.#t.headers)}else this.#t=o;if(typeof e==="string"||typeof e?.getReader<"u"||e instanceof Blob||e instanceof Uint8Array)this[Z]=[o?.status||200,e,s||o?.headers]}get headers(){let e=this[Z];if(e){if(!(e[2]instanceof Headers))e[2]=new Headers(e[2]||{"content-type":"text/plain; charset=UTF-8"});return e[2]}return this[v]().headers}get status(){return this[Z]?.[0]??this[v]().status}get ok(){let e=this.status;return e>=200&&e<300}};["body","bodyUsed","redirected","statusText","trailers","type","url"].forEach((t)=>{Object.defineProperty(W.prototype,t,{get(){return this[v]()[t]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach((t)=>{Object.defineProperty(W.prototype,t,{value:function(){return this[v]()[t]()}})});Object.setPrototypeOf(W,P);Object.setPrototypeOf(W.prototype,P.prototype);async function Ne(t){return Promise.race([t,Promise.resolve().then(()=>Promise.resolve(void 0))])}function ft(t,e,o){let s=(u)=>{t.cancel(u).catch(()=>{})};return e.on("close",s),e.on("error",s),(o??t.read()).then(r,l),t.closed.finally(()=>{e.off("close",s),e.off("error",s)});function l(u){if(u)e.destroy(u)}function a(){t.read().then(r,l)}function r({done:u,value:f}){try{if(u)e.end();else if(!e.write(f))e.once("drain",a);else return t.read().then(r,l)}catch(y){l(y)}}}function de(t,e){if(t.locked)throw TypeError("ReadableStream is locked.");else if(e.destroyed)return;return ft(t.getReader(),e)}var j=(t)=>{let e={};if(!(t instanceof Headers))t=new Headers(t??void 0);let o=[];for(let[s,l]of t)if(s==="set-cookie")o.push(l);else e[s]=l;if(o.length>0)e["set-cookie"]=o;return e["content-type"]??="text/plain; charset=UTF-8",e},ve="x-hono-already-sent";if(typeof global.crypto>"u")global.crypto=Ue;var C=Symbol("outgoingEnded"),Oe=()=>new Response(null,{status:400}),it=(t)=>new Response(null,{status:t instanceof Error&&(t.name==="TimeoutError"||t.constructor.name==="TimeoutError")?504:500}),q=(t,e)=>{let o=t instanceof Error?t:Error("unknown error",{cause:t});if(o.code==="ERR_STREAM_PREMATURE_CLOSE")console.info("The user aborted a request.");else{if(console.error(t),!e.headersSent)e.writeHead(500,{"Content-Type":"text/plain"});e.end(`Error: ${o.message}`),e.destroy(o)}},yt=(t)=>{if("flushHeaders"in t&&t.writable)t.flushHeaders()},mt=async(t,e)=>{let[o,s,l]=t[Z],a=!1;if(!l)l={"content-type":"text/plain; charset=UTF-8"};else if(l instanceof Headers)a=l.has("content-length"),l=j(l);else if(Array.isArray(l)){let r=new Headers(l);a=r.has("content-length"),l=j(r)}else for(let r in l)if(r.length===14&&r.toLowerCase()==="content-length"){a=!0;break}if(!a){if(typeof s==="string")l["Content-Length"]=Buffer.byteLength(s);else if(s instanceof Uint8Array)l["Content-Length"]=s.byteLength;else if(s instanceof Blob)l["Content-Length"]=s.size}if(e.writeHead(o,l),typeof s==="string"||s instanceof Uint8Array)e.end(s);else if(s instanceof Blob)e.end(new Uint8Array(await s.arrayBuffer()));else yt(e),await de(s,e)?.catch((r)=>q(r,e));e[C]?.()},Ye=(t)=>typeof t.then==="function",Be=async(t,e,o={})=>{if(Ye(t))if(o.errorHandler)try{t=await t}catch(l){let a=await o.errorHandler(l);if(!a)return;t=a}else t=await t.catch(it);if(Z in t)return mt(t,e);let s=j(t.headers);if(t.body){let l=t.body.getReader(),a=[],r=!1,u=void 0;if(s["transfer-encoding"]!=="chunked"){let f=2;for(let y=0;y<f;y++){u||=l.read();let w=await Ne(u).catch((i)=>{console.error(i),r=!0});if(!w){if(y===1){await new Promise((i)=>setTimeout(i)),f=3;continue}break}if(u=void 0,w.value)a.push(w.value);if(w.done){r=!0;break}}if(r&&!("content-length"in s))s["content-length"]=a.reduce((y,w)=>y+w.length,0)}if(e.writeHead(t.status,s),a.forEach((f)=>{e.write(f)}),r)e.end();else{if(a.length===0)yt(e);await ft(l,e,u)}}else if(s[ve]);else e.writeHead(t.status,s),e.end();e[C]?.()},Ke=(t,e={})=>{let o=e.autoCleanupIncoming??!0;if(e.overrideGlobalObjects!==!1&&global.Request!==K)Object.defineProperty(global,"Request",{value:K}),Object.defineProperty(global,"Response",{value:W});return async(s,l)=>{let a,r;try{r=Ze(s,e.hostname);let u=!o||s.method==="GET"||s.method==="HEAD";if(!u){if(s[ut]=!0,s.on("end",()=>{u=!0}),s instanceof me)l[C]=()=>{if(!u)setTimeout(()=>{if(!u)setTimeout(()=>{s.destroy(),l.destroy()})})}}if(l.on("close",()=>{if(r[U]){if(s.errored)r[U].abort(s.errored.toString());else if(!l.writableFinished)r[U].abort("Client connection prematurely closed.")}if(!u)setTimeout(()=>{if(!u)setTimeout(()=>{s.destroy()})})}),a=t(r,{incoming:s,outgoing:l}),Z in a)return mt(a,l)}catch(u){if(!a)if(e.errorHandler){if(a=await e.errorHandler(r?u:we(u)),!a)return}else if(!r)a=Oe();else a=it(u);else return q(u,l)}try{return await Be(a,l,e)}catch(u){return q(u,l)}}},We=(t)=>{let e=t.fetch,o=Ke(e,{hostname:t.hostname,overrideGlobalObjects:t.overrideGlobalObjects,autoCleanupIncoming:t.autoCleanupIncoming});return(t.createServer||ye)(t.serverOptions||{},o)},wt=(t,e)=>{let o=We(t);return o.listen(t?.port??3000,t.hostname,()=>{let s=o.address();e&&e(s)}),o};import{writeFileSync as Ge,unlinkSync as Re,existsSync as se,readFileSync as Me,mkdirSync as De}from"node:fs";import{join as le}from"node:path";import{homedir as oe}from"node:os";async function ct(t){let e=(i)=>{return i.stateSchema=ht,i},o={id:"filesystem",name:"filesystem",description:"File and directory operations (read, write, search, glob)",execute:async()=>{return e(new k)}};await t.addMiddleware(o),t.middlewares.registerImplementation(o);let s={id:"terminal",name:"terminal",description:"Terminal command execution (Bash/CMD, background processes)",execute:async()=>{return e(new H)}};await t.addMiddleware(s),t.middlewares.registerImplementation(s);let l={id:"subagents",name:"subagents",description:"Task delegation to specialized agents",execute:async()=>{let{createSubAgentsMiddleware:i}=await import("./chunk-1t3rabge.js");return await i(t)}};await t.addMiddleware(l),t.middlewares.registerImplementation(l);let a={id:"skills",name:"skills",description:"Progressive skills disclosure",execute:async(i)=>{if(i.projectSkillsDir=i.projectSkillsDir||"./.claude/skills",!i.skillsDir){let $=await import("os"),ne=await import("path");i.skillsDir=ne.join($.homedir(),".claude","skills")}let{SkillsMiddleware:x}=await import("./chunk-txnezkkt.js");return new x(i)}};await t.addMiddleware(a),t.middlewares.registerImplementation(a);let r={id:"agents_md",name:"agents_md",description:"Inject agent documentation",execute:async(i)=>{let{AgentsMdMiddleware:x}=await import("./chunk-txnezkkt.js");return new x({projectRoot:i?.projectRoot})}};await t.addMiddleware(r),t.middlewares.registerImplementation(r);let u={id:"interactive",name:"interactive",description:"User interaction for approval and input",execute:async()=>{let{InteractiveMiddleware:i}=await import("./chunk-df36fv24.js");return i}};await t.addMiddleware(u),t.middlewares.registerImplementation(u);let f={id:"task",name:"task",description:"Task management for todo lists",execute:async()=>{let{taskMiddleware:i}=await import("./chunk-s04zfe57.js");return i}};await t.addMiddleware(f),t.middlewares.registerImplementation(f);let y={id:"mcp",name:"mcp",description:"Task management for todo lists",execute:async()=>{let{MCPWithConfigMiddleware:i}=await import("./chunk-p75m7q2h.js");return new i}};await t.addMiddleware(y),t.middlewares.registerImplementation(y);let w={id:"web",name:"web",description:"Fetch and extract readable content from URLs",execute:async()=>{let{WebMiddleware:i}=await import("./chunk-bv28r5cf.js");return i}};await t.addMiddleware(w),t.middlewares.registerImplementation(w)}var xt=`# Manager - 项目经理
|
|
219
2
|
|
|
220
3
|
你是 **Manager**,用户与整个 AI 系统的主要交流窗口。你的职责是理解用户需求、拆解任务、协调子 agent 执行,并汇总结果。
|
|
221
4
|
|
|
@@ -363,7 +146,7 @@ import{na as z0}from"../../code-graph/zen-code/chunk-n61yv4t5.js";import{ra as A
|
|
|
363
146
|
2. **完整上下文**:给子 agent 的任务必须包含足够的背景信息
|
|
364
147
|
3. **有序执行**:有依赖关系的任务按顺序执行
|
|
365
148
|
4. **保持专注**:每次只追踪一个进行中的任务
|
|
366
|
-
`;var
|
|
149
|
+
`;var Tt=({cwd:t,env:e})=>`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
150
|
|
|
368
151
|
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
152
|
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.
|
|
@@ -457,11 +240,11 @@ NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTAN
|
|
|
457
240
|
Here is useful information about the environment you are running in:
|
|
458
241
|
|
|
459
242
|
<env>
|
|
460
|
-
Working directory: ${
|
|
461
|
-
Is directory a git repo: ${
|
|
462
|
-
Platform: ${
|
|
463
|
-
OS Version: ${
|
|
464
|
-
Today's date: ${
|
|
243
|
+
Working directory: ${t}
|
|
244
|
+
Is directory a git repo: ${e.isGitRepo?"Yes":"No"}
|
|
245
|
+
Platform: ${e.platform}
|
|
246
|
+
OS Version: ${e.osVersion}
|
|
247
|
+
Today's date: ${e.date}
|
|
465
248
|
</env>
|
|
466
249
|
|
|
467
250
|
# Code References
|
|
@@ -472,173 +255,7 @@ When referencing specific functions or pieces of code include the pattern \`file
|
|
|
472
255
|
user: Where are errors from the client handled?
|
|
473
256
|
assistant: Clients are marked as failed in the \`connectToServer\` function in src/services/process.ts:712.
|
|
474
257
|
</example>
|
|
475
|
-
`;var
|
|
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
|
-
|
|
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"));
|
|
258
|
+
`;var Ve={filesystem:!0,terminal:!0,agents_md:!0,skills:!0,subagents:!0,interactive:!0,task:!0,mcp:!0,web:!0};async function b(){let t=new $t,e=new V(t);await e.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 ct(e);let s=await new At().loadAllAgents(process.cwd()),l=new Set(s.map((a)=>`agents/${a.name}`));for(let a of s){let r=`agents/${a.name}`,u=`prompts/${a.name}`;await e.addPrompt({id:u,name:a.name},a.systemPrompt),await e.addAgent({id:r,name:a.name,description:a.description,system_prompt:u,model:"glm-4.7",middlewares:Ve})}if(await e.addPrompt({id:"prompts/default",name:"default"},Tt({cwd:process.cwd(),env:{isGitRepo:!0,platform:process.platform,osVersion:process.version,date:new Date().toISOString().split("T")[0]}})),await e.addPrompt({id:"prompts/manager",name:"manager"},xt),!l.has("agents/default"))await e.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(!l.has("agents/manager"))await e.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 e}var be=await b(),Zt=be;async function Fe(t,e,o,s,l){let a=await I(t,o,{pkg:e,providerResolver:l?.providerResolver,initModel:p,stateSchema:L,enhanceSystemPrompt:async(u,f)=>{return u+`
|
|
259
|
+
|
|
260
|
+
`+await Ot(f)}});o.thread_id=Ut(s);let r=await a.invoke(o,{recursionLimit:500,configurable:s.configurable,context:s.context});return{active_agent:"",task_store:r.task_store,messages:r.messages}}await Nt();function S(t,e){return new vt(L).addNode("graph",async(o,s)=>{let{active_agent:l}=o,a=t??Zt,r=await _(a),u=(l&&l!=="default"?l:null)??o.agent_id??"agents/default";if(!r.includes(u))throw Error(`Unknown agent: ${u}. Available: ${r.join(", ")}`);return await Fe(u,a,o,s,e)}).addEdge(dt,"graph").compile()}var R=null;async function Kt(){if(R)return R;let t=await b(),e=await V.fromStorage(t.storage);for(let l of t.middlewares.listImplementations())e.middlewares.registerImplementation(l);let o=await Yt(),s=new Bt(process.cwd());return await s.initialize(),R={agentPackage:e,configManager:o,taskStore:s},R}var Vt=Wt.context().create(),c=Vt.router,m=Vt.procedure;var bt=c({get:m.query(async({ctx:t})=>{return await t.configManager.getConfig()}),update:m.input(n.record(n.string(),n.unknown())).mutation(async({ctx:t,input:e})=>{return await t.configManager.updateConfig(e),await t.configManager.getConfig()})});var Ft=30000;async function Qe(t){let e=new AbortController,o=setTimeout(()=>e.abort(),Ft);try{if(t.type==="openai"||t.type==="deepseek"||t.type==="moonshot"||t.type==="zhipu"||t.type==="custom"){let s=await fetch(`${t.baseUrl}/models`,{method:"GET",headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"},signal:e.signal});if(!s.ok)throw Error(`API error (${s.status}): ${s.statusText}`);return((await s.json()).data||[]).map((a)=>({id:a.id,name:a.id,provider:t.type}))}else if(t.type==="anthropic"){let s=await fetch(`${t.baseUrl}/v1/models`,{method:"GET",headers:{"x-api-key":t.apiKey,"anthropic-version":"2023-06-01","Content-Type":"application/json"},signal:e.signal});if(!s.ok)throw Error(`Anthropic API error (${s.status}): ${s.statusText}`);return((await s.json()).data||[]).map((a)=>({id:a.id,name:a.display_name||a.id,provider:"anthropic"}))}else if(t.type==="gemini"){let s=await fetch(`${t.baseUrl}/v1beta/models`,{method:"GET",headers:{Authorization:`Bearer ${t.apiKey}`},signal:e.signal});if(!s.ok)throw Error(`Gemini API error (${s.status}): Invalid API key`);return((await s.json()).models||[]).map((a)=>({id:a.name,name:a.displayName||a.name,provider:"gemini"}))}return[]}catch(s){if(s.name==="AbortError")throw Error(`API request timeout (${Ft/1000}s)`);throw s}finally{clearTimeout(o)}}var Qt=c({list:m.input(n.object({providerId:n.string()})).query(async({ctx:t,input:e})=>{let s=((await t.configManager.getConfig()).providers||[]).find((l)=>l.id===e.providerId);if(!s||!s.apiKey||!s.baseUrl)return[];return await Qe(s)})});var Jt=c({list:m.query(async({ctx:t})=>{return await t.configManager.listSkills()}),get:m.input(n.object({name:n.string()})).query(async({ctx:t,input:e})=>{return await t.configManager.getSkill(e.name)}),save:m.input(n.object({name:n.string(),content:n.object({frontmatter:n.record(n.string(),n.unknown()).optional(),body:n.string()})})).mutation(async({ctx:t,input:e})=>{return await t.configManager.saveSkill(e.name,e.content),{success:!0}}),delete:m.input(n.object({name:n.string()})).mutation(async({ctx:t,input:e})=>{return await t.configManager.deleteSkill(e.name),{success:!0}})});var zt=c({list:m.input(n.object({filter:n.string().optional(),cwd:n.string().optional()}).optional()).query(async({ctx:t,input:e})=>{if(e?.filter)return await t.taskStore.getTasksByStatus(e.filter);return await t.taskStore.getAllTasks()}),get:m.input(n.object({id:n.string(),cwd:n.string().optional()})).query(async({ctx:t,input:e})=>{return await t.taskStore.getTask(e.id)}),updateStatus:m.input(n.object({id:n.string(),status:n.string(),cwd:n.string().optional()})).mutation(async({ctx:t,input:e})=>{return await t.taskStore.updateTask(e.id,{status:e.status})}),delete:m.input(n.object({id:n.string(),cwd:n.string().optional()})).mutation(async({ctx:t,input:e})=>{return await t.taskStore.deleteTask(e.id)})});import{join as Xt}from"path";import{homedir as Je}from"os";var Mt=c({list:m.input(n.object({type:n.enum(["memories","skills"]),cwd:n.string().optional()})).query(async({input:t})=>{let e=t.cwd||process.cwd(),o=Xt(e,".claude",t.type),s=Xt(Je(),".claude",t.type);try{if(t.type==="memories")return Rt(s,o).map((a)=>({...a,type:"memory"}));else return Gt(s,o).map((a)=>({...a,type:"skill"}))}catch(l){return console.warn(`Failed to load ${t.type}:`,l),[]}})});ze();var Xe=new Map;async function qt(t){let{command:e,cwd:o,timeout:s}=t,l=Dt();try{let a=process.platform==="win32",f=Et(a?"cmd.exe":"/bin/bash",[...a?["/d","/s","/c"]:["-c"],e],{cwd:o,detached:!0,reject:!1,windowsVerbatimArguments:a,timeout:s});if(!f.pid)return{id:l,pid:0,output:"Error: Failed to start command",status:"failed",exitCode:-1};let y={process:f,stdout:[],stderr:[],command:e,startTime:Date.now()};jt.set(f.pid,y),Xe.set(l,f.pid);let w=[];f.stdout?.on("data",(x)=>{let $=x.toString();w.push($),y.stdout.push($)}),f.stderr?.on("data",(x)=>{let $=x.toString();w.push($),y.stderr.push($)}),f.on("close",(x)=>{y.status=x===0?"completed":"failed",y.exitCode=x}),await new Promise((x)=>setTimeout(x,100));let i=y.status||"running";return{id:l,pid:f.pid,output:w.join(""),status:i,exitCode:y.exitCode}}catch(a){let r=a instanceof Error?a.message:"Unknown error";return{id:l,pid:0,output:`Error: ${r}`,status:"failed",exitCode:-1}}}var F=new Map,Pt=c({list:m.query(async()=>{return Array.from(F.values())}),get:m.input(n.object({id:n.string()})).query(async({input:t})=>{let e=F.get(t.id);if(!e)throw Error(`Process '${t.id}' not found`);return e}),exec:m.input(n.object({command:n.string(),cwd:n.string().optional()})).mutation(async({input:t})=>{let e=await qt({command:t.command,cwd:t.cwd||process.cwd()});return F.set(e.id,{id:e.id,name:t.command,pid:e.pid,status:e.status==="running"?"running":e.exitCode===0?"stopped":"error",startedAt:Date.now()}),{id:e.id,pid:e.pid,stdout:e.output,stderr:"",exitCode:e.exitCode??0,status:e.status}}),kill:m.input(n.object({id:n.string()})).mutation(async({input:t})=>{let e=F.get(t.id);if(!e)throw Error(`Process '${t.id}' not found`);if(e.pid)try{process.kill(e.pid,"SIGTERM")}catch{}return e.status="stopped",F.set(t.id,e),{success:!0}})});var Ct=c({config:bt,models:Qt,skills:Jt,tasks:zt,knowledge:Mt,processes:Pt});function kt(t){return{...t}}var N=(t,e)=>t.constructor.name===e.name,h=new Map;h.set(n.ZodBoolean.name,()=>!1),h.set(n.ZodNumber.name,()=>0),h.set(n.ZodString.name,()=>""),h.set(n.ZodArray.name,()=>[]),h.set(n.ZodRecord.name,()=>({})),h.set(n.ZodDefault.name,(t)=>t.def.defaultValue),h.set(n.ZodPipe.name,(t)=>Q(t.def.in)),h.set(n.ZodOptional.name,(t)=>N(t.def.innerType,n.ZodDefault)?t.def.innerType.def.defaultValue:void 0),h.set(n.ZodTuple.name,(t)=>{let e=[];for(let o of t.def.items)e.push(Q(o));return e}),h.set(n.ZodPipe.name,(t)=>Q(t.def.in)),h.set(n.ZodUnion.name,(t)=>Q(t.def.options[0])),h.set(n.ZodObject.name,(t)=>d(t)),h.set(n.ZodRecord.name,(t)=>d(t)),h.set(n.ZodIntersection.name,(t)=>d(t));function Q(t){let e=t.constructor.name;if(!h.has(e)){console.warn("getSchemaDefaultForField: Unhandled type",t.constructor.name);return}return h.get(e)(t)}function d(t){if(N(t,n.ZodRecord))return{};if(N(t,n.ZodPipe))return d(t.def.in);if(N(t,n.ZodIntersection))return{...d(t.def.left),...d(t.def.right)};if(N(t,n.ZodUnion)){for(let e of t.def.options)if(N(e,n.ZodObject))return d(e);return console.warn("getSchemaDefaultObject: No object found in union, returning empty object"),{}}return N(t,n.ZodObject)?Object.fromEntries(Object.entries(t.shape).map(([e,o])=>[e,Q(o)]).filter((e)=>e[1]!==void 0)):(console.warn(`getSchemaDefaultObject: Expected object schema, got ${t.constructor.name}`),{})}var pl=n.object({task_store:n.record(n.string(),n.any()).default({})}),Sl=n.object({task_id:n.string().optional().describe("The task id to ask the subagent, if not provided, will use the tool call id"),subagent_id:n.string(),task_description:n.string().describe("Describe the user state and what you want the subagent to do."),data_transfer:n.any().optional().describe("Data to transfer to the subagent.")});class tt{agentPackage;baseUrl;constructor(t,e){this.agentPackage=t;this.baseUrl=e||process.env.ZEN_SWARM_URL||"http://127.0.0.1:8124"}async resolve(t){try{let e=`${this.baseUrl}/api/trpc/providers.resolveForAgent?input=${encodeURIComponent(JSON.stringify({json:{id:t}}))}`,o=await fetch(e,{signal:AbortSignal.timeout(3000)});if(!o.ok)return null;let l=(await o.json())?.result?.data?.json;if(!l?.apiKey)return null;return{id:l.id,type:l.type,name:l.name,baseUrl:l.baseUrl,apiKey:l.apiKey}}catch{return null}}async resolveByModel(t){let e=await this.agentPackage.getModel(t);if(!e?.provider_id)return null;return this.resolve(e.provider_id)}}async function Ht(t){let e=new tt(t.agentPackage),o=S(t.agentPackage,{providerResolver:e});g("code",o),console.log('LangGraph graph "code" registered at /api/langgraph')}function Lt(t){return(e)=>e.json({status:"ok",version:"1.0.0",service:"zen-core",port:Number(process.env.ZEN_CORE_PORT||8125),graphs:["code"],timestamp:Date.now()})}var J=It(_t(),1),et=(t)=>{return t=t.startsWith("/")?t.slice(1):t,t=t.endsWith("/")?t.slice(0,-1):t,t};async function St(t){let e=new Headers,o=async(u)=>{var f;return(f=t.createContext)===null||f===void 0?void 0:f.call(t,(0,J.default)({req:t.req,resHeaders:e},u))},s=new URL(t.req.url),l=et(s.pathname),a=et(t.endpoint),r=et(l.slice(a.length));return await pt((0,J.default)((0,J.default)({},t),{},{req:t.req,createContext:o,path:r,error:null,onError(u){var f;t===null||t===void 0||(f=t.onError)===null||f===void 0||f.call(t,(0,J.default)((0,J.default)({},u),{},{req:t.req}))},responseMeta(u){var f;let y=(f=t.responseMeta)===null||f===void 0?void 0:f.call(t,u);if(y===null||y===void 0?void 0:y.headers){if(y.headers instanceof Headers)for(let[w,i]of y.headers.entries())e.append(w,i);else for(let[w,i]of Object.entries(y.headers))if(Array.isArray(i))for(let x of i)e.append(w,x);else if(typeof i==="string")e.set(w,i)}return{headers:e,status:y===null||y===void 0?void 0:y.status}}}))}var M={};function gt(t){t.post("/api/mcp-sync",async(e)=>{try{let o=await e.req.json();return M=o.servers??o??{},console.log(`[mcp-sync] Received ${Object.keys(M).length} MCP server(s)`),e.json({ok:!0,count:Object.keys(M).length})}catch(o){return console.error("[mcp-sync] Failed to parse request body:",o),e.json({ok:!1,error:String(o)},400)}}),t.get("/api/mcp-sync",(e)=>{return e.json({servers:M})})}var Y=Number(process.env.ZEN_CORE_PORT||8125),D=le(oe(),".zen-code","zen-core.pid"),te=le(oe(),".zen-code");if(!se(te))De(te,{recursive:!0});if(se(D)){let t=parseInt(Me(D,"utf8").trim());if(!isNaN(t))try{process.kill(t,"SIGTERM"),console.log(`Terminated old zen-core process (PID: ${t})`),await new Promise((e)=>setTimeout(e,500))}catch{}}Ge(D,String(process.pid));process.on("exit",()=>{try{Re(D)}catch{}});console.log("Bootstrapping zen-core services...");var st=await Kt();await Ht(st);var B=new ee;B.use(at());B.get("/health",Lt(st));gt(B);B.all("/api/trpc/*",async(t)=>{return St({req:t.req.raw,router:Ct,createContext:()=>kt(st),endpoint:"/api/trpc"})});var{default:Ee}=await import("./chunk-rr7h6wdp.js");B.route("/api/langgraph",Ee);wt({fetch(t,e){return B.fetch(t,e)},port:Y});console.log(`zen-core running on http://127.0.0.1:${Y}`);console.log(` Health: http://127.0.0.1:${Y}/health`);console.log(` LangGraph: http://127.0.0.1:${Y}/api/langgraph`);console.log(` tRPC: http://127.0.0.1:${Y}/api/trpc`);console.log(` Terminal: ws://127.0.0.1:${Y}/ws/terminal`);async function ae(t){console.log(`
|
|
261
|
+
[zen-core] Received ${t}, shutting down...`),process.exit(0)}process.on("SIGTERM",()=>ae("SIGTERM"));process.on("SIGINT",()=>ae("SIGINT"));
|