blade-code 0.10.128 → 0.10.129
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/blade.js +2 -2
- package/dist/chunk-0z9nqbd0.js +2 -0
- package/dist/{chunk-yqqeh12b.js → chunk-1c11sbk3.js} +2 -2
- package/dist/{chunk-fa0pyv9k.js → chunk-1q6sasj0.js} +2 -2
- package/dist/chunk-1y8x5q68.js +1 -0
- package/dist/chunk-2bnpn8be.js +1 -0
- package/dist/{chunk-xzfc1s6k.js → chunk-2y1qngw7.js} +1 -1
- package/dist/{chunk-p2rxrxct.js → chunk-440v1nhy.js} +3 -3
- package/dist/{chunk-ted1hyvb.js → chunk-44jtpg8y.js} +1 -1
- package/dist/{chunk-z3hpstky.js → chunk-53h87fmt.js} +1 -1
- package/dist/chunk-54yagjc7.js +2 -0
- package/dist/chunk-606343xt.js +1 -0
- package/dist/{chunk-85jv1sr7.js → chunk-651cnx1s.js} +2 -2
- package/dist/{chunk-n8w1jxsh.js → chunk-67qdrjyy.js} +1 -1
- package/dist/chunk-6czf04er.js +1 -0
- package/dist/{chunk-pq6g92cz.js → chunk-6p6ts4kv.js} +2 -2
- package/dist/{chunk-sca5q3tt.js → chunk-77efqpdc.js} +1 -1
- package/dist/{chunk-10w2pj3r.js → chunk-93x9xbew.js} +1 -1
- package/dist/chunk-9gs4eqt8.js +1 -0
- package/dist/{chunk-jy0vfp8a.js → chunk-9kt66etm.js} +1 -1
- package/dist/chunk-9pzfv6nb.js +1 -0
- package/dist/{chunk-p7349xay.js → chunk-9rj01jd1.js} +2 -2
- package/dist/chunk-9s8saznq.js +1 -0
- package/dist/{chunk-1aw643j2.js → chunk-9snmrjg8.js} +2 -2
- package/dist/{chunk-yqpej45c.js → chunk-a60cmnmz.js} +2 -2
- package/dist/{chunk-8hd4vd20.js → chunk-aaxc81jc.js} +1 -1
- package/dist/{chunk-c47db31j.js → chunk-ajsw4te2.js} +2 -2
- package/dist/{chunk-xejvs1fk.js → chunk-amc5d34g.js} +1 -1
- package/dist/{chunk-r04vwtej.js → chunk-ar5np5h5.js} +2 -2
- package/dist/{chunk-mkvvyq49.js → chunk-bamj4e6v.js} +2 -2
- package/dist/{chunk-atema2rc.js → chunk-dfjmvj3d.js} +2 -2
- package/dist/{chunk-9n90djh7.js → chunk-dg54m1y3.js} +2 -2
- package/dist/{chunk-s7axaw78.js → chunk-edtxcqxa.js} +1 -1
- package/dist/chunk-f8gb685p.js +2 -0
- package/dist/chunk-fhafrrvs.js +1 -0
- package/dist/{chunk-zfyg3888.js → chunk-g4xny949.js} +1 -1
- package/dist/chunk-gfbkrk60.js +338 -0
- package/dist/{chunk-12hdakw4.js → chunk-gmqpfm52.js} +2 -2
- package/dist/{chunk-skv2gb99.js → chunk-grhsv55v.js} +2 -2
- package/dist/{chunk-nx8xb7dm.js → chunk-jkfkyedn.js} +1 -1
- package/dist/{chunk-v4nqv1pr.js → chunk-jxh9wf3c.js} +356 -356
- package/dist/{chunk-b408cqg1.js → chunk-kbxqsf93.js} +2 -2
- package/dist/chunk-kd3k1q9z.js +1 -0
- package/dist/{chunk-a7gghhvn.js → chunk-m5vpmvrs.js} +18 -18
- package/dist/chunk-m9mw8ppy.js +1 -0
- package/dist/{chunk-y93nqyqd.js → chunk-mawx6fa5.js} +2 -2
- package/dist/{chunk-xshrj2nd.js → chunk-mdew58v9.js} +1 -1
- package/dist/{chunk-60he05xs.js → chunk-mkzze9aq.js} +2 -2
- package/dist/{chunk-n4q6fvqe.js → chunk-mvm1rzc4.js} +2 -2
- package/dist/chunk-nz8wbcf1.js +1 -0
- package/dist/{chunk-qm632an7.js → chunk-p00f53yq.js} +1 -1
- package/dist/{chunk-9hnfz9bx.js → chunk-pa636c8e.js} +1 -1
- package/dist/chunk-pd1b8jrv.js +1 -0
- package/dist/chunk-pj69j4zp.js +2 -0
- package/dist/{chunk-41byj2h8.js → chunk-q6xsfm60.js} +2 -2
- package/dist/{chunk-6m4sqwj0.js → chunk-qcvxff27.js} +2 -2
- package/dist/chunk-r1b4pnce.js +94 -0
- package/dist/{chunk-jxc67ydz.js → chunk-rnmt44jm.js} +2 -2
- package/dist/chunk-s51h6n70.js +23 -0
- package/dist/chunk-s6158tg7.js +170 -0
- package/dist/{chunk-fgbqm2jh.js → chunk-sfe4810k.js} +1 -1
- package/dist/{chunk-96w8ay2h.js → chunk-sj1dzeta.js} +1 -1
- package/dist/{chunk-ektgnqmh.js → chunk-sx77dpxw.js} +1 -1
- package/dist/chunk-t6bg5b37.js +1 -0
- package/dist/{chunk-gxwkwkhp.js → chunk-tkydv9k8.js} +1 -1
- package/dist/{chunk-q3y3s16v.js → chunk-v52wc8yg.js} +2 -2
- package/dist/chunk-wzcwxhhz.js +1 -0
- package/dist/{chunk-yysqw1cq.js → chunk-xcmadwjv.js} +2 -2
- package/dist/chunk-xdphpfrg.js +14 -0
- package/dist/chunk-xsjtjrt9.js +10 -0
- package/dist/{chunk-6v2hhgka.js → chunk-y4f99y85.js} +2 -2
- package/dist/{chunk-mvgmsjwq.js → chunk-z03dtyh6.js} +1 -1
- package/dist/{chunk-rz2wc93t.js → chunk-za8gyypy.js} +4 -4
- package/dist/{chunk-mm05y2c5.js → chunk-zkzhm39s.js} +1 -1
- package/dist/{chunk-1xg7qx35.js → chunk-zwjrensv.js} +1 -1
- package/dist/chunk-zzgxy86p.js +1 -0
- package/dist/web/assets/ChatView-Bg36FUaj.js +53 -0
- package/dist/web/assets/{CodeBlockHighlighter-0VOa5Mes.js → CodeBlockHighlighter-D5rB73Eo.js} +2 -2
- package/dist/web/assets/FilePreview-BxaBSmap.js +65 -0
- package/dist/web/assets/KanbanBoard-B4gx3JMo.js +16 -0
- package/dist/web/assets/{MarkdownRenderer-3g4TPTeI.js → MarkdownRenderer-BRH7LHhN.js} +3 -3
- package/dist/web/assets/ScrollArea-DikU3QeQ.js +1 -0
- package/dist/web/assets/SessionHistorySurface-DG80d6-F.js +6 -0
- package/dist/web/assets/{SettingsModal-3GMy6V-E.js → SettingsModal-Bxqkok81.js} +3 -3
- package/dist/web/assets/Sidebar-DGaHGcHx.js +31 -0
- package/dist/web/assets/TaskSwitcher-DOnLPurk.js +26 -0
- package/dist/web/assets/TerminalPanel-BzhCF9vw.js +6 -0
- package/dist/web/assets/archive-BiDGrqry.js +6 -0
- package/dist/web/assets/{arrow-left-03GxbYI7.js → arrow-left-BY-esOAP.js} +1 -1
- package/dist/web/assets/{calendar-clock-8W4ostX1.js → calendar-clock-BCyxvfVt.js} +1 -1
- package/dist/web/assets/chevron-right-Bg-10yuN.js +6 -0
- package/dist/web/assets/{chevrons-up-down-BboZzEAk.js → chevrons-up-down-M5SAJq7T.js} +1 -1
- package/dist/web/assets/{clock-3-aXgeptZP.js → clock-3-v-nHTA0A.js} +1 -1
- package/dist/web/assets/copy-p1zc_rjZ.js +6 -0
- package/dist/web/assets/download-D_-kbJXR.js +6 -0
- package/dist/web/assets/{external-link-UkIIC2ds.js → external-link-wSGTIqe3.js} +1 -1
- package/dist/web/assets/{folder-BOCc5dv2.js → folder-Ltm9jCS5.js} +1 -1
- package/dist/web/assets/index-B4186fIT.css +1 -0
- package/dist/web/assets/index-_xnlrekR.js +210 -0
- package/dist/web/assets/{pause-DVIT6IIr.js → pause-_LvCZkxM.js} +1 -1
- package/dist/web/assets/pencil-DB6ICr_h.js +6 -0
- package/dist/web/assets/{play-DsdF5dji.js → play-BRXP1rHJ.js} +1 -1
- package/dist/web/assets/plus-BqvjEpLw.js +6 -0
- package/dist/web/assets/session-events-AGMXvPey.js +22 -0
- package/dist/web/assets/settings-LfQbDvBA.js +6 -0
- package/dist/web/assets/teamService-B5FnUcet.js +1 -0
- package/dist/web/assets/terminal-By4sO9Gw.js +6 -0
- package/dist/web/assets/vendor-radix-D6QrtXqd.js +45 -0
- package/dist/web/index.html +3 -3
- package/package.json +1 -1
- package/dist/chunk-0ktte40x.js +0 -185
- package/dist/chunk-1acb8fwq.js +0 -120
- package/dist/chunk-3pwqqk7w.js +0 -1
- package/dist/chunk-3q7g9206.js +0 -1
- package/dist/chunk-562w5zc6.js +0 -2
- package/dist/chunk-5x56nka1.js +0 -1
- package/dist/chunk-7hajkvde.js +0 -1
- package/dist/chunk-9wptwfmg.js +0 -1
- package/dist/chunk-ap01rwg0.js +0 -169
- package/dist/chunk-cm8fy1jn.js +0 -1
- package/dist/chunk-dp4r5bay.js +0 -1
- package/dist/chunk-dtxza4zh.js +0 -1
- package/dist/chunk-hd7bxzvy.js +0 -1
- package/dist/chunk-hks48s9k.js +0 -1
- package/dist/chunk-hmncnf7p.js +0 -1
- package/dist/chunk-j6fj679p.js +0 -10
- package/dist/chunk-m8czdpyg.js +0 -1
- package/dist/chunk-p5awnndq.js +0 -8
- package/dist/chunk-s7peh6kf.js +0 -2
- package/dist/chunk-ws6gtw33.js +0 -1
- package/dist/chunk-wtmhqy5s.js +0 -1
- package/dist/chunk-xnstybjm.js +0 -2
- package/dist/chunk-xpdtg9h9.js +0 -23
- package/dist/chunk-z2jwm4s8.js +0 -1
- package/dist/web/assets/ChatView-DCHnicTP.js +0 -58
- package/dist/web/assets/FilePreview-C_3KHzzj.js +0 -65
- package/dist/web/assets/KanbanBoard-D_NTkUnD.js +0 -16
- package/dist/web/assets/TaskSwitcher-eCdxu5Eo.js +0 -26
- package/dist/web/assets/TerminalPanel-9q9Trmv9.js +0 -6
- package/dist/web/assets/index-DGf6Z2kM.css +0 -1
- package/dist/web/assets/index-DaiT-mmo.js +0 -275
- package/dist/web/assets/session-events-CWzF04l4.js +0 -22
- package/dist/web/assets/teamService-BliaDj1Z.js +0 -1
- package/dist/web/assets/vendor-radix-Bc1_Q9tz.js +0 -45
package/dist/chunk-cm8fy1jn.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ge as a,He as b}from"./chunk-mkvvyq49.js";import"./chunk-b408cqg1.js";import"./chunk-mm05y2c5.js";export{a as globalOptions,b as cliConfig};
|
package/dist/chunk-dp4r5bay.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ff as a,Gf as b,Hf as c}from"./chunk-n4q6fvqe.js";import"./chunk-s7axaw78.js";import"./chunk-atema2rc.js";import"./chunk-gxwkwkhp.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";export{b as resolveModelConfig,c as getModelDisplayName,a as getModelApiKeyEnvironmentVariable};
|
package/dist/chunk-dtxza4zh.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{fj as a,gj as b,hj as c,ij as d,jj as e,kj as f}from"./chunk-b408cqg1.js";import"./chunk-mm05y2c5.js";export{b as getVersion,c as getPackageName,a as getPackageInfo,e as getFormattedVersion,d as getDescription,f as getCopyright};
|
package/dist/chunk-hd7bxzvy.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Kf as a,Lf as b,Mf as c,Nf as d}from"./chunk-yqqeh12b.js";import"./chunk-6v2hhgka.js";import"./chunk-nx8xb7dm.js";import"./chunk-96w8ay2h.js";import"./chunk-s7peh6kf.js";import"./chunk-ted1hyvb.js";import"./chunk-xzfc1s6k.js";import"./chunk-r04vwtej.js";import"./chunk-atema2rc.js";import"./chunk-gxwkwkhp.js";import"./chunk-b408cqg1.js";import"./chunk-6m4sqwj0.js";import"./chunk-1xg7qx35.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";export{c as snapshotWorkspaceModelResources,b as resolveWorkspaceModelResources,d as createProcessModelResources,a as cloneWorkspaceModelConfig};
|
package/dist/chunk-hks48s9k.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ae as g,Be as h,Ce as i,De as j,Ee as k,Fe as l,ue as a,ve as b,we as c,xe as d,ye as e,ze as f}from"./chunk-0ktte40x.js";import"./chunk-r04vwtej.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";export{f as syncSession,h as syncAllAcpRemoteScopes,i as syncAll,g as syncAcpRemoteScope,l as searchProjectionText,e as resetProjectionDbCache,j as removeSessionFromProjection,k as rebuildProjectionIndex,d as getProjectionDb,c as getIndexDbPath,a as __setProjectionIOForTesting,b as __resetProjectionIOForTesting};
|
package/dist/chunk-hmncnf7p.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ud as a,Vd as b,Wd as c,Xd as d,Yd as e,Zd as f,_d as g}from"./chunk-1acb8fwq.js";import"./chunk-z3hpstky.js";import"./chunk-0ktte40x.js";import"./chunk-s7axaw78.js";import"./chunk-8hd4vd20.js";import"./chunk-zfyg3888.js";import"./chunk-s7peh6kf.js";import"./chunk-ted1hyvb.js";import"./chunk-r04vwtej.js";import"./chunk-gxwkwkhp.js";import"./chunk-b408cqg1.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";export{b as __setSessionSnapshotIOForTesting,c as __resetSessionSnapshotIOForTesting,g as SessionService,d as SessionMissingCreationError,e as SessionArchivedError,f as SessionArchiveConflictError,a as STALE_EMPTY_SESSION_AGE_MS};
|
package/dist/chunk-j6fj679p.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{a as T,b as W,c as X,d as Y}from"./chunk-p5awnndq.js";import"./chunk-562w5zc6.js";import"./chunk-skv2gb99.js";import"./chunk-85jv1sr7.js";import"./chunk-9n90djh7.js";import"./chunk-fa0pyv9k.js";import"./chunk-v4nqv1pr.js";import"./chunk-pq6g92cz.js";import"./chunk-60he05xs.js";import"./chunk-q3y3s16v.js";import"./chunk-rz2wc93t.js";import"./chunk-sca5q3tt.js";import"./chunk-1acb8fwq.js";import"./chunk-z3hpstky.js";import"./chunk-0ktte40x.js";import{Ne as R}from"./chunk-1aw643j2.js";import"./chunk-yqpej45c.js";import{hf as Q}from"./chunk-jxc67ydz.js";import"./chunk-v508x7cg.js";import"./chunk-xshrj2nd.js";import"./chunk-c47db31j.js";import"./chunk-n4q6fvqe.js";import"./chunk-s7axaw78.js";import"./chunk-yqqeh12b.js";import"./chunk-a7gghhvn.js";import"./chunk-ektgnqmh.js";import"./chunk-8hd4vd20.js";import"./chunk-10w2pj3r.js";import"./chunk-p2rxrxct.js";import"./chunk-zfyg3888.js";import"./chunk-6v2hhgka.js";import"./chunk-nx8xb7dm.js";import"./chunk-96w8ay2h.js";import"./chunk-s7peh6kf.js";import"./chunk-ted1hyvb.js";import"./chunk-xzfc1s6k.js";import"./chunk-r04vwtej.js";import"./chunk-atema2rc.js";import"./chunk-gxwkwkhp.js";import{gj as M}from"./chunk-b408cqg1.js";import"./chunk-6m4sqwj0.js";import"./chunk-1xg7qx35.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";import m from"chalk";import K from"open";var A=`
|
|
2
|
-
____ _ _
|
|
3
|
-
| __ )| | __ _ __| | ___
|
|
4
|
-
| _ \\| |/ _\` |/ _\` |/ _ \\
|
|
5
|
-
| |_) | | (_| | (_| | __/
|
|
6
|
-
|____/|_|\\__,_|\\__,_|\\___|
|
|
7
|
-
`,C={command:"web",describe:"Start Blade server and open web interface",builder:T,handler:async(Z)=>{let H=W(Z);if(await Q(),!process.env.BLADE_SERVER_PASSWORD)console.log(m.yellow("[WARN] BLADE_SERVER_PASSWORD is not set; server is unsecured.")),console.log(m.gray(` Set this environment variable to enable Basic Auth.
|
|
8
|
-
`));let F=await Y.listenAsync(H);if(console.log(m.cyan(A)),console.log(m.gray(` v${M()}
|
|
9
|
-
`)),H.hostname==="0.0.0.0"){let q=`http://localhost:${F.port}`;console.log(m.blue.bold(" Local access: "),m.white(q));let x=X();for(let z of x)console.log(m.blue.bold(" Network access: "),m.white(`http://${z}:${F.port}`));K(q).catch(()=>{})}else{let q=F.url.toString();console.log(m.blue.bold(" Web interface: "),m.white(q)),K(q).catch(()=>{})}console.log(""),console.log(m.gray(` Press Ctrl+C to stop the server.
|
|
10
|
-
`));let J,$=new Promise((q)=>{J=q}),b=R(async()=>{await F.stop(),J()});try{await $}finally{b(),await F.stop()}}};export{C as webCommand};
|
package/dist/chunk-m8czdpyg.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{eg as a,fg as b,gg as c,hg as d,ig as e,jg as f,kg as g,lg as h,mg as i,ng as j,og as k}from"./chunk-a7gghhvn.js";import"./chunk-ektgnqmh.js";import"./chunk-8hd4vd20.js";import"./chunk-10w2pj3r.js";import"./chunk-p2rxrxct.js";import"./chunk-zfyg3888.js";import"./chunk-6v2hhgka.js";import"./chunk-nx8xb7dm.js";import"./chunk-96w8ay2h.js";import"./chunk-s7peh6kf.js";import"./chunk-ted1hyvb.js";import"./chunk-xzfc1s6k.js";import"./chunk-r04vwtej.js";import"./chunk-atema2rc.js";import"./chunk-gxwkwkhp.js";import"./chunk-b408cqg1.js";import"./chunk-6m4sqwj0.js";import"./chunk-1xg7qx35.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";export{g as withWorkspaceAgentResources,i as snapshotWorkspaceAgentResources,f as resolveWorkspaceAgentResources,k as resetWorkspaceAgentResources,d as refreshWorkspaceCommunicationStyles,h as getWorkspaceAgentResourceCacheStats,j as createEmptySessionAgentResources,e as configureInvocationPluginDirs,c as WorkspaceAgentResourceCapacityError,a as MAX_RESIDENT_WORKSPACE_AGENT_RESOURCES,b as MAX_ACTIVE_WORKSPACE_AGENT_RESOURCES};
|
package/dist/chunk-p5awnndq.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{e as I$,f as q$}from"./chunk-562w5zc6.js";import{g as P1}from"./chunk-skv2gb99.js";import{s as P0,t as O$}from"./chunk-85jv1sr7.js";import{u as x$,v as $$,w as Q$,x as j0}from"./chunk-9n90djh7.js";import{A as h4,B as y4,C as eO,D as g4,y as ax,z as m4}from"./chunk-fa0pyv9k.js";import{G as gx,H as I1,I as g$,L as ux,M as y0,N as U4,O as S1,P as Wx,Q as Z4,R as vx,S as $0,T as dx,U as lx,V as p4,W as r0,X as J4,Y as W0,Z as b0,aa as G1,ba as U1,ca as e$,da as cx,ea as ix,fa as w$,ga as G$,ha as U$,ia as B$,ja as _$,ka as K$,la as F$,ma as L$,na as D$,qa as T$,ta as W2,ya as u$}from"./chunk-v4nqv1pr.js";import{Fa as r4,La as fO}from"./chunk-60he05xs.js";import{$a as S$,Pa as v1,Sa as v$,Ta as B4,Ua as ox,Va as nx,Wa as d$,Xa as l$,Ya as _4,Za as c$,_a as I0,ab as f$,bb as C$,cb as tx,db as sx,eb as rx,fb as ex,gb as C4,hb as b4}from"./chunk-q3y3s16v.js";import{Hb as Q4,Qb as T0,sb as CO,tb as o,vb as E,wb as px}from"./chunk-rz2wc93t.js";import{$b as N4}from"./chunk-sca5q3tt.js";import{Bd as z1,Cd as W4,Dd as w1,Fd as kx,Gc as Sx,Hc as e1,Ic as fx,Jc as Q1,Kc as Cx,Md as mx,Nc as n1,Nd as hx,Pd as m0,Sd as O4,Xd as yx,Yd as x4,Zd as $4,_c as Ex,_d as y,jd as Px,td as N1,ud as A0,zc as Rx}from"./chunk-1acb8fwq.js";import{cf as s$,gf as FO,kf as $x,rf as uO}from"./chunk-jxc67ydz.js";import{sf as R1}from"./chunk-xshrj2nd.js";import{Jf as Ix}from"./chunk-s7axaw78.js";import{Lf as T1}from"./chunk-yqqeh12b.js";import{Uf as r$,Wf as k$,Zf as z$,bg as O1,cg as x1,gg as B2,jg as oO,kg as $1,og as _2}from"./chunk-a7gghhvn.js";import{Eg as Qx,Fg as qx}from"./chunk-8hd4vd20.js";import{Jg as o4,Kg as E0}from"./chunk-p2rxrxct.js";import{Fh as Mx,Ih as Ax,Kh as Tx,Xh as n4,ah as s4,ai as e0,qh as Dx,th as Hx,vh as bx,wh as jx,xh as Yx,yh as Nx,zh as E4}from"./chunk-6v2hhgka.js";import{di as s1}from"./chunk-nx8xb7dm.js";import{ei as p,gi as V,hi as tO,ji as zO}from"./chunk-96w8ay2h.js";import{li as C1,oi as r1}from"./chunk-s7peh6kf.js";import{si as $O}from"./chunk-ted1hyvb.js";import{Ui as ZO}from"./chunk-r04vwtej.js";import{_i as L0}from"./chunk-atema2rc.js";import{aj as Ox,bj as Fx,dj as xx,ej as Lx}from"./chunk-gxwkwkhp.js";import{gj as C0}from"./chunk-b408cqg1.js";import{nj as H4}from"./chunk-6m4sqwj0.js";import{Lj as j1,Tj as d4,qj as f1}from"./chunk-xnstybjm.js";import{Wj as F4}from"./chunk-mm05y2c5.js";var v5={port:{type:"number",describe:"Port to listen on (0 for auto)",default:0},hostname:{type:"string",describe:"Hostname to listen on",default:"127.0.0.1"},cors:{type:"array",describe:"Additional domains to allow for CORS",default:[]}};function d5(O){return{port:O.port??0,hostname:O.hostname??"127.0.0.1",cors:O.cors??[]}}import{existsSync as j4,readFileSync as _1}from"node:fs";import{createServer as F5}from"node:http";import{networkInterfaces as L5}from"node:os";import{dirname as D5,extname as H5,join as G0}from"node:path";import{fileURLToPath as b5}from"node:url";import{brotliCompressSync as j5,gzipSync as M5,constants as A5}from"node:zlib";import{Hono as T5}from"hono";import{cors as I5}from"hono/cors";import{WebSocketServer as q5}from"ws";var f0=ZO("Service"),S2=30000,f2=new Set(["completed","failed","cancelled","interrupted"]);class d1{dispatch;store;tickMs;timer;unsubscribeBus;ticking=!1;inFlight=new Set;constructor(O){this.dispatch=O.dispatch,this.store=O.store??C4.getInstance(),this.tickMs=O.tickMs??S2}start(){if(this.timer)return;f0.info("[TaskScheduler] Starting scheduler tick loop"),this.timer=setInterval(()=>{this.tick()},this.tickMs),this.timer.unref?.(),this.unsubscribeBus=E.subscribe((O)=>{if(O.type!=="task.status")return;let x=O.properties.taskStatus;if(typeof x!=="string"||!f2.has(x))return;this.recordTerminalStatus(O.sessionId,x,typeof O.properties.taskStatusReason==="string"?O.properties.taskStatusReason:void 0)}),this.tick()}stop(){if(this.timer)clearInterval(this.timer),this.timer=void 0,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,f0.info("[TaskScheduler] Stopped scheduler tick loop")}async tick(O=new Date){if(this.ticking)return;this.ticking=!0;try{let x=await this.store.list();for(let $ of x)await this.evaluate($,O)}catch(x){f0.warn("[TaskScheduler] Tick failed:",x)}finally{this.ticking=!1}}async evaluate(O,x){if(!O.enabled)return;if(this.inFlight.has(O.id))return;if(O.expiresAt&&new Date(O.expiresAt).getTime()<=x.getTime()){await this.store.update(O.id,{enabled:!1,nextRunAt:null}),f0.info(`[TaskScheduler] Schedule ${O.id} expired; disabled`);return}if(!O.nextRunAt)return;if(!(new Date(O.nextRunAt).getTime()<=x.getTime()))return;await this.fire(O,x)}async fire(O,x=new Date,$={}){if(this.inFlight.has(O.id))throw Error(`Schedule ${O.id} is already dispatching`);this.inFlight.add(O.id);let Q=x.toISOString();try{let Z=await this.dispatch({prompt:O.prompt,title:O.title??C2(O),sourceProjectPath:O.projectPath,isolation:O.dispatch.isolation??"worktree",permissionMode:O.dispatch.permissionMode??"default",modelId:O.dispatch.modelId,reasoningEffort:O.dispatch.reasoningEffort,serviceTier:O.dispatch.serviceTier,responseVerbosity:O.dispatch.responseVerbosity,communicationStyle:O.dispatch.communicationStyle}),Y=O.trigger.kind==="once"?null:$.manual?O.nextRunAt?new Date(O.nextRunAt):null:v1(O.trigger,x,x);await this.store.update(O.id,{lastRunAt:Q,lastRunSessionId:Z.session.sessionId,lastStatus:Z.status,lastError:void 0,runCount:O.runCount+1,nextRunAt:Y?Y.toISOString():null,enabled:O.trigger.kind==="once"?!1:O.enabled}),E.publish({sessionId:Z.session.sessionId,projectPath:O.projectPath},"schedule.fired",{scheduleId:O.id,firedAt:Q,sessionId:Z.session.sessionId,runId:Z.runId,status:Z.status}),f0.info(`[TaskScheduler] Fired schedule ${O.id} -> session ${Z.session.sessionId} (${Z.status})`)}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);f0.warn(`[TaskScheduler] Schedule ${O.id} dispatch failed:`,Z);let W=O.trigger.kind==="once"?null:$.manual?O.nextRunAt?new Date(O.nextRunAt):null:v1(O.trigger,x,x);await this.store.update(O.id,{lastRunAt:Q,lastStatus:"error",lastError:Y,nextRunAt:W?W.toISOString():null,enabled:O.trigger.kind==="once"?!1:O.enabled})}finally{this.inFlight.delete(O.id)}}async recordTerminalStatus(O,x,$){let Z=(await this.store.list()).find((Y)=>Y.lastRunSessionId===O);if(!Z)return;await this.store.update(Z.id,{lastStatus:x,...$?{lastError:$}:{lastError:void 0}})}}function C2(O){return`Scheduled: ${O.prompt.trim().replace(/\s+/g," ").slice(0,60)}`}class WO extends Error{code;statusCode;details;constructor(O,x,$=500,Q){super(x);this.code=O;this.statusCode=$;this.details=Q;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message,...this.details?{details:this.details}:{}}}}}class v extends WO{constructor(O,x){super("NOT_FOUND",x?`${O} not found: ${x}`:`${O} not found`,404)}}class K extends WO{constructor(O){super("BAD_REQUEST",O,400)}}class g extends WO{constructor(O){super("CONFLICT",O,409)}}class dO extends WO{constructor(O,x){super("TOO_MANY_REQUESTS",O,429,x)}}class KO extends WO{constructor(O="Server is shutting down"){super("SERVICE_UNAVAILABLE",O,503)}}class H1 extends WO{constructor(O){super("SESSION_WORKSPACE_UNAVAILABLE","This session workspace is no longer available",409,{reason:O})}}class SO extends WO{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class JO extends WO{constructor(O="Internal server error"){super("INTERNAL_ERROR",O,500)}}var s5=V.Object({error:V.Object({code:V.String(),message:V.String(),details:V.Optional(V.Record(V.String(),V.Unknown()))})});import{Hono as E2}from"hono";var l1=ZO("Service"),P2=V.Object({updates:V.Record(V.String(),V.Any()),options:V.Optional(V.Object({scope:V.Optional(zO(["local","project","global"])),immediate:V.Optional(V.Boolean())}))});function k2(O){return{currentModelId:O.currentModelId,permissionMode:O.permissionMode,language:O.language,codeTheme:O.codeTheme,uiTheme:O.uiTheme,autoSaveSessions:O.autoSaveSessions,notifyBuild:O.notifyBuild,notifyErrors:O.notifyErrors,notifySounds:O.notifySounds,privacyTelemetry:O.privacyTelemetry,privacyCrash:O.privacyCrash,agentTeamsEnabled:O.agentTeamsEnabled===!0,communicationStyle:O.communicationStyle,maxConcurrentTasks:O.maxConcurrentTasks,maxQueuedTasks:O.maxQueuedTasks,maxQueuedTaskBytes:O.maxQueuedTaskBytes,maxResidentSessionRuntimes:O.maxResidentSessionRuntimes,sessionRuntimeIdleMs:O.sessionRuntimeIdleMs,maxResidentSessionProjections:O.maxResidentSessionProjections,sessionProjectionIdleMs:O.sessionProjectionIdleMs}}var P4=()=>{let O=new E2;return O.get("/",async(x)=>{try{let $=FO();return x.json($?k2($):{})}catch($){return l1.error("[ConfigRoutes] Failed to get config:",$),x.json({})}}),O.put("/",async(x)=>{try{let $=await x.req.json(),Q=p(P2,$);if(!Q.success)throw new K("Invalid config update format");let{updates:Z,options:Y}=Q.data;return await uO().updateConfig(Z,Y),x.json({success:!0,updates:Z})}catch($){if($ instanceof E4)throw new K($.message);throw l1.error("[ConfigRoutes] Failed to update config:",$),$}}),O.get("/permissions",async(x)=>{try{let $=FO();return x.json($?.permissions||{})}catch($){return l1.error("[ConfigRoutes] Failed to get permissions:",$),x.json({})}}),O};import{Hono as m2}from"hono";import{streamSSE as h2}from"hono/streaming";function k4(O){let x="";if(O.id!==void 0)x+=`id: ${O.id}
|
|
2
|
-
`;if(O.event!==void 0)x+=`event: ${O.event}
|
|
3
|
-
`;for(let $ of O.data.split(/\r\n|\r|\n/))x+=`data: ${$}
|
|
4
|
-
`;if(O.retry!==void 0)x+=`retry: ${O.retry}
|
|
5
|
-
`;return x+=`
|
|
6
|
-
`,Buffer.byteLength(x)}class t0{serial;buffered=[];bufferedBytes=0;nextOrder=0;phase="buffering";highestDeliveredSequence=0;highestReplaySequence=0;failure;maxPendingItems;maxPendingBytes;constructor(O){this.maxPendingItems=O.maxPendingItems??m4,this.maxPendingBytes=O.maxPendingBytes??h4,this.serial=new g4({maxPendingItems:this.maxPendingItems,maxPendingBytes:this.maxPendingBytes,writeTimeoutMs:O.writeTimeoutMs??y4,sizeOf:k4,write:O.write,onFailure:(x)=>{this.failure=x,this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,O.onFailure?.(x)}})}async writeInitial(O){await this.offerDirect(O)}observe(O,x){if(this.phase==="closed")return;if(this.phase==="buffering"){this.buffer(O,x);return}this.offerLive(O,x)}async writeReplay(O,x){if(!Number.isSafeInteger(x)||x<=0)throw this.fail(new eO("invalid_size","SSE committed sequence must be a positive safe integer")),this.currentFailure();if(x<=this.highestReplaySequence)return;await this.offerDirect(O),this.highestReplaySequence=x,this.highestDeliveredSequence=x}finishInitialization(O){if(this.phase!=="buffering")return;let x=this.buffered.splice(0);this.bufferedBytes=0,this.phase="live";let $=O.replayed?x.filter((Z)=>Z.sequence!==void 0&&Z.sequence>this.highestReplaySequence).sort((Z,Y)=>Z.sequence-Y.sequence||Z.order-Y.order):x.sort((Z,Y)=>Z.order-Y.order),Q;for(let Z of $){if(O.replayed&&Z.sequence!==void 0&&Z.sequence===Q)continue;if(this.offerLive(Z.message,Z.sequence),this.serial.stats().closed)return;Q=Z.sequence}}offerHeartbeat(O){if(this.phase!=="live"||this.buffered.length>0||this.serial.stats().pendingItems>0)return!1;return this.offerLive(O),!this.serial.stats().closed}async flush(){await this.serial.flush()}close(O){if(this.phase==="closed")return;this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,this.serial.close(O)}stats(){let O=this.serial.stats();return{closed:this.phase==="closed",pendingItems:O.pendingItems+this.buffered.length,pendingBytes:O.pendingBytes+this.bufferedBytes,bufferedItems:this.buffered.length,bufferedBytes:this.bufferedBytes}}buffer(O,x){let $=k4(O),Q=this.serial.stats();if($>this.maxPendingBytes){this.fail(new eO("oversized",`SSE frame requires ${$} bytes; limit is ${this.maxPendingBytes}`,{pendingItems:Q.pendingItems+this.buffered.length,pendingBytes:Q.pendingBytes+this.bufferedBytes}));return}if(Q.pendingItems+this.buffered.length>=this.maxPendingItems||Q.pendingBytes+this.bufferedBytes+$>this.maxPendingBytes){this.fail(new eO("overflow","SSE initialization buffer limit exceeded",{pendingItems:Q.pendingItems+this.buffered.length,pendingBytes:Q.pendingBytes+this.bufferedBytes}));return}this.nextOrder+=1,this.buffered.push({message:O,bytes:$,sequence:x,order:this.nextOrder}),this.bufferedBytes+=$}offerLive(O,x){if(x!==void 0){if(x<=this.highestReplaySequence)return;if(x<=this.highestDeliveredSequence){this.fail(new eO("write_failed","SSE committed sequence regressed"));return}this.highestDeliveredSequence=x}if(!this.serial.offer(O).accepted)this.phase="closed"}async offerDirect(O){if(this.phase==="closed")throw this.currentFailure();let x=this.serial.offer(O);if(!x.accepted)throw this.phase="closed",x.error;await x.completion}fail(O){this.serial.close(O)}currentFailure(){return this.failure??new eO("closed","SSE egress is closed")}}var y2=15000,g2=ZO("Service"),u2=new Set(["task.status","task.delivery","session.created","session.updated","session.deleted","schedule.fired","permission.asked","question.required","elicitation.required","interaction.resolved"]),p2=new Set(["queued","running","completed","failed","cancelled","interrupted"]),v2=new Set(["high","medium","low"]),d2=new Set(["feature","bug","maintenance","research"]);function l2(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let x=O,$=["changedFiles","additions","deletions","commits"];if($.some((Q)=>typeof x[Q]!=="number"||!Number.isInteger(x[Q])||x[Q]<0))return;return Object.fromEntries($.map((Q)=>[Q,x[Q]]))}function s0(O,x){return typeof O==="number"&&Number.isInteger(O)&&O>=x?O:void 0}function c2(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let x=O;if(!["applied","discarded","conflicted"].includes(String(x.status))||typeof x.updatedAt!=="string")return;return{status:x.status,updatedAt:x.updatedAt,...typeof x.sourceCommit==="string"?{sourceCommit:x.sourceCommit}:{},...s0(x.changedFiles,0)!==void 0?{changedFiles:x.changedFiles}:{},...typeof x.message==="string"?{message:x.message}:{}}}function u4(O,x){return x&&O instanceof eO&&(O.kind==="closed"||O.kind==="aborted")}var v4=()=>{let O=new m2,x=new r0;return O.onError(($,Q)=>{if($ instanceof KO)return Q.json($.toObject(),503);throw $}),O.get("/",async($)=>{let Q;try{Q=x.enter($.req.raw.signal)}catch(Y){if(Y instanceof p4)throw new KO;throw Y}let Z=!1;try{let Y=h2($,async(W)=>{let U,A,B=!1,M,H,T=new Promise((L)=>{H=L}),k,q=()=>{if(A!==void 0)clearInterval(A),A=void 0;U?.(),U=void 0},P=(L)=>{if(k)return k;return B=!0,k=(async()=>{try{q(),M?.close(L),W.close()}finally{H()}})(),k},n=()=>{P(Q.signal.reason)};if(Q.signal.addEventListener("abort",n,{once:!0}),W.onAbort(()=>{P()}),Q.signal.aborted){await P(Q.signal.reason),Q.signal.removeEventListener("abort",n),Q.release();return}M=new t0({write:async(L)=>{await W.writeSSE(L)},onFailure:(L)=>{if(u4(L,B))return;g2.warn(`[EventRoutes] SSE egress closed: kind=${L.kind} pendingItems=${L.pendingItems??0} pendingBytes=${L.pendingBytes??0}`),P(L)}});let r=(L,i)=>{M?.observe({data:JSON.stringify({type:L,properties:i})})};U=E.subscribe((L)=>{if(!u2.has(L.type))return;if(L.type==="permission.asked"||L.type==="question.required"||L.type==="elicitation.required"){let OO=L.properties.requestId;if(typeof OO!=="string"||!OO)return;r("interaction.pending",{sessionId:L.sessionId,projectPath:L.projectPath,interactionType:L.type==="question.required"?"question":L.type==="elicitation.required"?"elicitation":"permission",requestId:OO});return}if(L.type==="interaction.resolved"){let OO=L.properties.requestId;if(typeof OO!=="string"||!OO)return;r(L.type,{sessionId:L.sessionId,projectPath:L.projectPath,requestId:OO});return}if(L.type==="session.created"||L.type==="session.deleted"){r(L.type,{sessionId:L.sessionId,projectPath:L.projectPath});return}if(L.type==="session.updated"){let OO=L.properties.title,bO=L.properties.taskPriority,t=L.properties.taskKind,EO=L.properties.taskDueAt,U0=typeof OO==="string"&&Boolean(OO.trim()),RO=v2.has(String(bO)),G=d2.has(String(t)),YO=EO===null||typeof EO==="string"&&Number.isFinite(Date.parse(EO));if(!U0&&!RO&&!G&&!YO)return;r(L.type,{sessionId:L.sessionId,projectPath:L.projectPath,...U0?{title:OO}:{},...RO?{taskPriority:bO}:{},...G?{taskKind:t}:{},...YO?{taskDueAt:EO}:{}});return}if(L.type==="task.delivery"){let OO=c2(L.properties.taskDelivery);if(!OO)return;r(L.type,{sessionId:L.sessionId,projectPath:L.projectPath,taskDelivery:OO,...L.properties.taskWorktreeRemoved===!0?{taskWorktreeRemoved:!0}:{},...typeof L.properties.updatedAt==="string"?{updatedAt:L.properties.updatedAt}:{}});return}if(L.type==="schedule.fired"){let OO=L.properties.scheduleId,bO=L.properties.firedAt;if(typeof OO!=="string"||typeof bO!=="string")return;r(L.type,{scheduleId:OO,firedAt:bO,sessionId:L.sessionId,projectPath:L.projectPath,...typeof L.properties.runId==="string"?{runId:L.properties.runId}:{},...typeof L.properties.status==="string"?{status:L.properties.status}:{}});return}let i=L.properties.taskStatus;if(typeof i!=="string"||!p2.has(i))return;let QO=l2(L.properties.taskDiffStat),S=s0(L.properties.taskQueuePosition,1),HO=s0(L.properties.taskQueueDepth,0),c=s0(L.properties.taskConcurrencyLimit,1),xO=s0(L.properties.taskInFlight,0),e=typeof L.properties.taskAdmissionPaused==="boolean"?L.properties.taskAdmissionPaused:void 0;r(L.type,{sessionId:L.sessionId,projectPath:L.projectPath,taskStatus:i,...typeof L.properties.taskStatusReason==="string"?{taskStatusReason:L.properties.taskStatusReason}:{},...L.properties.taskFailure&&typeof L.properties.taskFailure==="object"?{taskFailure:L.properties.taskFailure}:{},...typeof L.properties.taskStartedAt==="string"?{taskStartedAt:L.properties.taskStartedAt}:{},...typeof L.properties.taskCompletedAt==="string"?{taskCompletedAt:L.properties.taskCompletedAt}:{},...typeof L.properties.updatedAt==="string"?{updatedAt:L.properties.updatedAt}:{},...QO?{taskDiffStat:QO}:{},...S!==void 0?{taskQueuePosition:S}:{},...HO!==void 0?{taskQueueDepth:HO}:{},...c!==void 0?{taskConcurrencyLimit:c}:{},...xO!==void 0?{taskInFlight:xO}:{},...e!==void 0?{taskAdmissionPaused:e}:{}})});try{if(W.aborted||B)return;if(await M.writeInitial({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),W.aborted||B)return;if(M.finishInitialization({replayed:!1}),W.aborted||B)return;A=setInterval(()=>{if(W.aborted||B)return;M?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},y2),await T}catch(L){if(u4(L,B))return;throw L}finally{await P(),Q.signal.removeEventListener("abort",n),Q.release()}});return Z=!0,Y}catch(Y){if(!Z)Q.release();throw Y}}),{app:O,shutdown:($)=>x.shutdown($),getSseConnectionStats:()=>x.stats()}};import{Hono as i2}from"hono";var a2=V.Object({paused:V.Boolean()}),l4=()=>{let O=new i2;return O.get("/health",(x)=>{return x.json({healthy:!0,version:C0()})}),O.get("/info",(x)=>{let $=$O(),Q=FO();if(Q)W0.configure(Q.maxConcurrentTasks,Q.maxQueuedTasks,Q.maxQueuedTaskBytes);let Z=W0.getStats();return x.json({version:C0(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:$,gitBranch:d4($),taskAdmission:{inFlight:Z.inFlight,queued:Z.queued,maxConcurrent:Z.maxConcurrent,maxQueued:Z.maxQueued,paused:Z.paused}})}),O.put("/task-admission",async(x)=>{let $;try{$=await x.req.json()}catch{throw new K("Invalid request body")}let Q=p(a2,$);if(!Q.success)throw new K("Invalid task admission control request");W0.setPaused(Q.data.paused);let Z=W0.getStats();return x.json({inFlight:Z.inFlight,queued:Z.queued,maxConcurrent:Z.maxConcurrent,maxQueued:Z.maxQueued,paused:Z.paused})}),O};import c4 from"node:path";import{Hono as o2}from"hono";var n2=V.Object({projectPath:V.String({minLength:1}),action:zO(["trust","revoke"]),expectedDigest:V.Optional(V.String())}),t2=V.Object({projectPath:V.String({minLength:1}),sessionId:V.String({minLength:1}),enabled:V.Boolean()});function c1(O){if(!O||!c4.isAbsolute(O))throw new K("projectPath must be absolute");return c4.resolve(O)}function i4(O){if(!O)throw new K("sessionId is required");try{j1(O)}catch(x){throw new K(x instanceof Error?x.message:"sessionId is invalid")}return O}async function b1(O){let x=c1(O),$=FO()?.hooks??n4.hooks,Q=await e0.getInstance().loadWorkspaceHooks(x,$,{includeBaseForCurrentWorkspace:!1});return $1(x,async()=>{x1(x);let Z=E0.getInstance();return Z.loadConfig(Q,x),await O1(x),Z.getConfig(x)})}function a4(O,x){let $=E0.getInstance(),Q=$.getConfig(x).enabled,Z=$.isSessionPaused(O,x);return{sessionId:O,projectPath:x,enabled:$.isSessionEnabled(O,x),paused:Z,configEnabled:Q}}var t4=()=>{let O=new o2;return O.get("/trust",async(x)=>{let $=x.req.query("projectPath");if(!$)throw new K("projectPath query parameter is required");return await b1($),x.json(await E0.getInstance().getTrustStatus($))}),O.post("/trust",async(x)=>{let $=p(n2,await x.req.json());if(!$.success)throw new K("Invalid hook trust request");let{projectPath:Q,action:Z,expectedDigest:Y}=$.data;await b1(Q);let W=E0.getInstance(),U;try{U=Z==="trust"?await W.trustProject(Q,Y):await W.revokeProjectTrust(Q)}catch(A){if(A instanceof o4)throw new g(A.message);throw A}return x.json(U)}),O.get("/session",async(x)=>{let $=c1(x.req.query("projectPath")),Q=i4(x.req.query("sessionId"));return await b1($),x.json(a4(Q,$))}),O.post("/session",async(x)=>{let $=p(t2,await x.req.json());if(!$.success)throw new K("Invalid hook session request");let Q=c1($.data.projectPath),Z=i4($.data.sessionId);await b1(Q);let Y=E0.getInstance();if($.data.enabled)Y.enableSession(Z,Q);else Y.disableSession(Z,Q);return x.json(a4(Z,Q))}),O};import{Hono as s2}from"hono";var O0=ZO("Service");function r2(O){try{return r4(O)}catch{return[]}}function e2(O){if(!M1(O)||!M1(O.reference)||!M1(O.argument))throw Error("Invalid MCP completion request");let x=O.reference.type,$=x==="prompt"&&typeof O.reference.name==="string"?{type:"prompt",name:O.reference.name}:x==="resource"&&typeof O.reference.uri==="string"?{type:"resource",uri:O.reference.uri}:void 0;if(!$||typeof O.argument.name!=="string"||typeof O.argument.value!=="string")throw Error("Invalid MCP completion request");let Q;if(O.context!==void 0){if(!M1(O.context))throw Error("Invalid MCP completion context");Q=Object.create(null);for(let[Z,Y]of Object.entries(O.context)){if(typeof Y!=="string")throw Error("Invalid MCP completion context");Q[Z]=Y}}return{reference:$,argument:{name:O.argument.name,value:O.argument.value},...Q?{context:Q}:{}}}function M1(O){return O!==null&&typeof O==="object"&&!Array.isArray(O)}async function X0(O,x){let $=FO()?.mcpServers??{};for(let[Q,Z]of Object.entries($)){if(x&&Q!==x)continue;if(!O.getServerStatus(Q))await O.registerServer(Q,Z,{connect:!1})}}var e4=()=>{let O=new s2;return O.get("/",async(x)=>{try{let $=fO.getInstance();await X0($);let Q=$.getAllServers(),Z=await Promise.all(Array.from(Q.entries()).map(async([Y,W])=>({id:Y,name:Y,status:W.status==="connected"?"connected":W.status==="reconnecting"?"reconnecting":W.status==="connecting"?"connecting":W.lastError?"error":"offline",endpoint:W.config.command?`${W.config.command} ${(W.config.args||[]).join(" ")}`.trim():W.config.url||"Unknown",description:`MCP server: ${Y}`,tools:W.tools.map((U)=>U.name),completionSupported:W.client.completionSupported,tasks:W.client.tasks,resources:W.contentCatalog.resources,resourceTemplates:W.contentCatalog.resourceTemplates.map((U)=>({...U,variables:r2(U.uriTemplate)})),prompts:W.contentCatalog.prompts,connectedAt:W.connectedAt?.toISOString(),error:W.lastError?.message,recovery:W.recovery,logging:W.logging,instructions:W.instructions,oauthEnabled:W.client.oauthEnabled,oauthStatus:await W.client.getOAuthStatus()})));return x.json(Z)}catch($){return O0.error("[McpRoutes] Failed to get MCP servers:",$),x.json({error:$ instanceof Error?$.message:"Failed to get MCP servers"},500)}}),O.post("/:name/connect",async(x)=>{try{let $=x.req.param("name"),Q=fO.getInstance();return await X0(Q,$),await Q.connectServer($),x.json({success:!0})}catch($){return O0.error("[McpRoutes] Failed to connect MCP server:",$),x.json({success:!1,error:$.message},500)}}),O.post("/:name/disconnect",async(x)=>{try{let $=x.req.param("name"),Q=fO.getInstance();return await X0(Q,$),await Q.disconnectServer($),x.json({success:!0})}catch($){return O0.error("[McpRoutes] Failed to disconnect MCP server:",$),x.json({success:!1,error:$.message},500)}}),O.get("/:name/logs",async(x)=>{try{let $=x.req.param("name"),Q=Number(x.req.query("limit")??20),Z=Number(x.req.query("afterRevision")??0);if(!Number.isSafeInteger(Q)||Q<1||Q>100||!Number.isSafeInteger(Z)||Z<0)return x.json({error:"Invalid MCP log pagination"},400);let Y=fO.getInstance();return await X0(Y,$),x.json(Y.getLogSnapshot($,{limit:Q,afterRevision:Z}))}catch($){return O0.error("[McpRoutes] Failed to get MCP logs:",$),x.json({error:$.message},500)}}),O.post("/:name/logging-level",async(x)=>{try{let $=x.req.param("name"),Q=await x.req.json();if(!s4(Q.level))return x.json({success:!1,error:"Invalid MCP logging level"},400);let Z=fO.getInstance();return await X0(Z,$),await Z.setServerLoggingLevel($,Q.level),x.json({success:!0,level:Q.level})}catch($){return O0.error("[McpRoutes] Failed to set MCP logging level:",$),x.json({success:!1,error:$.message},400)}}),O.post("/:name/complete",async(x)=>{try{let $=x.req.param("name"),Q=e2(await x.req.json()),Z=fO.getInstance();await X0(Z,$);let Y=await Z.complete($,Q);return x.json(Y)}catch($){return O0.error("[McpRoutes] Failed to complete MCP argument:",$),x.json({error:$.message},400)}}),O.post("/:name/oauth/login",async(x)=>{try{let $=x.req.param("name"),Q=fO.getInstance();await X0(Q,$);let Z=await Q.beginOAuthLogin($);return x.json({success:!0,flowId:Z.flowId,authorizationUrl:Z.authorizationUrl},202)}catch($){return O0.error("[McpRoutes] Failed to start MCP OAuth login:",$),x.json({success:!1,error:$.message},400)}}),O.post("/:name/oauth/logout",async(x)=>{try{let $=x.req.param("name"),Q=fO.getInstance();return await X0(Q,$),await Q.logoutOAuth($),x.json({success:!0})}catch($){return O0.error("[McpRoutes] Failed to log out MCP OAuth:",$),x.json({success:!1,error:$.message},400)}}),O.delete("/:name",async(x)=>{try{let $=x.req.param("name");await fO.getInstance().unregisterServer($);let Z=FO();if(Z?.mcpServers){let{[$]:Y,...W}=Z.mcpServers;await uO().updateConfig({mcpServers:W})}return x.json({success:!0})}catch($){return O0.error("[McpRoutes] Failed to delete MCP server:",$),x.json({success:!1,error:$.message},500)}}),O.post("/",async(x)=>{try{let $=await x.req.json(),{name:Q,config:Z}=$;if(!Q||!Z)return x.json({success:!1,error:"Missing name or config"},400);await fO.getInstance().registerServer(Q,Z);let W=FO();return await uO().updateConfig({mcpServers:{...W?.mcpServers,[Q]:Z}}),x.json({success:!0})}catch($){return O0.error("[McpRoutes] Failed to add MCP server:",$),x.json({success:!1,error:$.message},500)}}),O};import{getSupportedThinkingLevels as O3}from"@earendil-works/pi-ai";import{Hono as x3}from"hono";var A1=ZO("Service");function $3(O,x,$=Qx.list()){return{id:O.id,displayName:O.displayName,provider:O.provider,model:O.model,overrides:O.overrides,fallbackModels:O.fallbackModels,contextWindow:x.contextWindow,maxTokens:x.maxTokens,reasoning:x.reasoning,supportedReasoningEfforts:O3(x),supportedServiceTiers:xx(x),supportedResponseVerbosities:Ox(x),communicationStyles:$,input:x.input}}function Q3(O){Zx(O.overrides);let x={displayName:O.displayName||void 0,overrides:O.overrides||void 0};if(O.model)x.model=O.model;return x}function Zx(O){let x=O?.streamIdleTimeout;if(x!==void 0&&(!Number.isFinite(x)||x<1000))throw new K("streamIdleTimeout must be at least 1000ms")}var Jx=()=>{let O=new x3;return O.get("/",async(x)=>{try{let $=FO();if(!$)throw Error("Config not initialized");let Q=x.get("directory")||$O(),[Z,Y]=await Promise.all([T1(Q,$),oO(Q)]),W=Z.config.models,U=W.find((H)=>H.id===Z.config.currentModelId)??W[0],A=Z.catalog,B=Y.communicationStyles.list(),M=(H)=>$3(H,A.resolveConfig(H),B);return x.json({configured:W.map(M),current:U?M(U):null})}catch($){A1.error("[ModelsRoutes] Failed to get models:",$);let Q=new JO("Failed to get models");return x.json(Q.toObject(),500)}}),O.post("/",async(x)=>{let $=L0(),Q,Z;try{let Y=await x.req.json(),{provider:W,displayName:U,model:A,overrides:B,apiKey:M,modelProvider:H}=Y;if(!W||!A)throw new K("provider and model are required");Zx(B);let T;if(H){if(H.id!==W)throw new K("modelProvider.id must match the model provider");if(FO()?.modelProviders[W])throw new K(`model provider already exists: ${W}`);T={name:H.name,baseUrl:H.baseUrl,wireApi:H.wireApi,...H.apiKeyEnv?{apiKeyEnv:H.apiKeyEnv}:{}};try{$.registerModelProvider(W,T,[A]),Z=W}catch(P){throw new K(P instanceof Error?P.message:"Invalid model provider")}}else $.getModel(W,A);if(M?.trim()){if(await $.setApiKey(W,M.trim()),T)Q=W}let k={provider:W,displayName:U||void 0,model:A,overrides:B||void 0},q=T?await uO().addModelWithProvider(k,T):await uO().addModel(k);return x.json({success:!0,model:q})}catch(Y){if(Q)await $.credentials.delete(Q);if(Z){let W=FO();$.configureModelProviders(W?.modelProviders??{},W?.models??[])}throw A1.error("[ModelsRoutes] Failed to add model:",Y),Y}}),O.put("/:modelId",async(x)=>{try{let $=x.req.param("modelId"),Q=await x.req.json(),{displayName:Z,overrides:Y,model:W}=Q,U=$x($);if(!U)throw new K("model config not found");if(W)L0().getModel(U.provider,W);return await uO().updateModel($,Q3({displayName:Z,overrides:Y,model:W})),x.json({success:!0})}catch($){throw A1.error("[ModelsRoutes] Failed to update model:",$),$}}),O.delete("/:modelId",async(x)=>{try{let $=x.req.param("modelId");return await uO().removeModel($),x.json({success:!0})}catch($){throw A1.error("[ModelsRoutes] Failed to delete model:",$),$}}),O};import{Hono as q3}from"hono";import Ux from"node:path";import{Mutex as X3}from"async-mutex";import{Hono as V3}from"hono";import{streamSSE as z3}from"hono/streaming";import{LRUCache as w3}from"lru-cache";import{nanoid as k0}from"nanoid";class nO extends Error{limit;resource="resident_session_projections";retryable=!0;constructor(O){super("Session projection capacity is full");this.limit=O;this.name="SessionProjectionCapacityError"}}class D0 extends Error{reason;constructor(O="Session projection residency is closed"){super(O);this.reason=O;this.name="SessionProjectionResidencyClosedError"}}class x0 extends Error{key;constructor(O,x=`Session projection residency already owns key: ${O}`){super(x);this.key=O;this.name="SessionProjectionResidencyConflictError"}}class i1 extends Error{deadlineAt;constructor(O){super(`Session projection close wait timed out at ${O}`);this.deadlineAt=O;this.name="SessionProjectionResidencyCloseTimeoutError"}}function Z3(O,x){if(O.size!==x.size)return!1;for(let[$,Q]of O)if(!x.has($)||x.get($)!==Q)return!1;return!0}class a1{maxResident;idleMs;toSnapshot;now;residents=new Map;reservations=new Map;closings=new Map;closeStates=new Set;capacityListeners=new Set;nextGeneration=1;closed=!1;closedReason="Session projection residency is closed";invalidationPromise;resolveInvalidation;constructor(O){if(!Yx(O.maxResident))throw Error("Invalid max resident Session projection limit");if(!Nx(O.idleMs))throw Error("Invalid Session projection idle timeout");this.maxResident=O.maxResident,this.idleMs=O.idleMs,this.toSnapshot=O.toSnapshot,this.now=O.now??Date.now}acquire(O){if(this.assertNotClosed(),this.closings.has(O))throw new x0(O);let x=this.residents.get(O);if(!x||x.value===void 0)return;return x.pins++,this.createLease(x)}reserve(O){this.assertNotClosed(),this.assertKeyOpen(O),this.makeCapacityForReservation();let x={key:O,generation:this.allocateGeneration()};return this.reservations.set(O,x),this.createReservation(x)}snapshot(O){let x=this.residents.get(O);if(!x||x.value===void 0)return;return this.projectSnapshot(x.value)}snapshotAll(){let O=[];for(let x of this.residents.values()){if(x.value===void 0)continue;let $=this.projectSnapshot(x.value);if($!==void 0)O.push($)}return O}beginCloseMany(O,x){this.assertNotClosed();let $=[...new Set(O)].sort((q,P)=>q.localeCompare(P));for(let q of $)if(this.closings.has(q))throw new x0(q,`Session projection residency is already closing key: ${q}`);let Q=new Map,Z=new Map,Y=new Map,W=new Set;for(let q of $){let P=this.reservations.get(q);if(P)this.reservations.delete(q);let n=this.residents.get(q);if(n){if(this.residents.delete(q),n.phase="closing",Y.set(q,n),this.closings.set(q,n),Q.set(q,n.generation),W.add(q),n.value!==void 0){let L=this.projectSnapshot(n.value);if(L!==void 0)Z.set(q,L)}continue}let r={key:q,generation:P?.generation??this.allocateGeneration(),value:void 0,pins:0,lastUsedAt:this.now(),phase:"closing"};Y.set(q,r),this.closings.set(q,r),Q.set(q,r.generation)}let U={keys:$,generations:Q,snapshots:Z,entries:Y,originalResidentKeys:W,waiters:new Set,state:"open"};this.closeStates.add(U),this.notifyCapacityAvailableIf(!0);let A=()=>{if(U.state==="committed")throw new D0("Session projection close set is already committed");if(U.state==="rolled_back")throw new D0("Session projection close set is already rolled back")},B=()=>{for(let q of U.entries.values())if(q.pins>0)return!1;return!0},M=()=>{if(!B())return;for(let q of U.waiters){if(q.timer!==void 0)clearTimeout(q.timer);q.removeAbortListener?.(),q.resolve()}U.waiters.clear()},H=({signal:q,deadlineAt:P}={})=>{if(U.state!=="open"||B())return Promise.resolve();if(P!==void 0&&P<=this.now())return Promise.reject(new i1(P));return new Promise((n,r)=>{let L={resolve:()=>n(),reject:r,timer:void 0,removeAbortListener:void 0};if(U.waiters.add(L),P!==void 0){let i=Math.max(0,P-this.now());L.timer=setTimeout(()=>{U.waiters.delete(L),L.removeAbortListener?.(),r(new i1(P))},i)}if(q){let i=()=>{if(U.waiters.delete(L),L.timer!==void 0)clearTimeout(L.timer);q.removeEventListener("abort",i),r(q.reason instanceof Error?q.reason:Error(String(q.reason??"AbortError")))};if(q.addEventListener("abort",i,{once:!0}),L.removeAbortListener=()=>{q.removeEventListener("abort",i)},q.aborted)i()}})},T=()=>{if(U.state==="committed")return;if(A(),!B())throw new x0(U.keys[0]??"","Session projection close set still has active pins");let q=!1;for(let P of U.keys){let n=U.entries.get(P);if(!n)continue;if(this.closings.get(P)===n){if(this.closings.delete(P),n.value!==void 0)q=!0}}U.state="committed",this.closeStates.delete(U),M(),this.notifyCapacityAvailableIf(q)},k=(q)=>{if(this.closed)throw new D0(this.closedReason);if(U.state==="committed")throw new D0("Session projection close set is already committed");if(U.state==="rolled_back"){if(!U.rollbackReplacements)return;if(!Z3(U.rollbackReplacements,q))throw new x0(U.keys[0]??"","Session projection close set rollback replacements changed");return}if(!B())throw new x0(U.keys[0]??"","Session projection close set still has active pins");for(let L of U.originalResidentKeys)if(!q.has(L))throw new x0(L,`Session projection close rollback requires replacement for key: ${L}`);let P=!1,n=!1,r=this.now();for(let L of U.keys){let i=U.entries.get(L);if(!i)continue;if(this.closings.get(L)===i)this.closings.delete(L);if(!U.originalResidentKeys.has(L)){P||=i.value!==void 0;continue}let QO=q.get(L);if(QO===void 0){P||=i.value!==void 0;continue}if(i.value=QO,i.phase="resident",i.lastUsedAt=r,this.residents.set(L,i),i.pins===0)n=!0}U.rollbackReplacements=new Map(q),U.state="rolled_back",this.closeStates.delete(U),M(),this.notifyCapacityAvailableIf(P||n)};return{keys:U.keys,generations:U.generations,snapshots:U.snapshots,waitForIdle:H,commit:T,rollback:k}}invalidateAll(O){if(this.closed&&this.invalidationPromise)return this.invalidationPromise;this.closed=!0,this.closedReason=O;for(let x of[...this.reservations.keys()])this.reservations.delete(x);for(let[x,$]of[...this.residents.entries()])this.residents.delete(x),$.phase="closing",this.closings.set(x,$);return this.invalidationPromise=new Promise((x)=>{this.resolveInvalidation=x}),this.maybeFinishInvalidation(),this.invalidationPromise}sweepIdle(){if(this.closed)return 0;let O=this.now(),x=0;while(!0){let $=[...this.residents.values()].filter((Q)=>Q.pins===0).sort((Q,Z)=>Q.lastUsedAt-Z.lastUsedAt||Q.generation-Z.generation).find((Q)=>O-Q.lastUsedAt>=this.idleMs);if(!$)return x;this.residents.delete($.key),x++,this.notifyCapacityAvailableIf(!0)}}onCapacityAvailable(O){return this.capacityListeners.add(O),()=>{this.capacityListeners.delete(O)}}getStats(){let O=0,x=0,$=this.reservations.size,Q=0;for(let Z of this.residents.values())if(O++,Z.pins>0)Q++;for(let Z of this.closings.values())if(x++,Z.pins>0)Q++;return{resident:O,closing:x,reserved:$,pinned:Q,retained:O+$+this.countClosingWithValue(),maxResident:this.maxResident,idleMs:this.idleMs}}getDebugStats(){let O=0,x=0;for(let $ of this.closings.values())if($.value===void 0)O++;for(let $ of this.closeStates)x+=$.waiters.size;return{tombstones:O,waiters:x,listeners:this.capacityListeners.size}}assertNotClosed(){if(this.closed)throw new D0(this.closedReason)}assertKeyOpen(O){if(this.residents.has(O)||this.reservations.has(O)||this.closings.has(O))throw new x0(O)}retainedCount(){return this.residents.size+this.reservations.size+this.countClosingWithValue()}countClosingWithValue(){let O=0;for(let x of this.closings.values())if(x.value!==void 0)O++;return O}allocateGeneration(){let O=this.nextGeneration;return this.nextGeneration=this.nextGeneration===Number.MAX_SAFE_INTEGER?1:this.nextGeneration+1,O}createReservation(O){let x=!1;return{key:O.key,generation:O.generation,commit:($)=>{if(x)throw new x0(O.key);if(this.closed)throw this.reservations.delete(O.key),x=!0,new D0(this.closedReason);if(this.reservations.get(O.key)!==O)throw x=!0,new x0(O.key);this.reservations.delete(O.key);let Q={key:O.key,generation:O.generation,value:$,pins:1,lastUsedAt:this.now(),phase:"resident"};return this.residents.set(O.key,Q),x=!0,this.createLease(Q)},cancel:()=>{if(x)return;if(this.reservations.get(O.key)===O)this.reservations.delete(O.key),this.notifyCapacityAvailableIf(!0);x=!0}}}createLease(O){let x=!1;return{key:O.key,generation:O.generation,get value(){return O.value},isCurrent:()=>{let $=this.residents.get(O.key);if($===O&&$.generation===O.generation)return!0;let Q=this.closings.get(O.key);return Q===O&&Q.generation===O.generation},release:()=>{if(x)return;x=!0;let $=this.residents.get(O.key),Q=this.closings.get(O.key),Z=$===O&&$.generation===O.generation?$:Q===O&&Q.generation===O.generation?Q:void 0;if(!Z)return;Z.pins=Math.max(0,Z.pins-1),Z.lastUsedAt=this.now(),this.notifyCapacityAvailableIf(!0),this.resolveIdleWaitersForEntry(Z),this.maybeFinishInvalidation()}}}makeCapacityForReservation(){while(this.retainedCount()>=this.maxResident){let O=[...this.residents.values()].filter((x)=>x.pins===0).sort((x,$)=>x.lastUsedAt-$.lastUsedAt||x.generation-$.generation)[0];if(!O)throw new nO(this.maxResident);this.residents.delete(O.key)}}projectSnapshot(O){try{return this.toSnapshot(O)}catch{return}}resolveIdleWaitersForEntry(O){if(O.pins>0)return;for(let x of this.closeStates){if(!x.entries.has(O.key))continue;let $=!0;for(let Q of x.entries.values())if(Q.pins>0){$=!1;break}if(!$)continue;for(let Q of x.waiters){if(Q.timer!==void 0)clearTimeout(Q.timer);Q.removeAbortListener?.(),Q.resolve()}x.waiters.clear()}}maybeFinishInvalidation(){if(!this.closed||!this.resolveInvalidation)return;for(let x of this.closings.values())if(x.pins>0)return;this.closings.clear();let O=this.resolveInvalidation;this.resolveInvalidation=void 0,O()}notifyCapacityAvailableIf(O){if(!O)return;for(let x of[...this.capacityListeners])try{x()}catch{}}}class o1{runtimes=new Map;createRuntime;constructor(O={}){this.createRuntime=O.createRuntime??((x)=>new Wx(x.projectPath,`web-browser:${x.sessionId}`,{exposeArtifactPaths:!1}))}get(O){let x=o(O),$=this.runtimes.get(x);if($?.state==="live")return $.runtime;if($)throw new I1("browser_disposed","Browser Session Runtime is closed",{retryable:!0});let Q=this.createRuntime(O);return this.runtimes.set(x,{state:"live",runtime:Q}),Q}async reset(O){let x=this.runtimes.get(o(O));if(x?.state==="live")await x.runtime.page({action:{kind:"reset"}})}dispose(O){let x=o(O),$=this.runtimes.get(x);if(!$)return Promise.resolve();if($.state==="disposing")return $.disposePromise;return this.disposeKey(x,$.runtime)}async disposeAll(){let x=(await Promise.allSettled([...this.runtimes.keys()].map(($)=>{let Q=this.runtimes.get($);if(!Q)return Promise.resolve();if(Q.state==="disposing")return Q.disposePromise;return this.disposeKey($,Q.runtime)}))).find(($)=>$.status==="rejected");if(x)throw x.reason}stats(){let O=0,x=0,$=0;for(let Q of this.runtimes.values()){if(Q.state==="live")O++;if(Q.state==="disposing")x++;if(Q.state==="failed")$++}return{sessions:this.runtimes.size,live:O,disposing:x,failed:$}}disposeKey(O,x){let $=x.dispose().then(()=>{if(this.runtimes.get(O)?.runtime===x)this.runtimes.delete(O)},(Q)=>{if(this.runtimes.get(O)?.runtime===x)this.runtimes.set(O,{state:"failed",runtime:x,error:Q});throw Q});return this.runtimes.set(O,{state:"disposing",runtime:x,disposePromise:$}),$}}import{Hono as Y3}from"hono";var Xx=V.Object({action:zO(["accept","dismiss"])},{additionalProperties:!1}),J3=tO(V.Union([V.Object({kind:V.Literal("click"),dialog:V.Optional(Xx)},{additionalProperties:!1}),V.Object({kind:V.Literal("click_at"),screenshotId:V.String({minLength:1,maxLength:Q1}),x:V.Integer({minimum:0,maximum:n1}),y:V.Integer({minimum:0,maximum:n1}),dialog:V.Optional(Xx)},{additionalProperties:!1}),V.Object({kind:V.Literal("hover")},{additionalProperties:!1}),V.Object({kind:V.Literal("fill"),value:V.String()},{additionalProperties:!1}),V.Object({kind:V.Literal("type"),value:V.String()},{additionalProperties:!1}),V.Object({kind:V.Literal("press"),key:zO(["Enter","Tab","Escape","Backspace","Delete","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Space"])},{additionalProperties:!1}),V.Object({kind:V.Literal("select"),values:V.Array(V.String())},{additionalProperties:!1}),V.Object({kind:V.Literal("check")},{additionalProperties:!1}),V.Object({kind:V.Literal("uncheck")},{additionalProperties:!1}),V.Object({kind:V.Literal("scroll"),direction:zO(["up","down","left","right"]),amount:V.Integer()},{additionalProperties:!1})])),Vx=tO(V.Object({action:V.Optional(zO(["goto","back","forward","reload"])),url:V.Optional(V.String()),pageId:V.Optional(V.String()),expectedOrigin:V.Optional(V.String()),waitUntil:V.Optional(zO(["commit","domcontentloaded","load"])),timeoutMs:V.Optional(V.Integer())},{additionalProperties:!1})),zx=tO(V.Object({pageId:V.String(),snapshotId:V.String(),ref:V.Optional(V.String()),expectedOrigin:V.String(),action:J3,timeoutMs:V.Optional(V.Integer())},{additionalProperties:!1}));function wx(O,x){if(O===void 0)return;let $=Number(O);if(!Number.isSafeInteger($))throw new K(`${x} must be an integer`);return $}function N3(O,x){if(O===void 0)return;if(O==="true")return!0;if(O==="false")return!1;throw new K(`${x} must be true or false`)}function W3(O){let x=O.code==="browser_not_installed"||O.code==="browser_disconnected"||O.code==="browser_disposed"?503:O.code==="browser_capacity"?429:O.code==="browser_unsupported"?400:409;return new WO(O.code.toUpperCase(),O.message,x,O.details)}function Gx(O){let x=new Y3;x.use("*",(Q,Z)=>O.withAdmission(Z)),x.onError((Q,Z)=>{let Y=Q instanceof I1?W3(Q):Q instanceof WO?Q:new JO;return Z.json(Y.toObject(),Y.statusCode)});let $=(Q,Z)=>O.resolveSessionRef(Q,Z);return x.post("/:sessionId/browser/navigate",async(Q)=>{let Z=await Q.req.json().catch(()=>{return}),Y=p(Vx,Z);if(!Y.success)throw new K("Invalid browser navigation request");let W=await $(Q.req.param("sessionId"),Q.req.query("projectPath"));return Q.json(await O.getRuntime(W).navigate(Y.data))}),x.post("/:sessionId/browser/interact",async(Q)=>{let Z=await Q.req.json().catch(()=>{return}),Y=p(zx,Z);if(!Y.success)throw new K("Invalid browser interaction request");let W=await $(Q.req.param("sessionId"),Q.req.query("projectPath"));return Q.json(await O.getRuntime(W).interact(Y.data))}),x.get("/:sessionId/browser/snapshot",async(Q)=>{let Z=await $(Q.req.param("sessionId"),Q.req.query("projectPath")),Y=wx(Q.req.query("depth"),"depth"),W=N3(Q.req.query("includeBoxes"),"includeBoxes");return Q.json(await O.getRuntime(Z).snapshot({...Q.req.query("pageId")?{pageId:Q.req.query("pageId")}:{},...Y===void 0?{}:{depth:Y},...W===void 0?{}:{includeBoxes:W}}))}),x.get("/:sessionId/browser/inspect",async(Q)=>{let Z=await $(Q.req.param("sessionId"),Q.req.query("projectPath")),Y=Q.req.query("target"),W=Q.req.query("pageId"),U=Q.req.query("expectedOrigin");if(Y==="screenshot"){let M=Q.req.query("source")??"user";if(M!=="user"&&M!=="agent")throw new K("Unsupported browser screenshot source");if(M==="agent"&&(!W||!U))throw new K("Agent browser screenshots require pageId and expectedOrigin");let H={...W?{pageId:W}:{},...U?{expectedOrigin:U}:{}},T=M==="agent"?await O.captureAgentScreenshot(Z,H):await O.getRuntime(Z).screenshot(H);return new Response(new Uint8Array(T),{headers:{"Content-Type":"image/png","Content-Length":String(T.length),"Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}let A=wx(Q.req.query("limit"),"limit"),B={...W?{pageId:W}:{},...U?{expectedOrigin:U}:{}};if(Y==="find"){let M=Q.req.query("text");if(!M)throw new K("text is required for browser find");return Q.json(await O.getRuntime(Z).inspect({...B,target:{kind:"find",text:M,...A===void 0?{}:{limit:A}}}))}if(Y!=="console"&&Y!=="page-errors"&&Y!=="network")throw new K("Unsupported browser inspection target");return Q.json(await O.getRuntime(Z).inspect({...B,target:{kind:Y,...A===void 0?{}:{limit:A}}}))}),x.post("/:sessionId/browser/reset",async(Q)=>{let Z=await $(Q.req.param("sessionId"),Q.req.query("projectPath"));return await O.resetRuntime(Z),Q.json({success:!0})}),x}var d=ZO("Service"),q1="web-pending-resume-recovery-budget-exhausted";class J1 extends Error{evidence;constructor(O){super(O.taskFailure.message);this.evidence=O;this.name="WebAgentRunFailure"}}var G3=V.Object({title:V.Optional(V.String()),projectPath:V.Optional(V.String())}),U3=tx,B3=V.Object({title:V.Optional(V.String()),projectPath:V.Optional(V.String())}),_3=V.Object({projectPath:V.String()}),K3=V.Object({objective:V.String({minLength:1}),tokenBudget:V.Optional(V.Integer({minimum:1})),permissionMode:V.Optional(zO(["default","autoEdit","plan","yolo"]))}),F3=V.Union([V.Object({action:V.Literal("pause")}),V.Object({action:V.Literal("resume")}),V.Object({action:V.Literal("edit"),objective:V.String({minLength:1})})]),Q0,W1,rO=new Map,J0=new Map,sO=new Map,E1=new w3({max:100,ttl:1800000});function L3(O){let x=structuredClone({...O,createdAt:O.createdAt.toISOString(),updatedAt:O.updatedAt.toISOString()});return{...x,createdAt:new Date(x.createdAt),updatedAt:new Date(x.updatedAt)}}function Bx(O){return{sessionId:O.sessionId,projectPath:O.projectPath}}function TO(O){if(!O)return;return rO.get(O)??E1.get(O)}function D3(O){if(rO.get(O.id)!==O)return;rO.delete(O.id),E1.set(O.id,O)}function H3(O){rO.delete(O),E1.delete(O)}function AO(O){return O?.status==="queued"||O?.status==="running"||O?.status==="waiting_permission"}function X1(O,x="user-cancel"){if(O.status==="cancelled"||O.status==="completed"||O.status==="failed"||O.status==="attention_required")return!1;let $=O.pendingPermission;if(O.pendingPermission=void 0,$?.resolve({approved:!1,reason:N4}),$)E.publish(Bx(O),"interaction.resolved",{requestId:$.permissionId});return O.abortController.abort(x),O.status="cancelled",E.publish(Bx(O),"run.cancelled",{runId:O.id}),!0}function Z$(O,x=!1){let{permissionId:$,details:Q}=O;if(Q.type==="askUserQuestion"&&Q.questions)return{type:"question.required",properties:{requestId:$,toolCallId:Q.toolCallId??$,questions:Q.questions,details:Q,...x?{replayed:!0}:{}}};if(Q.type==="mcpElicitation"&&Q.mcpElicitation)return{type:"elicitation.required",properties:{requestId:$,toolCallId:Q.toolCallId??$,elicitation:Q.mcpElicitation,...x?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:$,toolName:Q.toolName,description:Q.message,args:Q.args,details:Q,...x?{replayed:!0}:{}}}}function b3(O){return{...typeof O.seq==="number"?{id:String(O.seq)}:{},data:JSON.stringify({type:O.type,...typeof O.seq==="number"?{seq:O.seq}:{},properties:{...O.properties,sessionId:O.sessionId,projectPath:O.projectPath}})}}function j3(){let O=Q0;if(O)O.accepting=!1,O.invalidateAll("route-reset");Q0=void 0;for(let x of rO.values())X1(x,"route-reset");rO.clear();for(let x of J0.values())x.controller.abort("route-reset");J0.clear(),E1.clear(),W1?.(),W1=void 0}function M3(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let x=O,$=x.code,Q=x.reason,Z=x.scope,Y=x.kind,W=x.limit;if($!=="tool_busy"&&$!=="tool_batch_full"||Q!=="queue_full"&&Q!=="wait_timeout"&&Q!=="turn_limit"||Z!=="global"&&Z!=="session"||typeof x.retryable!=="boolean"||!Number.isSafeInteger(W)||W<=0||Y!==void 0&&Y!=="readonly"&&Y!=="write"&&Y!=="execute")return;return{code:$,reason:Q,scope:Z,retryable:x.retryable,...Y===void 0?{}:{kind:Y},limit:W}}var V1=(O,x)=>{if(!x||typeof x!=="object")return x;let $={...x},Q=M3($.tool_admission);if(Q)$.tool_admission=Q;else delete $.tool_admission;if(gx(O)){let W=$.browser&&typeof $.browser==="object"&&!Array.isArray($.browser)?$.browser:{},U={},A=(B,M,H)=>{let T=W[B];if(typeof T==="string"&&Buffer.byteLength(T)<=M&&(!H||H.test(T)))U[B]=T};if(A("action",64),A("status",16,/^(?:ok|warning|error)$/),A("pageId",Q1,/^browser_page_[a-f0-9-]+$/),A("snapshotId",Q1,/^browser_snapshot_[a-f0-9-]+$/),A("origin",e1),A("candidateOrigin",e1),A("url",Sx),A("title",fx),A("errorCode",64,/^browser_[a-z_]+$/),typeof W.truncated==="boolean")U.truncated=W.truncated;if(typeof W.actionApplied==="boolean"||W.actionApplied==="unknown")U.actionApplied=W.actionApplied;if(typeof W.sideEffectsUncertain==="boolean")U.sideEffectsUncertain=W.sideEffectsUncertain;if(typeof W.diagnosticCount==="number"&&Number.isSafeInteger(W.diagnosticCount)&&W.diagnosticCount>=0&&W.diagnosticCount<=Rx)U.diagnosticCount=W.diagnosticCount;if(W.interaction&&typeof W.interaction==="object"&&!Array.isArray(W.interaction)){let B=W.interaction,M=new Set(["click","hover","fill","type","press","select","check","uncheck","scroll"]);if(typeof B.action==="string"&&M.has(B.action)){let H={action:B.action};if(typeof B.ref==="string"&&Buffer.byteLength(B.ref)<=Cx&&/^[a-z][a-z0-9]*$/.test(B.ref))H.ref=B.ref;let T=(k,q,P)=>typeof k==="number"&&Number.isFinite(k)&&k>=q&&k<=P;if(B.viewport&&typeof B.viewport==="object"&&!Array.isArray(B.viewport)){let k=B.viewport;if(T(k.width,1,16384)&&T(k.height,1,16384))H.viewport={width:k.width,height:k.height}}if(B.targetBox&&typeof B.targetBox==="object"&&!Array.isArray(B.targetBox)){let k=B.targetBox;if(T(k.x,-16384,32768)&&T(k.y,-16384,32768)&&T(k.width,0,16384)&&T(k.height,0,16384))H.targetBox={x:k.x,y:k.y,width:k.width,height:k.height}}U.interaction=H}}if(W.artifact&&typeof W.artifact==="object"&&!Array.isArray(W.artifact)){let B=W.artifact;if(typeof B.id==="string"&&/^[a-f0-9]{64}$/.test(B.id)&&B.sha256===B.id&&B.kind==="image"&&B.mimeType==="image/png"&&typeof B.size==="number"&&Number.isSafeInteger(B.size)&&B.size>=0&&B.size<=Ex&&B.persisted===!0)U.artifact={id:B.id,sha256:B.sha256,kind:B.kind,mimeType:B.mimeType,size:B.size,persisted:!0,...typeof B.path==="string"&&Buffer.byteLength(B.path)<=8192?{path:B.path}:{}}}return{...typeof $.summary==="string"?{summary:$.summary.slice(0,512)}:{},browser:U,...Q?{tool_admission:Q}:{}}}if(O==="Bash"){let W={},U=["message","signal","status","summary"],A=["aborted","acp_mode","admission_failed","auto_backgrounded","background","capture_truncated","finalization_failed","has_stderr","output_accounting_complete","output_truncated","projection_truncated","sandbox_required","sandboxed","stderr_projection_truncated","stdout_projection_truncated","terminal_output_merged","timeout"],B=["execution_time","foreground_budget_ms","pid","raw_output_bytes","stderr_length","stderr_omitted_bytes","stderr_retained_bytes","stderr_total_bytes","stdout_length","stdout_omitted_bytes","stdout_retained_bytes","stdout_total_bytes"];for(let H of U){let T=$[H];if(typeof T==="string")W[H]=T.slice(0,8192)}for(let H of A){let T=$[H];if(typeof T==="boolean")W[H]=T}for(let H of B){let T=$[H];if(typeof T==="number"&&Number.isSafeInteger(T)&&T>=0)W[H]=T}if($.exit_code===null||typeof $.exit_code==="number"&&Number.isSafeInteger($.exit_code))W.exit_code=$.exit_code;if($.terminal_transport==="local"||$.terminal_transport==="acp"||$.terminal_transport==="local_fallback")W.terminal_transport=$.terminal_transport;if($.background_reason==="explicit"||$.background_reason==="foreground_budget")W.background_reason=$.background_reason;for(let H of["bash_id","shell_id"]){let T=$[H];if(typeof T==="string"&&T.length<=128&&/^bash_[A-Za-z0-9-]+$/.test(T))W[H]=T}if(Q)W.tool_admission=Q;let M=$.background_shell_admission;if(M&&typeof M==="object"&&!Array.isArray(M)){let H=M;if(H.code==="background_shell_busy"&&(H.scope==="session"||H.scope==="global")&&H.retryable===!0&&Number.isSafeInteger(H.limit)&&H.limit>0)W.background_shell_admission={code:H.code,scope:H.scope,retryable:H.retryable,limit:H.limit}}return W}let Z=200000,Y=(W,U)=>typeof W==="number"&&Number.isSafeInteger(W)&&W>=0&&W<=U?W:0;if(typeof $.oldContent==="string"&&$.oldContent.length>Z)delete $.oldContent;if(typeof $.newContent==="string"&&$.newContent.length>Z)delete $.newContent;if($.mcpResult&&typeof $.mcpResult==="object"&&!Array.isArray($.mcpResult)){let W=$.mcpResult,U=Array.isArray(W.artifacts)?W.artifacts.slice(0,64).flatMap((A)=>{if(!A||typeof A!=="object"||Array.isArray(A))return[];let B=A,M=new Set(["text","image","audio","resource"]);if(typeof B.id!=="string"||!/^[a-f0-9]{64}$/.test(B.id)||typeof B.sha256!=="string"||B.sha256!==B.id||typeof B.kind!=="string"||!M.has(B.kind)||Y(B.size,67108864)!==B.size||typeof B.persisted!=="boolean")return[];return[{id:B.id.slice(0,128),sha256:B.sha256.slice(0,128),kind:B.kind,size:B.size,persisted:B.persisted,...typeof B.mimeType==="string"?{mimeType:B.mimeType.slice(0,256)}:{},...typeof B.sourceUri==="string"?{sourceUri:B.sourceUri.slice(0,8192)}:{},...typeof B.path==="string"?{path:B.path.slice(0,8192)}:{}}]}):[];$.mcpResult={isError:W.isError===!0,contentCount:Y(W.contentCount,64),textBytes:Y(W.textBytes,4194304),structuredBytes:Y(W.structuredBytes,4194304),artifactCount:Y(W.artifactCount,64),truncated:W.truncated===!0,binaryOmitted:W.binaryOmitted===!0,artifacts:U}}else delete $.mcpResult;return $};function A3(O){let x=typeof O.seq==="number"?{seq:O.seq}:{};if(O.type==="part_created"&&O.data.partType==="tool_call"){let $=O.data.payload;return{type:"tool.start",...x,properties:{messageId:O.data.messageId,toolCallId:$.toolCallId??O.data.partId,toolName:$.toolName??"unknown",arguments:JSON.stringify($.input??{})}}}if(O.type==="part_created"&&O.data.partType==="tool_result"){let $=O.data.payload,Q=$.toolName??"unknown",Z=W4($),Y=w1(G1(Q,Z),z1);return{type:"tool.result",...x,properties:{messageId:O.data.messageId,toolCallId:$.toolCallId??O.data.partId,toolName:Q,success:Z.success,status:Z.success?"completed":"failed",summary:Z.metadata?.summary,output:U1(Y),metadata:V1(Q,Z.metadata)}}}return{type:`committed.${O.type}`,...x,properties:{event:O}}}function T3(O,x,$){switch($.kind){case"tool_start":if("function"in $.toolCall)E.publish(O,"subagent.update",{subagentSessionId:x,toolName:$.toolCall.function.name}),E.publish(O,"subagent.tool.start",{subagentSessionId:x,toolCallId:$.toolCall.id,toolName:$.toolCall.function.name,arguments:$.toolCall.function.arguments,toolKind:$.toolKind});break;case"tool_result":if("function"in $.toolCall)E.publish(O,"subagent.tool.result",{subagentSessionId:x,toolCallId:$.toolCall.id,toolName:$.toolCall.function.name,success:$.result.success,summary:$.result.metadata?.summary,output:U1(w1(G1($.toolCall.function.name,$.result),z1)),metadata:V1($.toolCall.function.name,$.result.metadata)});break;case"tool_progress":if("function"in $.toolCall)E.publish(O,"subagent.tool.progress",{subagentSessionId:x,toolCallId:$.toolCall.id,toolName:$.toolCall.function.name,...$.update});break;case"content_delta":E.publish(O,"subagent.delta",{subagentSessionId:x,delta:$.delta});break;case"thinking_delta":E.publish(O,"subagent.thinking.delta",{subagentSessionId:x,delta:$.delta});break;case"stream_end":E.publish(O,"subagent.stream.end",{subagentSessionId:x});break;case"provider_admission":E.publish(O,"subagent.provider.admission",{subagentSessionId:x,phase:$.phase,requestClass:$.requestClass,resource:$.resource,scope:$.scope,reason:$.reason,queuePosition:$.queuePosition,queueDepth:$.queueDepth,inFlight:$.inFlight,limit:$.limit,waitMs:$.waitMs,maxWaitMs:$.maxWaitMs,recoveryRemainingMs:$.recoveryRemainingMs});break;case"provider_circuit":E.publish(O,"subagent.provider.circuit",{subagentSessionId:x,phase:$.phase,reason:$.reason,statusCode:$.statusCode,retryAfterMs:$.retryAfterMs,nextProbeAt:$.nextProbeAt,openDurationMs:$.openDurationMs,sampleCount:$.sampleCount,failureCount:$.failureCount,recoveryRemainingMs:$.recoveryRemainingMs});break;case"provider_retry":E.publish(O,"subagent.provider.retry",{subagentSessionId:x,phase:$.phase,attempt:$.attempt,maxRetries:$.maxRetries,reason:$.reason,statusCode:$.statusCode,delayMs:$.delayMs,nextRetryAt:$.nextRetryAt,mode:$.mode,recoveryBudgetMs:$.recoveryBudgetMs,recoveryElapsedMs:$.recoveryElapsedMs,recoveryRemainingMs:$.recoveryRemainingMs,exhaustedBy:$.exhaustedBy});break;case"provider_stall":E.publish(O,"subagent.provider.stall",{subagentSessionId:x,phase:$.phase,stallCount:$.stallCount,durationMs:$.durationMs,warningAfterMs:$.warningAfterMs,timeoutMs:$.timeoutMs,outputStarted:$.outputStarted});break;case"action_stationarity":E.publish(O,"subagent.action.stationarity",{subagentSessionId:x,phase:$.phase,toolName:$.toolName,runLength:$.runLength,nudgeThreshold:$.nudgeThreshold,haltThreshold:$.haltThreshold,progressAware:$.progressAware});break;case"mcp_catalog_changed":E.publish(O,"subagent.mcp.catalog.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,added:$.added,removed:$.removed,updated:$.updated});break;case"mcp_content_changed":E.publish(O,"subagent.mcp.content.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,contentKind:$.contentKind,added:$.added,removed:$.removed,updated:$.updated});break;case"mcp_resource_updated":E.publish(O,"subagent.mcp.resource.updated",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,uri:$.uri});break;case"mcp_connection_changed":E.publish(O,"subagent.mcp.connection.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,phase:$.phase,reason:$.reason,attempt:$.attempt,maxAttempts:$.maxAttempts,nextRetryAt:$.nextRetryAt,error:$.error});break;case"mcp_log":E.publish(O,"subagent.mcp.log",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,level:$.level,logger:$.logger,message:$.message,projectedBytes:$.projectedBytes,dataSha256:$.dataSha256,truncated:$.truncated,detailsOmitted:$.detailsOmitted,timestamp:$.timestamp,synthetic:$.synthetic});break;case"mcp_instructions_changed":E.publish(O,"subagent.mcp.instructions.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,action:$.action,reason:$.reason,text:$.text,sourceBytes:$.sourceBytes,projectedBytes:$.projectedBytes,sha256:$.sha256,truncated:$.truncated,detailsOmitted:$.detailsOmitted});break;case"mcp_task_changed":E.publish(O,"subagent.mcp.task.changed",{subagentSessionId:x,revision:$.revision,taskId:$.taskId,serverName:$.serverName,toolName:$.toolName,status:$.status,statusMessage:$.statusMessage,createdAt:$.createdAt,updatedAt:$.updatedAt,completedAt:$.completedAt,hasResult:$.hasResult,error:$.error});break;case"project_rules_loaded":E.publish(O,"subagent.project.rules.loaded",{subagentSessionId:x,files:$.files,triggerPaths:$.triggerPaths,blockedWrite:$.blockedWrite});break;default:break}}function M0(O,x="projectPath"){if(!Ux.isAbsolute(O))throw new K(`${x} must be absolute`);return Ux.resolve(O)}function Y1(O){try{j1(O)}catch(x){throw new K(x instanceof Error?x.message:`Invalid session ID: ${O}`)}}function XO(O){return{sessionId:O.id,projectPath:O.projectPath}}function Z1(O,x){return{id:O.sessionId,projectPath:O.projectPath,title:O.title??`Session ${O.sessionId.slice(0,6)}`,createdAt:new Date(O.firstMessageTime),updatedAt:new Date(O.lastMessageTime),rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,taskStatus:O.taskStatus,taskStatusReason:O.taskStatusReason,taskFailure:O.taskFailure,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskPriority:O.taskPriority,taskKind:O.taskKind,taskDueAt:O.taskDueAt,taskModelId:O.taskModelId,selectedModelId:O.selectedModelId,permissionMode:O.permissionMode,reasoningEffort:O.reasoningEffort,serviceTier:O.serviceTier,responseVerbosity:O.responseVerbosity,communicationStyle:O.communicationStyle,communicationStyleDigest:O.communicationStyleDigest,projectInstructionsDigest:O.projectInstructionsDigest,pendingInteraction:O.pendingInteraction,taskRetryAvailable:O.taskRetryAvailable,taskRetriedFrom:O.taskRetriedFrom,taskDelivery:O.taskDelivery,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:O.taskQueuePosition,taskQueueDepth:O.taskQueueDepth,taskConcurrencyLimit:O.taskConcurrencyLimit,archivedAt:O.archivedAt,archivedBySessionId:O.archivedBySessionId,taskWorktree:x,messageCount:O.messageCount}}function t1(O){return O.flatMap((x)=>{if(!kx(x)||x.role==="system"||x.role==="tool"&&x.name===m0)return[];let $=x.tool_calls?.filter((W)=>!("function"in W)||W.function.name!==m0),Q=typeof x.content==="string"?x.content.trim():"";if(x.role==="assistant"&&x.tool_calls?.length&&!$?.length&&!Q&&!x.reasoningContent&&!x.metadata)return[];let Z={...x,...x.tool_calls?{tool_calls:$&&$.length>0?$:void 0}:{}};if(x.role==="tool"){let W=x.metadata&&typeof x.metadata==="object"&&!Array.isArray(x.metadata)?x.metadata:void 0,U=x.name??(typeof W?.toolName==="string"?W.toolName:"unknown");if(W!==void 0&&(Object.hasOwn(W,"output")||Object.hasOwn(W,"error"))){let B=W4(W),M=w1(G1(U,B),z1);return[{...Z,name:U,content:U1(M),metadata:V1(U,{...B.metadata,status:B.success?"completed":"failed"})}]}return[{...Z,name:U,metadata:V1(U,W)}]}let Y=hx(x.metadata);return[Y?{...Z,content:mx(Y)}:Z]})}function Z0(O,x){O.title=x.title??O.title,O.taskStatus=x.taskStatus,O.taskStatusReason=x.taskStatusReason,O.taskFailure=x.taskFailure,O.taskStartedAt=x.taskStartedAt,O.taskCompletedAt=x.taskCompletedAt,O.taskPromptSummary=x.taskPromptSummary,O.taskPriority=x.taskPriority,O.taskKind=x.taskKind,O.taskDueAt=x.taskDueAt,O.taskModelId=x.taskModelId,O.selectedModelId=x.selectedModelId,O.permissionMode=x.permissionMode,O.reasoningEffort=x.reasoningEffort,O.serviceTier=x.serviceTier,O.responseVerbosity=x.responseVerbosity,O.communicationStyle=x.communicationStyle,O.communicationStyleDigest=x.communicationStyleDigest,O.projectInstructionsDigest=x.projectInstructionsDigest,O.pendingInteraction=x.pendingInteraction,O.taskRetryAvailable=x.taskRetryAvailable,O.taskRetriedFrom=x.taskRetriedFrom,O.taskDelivery=x.taskDelivery,O.taskIsolation=x.taskIsolation,O.taskSourceProjectPath=x.taskSourceProjectPath,O.taskWorktreePath=x.taskWorktreePath,O.taskWorktreeBranch=x.taskWorktreeBranch,O.taskBaseCommit=x.taskBaseCommit,O.taskDiffStat=x.taskDiffStat,O.taskQueuePosition=x.taskQueuePosition,O.taskQueueDepth=x.taskQueueDepth,O.taskConcurrencyLimit=x.taskConcurrencyLimit,O.archivedAt=x.archivedAt,O.archivedBySessionId=x.archivedBySessionId,O.messageCount=x.messageCount,O.updatedAt=new Date(x.lastMessageTime)}async function Y0(O){let x=await y.findSessionMetadata(O.id,O.projectPath);if(x)Z0(O,x)}function H0(O){let x=TO(O.currentRunId),$=x?.status==="waiting_permission"?"running":x?.status==="attention_required"?"interrupted":x?.status??O.taskStatus;return{sessionId:O.id,projectPath:O.projectPath,title:O.title,rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,status:void 0,taskStatus:$,taskStatusReason:O.taskStatusReason,taskFailure:O.taskFailure,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskPriority:O.taskPriority,taskKind:O.taskKind,taskDueAt:O.taskDueAt,taskModelId:O.taskModelId,selectedModelId:O.selectedModelId,permissionMode:O.permissionMode,reasoningEffort:O.reasoningEffort,serviceTier:O.serviceTier,responseVerbosity:O.responseVerbosity,communicationStyle:O.communicationStyle,communicationStyleDigest:O.communicationStyleDigest,projectInstructionsDigest:O.projectInstructionsDigest,taskRetryAvailable:O.taskRetryAvailable,taskRetriedFrom:O.taskRetriedFrom,taskDelivery:O.taskDelivery,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:$==="queued"?O.taskQueuePosition:void 0,taskQueueDepth:$==="queued"?O.taskQueueDepth:void 0,taskConcurrencyLimit:O.taskConcurrencyLimit,archivedAt:O.archivedAt,archivedBySessionId:O.archivedBySessionId,pendingInteraction:x?.pendingPermission?{type:x.pendingPermission.details.type==="askUserQuestion"?"question":x.pendingPermission.details.type==="mcpElicitation"?"elicitation":"permission",requestId:x.pendingPermission.permissionId}:O.pendingInteraction,agentType:void 0,model:void 0,messageCount:O.messageCount,firstMessageTime:O.createdAt.toISOString(),lastMessageTime:O.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function IO(O,x){let $=Q0;if($?.accepting)return $.resolveSessionRef(O,x);if(Y1(O),x!==void 0){let Z=CO({sessionId:O,projectPath:M0(x)}),Y=await y.findSessionMetadata(Z.sessionId,Z.projectPath);if(!Y)throw new v("Session",O);return CO({sessionId:Y.sessionId,projectPath:Y.projectPath})}let Q=new Map;for(let Z of await y.listSessions()){if(Z.sessionId!==O)continue;let Y=CO({sessionId:Z.sessionId,projectPath:Z.projectPath});Q.set(o(Y),Y)}if(Q.size===0)try{let Z=await y.findSessionMetadata(O);if(!Z)throw new v("Session",O);return CO({sessionId:Z.sessionId,projectPath:Z.projectPath})}catch(Z){if(Z instanceof v)throw Z;if(Z instanceof Error&&Z.message.startsWith("Ambiguous session ID:"))throw new SO;throw Z}if(Q.size>1)throw new SO;return Q.values().next().value}function Y4(O){if(typeof O==="string")return O;return O.filter((x)=>x.type==="text").map((x)=>x.text).join(`
|
|
7
|
-
`)}function _x(O,x){let $=(x??[]).filter((Z)=>Z.type==="image"&&typeof Z.content==="string").map((Z)=>({type:"image_url",image_url:{url:Z.content}}));if($.length===0)return O;let Q=[];if(O.trim())Q.push({type:"text",text:O});return Q.push(...$),Q}function Kx(O,x){return x&&O instanceof eO&&(O.kind==="closed"||O.kind==="aborted")}var J$=()=>{j3();let O=new V3;O.onError((J,z)=>{if(J instanceof P0){let N=new dO("Session runtime capacity is full",{resource:J.resource,limit:J.limit});return z.json(N.toObject(),429)}if(J instanceof nO){let N=new dO("Session projection capacity is full",{resource:J.resource,limit:J.limit,retryable:J.retryable});return z.json(N.toObject(),429)}if(J instanceof WO)return z.json(J.toObject(),J.statusCode);return d.error("[SessionRoutes] Unhandled route error:",J),z.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let x=new Map,$=new o1,Q=new Map,Z=new Map,Y=new Map,W=new Set,U=new s1,A=new s1,B=new X3,M=FO(),H=new O$({maxResident:M?.maxResidentSessionRuntimes??Mx,idleMs:M?.sessionRuntimeIdleMs??Ax}),T=new a1({maxResident:M?.maxResidentSessionProjections??Dx,idleMs:M?.sessionProjectionIdleMs??Hx,toSnapshot:L3}),k=new r0,q=new r0,P=setInterval(()=>{H.sweepIdle().catch((J)=>{d.warn("[SessionRoutes] Session Runtime idle sweep failed:",J)})},Tx);P.unref?.();let n=setInterval(()=>{try{T.sweepIdle()}catch(J){d.warn("[SessionRoutes] Session projection idle sweep failed:",J)}},bx);n.unref?.();let r,L=new Map,i=1,QO,S=(J)=>{let z=J.projectionLease;J.projectionLease=void 0,z?.release()},HO=()=>{for(let J of L.values()){if(J.timer)clearTimeout(J.timer);S(J)}L.clear()};W1=HO;let c=async(J)=>{let z;try{z=k.enter()}catch{throw new KO}try{return await J()}finally{z.release()}};O.use("*",async(J,z)=>{if(J.req.method==="GET"||J.req.method==="HEAD")return z();return c(z)});let xO=(J,z)=>U.runExclusive(o(J),z),e=(J,z)=>{let N=o(J),X=L.get(N);if(!X||z!==void 0&&X.generation!==z)return;if(X.timer)clearTimeout(X.timer);S(X),L.delete(N)},OO=(J,z)=>{let N=L.get(o(XO(J)));return N?.generation===z.generation&&N.attempt===z.attempt&&N.inFlight&&!N.terminal},bO=(J,z)=>{let N=o(XO(J)),X=L.get(N);if(X){if(z?.release(),X.inFlight||X.timer||X.terminal)return}else{if(!z)throw new KO;X={attempt:0,generation:i++,inFlight:!1,projectedInputIds:new Set,projectionLease:z,startedAt:Date.now(),terminal:!1,timer:void 0},L.set(N,X)}return X.inFlight=!0,X.attempt++,{attempt:X.attempt,deadlineAt:X.startedAt+$$,generation:X.generation,projectedInputIds:X.projectedInputIds}},t=(J,z,N,X,w)=>{E.publish(J,"pending.resume",{phase:z,kind:"pending_input",attempt:N,maxAttempts:x$,...w===void 0?{}:{delayMs:w,nextRetryAt:Date.now()+w},...X?{failure:{code:X.code,retryable:X.retryable,...X.resource?{resource:X.resource}:{}}}:{}})},EO=(J,z,N,X,w,F)=>{let _=XO(J),b=o(_),j=L.get(b);if(!j||j.generation!==z.generation)return!1;if(F)return j.inFlight=!1,j.terminal=!0,S(j),t(_,"exhausted",z.attempt,N.taskFailure),!1;let D=Q$({sessionIdentity:b,failedAttempt:z.attempt,recoveryStartedAt:j.startedAt,workStillPending:X,evidence:N});if(D.phase!=="retry_scheduled")return j.inFlight=!1,j.terminal=!0,S(j),t(_,D.phase,z.attempt,N.taskFailure),!1;if(!j.projectionLease)return!1;let R=setTimeout(()=>{(async()=>{if(await w.completion,L.get(b)!==j||j.timer!==R)return;await xO(_,async()=>{if(L.get(b)!==j||j.timer!==R)return;j.timer=void 0,j.inFlight=!1;let I=bO(J);if(!I)return;try{await QO(J,I)}catch(f){if(L.get(b)!==j)return;let h=A0(f);j.inFlight=!1,j.terminal=!0;try{let wO=new Date().toISOString(),NO;try{NO=await y.updateSessionMetadata(J.id,J.projectPath,{taskStatus:"failed",taskStatusReason:h.message,taskFailure:h,taskCompletedAt:wO,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null})}catch{d.error(`[SessionRoutes] Failed to persist terminal pending input state for ${J.id}`)}if(L.get(b)!==j||!j.terminal)return;if(J.taskStatus="failed",J.taskStatusReason=h.message,J.taskFailure=h,J.taskCompletedAt=wO,NO)Z0(J,NO);t(_,"failed",I.attempt,h),E.publish(_,"session.error",{error:h.message,taskFailure:h}),E.publish(_,"session.status",{status:"error"})}finally{S(j)}}})})().catch((I)=>{d.error(`[SessionRoutes] Failed to retry pending input for ${J.id}:`,I)})},D.delayMs);return R.unref?.(),j.timer=R,j.inFlight=!1,t(_,"retry_scheduled",z.attempt+1,N.taskFailure,D.delayMs),!0},U0=(J,z)=>{let N=XO(J),X=L.get(o(N));if(!X||X.generation!==z.generation)return!1;if(z.attempt>1)t(N,"recovered",z.attempt);return e(N,z.generation),!0},RO=(J,z)=>A.runExclusive(o(J),z),G=(J)=>[...rO.values()].some((z)=>z.sessionId===J.sessionId&&z.projectPath===J.projectPath&&AO(z)),YO=async(J,z,N)=>{let X=Z.get(z);if(!X)X=(async()=>{if(x.get(z)===N)x.delete(z);for(let[F,_]of x)if(_===N)x.delete(F);let w=XO(J);if(vO(w)?.id===J.id&&!G(w)&&!J0.has(z)&&!sO.has(z))await h1(w,"route-reset").catch(()=>{return});if(await N.dispose(),x.size===0)await fO.getInstance().disconnectAll()})().finally(()=>{if(Z.get(z)===X)Z.delete(z)}),Z.set(z,X);await X},iO=async(J,z={})=>{let N=XO(J),X=o(N);await Z.get(X);let w=H.acquire(X);if(w){if(x.get(X)!==w.value)throw w.release(),Error("Session Runtime residency identity is inconsistent");return w}if(H.owns(X))throw new P0(H.getStats().maxResident);let F=Q.get(X);if(!F){let _=z.communicationStyle??J.communicationStyle;F=(async()=>{let b=await H.reserve(X,{surface:"web",allowEviction:!0}),j;try{j=await b0.create({sessionId:J.id,workspaceRoot:J.projectPath,permissionMode:z.permissionMode??J.permissionMode??"default",...J.reasoningEffort?{reasoningEffort:J.reasoningEffort}:{},...J.serviceTier?{serviceTier:J.serviceTier}:{},...J.responseVerbosity?{responseVerbosity:J.responseVerbosity}:{},..._?{communicationStyle:_}:{},..._===J.communicationStyle&&J.communicationStyleDigest?{communicationStyleDigest:J.communicationStyleDigest}:{},...J.projectInstructionsDigest?{projectInstructionsDigest:J.projectInstructionsDigest}:{},...J.taskWorktree?{taskWorktree:J.taskWorktree}:{},...J.taskIsolation?{taskIsolation:J.taskIsolation}:{},...J.messageCount>0?{sessionStart:{isResume:!0,resumeSessionId:J.id}}:{}});let D=j.getCurrentModelId();if(D&&(J.selectedModelId||J.taskModelId)&&D!==J.selectedModelId){let f=await y.updateSessionMetadata(J.id,J.projectPath,{selectedModelId:D}).catch((h)=>{d.warn(`[SessionRoutes] Failed to migrate restored model for ${J.id}:`,h);return});if(f)J.selectedModelId=f.selectedModelId,J.updatedAt=new Date(f.lastMessageTime)}let R=j,I=b.commit({key:X,surface:"web",value:R,canEvict:()=>!G(N)&&!J0.has(X)&&!sO.has(X)&&!Q.has(X)&&!Z.has(X)&&R.isIdleForResidency(),dispose:()=>YO(J,X,R)});return j=void 0,x.set(X,R),{runtime:R,claimLease:()=>{if(I){let h=I;return I=void 0,h}let f=H.acquire(X);if(!f||f.value!==R)throw Error("Initialized Session Runtime lost residency");return f}}}catch(D){if(b.cancel(),j)await j.dispose().catch((R)=>{d.warn(`[SessionRoutes] Failed to dispose uncommitted Runtime for ${J.id}:`,R)});if(D instanceof vx)throw new H1(D.reason);throw D}})(),Q.set(X,F)}try{return(await F).claimLease()}finally{if(Q.get(X)===F)Q.delete(X)}},pO=async(J,z,N={})=>{let X=await iO(J,N);try{return await z(X.value)}finally{X.release()}},B0=async(J,z)=>{let N=o(XO(J)),X=Q.get(N);if(X)await X.catch(()=>{return});Q.delete(N);let w=z??x.get(N);if(!w)return;if(!await H.remove(N,w))throw Error(`Session Runtime is pinned and cannot be disposed: ${N}`)},K1=(J,z)=>{if(z==="delete")throw new v("Session",J.sessionId);if(z==="archive")throw new g("Session is archived");throw new KO},_0=(J,z,N)=>{if(N.invalidatedBy)K1(J,N.invalidatedBy);if(Y.get(z)!==N)throw new KO},S0=(J,z)=>{let N=o(J),X=Y.get(N);if(!X)return;if(X.invalidatedBy??=z,X.cancelReservation?.(),X.cancelReservation=void 0,Y.get(N)===X)Y.delete(N)},F1=(J)=>{for(let z of W)z.invalidatedBy??=J,z.cancelReservation?.(),z.cancelReservation=void 0;Y.clear()},vO=(J)=>T.snapshot(o(J)),L1=()=>T.snapshotAll(),h1=async(J,z)=>{S0(J,z);let N=o(J);if(!vO(J))return;let X=T.beginCloseMany([N],z);await X.waitForIdle({deadlineAt:Date.now()+jx}),X.commit()},F2=async(J,z)=>{if(z!==void 0)return Y1(J),CO({sessionId:J,projectPath:M0(z)});return y1(J,z)},y1=async(J,z)=>{if(Y1(J),z!==void 0){let X=CO({sessionId:J,projectPath:M0(z)});if(vO(X))return X;let w=await y.findSessionMetadata(X.sessionId,X.projectPath);if(!w)throw new v("Session",J);return CO({sessionId:w.sessionId,projectPath:w.projectPath})}let N=new Map;for(let X of L1()){if(X.id!==J)continue;let w=XO(X);N.set(o(w),w)}for(let X of await y.listSessions()){if(X.sessionId!==J)continue;let w=CO({sessionId:X.sessionId,projectPath:X.projectPath});N.set(o(w),w)}if(N.size===0)try{let X=await y.findSessionMetadata(J);if(!X)throw new v("Session",J);return CO({sessionId:X.sessionId,projectPath:X.projectPath})}catch(X){if(X instanceof v)throw X;if(X instanceof Error&&X.message.startsWith("Ambiguous session ID:"))throw new SO;throw X}if(N.size>1)throw new SO;return N.values().next().value},N0=async(J)=>{let z=Q0;if(!z?.accepting||z.acquireOrHydrateSession!==N0)throw new KO;let N=o(J),X=T.acquire(N);if(X)return X;let w=Y.get(N);if(!w){let _;_={promise:Promise.resolve().then(async()=>{let j=T.acquire(N);if(j){j.release();return}_0(J,N,_);let D=T.reserve(N);_.cancelReservation=()=>D.cancel();try{let R=await y.findSessionMetadata(J.sessionId,J.projectPath);if(_0(J,N,_),!R)throw new v("Session",J.sessionId);let I=await y.findSessionTaskWorktree(J.sessionId,J.projectPath);_0(J,N,_);let f=Z1(R,I);_0(J,N,_);let h=D.commit(f);_.cancelReservation=void 0,h.release()}catch(R){throw _.cancelReservation?.(),_.cancelReservation=void 0,R}})},w=_,Y.set(N,w),W.add(w)}try{await w.promise}finally{if(W.delete(w),Y.get(N)===w)Y.delete(N)}let F=T.acquire(N);if(!F)throw new KO;return F},L2=async(J,z)=>{let N=await N0(J);try{return await z(N.value)}finally{N.release()}},D1=async(J,z)=>{let N=await y1(J,z);try{await y.assertSessionWritable(N.sessionId,N.projectPath)}catch(X){if(X instanceof x4)throw new g(X.message);throw X}return N0(N)},K0=(J)=>{let z=T.acquire(J.key);if(!z||z.generation!==J.generation)throw z?.release(),new KO;return z},A4=async(J)=>{let z=await N0(J);try{return K0(z)}finally{z.release()}},aO=async(J,z,N)=>{let X=await D1(J,z);try{let w=X.value;return await N(w,XO(w),X)}finally{X.release()}},D2=async(J,z)=>{let N=await D1(J.sessionId,J.projectPath);try{return await z(N.value,N)}finally{N.release()}},T4=async(J,z)=>{if(J.permissionMode===z)return;let N=await y.setSessionPermissionMode(J.id,J.projectPath,z);J.permissionMode=N.permissionMode,J.updatedAt=new Date(N.lastMessageTime),E.publish(XO(J),"session.updated",{permissionMode:z})},a0=(J,z,N,X)=>{if(!k.stats().accepting)throw new KO;let w=k0(12),F={id:w,sessionId:J.id,projectPath:J.projectPath,status:"running",abortController:new AbortController,disposeRuntimeOnSettle:J.taskIsolation!==void 0&&X.runtimeLease!==void 0,pendingResume:X.pendingResume,projectionLease:X.projectionLease,createdAt:new Date};if(J.taskIsolation&&X.runtimeLease){let _=X.runtimeLease.value,b=W0.admit({key:`${J.projectPath}\x00${J.id}`,..._.getTaskAdmissionLimits(),pendingBytes:cx({content:z,outputSchema:X.outputSchema,pendingMessages:_.getPendingSteeringMessages()}),signal:F.abortController.signal,onUpdate:(D)=>{F.status=D.state,J.taskStatus=D.state,J.taskQueuePosition=D.queuePosition,J.taskQueueDepth=D.queueDepth,J.taskConcurrencyLimit=D.maxConcurrent,F.taskAdmissionUpdate=(F.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await _.setTaskAdmission(D)}).catch((R)=>{d.warn(`[SessionRoutes] Failed to persist admission for ${J.id}:`,R)})}});F.taskAdmission=b;let j=b.getSnapshot();F.status=j.state,J.taskStatus=j.state,J.taskQueuePosition=j.queuePosition,J.taskQueueDepth=j.queueDepth,J.taskConcurrencyLimit=j.maxConcurrent}return rO.set(w,F),J.currentRunId=w,F.completion=I3(F,J,z,N,iO,{pendingInputOnly:X.pendingInputOnly,preparedInputTurn:X.preparedInputTurn,goalContinuationOnly:X.goalContinuationOnly,outputSchema:X.outputSchema,taskAdmission:F.taskAdmission,runtimeLease:X.runtimeLease,projectionLease:X.projectionLease,disposeRuntime:B0,pendingResume:X.pendingResume,onPendingResumeFailure:(_,b,j,D)=>EO(J,_,b,j,F,D),onPendingResumeSuccess:(_)=>U0(J,_),onPendingResumeCancelled:(_)=>e(XO(J),_.generation)}).catch((_)=>{d.error(`[SessionRoutes] Run ${w} failed:`,_)}),F},H2=async(J)=>{let z;if(J.outputSchema)try{z=O4(J.outputSchema).schema}catch(m){throw new K(m instanceof Error?m.message:"Invalid output schema")}let N=R1("task",12),X=M0(J.sourceProjectPath),w=J.modelId?.trim(),F=FO();if(!F)throw new K("Config not initialized");let[_,b]=await Promise.all([T1(X,F),oO(X)]);if(w&&!_.config.models.some((m)=>m.id===w))throw new K(`Task model not found: ${w}`);let j=w||_.config.models.find((m)=>m.id===_.config.currentModelId)?.id||_.config.models[0]?.id;if(!j)throw new K("No model is configured. Add or select a model before dispatching a task.");let D=_.config.models.find((m)=>m.id===j);if(!D)throw new K(`Task model not found: ${j}`);let R=J.reasoningEffort??"off",I=J.serviceTier??"auto",f=J.responseVerbosity??"auto",h=J.communicationStyle??"auto",wO,NO=b.projectRules?.staticRules(X),l=NO&&NO.files.length>0?NO.provenanceSha256:void 0;try{let m=_.catalog.resolveConfig(D);Ix(m,R),Lx(m,I),Fx(m,f);let BO=qx(h,b.communicationStyles);wO=BO.source==="built-in"?void 0:BO.contentSha256}catch(m){throw new K(m instanceof Error?m.message:"Invalid reasoning effort")}let PO={version:1,prompt:J.prompt,...J.title?{title:J.title}:{},...J.taskPriority?{taskPriority:J.taskPriority}:{},...J.taskKind?{taskKind:J.taskKind}:{},...J.taskDueAt?{taskDueAt:J.taskDueAt}:{},sourceProjectPath:X,isolation:J.isolation,permissionMode:J.permissionMode,modelId:j,reasoningEffort:R,serviceTier:I,responseVerbosity:f,communicationStyle:h,...wO?{communicationStyleDigest:wO}:{},...l?{projectInstructionsDigest:l}:{},...J.attachments?{attachments:J.attachments.map((m)=>({...m}))}:{},...z?{outputSchema:z}:{}},kO,a,GO,u,UO,yO;try{let m=await B.runExclusive(async()=>{yO=o(CO({sessionId:N,projectPath:X})),UO=T.reserve(yO);try{return await ax.createSessionTask({sessionId:N,prompt:J.prompt,title:J.title,taskPriority:J.taskPriority,taskKind:J.taskKind,taskDueAt:J.taskDueAt,sourceProjectPath:X,isolation:J.isolation,dispatch:PO,retriedFrom:J.retriedFrom})}catch(DO){throw UO?.cancel(),UO=void 0,DO}}),{metadata:BO}=m;if(kO=m.taskWorktree,a=Z1(BO,kO),!UO)throw new KO;let mO=o(XO(a));if(yO!==mO)UO.cancel(),UO=T.reserve(mO),yO=mO;u=UO.commit(a),UO=void 0,yO=void 0;let C=XO(a);E.publish(C,"task.status",{taskStatus:BO.taskStatus,updatedAt:BO.lastMessageTime});let s=_x(J.prompt,J.attachments);GO=await iO(a);let VO=GO.value,LO=z?await VO.prepareInputTurn(s,{outputSchema:z}):await VO.prepareInputTurn(s);if(!LO.accepted)throw new g(`Task prompt was not accepted: ${LO.reason}`);if(!u)throw new KO;let gO=a0(a,s,J.permissionMode,{preparedInputTurn:LO,runtimeLease:GO,projectionLease:u,outputSchema:z});return u=void 0,GO=void 0,await gO.taskAdmissionUpdate,{session:H0(a),runId:gO.id,messageId:LO.messageId,status:gO.status==="queued"?"queued":"running",queuePosition:a.taskQueuePosition,queueDepth:a.taskQueueDepth,maxConcurrentTasks:a.taskConcurrencyLimit}}catch(m){if(UO?.cancel(),UO=void 0,yO=void 0,u?.release(),u=void 0,GO?.release(),GO=void 0,m instanceof nO&&!a)throw new dO("Session projection capacity is full",{resource:m.resource,limit:m.limit,retryable:m.retryable});if((m instanceof J4||m instanceof P0||m instanceof nO)&&a){if(kO)await $0.exit({sessionId:a.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await B0(a).catch(()=>{return}),await y.deleteSession(a.id,a.projectPath).catch(()=>{return}),new dO(m instanceof nO?"Session projection capacity is full":m instanceof P0?"Session runtime capacity is full":"Task admission capacity is full",{resource:m.resource,limit:m.limit,...m instanceof nO?{retryable:m.retryable}:{}})}if(a){let BO=await y.findSessionMetadata(a.id,a.projectPath).catch(()=>{return});if(!BO||BO.taskStatus==="queued"){let mO=A0(m),C=await y.updateSessionMetadata(a.id,a.projectPath,{taskStatus:"failed",taskStatusReason:mO.message,taskFailure:mO,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});a.taskStatus=C?.taskStatus??"failed",a.taskStatusReason=C?.taskStatusReason??mO.message,a.taskFailure=C?.taskFailure??mO,a.taskCompletedAt=C?.taskCompletedAt}else a.taskStatus=BO.taskStatus,a.taskStatusReason=BO.taskStatusReason,a.taskFailure=BO.taskFailure,a.taskCompletedAt=BO.taskCompletedAt}throw m}},I4=(J)=>c(()=>H2(J)),b2=async(J,z)=>{let N=await IO(J,z),X=await y.findSessionMetadata(N.sessionId,N.projectPath);if(!X)throw new v("Session",N.sessionId);if(!["failed","interrupted","cancelled"].includes(X.taskStatus))throw new g(`Task cannot be retried while status is ${X.taskStatus}`);let w=await y.findSessionTaskDispatch(N.sessionId,N.projectPath);if(!w)throw new g("Task retry payload is unavailable");return I4({prompt:w.prompt,title:X.title??w.title,taskPriority:X.taskPriority??w.taskPriority,taskKind:X.taskKind??w.taskKind,taskDueAt:X.taskDueAt,sourceProjectPath:w.sourceProjectPath,isolation:w.isolation,permissionMode:w.permissionMode,modelId:w.modelId,reasoningEffort:w.reasoningEffort,serviceTier:w.serviceTier,responseVerbosity:w.responseVerbosity,communicationStyle:w.communicationStyle,attachments:w.attachments,outputSchema:w.outputSchema,retriedFrom:N})},j2=(J,z)=>c(()=>b2(J,z)),M2=(J,z,N)=>c(async()=>{let X=await IO(J,N);if(!await y.findSessionMetadata(X.sessionId,X.projectPath))throw new v("Session",X.sessionId);let F=await y.updateSessionMetadata(X.sessionId,X.projectPath,z),_=vO(X);if(_)Z0(_,F);return E.publish(X,"session.updated",{...F.title?{title:F.title}:{},...F.taskPriority?{taskPriority:F.taskPriority}:{},...F.taskKind?{taskKind:F.taskKind}:{},taskDueAt:F.taskDueAt??null}),_?H0(_):{...F,isActive:!1}}),A2=async(J,z)=>{return aO(J,z,async(N)=>{if(!N.taskWorktree)throw new K("Session does not have a task worktree");try{await $0.restoreSession(N.taskWorktree);let X=await $0.getDiffArtifact(N.id);if(!X)throw new g("Task diff artifact is unavailable");return{sessionId:N.id,projectPath:N.projectPath,...X}}catch(X){if(X instanceof g)throw X;throw d.error("[SessionRoutes] Failed to load task diff artifact:",X),new g("Task diff artifact is unavailable")}})},T2=async(J,z,N)=>{let X=await IO(J,N);return RO(X,async()=>{return D2(X,async(w)=>{if(["queued","running"].includes(w.taskStatus))throw new g(`Task artifacts cannot be delivered while status is ${w.taskStatus}`);if(w.taskDelivery?.status==="applied")throw new g("Task changes have already been applied");if(w.taskDelivery?.status==="discarded")throw new g("Task changes have already been discarded");if(!w.taskWorktree)throw new g("Task worktree is unavailable");let F=async(_,b=!1)=>{let j=await y.updateSessionMetadata(w.id,w.projectPath,{taskDelivery:_,...b?{taskWorktree:null}:{}});if(Z0(w,j),b)w.taskWorktree=void 0;return E.publish(X,"task.delivery",{taskDelivery:_,...b?{taskWorktreeRemoved:!0}:{},updatedAt:j.lastMessageTime}),H0(w)};try{if(z==="discard"){try{await $0.restoreSession(w.taskWorktree)}catch(j){return d.warn(`[SessionRoutes] Abandoning unavailable task worktree for ${w.id}:`,j),F({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:w.taskDiffStat?.changedFiles??0,message:"Task artifact discarded; worktree was unavailable"},!0)}let b=await $0.exit({sessionId:w.id,action:"remove",discardChanges:!0});return F({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:b.discardedFiles??0,message:"Task worktree removed"},!0)}try{await $0.restoreSession(w.taskWorktree)}catch(b){throw d.warn(`[SessionRoutes] Task worktree is unavailable for ${w.id}:`,b),new Z4("artifact_unavailable","Task worktree is unavailable")}let _=await $0.apply(w.id);return F({status:"applied",updatedAt:new Date().toISOString(),sourceCommit:_.sourceCommit,changedFiles:_.changedFiles,message:"Task changes applied to the source workspace"})}catch(_){if(_ instanceof Z4)throw await F({status:"conflicted",updatedAt:new Date().toISOString(),message:_.message}),new g(_.message);throw _}})})},I2=(J,z,N)=>c(()=>T2(J,z,N)),q4=async(J,z)=>{let N=XO(J),X=o(N),w=L.get(X);if(!z&&w?.terminal)return;let F=TO(J.currentRunId);if(AO(F)){if(z)e(XO(J),z.generation);return}let _=J.taskIsolation&&J.taskStatus!=="queued"&&J.taskStatus!=="running",b=_?await b0.hasRecoverableTurn(J.projectPath,J.id):!1;if(_&&!b){if(z)e(XO(J),z.generation);return}let j=await b0.hasPendingInbox(J.projectPath,J.id),D=!j&&await b0.hasActiveGoal(J.projectPath,J.id);if(!j&&!D&&!b)b=await b0.hasRecoverableTurn(J.projectPath,J.id);if(!j&&!D&&!b){e(XO(J));return}if(z&&!j){e(XO(J),z.generation);return}let R=await iO(J),I=!1,f,h;try{let wO=R.value,NO=TO(J.currentRunId);if(AO(NO)){if(z)e(XO(J),z.generation);return}if(j&&wO.getPendingSteeringCount()===0)await wO.reloadPendingInbox();let l=wO.getPendingSteeringCount()>0,PO=l?null:await wO.getGoal(),kO=PO?.status==="active"||PO?.status==="verifying",a=wO.getTurnRecoveryAssessment();if(a.state!=="none"&&(a.state==="requires_attention"||!l&&!kO))E.publish({sessionId:J.id,projectPath:J.projectPath},"turn.recovery",{assessment:a});if(a.state==="requires_attention"||_||!l&&!kO||wO.hasTurnOwner()){if(z||!l)e(XO(J),z?.generation);return}let GO=z;if(l&&!J.taskIsolation&&!GO){let u=await A4(N);try{GO=bO(J,u);let UO=L.get(X);if(GO&&UO?.generation===GO.generation&&UO.projectionLease===u)h=GO,u=void 0}finally{u?.release()}}if(l&&!J.taskIsolation&&!GO)return;if(z&&!OO(J,z))return;f=z?(()=>{let u=w?.projectionLease;if(!u)throw new KO;return K0(u)})():await A4(XO(J)),a0(J,"",J.permissionMode??"default",{pendingInputOnly:l,goalContinuationOnly:kO,runtimeLease:R,projectionLease:f,pendingResume:l?GO:void 0}),f=void 0,h=void 0,I=!0}finally{if(f?.release(),h)e(N,h.generation);if(!I)R.release()}};QO=async(J,z)=>{let N;try{N=k.enter()}catch{return}try{let X=TO(J.currentRunId);if(AO(X)){if(z)e(XO(J),z.generation);return}if(J.taskIsolation){await q4(J);return}await q4(J,z)}finally{N.release()}};let g1={accepting:!0,resolveSessionRef:y1,getProjectionSnapshot:vO,snapshotAll:L1,acquireOrHydrateSession:N0,invalidateAll:F1,resumeRecoveredInteraction:QO};Q0=g1;let q2=async()=>{let J={scheduled:0,failed:0,deferred:0};if(!k.stats().accepting)return J;let z=(await y.listSessions({taskStatus:"queued"})).filter((N)=>N.taskIsolation!==void 0).sort((N,X)=>N.firstMessageTime.localeCompare(X.firstMessageTime)||N.projectPath.localeCompare(X.projectPath)||N.sessionId.localeCompare(X.sessionId));for(let[N,X]of z.entries()){let w={sessionId:X.sessionId,projectPath:X.projectPath};try{if(!await b0.hasPendingInbox(X.projectPath,X.sessionId)){let b=A0("Queued task input is missing");await y.updateSessionMetadata(X.sessionId,X.projectPath,{taskStatus:"failed",taskStatusReason:b.message,taskFailure:b,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),J.failed++;continue}let F=await N0(w),_=F.value;if(F.release(),await QO(_),_.currentRunId)J.scheduled++}catch(F){if(F instanceof J4||F instanceof P0){J.deferred+=z.length-N;break}d.warn(`[SessionRoutes] Failed to recover queued task ${X.sessionId}:`,F),J.deferred++}}return J};return O.route("/",Gx({withAdmission:c,resolveSessionRef:async(J,z)=>{try{let N=await F2(J,z);return(await N0(N)).release(),N}catch(N){if(N instanceof nO)throw new dO("Session projection capacity is full",{resource:N.resource,limit:N.limit,retryable:N.retryable});throw N}},getRuntime:(J)=>$.get(J),captureAgentScreenshot:async(J,z)=>{return L2(J,(N)=>pO(N,(X)=>X.captureBrowserScreenshot(z)))},resetRuntime:(J)=>$.reset(J)})),O.get("/",async(J)=>{try{let z=await y.listSessions(),N=new Set(z.filter((D)=>D.relationType==="subagent").map((D)=>o({sessionId:D.sessionId,projectPath:D.projectPath}))),X=L1().filter((D)=>!N.has(o(XO(D)))&&D.relationType!=="subagent").map((D)=>H0(D)),w=new Set(X.map((D)=>o({sessionId:D.sessionId,projectPath:D.projectPath}))),F=z.filter((D)=>{if(D.relationType==="subagent")return!1;return!w.has(o({sessionId:D.sessionId,projectPath:D.projectPath}))}),_=new Set(w),b=F.filter((D)=>{let R=o({sessionId:D.sessionId,projectPath:D.projectPath});if(_.has(R))return!1;return _.add(R),!0}),j=[...X,...b.map((D)=>({...D,isActive:!1}))];return J.json(j)}catch(z){throw d.error("[SessionRoutes] Failed to list sessions:",z),new JO("Failed to list sessions")}}),O.get("/catalog",async(J)=>{try{let z=J.req.query("limit"),N=z===void 0?void 0:Number(z),X=J.req.query("cursor"),w=J.req.query("projectPath"),F=J.req.query("archived");if(F!==void 0&&F!=="true"&&F!=="false")throw new K("archived must be true or false");let _=F==="true",b=await y.listSessionPage({...w?{cwd:M0(w)}:{},...X?{cursor:X}:{},...N===void 0?{}:{limit:N},includeSubagents:!1,archived:_}),j=new Map((_?[]:L1()).filter((D)=>D.relationType!=="subagent").map((D)=>[o(XO(D)),H0(D)]));return J.json({sessions:b.sessions.map((D)=>j.get(o({sessionId:D.sessionId,projectPath:D.projectPath}))??D),...b.nextCursor?{nextCursor:b.nextCursor}:{}})}catch(z){if(z instanceof K)throw z;if(z instanceof Error&&(z.message.startsWith("Invalid session cursor")||z.message.startsWith("Session cursor scope")||z.message.startsWith("Session catalog")))throw new K(z.message);throw d.error("[SessionRoutes] Failed to list session catalog:",z),new JO("Failed to list session catalog")}}),O.post("/",async(J)=>{try{let z=await J.req.json(),N=p(G3,z);if(!N.success)throw new K("Invalid request body");let{title:X,projectPath:w}=N.data,F=R1("web",12),_=M0(w||J.get("directory")||$O(),w?"projectPath":"directory"),b=CO({sessionId:F,projectPath:_}),j=await B.runExclusive(async()=>{let R=T.reserve(o(b));try{let I=await y.createSessionMetadata(F,_,{title:X,taskStatus:"completed"}),f=Z1(I);return R.commit(f)}catch(I){throw R.cancel(),I}}),D=j.value;return j.release(),E.publish(b,"session.created",{}),J.json({...H0(D),status:void 0,agentType:void 0,model:void 0})}catch(z){if(d.error("[SessionRoutes] Failed to create session:",z),z instanceof K||z instanceof WO||z instanceof nO)throw z;throw new JO("Failed to create session")}}),O.get("/:sessionId/export",async(J)=>{let z=J.req.param("sessionId");try{let N=J.req.query("includeReasoning");if(N!==void 0&&N!=="true"&&N!=="false")throw new K("includeReasoning must be true or false");let X=await IO(z,J.req.query("projectPath")),w=await y.exportSessionMarkdown(X.sessionId,X.projectPath,{includeReasoning:N==="true"});return J.body(w.markdown,200,{"Cache-Control":"no-store","Content-Disposition":`attachment; filename="${w.filename}"`,"Content-Length":String(Buffer.byteLength(w.markdown,"utf8")),"Content-Type":"text/markdown; charset=utf-8","X-Blade-Content-Sha256":w.contentSha256,"X-Blade-Export-Activities":String(w.activityCount),"X-Blade-Export-Messages":String(w.messageCount),"X-Blade-Export-Redactions":String(w.redactionCount)})}catch(N){if(N instanceof K||N instanceof v||N instanceof SO)throw N;if(N instanceof Error&&N.message==="No conversation content to export")throw new g(N.message);throw d.error("[SessionRoutes] Failed to export session:",N),new JO("Failed to export session")}}),O.post("/:sessionId/fork",async(J)=>{let z=J.req.param("sessionId");try{Y1(z);let N=await J.req.json(),X=p(_3,N);if(!X.success)throw new K("Invalid request body");let w=M0(X.data.projectPath),F=R1("fork"),_,b=await B.runExclusive(async()=>{let R=await y.findSessionMetadata(z,w);if(!R)throw new v("Session",z);let I;try{I=T.reserve(o({sessionId:F,projectPath:R.projectPath}))}catch(f){if(!(f instanceof nO))throw f}try{let f=await y.forkSession(z,{newSessionId:F,sourceProjectPath:R.projectPath,targetProjectPath:R.projectPath});if(I){let h=Z1(f.metadata);_=I.commit(h)}return f}catch(f){throw I?.cancel(),f}}),j=Z1(b.metadata),D=XO(j);return _?.release(),E.publish(D,"task.status",{taskStatus:b.metadata.taskStatus,...b.metadata.taskCompletedAt?{taskCompletedAt:b.metadata.taskCompletedAt}:{},updatedAt:b.metadata.lastMessageTime}),J.json({session:b.metadata,messages:t1(b.messages)},201)}catch(N){if(N instanceof K||N instanceof v||N instanceof g)throw N;if(N instanceof yx)throw new g("Session has no durable creation record");throw d.error("[SessionRoutes] Failed to fork session:",N),new JO("Failed to fork session")}}),O.get("/:sessionId",async(J)=>{let z=J.req.param("sessionId");try{let N=await IO(z,J.req.query("projectPath")),X=vO(N);if(X)return J.json(H0(X));let w=await y.findSessionMetadata(N.sessionId,N.projectPath);if(!w)throw new v("Session",z);return J.json(w)}catch(N){if(N instanceof K||N instanceof v||N instanceof SO)throw N;throw d.error("[SessionRoutes] Failed to get session:",N),new JO("Failed to get session")}}),O.patch("/:sessionId",async(J)=>{let z=J.req.param("sessionId");try{let N=await J.req.json(),X=p(B3,N);if(!X.success)throw new K("Invalid request body");if(X.data.title===void 0)throw new K("title is required");let w=await IO(z,X.data.projectPath),F=await y.updateSessionMetadata(w.sessionId,w.projectPath,{title:X.data.title}),_=T.acquire(o(w));try{let b=_?.value;if(b)b.title=F.title??b.title,b.updatedAt=new Date(F.lastMessageTime)}finally{_?.release()}if(F.title)E.publish(w,"session.updated",{title:F.title});return J.json({success:!0,title:F.title})}catch(N){if(d.error("[SessionRoutes] Failed to update session:",N),N instanceof K||N instanceof v||N instanceof SO)throw N;throw new JO("Failed to update session")}}),O.get("/:sessionId/rewind",async(J)=>{return aO(J.req.param("sessionId"),J.req.query("projectPath"),(z)=>pO(z,async(N)=>J.json({checkpoints:await N.listRewindCheckpoints()})))}),O.post("/:sessionId/rewind",async(J)=>{let z=p(ox,await J.req.json());if(!z.success)throw new K("Invalid rewind request");return aO(J.req.param("sessionId"),J.req.query("projectPath"),async(N,X,w)=>xO(X,async()=>{let F=TO(N.currentRunId);if(AO(F))throw new g("Cannot rewind while a run is active");return pO(N,async(_)=>{let b;try{b=await _.rewindSession(z.data)}catch(D){if(D instanceof Error&&D.message.startsWith("Cannot rewind while"))throw new g(D.message);throw D}await Y0(N);let j=t1(b.messages);return E.publish(X,"session.rewound",{targetMessageId:b.checkpoint.messageId,mode:b.mode,removedTurns:b.removedTurns,restoredFiles:b.restoredFiles,messages:j}),J.json({...b,messages:j})})}))}),O.get("/:sessionId/review",async(J)=>{let z=J.req.param("sessionId"),N=await IO(z,J.req.query("projectPath")),X=await j0.list(N.projectPath,N.sessionId);return J.json({reviews:X.map((w)=>({...w,content:w.completion?Px(w.start,w.completion):void 0}))})}),O.post("/:sessionId/review",async(J)=>{let z=J.req.param("sessionId"),N=p(ex,await J.req.json());if(!N.success)throw new K("Invalid code review request");let X=await D1(z,N.data.projectPath),w=X.value,F=XO(w),_=o(F);try{return await xO(F,async()=>{if(AO(TO(w.currentRunId)))throw new g("Cannot start a review during an active turn");if(sO.has(_))throw new g("Session already has an active review");return pO(w,async(b)=>{if(await j0.recoverInterrupted(F.projectPath,F.sessionId,b),N.data.modelId&&!b.getModelById(N.data.modelId))throw new K(`Model not found: ${N.data.modelId}`);if(N.data.modelId&&b.getCurrentModelId()!==N.data.modelId)await b.refresh({modelId:N.data.modelId});if(N.data.modelId&&w.selectedModelId!==N.data.modelId){let f=await y.updateSessionMetadata(w.id,w.projectPath,{selectedModelId:N.data.modelId});Z0(w,f)}let j=new AbortController,D,R;try{D=K0(X),R=await j0.start({sessionId:F.sessionId,projectPath:F.projectPath,runtime:b,request:{kind:N.data.kind,...N.data.ref?{ref:N.data.ref}:{},...N.data.instructions?{instructions:N.data.instructions}:{}},signal:j.signal,onEvent:(f)=>{if(f.kind==="tool_start")E.publish(F,"review.tool.started",{reviewId:R?.reviewId,toolCallId:f.toolCall.id,toolName:f.toolCall.function.name});else if(f.kind==="tool_progress")E.publish(F,"review.tool.progress",{reviewId:R?.reviewId,toolCallId:f.toolCall.id,message:f.update.message.slice(0,1000)});else if(f.kind==="tool_result")E.publish(F,"review.tool.completed",{reviewId:R?.reviewId,toolCallId:f.toolCall.id,success:f.result.success})}})}catch(f){if(D?.release(),f instanceof Error&&(f.message.includes("active review")||f.message.includes("interrupted review")||f.message.includes("active turn")))throw new g(f.message);if(f instanceof Error&&(f.message.includes("review")||f.message.includes("Git")||f.message.includes("changes")||f.message.includes("ref")))throw new K(f.message);throw f}if(!R)throw new JO("Code review failed to start");await Y0(w),E.publish(F,"review.started",{reviewId:R.reviewId,kind:N.data.kind}),E.publish(F,"task.status",{taskStatus:w.taskStatus,...w.taskStatusReason?{taskStatusReason:w.taskStatusReason}:{},...w.taskStartedAt?{taskStartedAt:w.taskStartedAt}:{},...w.taskPromptSummary?{taskPromptSummary:w.taskPromptSummary}:{},updatedAt:new Date().toISOString()});let I=R.completion.then(async(f)=>{await Y0(w),E.publish(F,"task.status",{taskStatus:w.taskStatus,...w.taskStatusReason?{taskStatusReason:w.taskStatusReason}:{},...w.taskFailure?{taskFailure:w.taskFailure}:{},...w.taskStartedAt?{taskStartedAt:w.taskStartedAt}:{},...w.taskCompletedAt?{taskCompletedAt:w.taskCompletedAt}:{},...w.taskPromptSummary?{taskPromptSummary:w.taskPromptSummary}:{},updatedAt:new Date().toISOString()}),E.publish(F,"review.completed",{reviewId:R.reviewId,status:f.status,findings:f.findings.length})}).catch((f)=>{d.error(`[SessionRoutes] Code review ${R.reviewId} failed:`,f)}).finally(()=>{if(sO.get(_)?.reviewId===R.reviewId)sO.delete(_);D?.release()});return sO.set(_,{reviewId:R.reviewId,controller:j,completion:I,projectionLease:D}),J.json({reviewId:R.reviewId,status:"running"},202)})})}finally{X.release()}}),O.get("/:sessionId/subagents",async(J)=>{return aO(J.req.param("sessionId"),J.req.query("projectPath"),(z)=>pO(z,(N)=>J.json({subagents:N.listSubagents().map(S1)})))}),O.post("/:sessionId/subagents/:agentId/resume",async(J)=>{Y1(J.req.param("agentId"));let z=nx.safeParse(await J.req.json());if(!z.success)throw new K("Invalid subagent resume request");return aO(J.req.param("sessionId"),J.req.query("projectPath"),async(N,X,w)=>xO(X,async()=>{let F=TO(N.currentRunId);if(AO(F))throw new g("Cannot resume a subagent while a parent run is active");return pO(N,async(_)=>{let b=!1,j,D=(I)=>{E.publish(X,"subagent.complete",{subagentSessionId:I.id,success:I.status==="completed",status:I.status,summary:I.result?.message?.slice(0,500),type:I.subagentType,verificationVerdict:I.result?.verificationVerdict,resumedFrom:I.resumedFrom,rootAgentId:I.rootAgentId,resumeDepth:I.resumeDepth})},R;try{R=_.resumeSubagent({agentId:J.req.param("agentId"),prompt:z.data.prompt,onEvent:(I,f)=>{T3(X,f,I)},onCompleted:(I)=>{if(b)D(I);else j=I}})}catch(I){if(I instanceof Error&&(I.message.startsWith("Cannot resume")||I.message.startsWith("Subagent cannot")))throw new g(I.message);if(I instanceof Error&&I.message.startsWith("Subagent not found"))throw new v(I.message);throw I}if(E.publish(X,"subagent.start",{subagentSessionId:R.session.id,type:R.session.subagentType,description:R.session.description,resumedFrom:R.source.id,rootAgentId:R.session.rootAgentId,resumeDepth:R.session.resumeDepth}),b=!0,j)D(j);return J.json({source:S1(R.source),session:S1(R.session)})})}))}),O.get("/:sessionId/goal",async(J)=>{return aO(J.req.param("sessionId"),J.req.query("projectPath"),async(z)=>J.json({goal:await new ux(z.projectPath,z.id).get()}))}),O.put("/:sessionId/goal",async(J)=>{let z=p(K3,await J.req.json());if(!z.success)throw new K("Invalid goal request");return aO(J.req.param("sessionId"),J.req.query("projectPath"),async(N,X,w)=>xO(X,async()=>{let F=TO(N.currentRunId);if(AO(F))return J.json({status:"rejected",reason:"run_active"},409);let b=z.data.permissionMode??N.permissionMode??"default";if(N.permissionMode!==b)await T4(N,b);let j=await iO(N),D=!1,R;try{let I=await j.value.createGoal(z.data);E.publish(X,"goal.updated",{goal:I}),R=K0(w);let f=a0(N,"",b,{goalContinuationOnly:!0,runtimeLease:j,projectionLease:R});return D=!0,R=void 0,await f.taskAdmissionUpdate,J.json({status:f.status==="queued"?"queued":"running",runId:f.id,goal:I,queuePosition:N.taskQueuePosition,queueDepth:N.taskQueueDepth,maxConcurrentTasks:N.taskConcurrencyLimit},202)}finally{if(R?.release(),!D)j.release()}}))}),O.patch("/:sessionId/goal",async(J)=>{let z=p(F3,await J.req.json());if(!z.success)throw new K("Invalid goal update");return aO(J.req.param("sessionId"),J.req.query("projectPath"),async(N,X,w)=>xO(X,async()=>{let F=await iO(N),_=!1,b;try{let j=F.value,D;if(z.data.action==="pause")D=await j.pauseGoal();else if(z.data.action==="edit")D=await j.editGoal(z.data.objective);else D=await j.resumeGoal();if(E.publish(X,"goal.updated",{goal:D}),D.status==="active"&&!AO(TO(N.currentRunId))){b=K0(w);let R=a0(N,"","default",{goalContinuationOnly:!0,runtimeLease:F,projectionLease:b});return _=!0,b=void 0,await R.taskAdmissionUpdate,J.json({status:R.status==="queued"?"queued":"running",runId:R.id,goal:D,queuePosition:N.taskQueuePosition,queueDepth:N.taskQueueDepth,maxConcurrentTasks:N.taskConcurrencyLimit},202)}return J.json({status:D.status,goal:D})}finally{if(b?.release(),!_)F.release()}}))}),O.delete("/:sessionId/goal",async(J)=>{return aO(J.req.param("sessionId"),J.req.query("projectPath"),(z,N)=>pO(z,async(X)=>{let w=await X.clearGoal();if(w)E.publish(N,"goal.cleared",{});return J.json({cleared:w})}))}),O.post("/:sessionId/archive",async(J)=>{let z=J.req.param("sessionId");try{let N=await IO(z,J.req.query("projectPath")),X=await y.listSessionArchiveMembers(N.sessionId,N.projectPath);for(let F of X){let _=CO({sessionId:F.sessionId,projectPath:F.projectPath}),b=vO(_);if(AO(TO(b?.currentRunId)))throw new g(`Stop session ${F.sessionId} before archiving this session tree`)}for(let F of X){let _=CO({sessionId:F.sessionId,projectPath:F.projectPath}),b=vO(_);if(b)await B0(b)}let w=await y.archiveSession(N.sessionId,N.projectPath);for(let F of X){let _=CO({sessionId:F.sessionId,projectPath:F.projectPath}),b=o(_);S0(_,"archive"),await h1(_,"archive").catch(()=>{return}),Q.delete(b),E.publish(_,"session.archived",{archiveRootId:N.sessionId,archivedAt:w.archivedAt})}if(x.size===0)await fO.getInstance().disconnectAll();return J.json({session:w,archivedSessionIds:X.map((F)=>F.sessionId)})}catch(N){if(N instanceof K||N instanceof v||N instanceof SO||N instanceof g)throw N;if(N instanceof $4)throw new g(N.message);throw d.error("[SessionRoutes] Failed to archive session:",N),new JO("Failed to archive session")}}),O.post("/:sessionId/unarchive",async(J)=>{let z=J.req.param("sessionId");try{let N=await IO(z,J.req.query("projectPath")),X=await y.listSessionArchiveMembers(N.sessionId,N.projectPath),w=await y.unarchiveSession(N.sessionId,N.projectPath),F=X.filter((_)=>_.sessionId===N.sessionId||_.archivedBySessionId===N.sessionId).map((_)=>_.sessionId);for(let _ of F)E.publish({sessionId:_,projectPath:N.projectPath},"session.unarchived",{archiveRootId:N.sessionId});return J.json({session:w,restoredSessionIds:F})}catch(N){if(N instanceof K||N instanceof v||N instanceof SO)throw N;if(N instanceof $4)throw new g(N.message);throw d.error("[SessionRoutes] Failed to unarchive session:",N),new JO("Failed to unarchive session")}}),O.delete("/:sessionId",async(J)=>{let z=J.req.param("sessionId"),N=J.req.query("projectPath");try{let X=await IO(z,N);e(X);let w=o(X),F=T.acquire(w),_=F?.value,b=_?.currentRunId,j=x.get(w),D=_?.taskWorktree??await y.findSessionTaskWorktree(X.sessionId,X.projectPath);F?.release();let R;if(b){let h=TO(b);if(h)X1(h),await h.completion,R=h.id}let I=sO.get(w);if(I)I.controller.abort("session-delete"),await I.completion;if(j)await j.clearGoal().catch((h)=>{d.warn("[SessionRoutes] Failed to clear session goal:",h)});if(await $.dispose(X),await y.deleteSession(X.sessionId,X.projectPath),S0(X,"delete"),R)H3(R);await h1(X,"delete").catch(()=>{return}),Q.delete(w),E.publish(X,"session.deleted",{});let f=x.get(w);if(f){if(!await H.remove(w,f))throw new g("Session Runtime is still active and cannot be deleted")}if(D)try{await $0.restoreSession(D),await $0.exit({sessionId:X.sessionId,action:"remove",discardChanges:!0})}catch(h){d.warn(`[SessionRoutes] Failed to remove deleted task worktree ${X.sessionId}:`,h)}return J.json({success:!0})}catch(X){if(d.error("[SessionRoutes] Failed to delete session:",X),X instanceof K||X instanceof v||X instanceof SO)throw X;throw new JO("Failed to delete session")}}),O.get("/:sessionId/message",async(J)=>{let z=J.req.param("sessionId");try{let N=await IO(z,J.req.query("projectPath")),X=await y.loadSession(N.sessionId,N.projectPath);return J.json(t1(X))}catch(N){if(d.error("[SessionRoutes] Failed to get messages:",N),N instanceof K||N instanceof v||N instanceof SO)throw N;throw new JO("Failed to get messages")}}),O.get("/:sessionId/events",async(J)=>{let z=J.req.param("sessionId"),N;try{N=q.enter(J.req.raw.signal)}catch{throw new KO}let X=!1;try{let w=await IO(z,J.req.query("projectPath"));try{await y.assertSessionWritable(w.sessionId,w.projectPath)}catch(I){if(I instanceof x4)throw new g(I.message);throw I}let F=await N0(w),_=F.value,b=J.req.header("Last-Event-ID")??J.req.query("lastEventId"),j=b?Number.parseInt(b,10):Number.NaN,D=Number.isInteger(j)?j+1:void 0,R=z3(J,async(I)=>{let h=new Set,wO,NO,l=!1,PO,kO,a=new Promise((C)=>{kO=C}),GO,u=new Set,UO=(C)=>{let s=C;return h.add(s),C.finally(()=>{h.delete(s)})},yO=()=>{if(wO?.(),wO=void 0,NO!==void 0)clearInterval(NO),NO=void 0},m=(C)=>{if(GO)return GO;return l=!0,GO=(async()=>{try{yO(),PO?.close(C),I.close()}finally{kO()}})(),GO},BO=()=>{m(N.signal.reason)},mO=async(C)=>{await m(C),await Promise.allSettled([...h]),N.signal.removeEventListener("abort",BO),N.release()};if(N.signal.addEventListener("abort",BO,{once:!0}),I.onAbort(()=>{m()}),N.signal.aborted){await mO(N.signal.reason);return}PO=new t0({write:async(C)=>{await I.writeSSE(C)},onFailure:(C)=>{if(Kx(C,l))return;d.warn(`[SessionRoutes] SSE egress closed for ${w.sessionId}: kind=${C.kind} pendingItems=${C.pendingItems??0} pendingBytes=${C.pendingBytes??0}`),m(C)}}),wO=E.subscribe((C)=>{if(l)return;if(C.sessionId!==w.sessionId||C.projectPath!==w.projectPath)return;let s=C.properties.requestId;if((C.type==="permission.asked"||C.type==="question.required"||C.type==="elicitation.required")&&typeof s==="string"){if(u.has(s))return;u.add(s)}if(C.type==="subagent.completion.queued"){let VO=xO(w,()=>QO(_)).catch((LO)=>{d.error(`[SessionRoutes] Failed to wake background completion for ${_.id}:`,LO)});UO(VO)}if(C.type==="team.message.received"&&typeof C.properties.teamName==="string"&&typeof C.properties.messageId==="string"&&typeof C.properties.content==="string"&&lx(C.properties.metadata,{messageId:C.properties.messageId,teamName:C.properties.teamName})){let VO=C.properties.teamName,LO=C.properties.messageId,gO=C.properties.content,DO=C.properties.metadata,_O=xO(w,async()=>{let MO=await iO(_),o0=!1;try{let F0=await MO.value.enqueueSteering(gO,{allowBeforeTurn:!0,messageId:LO,origin:"team_message",metadata:DO});if(!F0.accepted)return;await new dx(VO,f1()).markDelivered([LO]),o0=F0.delivery==="next_turn"}finally{MO.release()}if(!o0)return;await QO(_).catch((F0)=>{d.error(`[SessionRoutes] Failed to wake teammate delivery for ${_.id}:`,F0)})}).catch((MO)=>{d.error(`[SessionRoutes] Failed to deliver teammate message for ${_.id}:`,MO)});UO(_O)}if(C.type==="subagent.completion.queued"||C.type==="team.message.received")return;PO?.observe(b3(C),C.seq)});try{if(I.aborted||l)return;let C=TO(_.currentRunId),s=AO(C)?await iO(_):void 0;try{let DO=s?.value,_O=DO?.getPendingSteeringCount()??0;await PO.writeInitial({data:JSON.stringify({type:"connected",properties:{sessionId:w.sessionId,projectPath:w.projectPath,timestamp:Date.now(),status:AO(C)?C.status:"idle",runId:AO(C)?C.id:void 0,queued:_O,pendingInputDelivery:_O>0?DO?.hasActiveTurn()?"current_turn":"next_turn":null,recovered:DO?.getRecoveredSteeringCount()??0}})})}finally{s?.release()}if(I.aborted||l)return;if(D!==void 0){if(await px.for(w.sessionId,w.projectPath).replay({onCommitted:async(_O)=>{if(I.aborted||l)return;let MO=A3(_O);if(MO.seq===void 0)return;await PO.writeReplay({...typeof _O.seq==="number"?{id:String(_O.seq)}:{},data:JSON.stringify({type:MO.type,...MO.seq!==void 0?{seq:MO.seq}:{},properties:{...MO.properties,sessionId:w.sessionId,projectPath:w.projectPath}})},MO.seq)}},D),I.aborted||l)return}if(PO.finishInitialization({replayed:D!==void 0}),I.aborted||l)return;if(!C&&!sO.has(o(w))){let _O=(await j0.list(w.projectPath,w.sessionId)).some((MO)=>MO.completion===void 0)?await pO(_,(MO)=>j0.recoverInterrupted(w.projectPath,w.sessionId,MO)):void 0;if(_O)await Y0(_),E.publish(w,"review.completed",{reviewId:_O.reviewId,status:_O.status,findings:0,recovered:!0})}if(I.aborted||l)return;if(!C)await T0.recoverResponded(w.projectPath,w.sessionId);if(I.aborted||l)return;let VO=C?void 0:await T0.findPending(w.projectPath,w.sessionId),LO=C?.pendingPermission??(VO?{permissionId:VO.request.requestId,details:T0.confirmationDetails(VO),resolve:()=>{return}}:void 0);if(LO){u.add(LO.permissionId);let DO=Z$(LO,!0);PO.observe({data:JSON.stringify({type:DO.type,properties:{...DO.properties,sessionId:w.sessionId,projectPath:w.projectPath}})})}if(I.aborted||l)return;let gO=QO(_).catch(async(DO)=>{if(DO instanceof H1){await Y0(_).catch(()=>{return});let _O=_.taskFailure?.code==="workspace_unavailable"?_.taskFailure:N1("workspace_unavailable");_.taskStatus="failed",_.taskStatusReason=_O.message,_.taskFailure=_O,E.publish(w,"session.error",{error:_O.message,taskFailure:_O}),E.publish(w,"session.status",{status:"error"})}d.error(`[SessionRoutes] Failed to resume pending input for ${z}:`,DO)});if(UO(gO),I.aborted||l)return;NO=setInterval(()=>{if(I.aborted||l)return;PO?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},15000),await a}catch(C){if(Kx(C,l))return;throw C}finally{await mO()}});return X=!0,F.release(),R}catch(w){if(!X)N.release();throw w}}),O.post("/:sessionId/message",async(J)=>{let z=J.req.param("sessionId"),N=await J.req.json(),X=p(U3,N);if(!X.success)throw new K("Invalid message format");let{content:w,attachments:F,modelId:_,reasoningEffort:b,serviceTier:j,responseVerbosity:D,communicationStyle:R,permissionMode:I,projectPath:f,outputSchema:h}=X.data,wO;if(h)try{wO=O4(h).schema}catch(m){throw new K(m instanceof Error?m.message:"Invalid output schema")}let NO=R;if(Buffer.byteLength(w,"utf8")>r1)throw new K(`Message text exceeds the ${r1}-byte limit`);let l=_?.trim();if((F??[]).reduce((m,BO)=>m+(typeof BO.content==="string"?Buffer.byteLength(BO.content):0),0)>C1)throw new K("Message attachments exceed the 5 MiB limit");let kO=I,a=_x(w,F),GO=await D1(z,f??J.req.query("projectPath")),u=GO.value,UO=XO(u),yO=kO??u.permissionMode??"default";try{return await xO(UO,async()=>{let m=TO(u.currentRunId);if(AO(m)){if(wO)throw new g("Wait for the active turn to finish before setting an output schema");return pO(u,async(s)=>{if(l&&!s.getModelById(l))throw new K(`Model not found: ${l}`);if(l&&s.getCurrentModelId()!==l)throw new g("Wait for the active turn to finish before switching models");if(b&&s.getReasoningConfiguration().selection!==b)throw new g("Wait for the active turn to finish before switching reasoning effort");if(j&&s.getServiceTierConfiguration().selection!==j)throw new g("Wait for the active turn to finish before switching service tier");if(D&&s.getResponseVerbosityConfiguration().selection!==D)throw new g("Wait for the active turn to finish before switching response verbosity");if(NO&&s.getCommunicationStyleConfiguration().selection!==NO)throw new g("Wait for the active turn to finish before switching communication style");if(kO&&u.permissionMode!==kO)throw new g("Wait for the active turn to finish before switching permission mode");let VO=await s.enqueueSteering(a,{allowBeforeTurn:!0});if(!VO.accepted)return J.json({status:"rejected",reason:VO.reason??"turn_unavailable"},409);let LO=VO.messageId??k0(12),gO=VO.queued;E.publish(UO,"message.created",{messageId:LO,role:"user",content:Y4(a)});let DO=VO.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(E.publish(UO,DO,{runId:m.id,messageId:LO,queued:gO}),VO.delivery==="next_turn"&&m.status!=="running"&&m.status!=="waiting_permission")QO(u).catch((_O)=>{d.error(`[SessionRoutes] Failed to wake queued follow-up for ${z}:`,_O)});if(VO.delivery==="next_turn")m.pendingFollowUpRequested=!0;return J.json({runId:m.id,messageId:LO,status:VO.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:gO},202)})}if(e(UO),u.permissionMode!==yO)await T4(u,yO);let BO=await iO(u,{permissionMode:yO,...NO&&!NO.includes(":")?{communicationStyle:NO}:{}}),mO=!1,C;try{let s=BO.value;if(l&&!s.getModelById(l))throw new K(`Model not found: ${l}`);if(b)try{s.resolveReasoningConfiguration(b,l)}catch(jO){throw new K(jO instanceof Error?jO.message:"Invalid reasoning effort")}if(j)try{s.resolveServiceTierConfiguration(j,l)}catch(jO){throw new K(jO instanceof Error?jO.message:"Invalid service tier")}if(D)try{s.resolveResponseVerbosityConfiguration(D,l)}catch(jO){throw new K(jO instanceof Error?jO.message:"Invalid response verbosity")}let VO=NO?s.resolveCommunicationStyleConfiguration(NO):void 0;if(VO?.source!==void 0&&VO.source!=="built-in"&&!VO.contentSha256)throw new K("Custom communication style has no provenance");let LO=s.getCurrentModelId(),gO=s.getReasoningConfiguration(),DO=s.getServiceTierConfiguration(),_O=s.getResponseVerbosityConfiguration(),MO=s.getCommunicationStyleConfiguration(),o0=Boolean(l)&&LO!==l,F0=Boolean(b)&&gO.selection!==b,R4=Boolean(j)&&DO.selection!==j,S4=Boolean(D)&&_O.selection!==D,f4=Boolean(NO)&&MO.selection!==NO;if(o0||F0||R4||S4||f4)await s.refresh({...l?{modelId:l}:{},...b?{reasoningEffort:b}:{},...j?{serviceTier:j}:{},...D?{responseVerbosity:D}:{},...NO?{communicationStyle:NO}:{}});let u1={...l&&u.selectedModelId!==l?{selectedModelId:l}:{},...b&&u.reasoningEffort!==b?{reasoningEffort:b}:{},...j&&u.serviceTier!==j?{serviceTier:j}:{},...D&&u.responseVerbosity!==D?{responseVerbosity:D}:{},...VO&&(u.communicationStyle!==NO||u.communicationStyleDigest!==VO.contentSha256)?{communicationStyle:NO,communicationStyleDigest:VO.source==="built-in"?null:VO.contentSha256}:{}};if(Object.keys(u1).length>0)try{let jO=await y.updateSessionMetadata(u.id,u.projectPath,u1);u.permissionMode=jO.permissionMode,u.selectedModelId=jO.selectedModelId,u.reasoningEffort=jO.reasoningEffort,u.serviceTier=jO.serviceTier,u.responseVerbosity=jO.responseVerbosity,u.communicationStyle=jO.communicationStyle,u.communicationStyleDigest=jO.communicationStyleDigest,u.updatedAt=new Date(jO.lastMessageTime),E.publish(UO,"session.updated",u1)}catch(jO){if(o0||F0||R4||S4||f4)await s.refresh({...LO?{modelId:LO}:{},reasoningEffort:gO.selection,serviceTier:DO.selection,responseVerbosity:_O.selection,communicationStyle:MO.selection}).catch((R2)=>d.error("[SessionRoutes] Failed to roll back non-durable model settings:",R2));throw jO}let n0=wO?await s.prepareInputTurn(a,{outputSchema:wO}):await s.prepareInputTurn(a);if(!n0.accepted)return J.json({status:"rejected",reason:n0.reason},n0.reason==="queue_full"?429:409);C=K0(GO);let p1=a0(u,a,yO,{preparedInputTurn:n0,outputSchema:wO,runtimeLease:BO,projectionLease:C});return mO=!0,C=void 0,await p1.taskAdmissionUpdate,J.json({runId:p1.id,messageId:n0.messageId,status:p1.status==="queued"?"queued":"running",queuePosition:u.taskQueuePosition,queueDepth:u.taskQueueDepth,maxConcurrentTasks:u.taskConcurrencyLimit},202)}finally{if(C?.release(),!mO)BO.release()}})}finally{GO.release()}}),O.post("/:sessionId/side-question",async(J)=>{let z=J.req.param("sessionId"),N=p(rx,await J.req.json());if(!N.success)throw new K("Invalid side conversation request");return aO(z,N.data.projectPath??J.req.query("projectPath"),(X)=>pO(X,async(w)=>{let F=await w.askSideQuestion(N.data.question,{signal:J.req.raw.signal});return J.json({...F,...w.getCurrentModelId()?{modelId:w.getCurrentModelId()}:{}})}))}),O.post("/:sessionId/shell",async(J)=>{let z=J.req.param("sessionId"),N=p(sx,await J.req.json());if(!N.success)throw new K("Invalid user shell command");return aO(z,N.data.projectPath??J.req.query("projectPath"),(X,w,F)=>{let _=o(w);return xO(w,async()=>{if(J0.has(_))throw new g("A user shell command is already running in this Session");let b=await iO(X),j=K0(F),D=b.value,R=new AbortController,I,f=new Promise((h)=>{I=h});J0.set(_,{controller:R,completion:f,projectionLease:j});try{let h=await D.executeUserShellCommand(N.data.command,{signal:R.signal});await Y0(X);let wO=TO(X.currentRunId);if(h.delivery==="next_turn"&&AO(wO))wO.pendingFollowUpRequested=!0;return J.json({executionId:h.executionId,messageId:h.messageId,record:h.record,auxiliary:h.auxiliary,...h.delivery?{delivery:h.delivery}:{},...h.queued!==void 0?{queued:h.queued}:{}})}finally{J0.delete(_),I(),b.release(),j.release()}})})}),O.post("/:sessionId/abort",async(J)=>{let z=J.req.param("sessionId"),N=await IO(z,J.req.query("projectPath"));e(N);let X=vO(N);if(X?.currentRunId){let _=TO(X.currentRunId);if(_)X1(_),await _.completion}let w=J0.get(o(N));if(w)w.controller.abort("user-cancel"),await w.completion;let F=sO.get(o(N));if(F)F.controller.abort("user-cancel"),await F.completion;return J.json({success:!0})}),O.get("/:sessionId/status",async(J)=>{let z=J.req.param("sessionId"),N=await IO(z,J.req.query("projectPath")),X=vO(N),w=sO.get(o(N));if(w)return J.json({sessionId:z,projectPath:N.projectPath,reviewId:w.reviewId,status:"reviewing"});if(!X?.currentRunId)return J.json({sessionId:z,projectPath:N.projectPath,status:"idle"});let F=TO(X.currentRunId);return J.json({sessionId:z,projectPath:N.projectPath,runId:X.currentRunId,status:F?.status==="attention_required"?"idle":F?.status??"idle"})}),{app:O,dispatchTask:I4,retryTask:j2,updateTask:M2,getTaskDiff:A2,deliverTask:I2,recoverQueuedTasks:q2,getRuntimeResidencyStats:()=>H.getStats(),getProjectionResidencyStats:()=>T.getStats(),getCoordinationStats:()=>({messageSubmissions:U.getStats(),taskDeliveries:A.getStats()}),getSseConnectionStats:()=>q.stats(),shutdown:(J="server-shutdown")=>{if(r)return r;k.close(J);let z=q.shutdown(J);g1.accepting=!1,F1("server-shutdown");let N=Promise.allSettled([...W].map((X)=>X.promise));return clearInterval(P),clearInterval(n),HO(),r=(async()=>{let X,w=async(D)=>{let R=await Promise.allSettled(D);for(let I of R)if(I.status==="rejected")X??=I.reason},F=new Set,_=()=>{for(let D of rO.values()){if(D.completion)F.add(D.completion);if(AO(D))X1(D,J)}for(let D of J0.values())D.controller.abort(J),F.add(D.completion);for(let D of sO.values())D.controller.abort(J),F.add(D.completion)},b=k.waitForIdle(),j=!1;b.then(()=>{j=!0});while(!j)_(),await Promise.race([b,new Promise((D)=>setImmediate(D))]);if(await b,_(),await w([...F]),await N,await w([...Q.values()]),_(),await w([...F]),await w([z]),await w([...Q.values()]),await w([H.disposeAll()]),x.clear(),await w([...Z.values()]),await w([$.disposeAll()]),await w([fO.getInstance().disconnectAll()]),Q.clear(),Z.clear(),Y.clear(),W.clear(),Q0===g1)Q0=void 0;if(W1===HO)W1=void 0;if(X!==void 0)throw X})(),r}}};async function I3(O,x,$,Q,Z,Y={}){let{abortController:W,sessionId:U,id:A}=O,B=Y.preparedInputTurn?.messageId??k0(12),H=Y.pendingInputOnly===!0||Y.preparedInputTurn?.mode==="pending"||Y.goalContinuationOnly===!0?void 0:k0(12),T=Y.runtimeLease,k=Y.projectionLease,q,P,n=!1,r=!1,L,i=XO(x),QO=async(c)=>{let xO=c.metadata?.recoveryAttention;if(!xO||!q)return!1;if(Y.preparedInputTurn)await q.finishTurn(Y.preparedInputTurn.handle,{preserveStartupRecovery:!0,outcome:{status:"aborted",cause:"failed",turnsCount:0,toolCallsCount:0,durationMs:0}}).catch(()=>{return});let e=`Turn recovery requires attention: ${xO.reason}`,OO=await q.setTaskStatus("interrupted",e).catch(()=>{return});if(OO)Z0(x,OO);else x.taskStatus="interrupted",x.taskStatusReason=e,x.taskCompletedAt=void 0;return O.status="attention_required",S("session.status",{status:"idle"}),!0},S=(c,xO)=>{E.publish(i,c,xO)},HO=async()=>{let c=String(W.signal.reason||"Task run cancelled");if(x.taskIsolation){if(!T)T=await Z(x).catch(()=>{return});let xO=q??T?.value;if(c==="user-cancel")await xO?.discardPendingInput().catch((OO)=>{d.warn(`[SessionRoutes] Failed to discard cancelled input for ${x.id}:`,OO)});let e=await xO?.setTaskStatus("cancelled",c).catch(()=>{return});if(e)Z0(x,e);else await Y0(x).catch(()=>{return})}x.taskStatus="cancelled",x.taskStatusReason=c,x.taskCompletedAt??=new Date().toISOString()};try{if(Y.pendingResume){let G=Y.pendingResume.deadlineAt-Date.now();if(G<=0)throw W.abort(q1),new J1({taskFailure:N1("timeout"),outputStarted:!1,toolExecutionStarted:!1,toolCallsCount:0});else L=setTimeout(()=>{W.abort(q1);let YO=O.pendingPermission;if(O.pendingPermission=void 0,YO?.resolve({approved:!1,reason:N4}),YO)S("interaction.resolved",{requestId:YO.permissionId})},G),L.unref?.()}if(Y.taskAdmission){if(await Y.taskAdmission.ready,await O.taskAdmissionUpdate,W.signal.aborted)throw Error(String(W.signal.reason||"Task run cancelled"))}if(x.taskStatus="running",x.taskStatusReason=void 0,x.taskStartedAt=new Date().toISOString(),x.taskCompletedAt=void 0,!Y.pendingInputOnly&&!Y.goalContinuationOnly)S("message.created",{messageId:B,role:"user",content:Y4($)});if(S("session.status",{status:"running"}),H)S("message.created",{messageId:H,role:"assistant",content:""});T??=await Z(x),q=T.value;let c=q,xO=Boolean(Y.outputSchema??c.getPendingSteeringMessages().find((G)=>G.outputSchema)?.outputSchema);P=await ix.createWithRuntime(c,{sessionId:U,...x.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}});let e=async(G)=>{let YO=G.interactionRequestId??k0(12),iO=300000;O.status="waiting_permission";let pO=new Promise((S0)=>{let F1=setTimeout(()=>{d.warn(`[SessionRoutes] Permission ${YO} timed out after 300000ms`),S("permission.timeout",{requestId:YO}),S0({approved:!1,reason:"timeout"})},300000);O.pendingPermission={permissionId:YO,resolve:(vO)=>{clearTimeout(F1),S0(vO)},details:G}}),B0=O.pendingPermission;if(!B0)throw Error("Permission request was not registered");let K1=Z$(B0);S(K1.type,K1.properties),d.info(`[SessionRoutes] Permission request created: ${YO}, runId: ${A}`);let _0=await pO;if(d.info(`[SessionRoutes] Permission response received: ${YO}, approved: ${_0.approved}`),!W.signal.aborted)O.status="running";if(O.pendingPermission===B0)O.pendingPermission=void 0;return S("interaction.resolved",{requestId:YO}),_0},bO={messages:await y.loadSessionModelContext(x.id,x.projectPath),userId:"web-user",sessionId:U,workspaceRoot:x.projectPath,signal:W.signal,permissionMode:Q,onPermissionModeChange:async(G)=>{x.permissionMode=G,x.updatedAt=new Date,S("session.updated",{permissionMode:G})},...x.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:e}},t=()=>{if(!H)H=k0(12),S("message.created",{messageId:H,role:"assistant",content:""});return H},EO=async(G)=>{switch(G.kind){case"content_delta":if(G.delta.length>0)n=!0;if(xO)break;S("message.delta",{messageId:t(),delta:G.delta});break;case"structured_output":n=!0,S("structured.output",{messageId:t(),output:G.output,schemaDigest:G.schemaDigest});break;case"thinking_delta":if(G.delta.length>0)n=!0;S("thinking.delta",{messageId:t(),delta:G.delta});break;case"tool_start":if(r=!0,"function"in G.toolCall){if(G.toolCall.function.name===m0)break;S("tool.start",{messageId:t(),toolName:G.toolCall.function.name,toolCallId:G.toolCall.id,arguments:G.toolCall.function.arguments,toolKind:G.toolKind})}break;case"tool_result":if(r=!0,"function"in G.toolCall){if(G.toolCall.function.name===m0)break;S("tool.result",{messageId:t(),toolName:G.toolCall.function.name,toolCallId:G.toolCall.id,success:G.result.success,summary:G.result.metadata?.summary,output:U1(w1(G1(G.toolCall.function.name,G.result),z1)),metadata:V1(G.toolCall.function.name,G.result.metadata)})}break;case"tool_progress":if(r=!0,"function"in G.toolCall){if(G.toolCall.function.name===m0)break;S("tool.progress",{messageId:t(),toolName:G.toolCall.function.name,toolCallId:G.toolCall.id,...G.update})}break;case"token_usage":S("token.usage",{...G.usage});break;case"turn_start":S("turn.started",{turn:G.turn,maxTurns:G.maxTurns});break;case"turn_recovery":S("turn.recovery",{assessment:G.assessment});break;case"provider_admission":S("provider.admission",{phase:G.phase,requestClass:G.requestClass,resource:G.resource,scope:G.scope,reason:G.reason,queuePosition:G.queuePosition,queueDepth:G.queueDepth,inFlight:G.inFlight,limit:G.limit,waitMs:G.waitMs,maxWaitMs:G.maxWaitMs,recoveryRemainingMs:G.recoveryRemainingMs});break;case"provider_circuit":S("provider.circuit",{phase:G.phase,reason:G.reason,statusCode:G.statusCode,retryAfterMs:G.retryAfterMs,nextProbeAt:G.nextProbeAt,openDurationMs:G.openDurationMs,sampleCount:G.sampleCount,failureCount:G.failureCount,recoveryRemainingMs:G.recoveryRemainingMs});break;case"provider_retry":S("provider.retry",{phase:G.phase,attempt:G.attempt,maxRetries:G.maxRetries,reason:G.reason,statusCode:G.statusCode,delayMs:G.delayMs,nextRetryAt:G.nextRetryAt,mode:G.mode,recoveryBudgetMs:G.recoveryBudgetMs,recoveryElapsedMs:G.recoveryElapsedMs,recoveryRemainingMs:G.recoveryRemainingMs,exhaustedBy:G.exhaustedBy});break;case"provider_stall":S("provider.stall",{phase:G.phase,stallCount:G.stallCount,durationMs:G.durationMs,warningAfterMs:G.warningAfterMs,timeoutMs:G.timeoutMs,outputStarted:G.outputStarted});break;case"action_stationarity":S("action.stationarity",{phase:G.phase,toolName:G.toolName,runLength:G.runLength,nudgeThreshold:G.nudgeThreshold,haltThreshold:G.haltThreshold,progressAware:G.progressAware});break;case"mcp_catalog_changed":S("mcp.catalog.changed",{messageId:t(),revision:G.revision,serverName:G.serverName,added:G.added,removed:G.removed,updated:G.updated});break;case"mcp_content_changed":S("mcp.content.changed",{messageId:t(),revision:G.revision,serverName:G.serverName,contentKind:G.contentKind,added:G.added,removed:G.removed,updated:G.updated});break;case"mcp_resource_updated":S("mcp.resource.updated",{messageId:t(),revision:G.revision,serverName:G.serverName,uri:G.uri});break;case"mcp_connection_changed":S("mcp.connection.changed",{messageId:t(),revision:G.revision,serverName:G.serverName,phase:G.phase,reason:G.reason,attempt:G.attempt,maxAttempts:G.maxAttempts,nextRetryAt:G.nextRetryAt,error:G.error});break;case"mcp_log":S("mcp.log",{messageId:t(),revision:G.revision,serverName:G.serverName,level:G.level,logger:G.logger,message:G.message,projectedBytes:G.projectedBytes,dataSha256:G.dataSha256,truncated:G.truncated,detailsOmitted:G.detailsOmitted,timestamp:G.timestamp,synthetic:G.synthetic});break;case"mcp_instructions_changed":S("mcp.instructions.changed",{messageId:t(),revision:G.revision,serverName:G.serverName,action:G.action,reason:G.reason,text:G.text,sourceBytes:G.sourceBytes,projectedBytes:G.projectedBytes,sha256:G.sha256,truncated:G.truncated,detailsOmitted:G.detailsOmitted});break;case"mcp_task_changed":S("mcp.task.changed",{messageId:t(),revision:G.revision,taskId:G.taskId,serverName:G.serverName,toolName:G.toolName,status:G.status,statusMessage:G.statusMessage,createdAt:G.createdAt,updatedAt:G.updatedAt,completedAt:G.completedAt,hasResult:G.hasResult,error:G.error});break;case"project_rules_loaded":S("project.rules.loaded",{messageId:t(),files:G.files,triggerPaths:G.triggerPaths,blockedWrite:G.blockedWrite});break;case"steering_applied":S("steering.applied",{runId:A,messageIds:G.messageIds,count:G.count,recovered:G.recovered,delivery:G.delivery,queued:c.getPendingSteeringCount()});break;case"follow_up_started":{if(H)S("message.complete",{messageId:H}),H=void 0;for(let YO of G.messages){if(!YO.recovered||YO.persisted)continue;if(Y.pendingResume?.projectedInputIds.has(YO.id))continue;S("message.created",{messageId:YO.id,role:"user",content:Y4(YO.content),recovered:!0}),Y.pendingResume?.projectedInputIds.add(YO.id)}S("follow_up.started",{runId:A,queued:G.queued,recovered:G.recovered}),t();break}case"goal_updated":S("goal.updated",{goal:G.goal});break;case"goal_continuation_started":S("goal.continuation.started",{goal:G.goal,continuation:G.continuation,...G.prematureStopPattern?{prematureStopPattern:G.prematureStopPattern}:{},...G.prematureStopCount!==void 0?{prematureStopCount:G.prematureStopCount}:{}}),t();break;case"compaction":S(G.phase==="start"?"compaction.started":"compaction.completed",{...G.reason?{reason:G.reason}:{},...G.strategy?{strategy:G.strategy}:{},...G.outcome?{outcome:G.outcome}:{},...G.preTokens!==void 0?{preTokens:G.preTokens}:{},...G.preTokenSource?{preTokenSource:G.preTokenSource}:{},...G.estimatedPendingTokens!==void 0?{estimatedPendingTokens:G.estimatedPendingTokens}:{},...G.postTokens!==void 0?{postTokens:G.postTokens}:{},...G.sampleAttempts!==void 0?{sampleAttempts:G.sampleAttempts}:{},...G.inputReductions!==void 0?{inputReductions:G.inputReductions}:{},...G.messagesOmitted!==void 0?{messagesOmitted:G.messagesOmitted}:{},...G.filesOmitted!==void 0?{filesOmitted:G.filesOmitted}:{},...G.imagesOmitted!==void 0?{imagesOmitted:G.imagesOmitted}:{},...G.fallbackTargetTokens!==void 0?{fallbackTargetTokens:G.fallbackTargetTokens}:{},...G.fallbackMessagesOmitted!==void 0?{fallbackMessagesOmitted:G.fallbackMessagesOmitted}:{},...G.fallbackMessagesTruncated!==void 0?{fallbackMessagesTruncated:G.fallbackMessagesTruncated}:{},...G.failureReason?{failureReason:G.failureReason}:{}});break;case"model_fallback":S("model.fallback",{});break;case"task_update":S("task.updated",{tasks:G.tasks});break;case"goal_frontier_updated":S("goal.frontier.updated",{goalId:G.goal.goalId,goalStatus:G.goal.status,frontier:G.frontier,stall:G.goal.frontierStall});break;default:break}},U0=(G)=>{let YO=G.metadata?.toolCallsCount;return new J1({taskFailure:A0(G.error?.details??G.error?.message??"Agent run failed"),outputStarted:n,toolExecutionStarted:r,toolCallsCount:typeof YO==="number"&&Number.isInteger(YO)?YO:-1})},RO=await Q4(P.chatStream($,bO,{stream:!0,pendingInputOnly:Y.pendingInputOnly,preparedInputTurn:Y.preparedInputTurn,goalContinuationOnly:Y.goalContinuationOnly,outputSchema:Y.outputSchema,taskAdmission:Y.taskAdmission}),EO);if(await QO(RO))return;if(!RO.success)throw U0(RO);for(let G=0;G<20;G++){let YO=O.pendingFollowUpRequested===!0;if(O.pendingFollowUpRequested=!1,c.getPendingSteeringCount()===0){if(!YO)break;continue}if(W.signal.aborted)break;if(RO=await Q4(P.chatStream("",bO,{stream:!0,pendingInputOnly:!0,taskAdmission:Y.taskAdmission}),EO),await QO(RO))return;if(!RO.success)throw U0(RO)}if(await Y0(x),Y.pendingResume&&W.signal.aborted&&W.signal.reason===q1)throw new J1({taskFailure:N1("timeout"),outputStarted:n,toolExecutionStarted:r,toolCallsCount:Number.isInteger(RO.metadata?.toolCallsCount)?RO.metadata?.toolCallsCount??-1:-1});if(W.signal.aborted||O.status==="cancelled"){await HO(),S("session.status",{status:"idle"});return}if(Y.pendingResume)Y.onPendingResumeSuccess?.(Y.pendingResume);if(H)S("message.complete",{messageId:H});S("thinking.completed",{}),O.status="completed",x.taskStatus="completed",x.taskCompletedAt??=new Date().toISOString(),S("session.completed",{runId:A,outputTruncated:RO.metadata?.outputTruncated??!1}),S("session.status",{status:"idle"})}catch(c){if(q&&Y.preparedInputTurn)await(q.getTurnRecoveryAssessment().state==="requires_attention"?q.finishTurn(Y.preparedInputTurn.handle,{preserveStartupRecovery:!0}):q.finishTurn(Y.preparedInputTurn.handle)).catch(()=>{return});let xO=Y.pendingResume!==void 0&&W.signal.aborted&&W.signal.reason===q1;if(W.signal.aborted&&!xO||O.status==="cancelled"){if(Y.pendingResume)Y.onPendingResumeCancelled?.(Y.pendingResume);X1(O,"runtime-abort"),await HO(),S("session.status",{status:"idle"});return}let e=c instanceof J1?c.evidence:xO?{taskFailure:N1("timeout"),outputStarted:n,toolExecutionStarted:r,toolCallsCount:-1}:Y.pendingResume?{taskFailure:A0(c),outputStarted:!0,toolExecutionStarted:!0,toolCallsCount:-1}:void 0,OO=Y.pendingResume!==void 0&&e!==void 0&&Y.onPendingResumeFailure?.(Y.pendingResume,e,xO||(q?.getPendingSteeringCount()??0)>0,xO)===!0;if(O.status="failed",OO){let t=await q?.setTaskStatus("running").catch(()=>{return});if(t)Z0(x,t);x.taskStatus="running",x.taskStatusReason=void 0,x.taskFailure=void 0,x.taskCompletedAt=void 0,S("session.status",{status:"running"});return}await Y0(x).catch(()=>{return}),d.error("[SessionRoutes] Agent execution error:",c),x.taskStatus="failed",x.taskCompletedAt??=new Date().toISOString();let bO=e?.taskFailure??A0(c);if(!x.taskFailure){let t=q?await q.setTaskStatus("failed",c).catch(()=>{return}):await y.updateSessionMetadata(x.id,x.projectPath,{taskStatus:"failed",taskStatusReason:bO.message,taskFailure:bO,taskCompletedAt:x.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(t)Z0(x,t)}x.taskStatusReason??=bO.message,x.taskFailure??=bO,S("session.error",{error:x.taskFailure.message,taskFailure:x.taskFailure}),S("session.status",{status:"error"})}finally{if(L)clearTimeout(L);if(Y.taskAdmission?.release(),Y.taskAdmission){let c=W0.getStats();S("task.status",{taskStatus:x.taskStatus,...x.taskStatusReason?{taskStatusReason:x.taskStatusReason}:{},...x.taskFailure?{taskFailure:x.taskFailure}:{},...x.taskStartedAt?{taskStartedAt:x.taskStartedAt}:{},...x.taskCompletedAt?{taskCompletedAt:x.taskCompletedAt}:{},...x.taskDiffStat?{taskDiffStat:x.taskDiffStat}:{},taskQueueDepth:c.queued,taskConcurrencyLimit:c.maxConcurrent,taskInFlight:c.inFlight,taskAdmissionPaused:c.paused,updatedAt:new Date().toISOString()})}if(await P?.destroy().catch(()=>{return}),T?.release(),k?.release(),O.disposeRuntimeOnSettle&&Y.disposeRuntime)await Y.disposeRuntime(x,q).catch((c)=>{d.warn(`[SessionRoutes] Failed to dispose terminal task runtime ${x.id}:`,c)});D3(O)}}async function Y$(O,x,$){d.info(`[SessionRoutes] Looking for permission ${x} in session ${O.sessionId}`),d.info(`[SessionRoutes] Active runs: ${rO.size}`);for(let[W,U]of rO.entries())if(d.info(`[SessionRoutes] Checking run ${W}: sessionId=${U.sessionId}, projectPath=${U.projectPath}, pendingPermission=${U.pendingPermission?.permissionId}`),U.sessionId===O.sessionId&&U.projectPath===O.projectPath&&U.pendingPermission?.permissionId===x){if(U.pendingPermission.details.interactionRequestId)await T0.respond(O.projectPath,O.sessionId,x,$);return U.pendingPermission.resolve($),d.info(`[SessionRoutes] Permission ${x} responded, runId: ${U.id}`),!0}let Q=await T0.findPending(O.projectPath,O.sessionId);if(!Q||Q.request.requestId!==x)return d.error(`[SessionRoutes] Permission not found: ${x}`),!1;await T0.respondAndRecover(O.projectPath,O.sessionId,x,$),E.publish(O,"interaction.resolved",{requestId:x});let Z=Q0;if(!Z?.accepting)return!0;let Y;try{Y=await Z.acquireOrHydrateSession(O);let W=Y.value,U=await y.findSessionMetadata(O.sessionId,O.projectPath);if(Q0!==Z||!Z.accepting||!Y.isCurrent())return!0;if(U)Z0(W,U);Z.resumeRecoveredInteraction(W).catch((A)=>{d.error(`[SessionRoutes] Failed to resume recovered interaction ${x}:`,A)})}catch(W){if(Q0!==Z||!Z.accepting)return!0;throw W}finally{Y?.release()}return!0}var X4=ZO("Service"),R3=V.Object({approved:V.Boolean(),remember:V.Optional(V.Boolean()),scope:V.Optional(zO(["once","session","project"])),targetMode:V.Optional(zO(["default","autoEdit","plan","yolo"])),feedback:V.Optional(V.String({maxLength:4000})),answers:V.Optional(V.Record(V.String({maxLength:80}),V.Union([V.String({maxLength:4000}),V.Array(V.String({maxLength:1000}),{maxItems:4})]),{maxProperties:4})),elicitation:V.Optional(V.Object({action:zO(["accept","decline","cancel"]),content:V.Optional(V.Record(V.String(),V.Union([V.String({maxLength:4000}),V.Number(),V.Boolean(),V.Array(V.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))}),N$=()=>{let O=new q3;return O.post("/:permissionId",async(x)=>{let $=x.req.param("permissionId"),Q=x.req.query("sessionId"),Z=x.req.query("projectPath");X4.info(`[PermissionRoutes] Received permission response: permissionId=${$}, sessionId=${Q}`);try{let Y=await x.req.json(),W=p(R3,Y);if(!W.success)throw new K("Invalid permission response format");let{approved:U,remember:A,scope:B,targetMode:M,feedback:H,answers:T,elicitation:k}=W.data;if(!Q)throw new K("sessionId query parameter is required");let q=await IO(Q,Z);if(!await Y$(q,$,{approved:U,reason:H,scope:B,targetMode:M,feedback:H,answers:T,elicitation:k}))throw new v("Permission request",$);return X4.info(`[PermissionRoutes] Permission ${$} ${U?"approved":"denied"}`),x.json({success:!0,approved:U,remember:A})}catch(Y){if(X4.error("[PermissionRoutes] Failed to respond to permission:",Y),Y instanceof K||Y instanceof SO||Y instanceof v||Y instanceof WO)throw Y;throw Y}}),O};import W$ from"node:path";import{Hono as S3}from"hono";var f3=V.Object({projectPath:V.String({minLength:1}),enabled:V.Boolean(),scope:V.Optional(zO(["local","project","global"]))}),C3=V.Object({projectPath:V.String({minLength:1})}),E3=V.Object({projectPath:V.String({minLength:1}),source:V.String({minLength:1}),trust:V.Literal(!0),ref:V.Optional(V.String({minLength:1}))}),P3=V.Object({projectPath:V.String({minLength:1}),trust:V.Literal(!0)}),k3=V.Object({projectPath:V.String({minLength:1}),confirm:V.Literal(!0)}),m3=V.Object({projectPath:V.String({minLength:1}),source:V.String({minLength:1}),ref:V.Optional(V.String({minLength:1}))}),X$=V.Object({projectPath:V.String({minLength:1}),confirm:V.Optional(V.Literal(!0))}),h3=V.Object({projectPath:V.String({minLength:1}),scope:V.Optional(zO(["local","project","global"])),policy:V.Object({restrictToAllowedSources:V.Boolean(),requireGitCommitSha:V.Boolean(),allowedGitHosts:V.Array(V.String()),allowedMarketplaces:V.Array(V.String()),allowedLocalRoots:V.Array(V.String())})});function lO(O){if(!O||!W$.isAbsolute(O))throw new K("projectPath must be absolute");return W$.resolve(O)}async function V$(O){let[x,$]=await Promise.all([oO(O),e0.getInstance().loadWorkspacePluginSettingsResolution(O)]);return x.plugins.getAll().map((Q)=>({name:Q.manifest.name,description:Q.manifest.description,version:Q.manifest.version,source:Q.source,enabled:Q.status==="active",status:Q.status,commands:Q.commands.length,skills:Q.skills.length,agents:Q.agents.length,hooks:Q.hooks?Object.values(Q.hooks).reduce((Z,Y)=>Z+(Array.isArray(Y)?Y.length:0),0):0,mcpServers:Object.keys(Q.mcpServers??{}).length,configurable:Q.source!=="cli",managed:Q.installation!==void 0,marketplace:Q.installation?.source.type==="marketplace"?Q.installation.source.marketplace:void 0,revision:Q.installation?.revision,installedAt:Q.installation?.installedAt,updatedAt:Q.installation?.updatedAt,compatibilityIssues:Q.compatibilityIssues??[],effectiveScope:Q.source==="cli"?"invocation":$.settings[Q.manifest.name]?.effectiveScope??"default",settingLayers:Q.source==="cli"?{invocation:!0}:$.settings[Q.manifest.name]?.layers??{}}))}async function y3(){let O=z$(),[x,$]=await Promise.all([O.listCatalogs(),O.listInstallationRecords()]),Q=new Map($.map((Z)=>[Z.name,Z]));return x.map(({marketplace:Z,manifest:Y})=>({name:Z.name,description:Y.description??Y.metadata?.description??"",sourceType:Z.source.type,revision:Z.revision,updatedAt:Z.updatedAt,plugins:Y.plugins.map((W)=>{let U=Q.get(W.name);return{name:W.name,description:W.description??"",version:W.version,category:W.category,tags:W.tags??[],installed:U!==void 0,installedVersion:U?.version}})}))}function h0(O,x){if(!O.success)throw new K(O.error??x)}var H$=()=>{let O=new S3;return O.get("/",async(x)=>{let $=lO(x.req.query("projectPath"));return x.json(await V$($))}),O.post("/refresh",async(x)=>{let $=p(C3,await x.req.json());if(!$.success)throw new K("Invalid plugin refresh request");let Q=lO($.data.projectPath),Z=await G$(Q);return x.json({plugins:await V$(Q),errors:Z.discovery.errors.map((Y)=>({code:Y.code??"LOAD_ERROR",error:Y.error}))})}),O.get("/catalog",async(x)=>{return lO(x.req.query("projectPath")),x.json(await y3())}),O.get("/policy",async(x)=>{let $=lO(x.req.query("projectPath")),Q=await e0.getInstance().loadWorkspacePluginSourcePolicy($);return x.json({policy:Q,environmentRequiresSha:process.env.BLADE_PLUGIN_REQUIRE_SHA==="1"||process.env.BLADE_PLUGIN_REQUIRE_SHA==="true"})}),O.post("/policy",async(x)=>{let $=p(h3,await x.req.json());if(!$.success)throw new K("Invalid plugin source policy request");let Q=lO($.data.projectPath),Z=await U$(Q,$.data.policy,$.data.scope??"global");return x.json({policy:Z})}),O.post("/install",async(x)=>{let $=p(E3,await x.req.json());if(!$.success)throw new K("Invalid plugin install request; explicit source trust is required");let Q=lO($.data.projectPath),{result:Z}=await B$(Q,$.data.source,{trusted:$.data.trust,ref:$.data.ref});return h0(Z,"Plugin installation failed"),x.json({name:Z.pluginName,version:Z.manifest?.version,revision:Z.installation?.revision,changed:Z.changed,installedDependencies:Z.installedDependencies??[]})}),O.post("/marketplaces",async(x)=>{let $=p(m3,await x.req.json());if(!$.success)throw new K("Invalid marketplace add request");let Q=lO($.data.projectPath),Z=await F$(Q,$.data.source,$.data.ref);return h0(Z,"Marketplace installation failed"),x.json({name:Z.marketplace?.name,plugins:Z.manifest?.plugins.length??0,revision:Z.marketplace?.revision,changed:Z.changed})}),O.post("/marketplaces/:name/refresh",async(x)=>{let $=p(X$,await x.req.json());if(!$.success)throw new K("Invalid marketplace refresh request");let Q=await L$(lO($.data.projectPath),x.req.param("name"));return h0(Q,"Marketplace refresh failed"),x.json({name:Q.marketplace?.name,plugins:Q.manifest?.plugins.length??0,revision:Q.marketplace?.revision,changed:Q.changed})}),O.post("/marketplaces/:name/remove",async(x)=>{let $=p(X$,await x.req.json());if(!$.success||$.data.confirm!==!0)throw new K("Invalid marketplace removal request; explicit confirmation is required");lO($.data.projectPath);let Q=await D$(x.req.param("name"),!0);return h0(Q,"Marketplace removal failed"),x.json({name:Q.marketplace?.name,removed:!0})}),O.post("/:name/update",async(x)=>{let $=p(P3,await x.req.json());if(!$.success)throw new K("Invalid plugin update request; explicit source trust is required");let Q=lO($.data.projectPath),{result:Z}=await _$(Q,x.req.param("name"),{trusted:$.data.trust});return h0(Z,"Plugin update failed"),x.json({name:Z.pluginName,version:Z.manifest?.version,revision:Z.installation?.revision,changed:Z.changed,updatedDependencies:Z.updatedDependencies??[]})}),O.post("/:name/uninstall",async(x)=>{let $=p(k3,await x.req.json());if(!$.success)throw new K("Invalid plugin uninstall request; explicit confirmation is required");let Q=lO($.data.projectPath),{result:Z}=await K$(Q,x.req.param("name"),$.data.confirm);return h0(Z,"Plugin uninstall failed"),x.json({name:Z.pluginName,removed:!0})}),O.post("/:name/state",async(x)=>{let $=p(f3,await x.req.json());if(!$.success)throw new K("Invalid plugin state request");let Q=lO($.data.projectPath),Z=x.req.param("name"),W=(await oO(Q)).plugins.get(Z);if(!W)throw new v("Plugin",Z);if(W.source==="cli")throw new K(`Plugin "${Z}" was loaded with --plugin-dir and is invocation-scoped`);let U=await w$(Q,Z,$.data.enabled,$.data.scope??"local");return x.json(U)}),O};import{Hono as d3}from"hono";import{execFile as g3}from"node:child_process";import u3 from"node:path";var w4="__BLADE_DIRECTORY_PICKER_CANCELLED__",p3=900000;function v3(O,x){return new Promise(($)=>{g3(O,[...x],{timeout:p3,maxBuffer:65536,windowsHide:!0},(Q,Z,Y)=>{let W=Q?.code;$({stdout:Z,stderr:Y,exitCode:typeof W==="number"?W:Q?1:0,...typeof W==="string"?{errorCode:W}:{}})})})}function V4(O){let x=O.replace(/[\r\n]+$/,"");if(!x||x===w4)return{cancelled:!0};if(!u3.isAbsolute(x))throw Error("The folder picker returned an invalid path");return{cancelled:!1,path:x}}function z4(O){return O.exitCode!==0||Boolean(O.errorCode)}class b${platform;runCommand;activeSelection=null;constructor(O={}){this.platform=O.platform??process.platform,this.runCommand=O.runCommand??v3}pick(){if(this.activeSelection)return this.activeSelection;let O=this.pickForPlatform().finally(()=>{this.activeSelection=null});return this.activeSelection=O,O}async pickForPlatform(){switch(this.platform){case"darwin":return this.pickOnMac();case"win32":return this.pickOnWindows();case"linux":return this.pickOnLinux();default:throw Error("Native folder selection is unavailable on this system")}}async pickOnMac(){let O=["try",'set selectedFolder to choose folder with prompt "Choose a project folder"',"return POSIX path of selectedFolder","on error number -128",`return "${w4}"`,"end try"].join(`
|
|
8
|
-
`),x=await this.runCommand("osascript",["-e",O]);if(z4(x))throw Error("Unable to open the macOS folder picker");return V4(x.stdout)}async pickOnWindows(){let O=["Add-Type -AssemblyName System.Windows.Forms","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",'$dialog.Description = "Choose a project folder"',"$dialog.ShowNewFolderButton = $true","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {"," [Console]::Out.Write($dialog.SelectedPath)","} else {",` [Console]::Out.Write("${w4}")`,"}"].join("; "),x=await this.runCommand("powershell.exe",["-NoProfile","-STA","-Command",O]);if(z4(x))throw Error("Unable to open the Windows folder picker");return V4(x.stdout)}async pickOnLinux(){let O=[{command:"zenity",args:["--file-selection","--directory","--title=Choose a project folder"]},{command:"kdialog",args:["--getexistingdirectory",".","--title","Choose a project folder"]}];for(let x of O){let $=await this.runCommand(x.command,x.args);if($.errorCode==="ENOENT")continue;if($.exitCode===1&&!$.stdout.trim()&&!$.stderr.trim())return{cancelled:!0};if(z4($))throw Error("Unable to open the Linux folder picker");return V4($.stdout)}throw Error("Install zenity or kdialog to use native folder selection")}}var j$=new b$;var l3=V.Object({path:V.String({minLength:1})});function c3(O){if(!O)return!1;if(O==="tauri://localhost"||O==="http://tauri.localhost")return!0;try{let x=new URL(O).hostname;return x==="localhost"||x==="127.0.0.1"||x==="::1"||x==="[::1]"}catch{return!1}}var M$=(O={})=>{let x=new d3,$=O.pickDirectory??(()=>j$.pick()),Q=O.allowDirectoryPickerRequest??c3;return x.get("/",async(Z)=>{return Z.json(await P1.list($O()))}),x.post("/",async(Z)=>{let Y;try{Y=await Z.req.json()}catch{throw new K("A valid JSON body is required")}let W=p(l3,Y);if(!W.success)throw new K("A project path is required");try{let U=await P1.bind(W.data.path,$O());return Z.json(U,201)}catch(U){throw new K(U instanceof Error?U.message:"Failed to bind project")}}),x.post("/pick",async(Z)=>{if(!Q(Z.req.header("Origin")))throw new WO("LOCAL_ACCESS_REQUIRED","Folder selection is only available from this machine",403);try{return Z.json(await $())}catch(Y){throw new K(Y instanceof Error?Y.message:"Failed to select a folder")}}),x.delete("/",async(Z)=>{let Y=Z.req.query("path");if(!Y)throw new K("A project path is required");try{let W=await P1.unbind(Y);return Z.json({success:!0,removed:W})}catch(W){throw new K(W instanceof Error?W.message:"Failed to unbind project")}}),x};import{Hono as i3}from"hono";var A$=ZO("Service"),R$=()=>{let O=new i3;return O.get("/",async(x)=>{try{let $=await I$();return x.json($)}catch($){return A$.error("[ProviderRoutes] Failed to list providers:",$),x.json([])}}),O.get("/:provider/models",async(x)=>{let $=x.req.param("provider");try{let Q=await q$($);return x.json(Q)}catch(Q){return A$.error("[ProviderRoutes] Failed to list models:",Q),x.json([])}}),O.put("/:provider/credential",async(x)=>{let $=x.req.param("provider"),Q=await x.req.json();if(!Q.apiKey?.trim())throw new K("apiKey is required");return await L0().setApiKey($,Q.apiKey.trim()),x.json({success:!0})}),O.delete("/:provider/credential",async(x)=>{return await L0().clearCredential(x.req.param("provider")),x.json({success:!0})}),O.put("/:provider",async(x)=>{let $=x.req.param("provider"),Q=FO(),Z=Q?.modelProviders[$];if(!Q||!Z)throw new v("Model provider",$);let Y=await x.req.json();if(!Y.name||!Y.baseUrl||!Y.wireApi)throw new K("name, baseUrl and wireApi are required");let W="apiKeyEnv"in Y?Y.apiKeyEnv?.trim():Z.apiKeyEnv,U={name:Y.name,baseUrl:Y.baseUrl,wireApi:Y.wireApi,...W?{apiKeyEnv:W}:{}},A=L0(),B=Y.apiKey?.trim()?await A.credentials.read($):void 0;if(Y.apiKey?.trim())await A.setApiKey($,Y.apiKey.trim());try{return await uO().updateModelProvider($,U),x.json({success:!0})}catch(M){if(Y.apiKey?.trim())if(B)await A.credentials.modify($,async()=>B);else await A.credentials.delete($);if(M instanceof Error&&(M.message.includes("modelProviders.")||M.message.includes("built-in provider")))throw new K(M.message);throw M}}),O.delete("/:provider",async(x)=>{let $=x.req.param("provider");if(!FO()?.modelProviders[$])throw new v("Model provider",$);let Z=x.req.query("removeModels");if(Z!==void 0&&Z!=="true"&&Z!=="false")throw new K("removeModels must be true or false");try{let Y=await uO().removeModelProvider($,{removeModels:Z==="true"});return x.json({success:!0,...Y})}catch(Y){if(Y instanceof Error&&(Y.message.includes("still referenced")||Y.message.includes("owns the only model")))throw new g(Y.message);throw Y}}),O.post("/:provider/probe",async(x)=>{let $=x.req.param("provider"),Q=FO();if(!Q?.modelProviders[$])throw new v("Model provider",$);let Z=await x.req.json().catch(()=>({})),Y=Q.models.filter((U)=>U.provider===$),W=Z.modelId?Y.find((U)=>U.id===Z.modelId):Y[0];if(!W)throw new K(Z.modelId?"modelId does not reference this provider":"Model provider has no configured model to probe");return x.json(await T$(W,Q))}),O};import{Hono as a3}from"hono";var o3=ZO("Service"),E$=(O,x)=>{let $=new a3;return $.onError((Q,Z)=>{if(Q instanceof WO)return Z.json(Q.toObject(),Q.statusCode);return o3.error("[ScheduleRoutes] Unhandled route error:",Q),Z.json(new JO("Schedule request failed").toObject(),500)}),$.get("/",async(Q)=>{let Z=await O.list();return Q.json(C$.parse({schedules:Z}))}),$.post("/",async(Q)=>{let Z;try{Z=await Q.req.json()}catch{throw new K("Invalid request body")}let Y=p(S$,Z);if(!Y.success)throw new K("Invalid schedule request");let W=Y.data.projectPath||Q.get("directory")||$O();try{let U=await O.create({...Y.data,projectPath:W});return Q.json(I0.parse(U),201)}catch(U){throw new K(U instanceof Error?U.message:"Failed to create schedule")}}),$.get("/:id",async(Q)=>{let Z=await O.get(Q.req.param("id"));if(!Z)throw new v("Schedule not found");return Q.json(I0.parse(Z))}),$.patch("/:id",async(Q)=>{let Z;try{Z=await Q.req.json()}catch{throw new K("Invalid request body")}let Y=p(f$,Z);if(!Y.success)throw new K("Invalid schedule update");let{modelId:W,reasoningEffort:U,serviceTier:A,responseVerbosity:B,communicationStyle:M,isolation:H,permissionMode:T,...k}=Y.data,q={...W!==void 0?{modelId:W}:{},...U!==void 0?{reasoningEffort:U}:{},...A!==void 0?{serviceTier:A}:{},...B!==void 0?{responseVerbosity:B}:{},...M!==void 0?{communicationStyle:M}:{},...H!==void 0?{isolation:H}:{},...T!==void 0?{permissionMode:T}:{}};try{let P=await O.update(Q.req.param("id"),{...k,...Object.keys(q).length>0?{dispatch:q}:{}});if(!P)throw new v("Schedule not found");return Q.json(I0.parse(P))}catch(P){if(P instanceof WO)throw P;throw new K(P instanceof Error?P.message:"Failed to update schedule")}}),$.delete("/:id",async(Q)=>{if(!await O.remove(Q.req.param("id")))throw new v("Schedule not found");return Q.json({ok:!0})}),$.post("/:id/enable",async(Q)=>{let Z=await O.setEnabled(Q.req.param("id"),!0);if(!Z)throw new v("Schedule not found");return Q.json(I0.parse(Z))}),$.post("/:id/disable",async(Q)=>{let Z=await O.setEnabled(Q.req.param("id"),!1);if(!Z)throw new v("Schedule not found");return Q.json(I0.parse(Z))}),$.post("/:id/run",async(Q)=>{let Z=await O.get(Q.req.param("id"));if(!Z)throw new v("Schedule not found");if(!x)throw new JO("Scheduler is not running in this process");await x.fire(Z,new Date,{manual:!0});let Y=await O.get(Z.id);return Q.json(I0.parse(Y??Z),202)}),$};import*as z0 from"node:fs/promises";import{homedir as m$}from"node:os";import*as cO from"node:path";import{Hono as n3}from"hono";var q0=ZO("Service"),P$=cO.join(m$(),".blade","skills"),G4=cO.join(m$(),".blade","skills-config.json");async function h$(){try{let O=await z0.readFile(G4,"utf-8");return JSON.parse(O)}catch{return{disabled:[]}}}async function t3(O){await z0.mkdir(cO.dirname(G4),{recursive:!0}),await z0.writeFile(G4,JSON.stringify(O,null,2))}async function s3(O,x){let $=await h$();if(x)$.disabled=$.disabled.filter((Q)=>Q!==O);else if(!$.disabled.includes(O))$.disabled.push(O);await t3($)}var V0=null,r3=300000,e3=6;async function O5(){if(V0&&Date.now()-V0.timestamp<r3)return V0.data;try{let O=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!O.ok){if(q0.warn(`GitHub API returned ${O.status}`),V0)return V0.data;throw Error(`GitHub skills catalog returned ${O.status}`)}let $=(await O.json()).filter((W)=>W.type==="dir"),Q=Array($.length),Z=0,Y=Math.min(e3,$.length);return await Promise.all(Array.from({length:Y},async()=>{while(Z<$.length){let W=Z++,U=$[W];if(!U)continue;let A=`Official ${U.name} skill`;try{let B=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${U.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(B.ok){let H=(await B.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(H)A=H[1].trim().slice(0,100)}}catch{}Q[W]={name:U.name,description:A,tag:"Official",author:"Anthropic"}}})),V0={data:Q,timestamp:Date.now()},Q}catch(O){if(q0.warn("Failed to fetch skills catalog from GitHub:",O),V0)return V0.data;throw O}}var y$=()=>{let O=new n3;return O.get("/",async(x)=>{try{let $=x.get("directory")||$O(),Z=(await oO($)).skills.getAll(),Y=await h$(),W=Z.map((U)=>({id:U.name,name:U.name,enabled:!Y.disabled.includes(U.name),description:U.description||"",version:U.version||"1.0.0",provider:"Local",location:U.source==="builtin"?"Built-in":U.basePath,removable:U.source==="user"&&cO.dirname(cO.resolve(U.basePath))===cO.resolve(P$),capabilities:["prompts"],allowedTools:U.allowedTools||[]}));return x.json(W)}catch($){return q0.error("[SkillsRoutes] Failed to get skills:",$),x.json({error:$ instanceof Error?$.message:"Failed to get skills"},500)}}),O.post("/:name/toggle",async(x)=>{try{let $=x.req.param("name"),Q=await x.req.json();return await s3($,Q.enabled),x.json({success:!0,enabled:Q.enabled})}catch($){return q0.error("[SkillsRoutes] Failed to toggle skill:",$),x.json({success:!1,error:$.message},500)}}),O.delete("/:name",async(x)=>{try{let $=x.req.param("name"),Q=x.get("directory")||$O();return $1(Q,async(Z)=>{let Y=Z.skills,W=Y.get($);if(!W)return x.json({success:!1,error:"Skill not found"},404);let U=cO.resolve(W.basePath),A=cO.resolve(P$);if(W.source!=="user"||cO.dirname(U)!==A)return x.json({success:!1,error:"Only Blade user skills can be uninstalled"},400);return await z0.rm(U,{recursive:!0,force:!0}),await Y.refresh(),x1(Q),await O1(Q),x.json({success:!0})})}catch($){return q0.error("[SkillsRoutes] Failed to uninstall skill:",$),x.json({success:!1,error:$.message},500)}}),O.post("/install",async(x)=>{try{let $=await x.req.json(),Q=k$(),Z=x.get("directory")||$O();return $1(Z,async(Y)=>{let W=Y.skills,U=!1;if($.source==="catalog"&&$.name){if(U=await Q.installOfficialSkill($.name),!U)return x.json({success:!1,error:"Failed to install skill from catalog"},500)}else if($.source==="repo"&&$.url){if(U=await Q.installFromRepo($.url,$.name),!U)return x.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if($.source==="local"&&$.path){if(U=await Q.installFromLocal($.path,$.name),!U)return x.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return x.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await W.refresh(),x1(Z),await O1(Z),x.json({success:!0})})}catch($){return q0.error("[SkillsRoutes] Failed to install skill:",$),x.json({success:!1,error:$.message},500)}}),O.get("/catalog",async(x)=>{try{let $=await O5();return x.json($)}catch($){return q0.error("[SkillsRoutes] Failed to get catalog:",$),x.json({error:$ instanceof Error?$.message:"Failed to get skills catalog"},502)}}),O};import{execSync as x5}from"node:child_process";import{readdir as $5}from"node:fs/promises";import k1 from"node:path";import Q5 from"fast-glob";import{Hono as Z5}from"hono";var B1=ZO("Service"),J5=(O)=>{try{return x5("git rev-parse --abbrev-ref HEAD",{cwd:O,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},Y5=[...y0.map((O)=>`${O}/**`),...y0,...y0.map((O)=>`**/${O}/**`),...y0.map((O)=>`**/${O}`),...U4.map((O)=>`**/${O}`)],N5=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),p$=()=>{let O=new Z5;return O.get("/commands",async(x)=>{try{let $=x.req.query("q")||"",Q=x.get("directory")||$O(),Z=await oO(Q),Y=u$($,Q,Z).filter((W)=>!N5.has(W.command));return x.json(Y)}catch($){return B1.error("[SuggestionsRoutes] Failed to get command suggestions:",$),x.json([])}}),O.get("/files",async(x)=>{try{let $=x.req.query("q")||"",Q=x.get("directory")||$O(),Z=Math.min(Number(x.req.query("limit"))||100,1000),Y=x.req.query("type")==="file",U=(await Q5("**/*",{cwd:Q,dot:!1,followSymbolicLinks:!1,onlyFiles:Y,markDirectories:!0,unique:!0,ignore:Y5})).map((M)=>M.replace(/\\/g,"/"));if(!$)return x.json(U.slice(0,Z));let A=$.toLowerCase(),B=U.filter((M)=>M.toLowerCase().includes(A)).slice(0,Z);return x.json(B)}catch($){return B1.error("[SuggestionsRoutes] Failed to get file suggestions:",$),x.json([])}}),O.get("/files/tree",async(x)=>{try{let $=x.get("directory")||$O(),Q=x.req.query("path")||"",Z=Q?k1.join($,Q):$,W=(await $5(Z,{withFileTypes:!0})).map((B)=>({name:B.name,path:Q?`${Q}/${B.name}`:B.name,type:B.isDirectory()?"dir":"file"}));W.sort((B,M)=>{if(B.type!==M.type)return B.type==="dir"?-1:1;return B.name.localeCompare(M.name)});let U=new Set(y0),A=W.filter((B)=>{let M=B.name;if(M.startsWith("."))return!1;if(U.has(M))return!1;for(let H of U4)if(M.match(new RegExp(H.replace("*",".*"))))return!1;return!0});return x.json(A)}catch($){return B1.error("[SuggestionsRoutes] Failed to get file tree:",$),x.json([])}}),O.get("/files/content",async(x)=>{try{let $=x.req.query("path");if(!$)return x.json({error:"Missing file path"},400);let Q=x.get("directory")||$O(),Z=k1.resolve(Q,$),Y=k1.relative(Q,Z);if(Y.startsWith("..")||k1.isAbsolute(Y))return x.json({error:"Invalid file path"},400);let W=g$(),U=await W.stat(Z);if(!U?.isFile)return x.json({error:"File not found"},404);let A=200000,B=await W.readTextFile(Z),M=B.length>A;return x.json({path:$,content:M?B.slice(0,A):B,truncated:M,size:U.size})}catch($){return B1.error("[SuggestionsRoutes] Failed to get file content:",$),x.json({error:"Failed to read file"},500)}}),O.get("/git-info",async(x)=>{try{let $=x.get("directory")||$O(),Q=J5($);return x.json({branch:Q})}catch($){return B1.error("[SuggestionsRoutes] Failed to get git info:",$),x.json({branch:null})}}),O};import{Hono as W5}from"hono";var g0=ZO("Service"),i$=(O)=>{let x=new W5;return x.onError(($,Q)=>{if($ instanceof WO)return Q.json($.toObject(),$.statusCode);return g0.error("[TaskRoutes] Unhandled route error:",$),Q.json(new JO("Failed to dispatch task").toObject(),500)}),x.post("/",async($)=>{let Q;try{Q=await $.req.json()}catch{throw new K("Invalid request body")}let Z=p(d$,Q);if(!Z.success)throw new K("Invalid task request");if((Z.data.attachments??[]).reduce((W,U)=>W+(typeof U.content==="string"?Buffer.byteLength(U.content):0),0)>C1)throw new K("Task attachments exceed the 5 MiB limit");if(Z.data.taskDueAt&&!Number.isFinite(Date.parse(Z.data.taskDueAt)))throw new K("Invalid task due date");try{let W=await O.dispatchTask({prompt:Z.data.prompt,title:Z.data.title,taskPriority:Z.data.taskPriority,taskKind:Z.data.taskKind,taskDueAt:Z.data.taskDueAt?new Date(Z.data.taskDueAt).toISOString():void 0,sourceProjectPath:Z.data.projectPath||$.get("directory")||$O(),isolation:Z.data.isolation,permissionMode:Z.data.permissionMode,modelId:Z.data.modelId,reasoningEffort:Z.data.reasoningEffort,serviceTier:Z.data.serviceTier,responseVerbosity:Z.data.responseVerbosity,communicationStyle:Z.data.communicationStyle,attachments:Z.data.attachments,outputSchema:Z.data.outputSchema});return $.json(_4.parse(W),202)}catch(W){if(W instanceof K||W instanceof g||W instanceof KO||W instanceof dO)throw W;throw g0.error("[TaskRoutes] Failed to dispatch task:",W),new JO("Failed to dispatch task")}}),x.patch("/:sessionId",async($)=>{let Q;try{Q=await $.req.json()}catch{throw new K("Invalid request body")}let Z=p(l$,Q);if(!Z.success)throw new K("Invalid task update");if(Z.data.title===void 0&&Z.data.taskPriority===void 0&&Z.data.taskKind===void 0&&Z.data.taskDueAt===void 0)throw new K("Task update must include at least one field");if(typeof Z.data.taskDueAt==="string"&&!Number.isFinite(Date.parse(Z.data.taskDueAt)))throw new K("Invalid task due date");try{let Y=await O.updateTask($.req.param("sessionId"),{...Z.data,...typeof Z.data.taskDueAt==="string"?{taskDueAt:new Date(Z.data.taskDueAt).toISOString()}:{}},$.req.query("projectPath"));return $.json(B4.parse(Y))}catch(Y){if(Y instanceof K||Y instanceof v||Y instanceof g)throw Y;throw g0.error("[TaskRoutes] Failed to update task:",Y),new JO("Failed to update task")}}),x.post("/:sessionId/retry",async($)=>{try{let Q=await O.retryTask($.req.param("sessionId"),$.req.query("projectPath"));return $.json(_4.parse(Q),202)}catch(Q){if(Q instanceof K||Q instanceof v||Q instanceof g||Q instanceof KO||Q instanceof dO)throw Q;throw g0.error("[TaskRoutes] Failed to retry task:",Q),new JO("Failed to retry task")}}),x.get("/:sessionId/diff",async($)=>{try{let Q=await O.getTaskDiff($.req.param("sessionId"),$.req.query("projectPath"));return $.json(v$.parse(Q))}catch(Q){if(Q instanceof K||Q instanceof v||Q instanceof g)throw Q;throw g0.error("[TaskRoutes] Failed to load task diff:",Q),new JO("Failed to load task diff")}}),x.post("/:sessionId/delivery",async($)=>{let Q;try{Q=await $.req.json()}catch{throw new K("Invalid request body")}let Z=p(c$,Q);if(!Z.success)throw new K("Invalid task delivery request");try{let Y=await O.deliverTask($.req.param("sessionId"),Z.data.action,$.req.query("projectPath"));return $.json(B4.parse(Y))}catch(Y){if(Y instanceof K||Y instanceof v||Y instanceof g)throw Y;throw g0.error("[TaskRoutes] Failed to deliver task:",Y),new JO("Failed to deliver task")}}),x};import t$ from"node:path";import{Hono as z5}from"hono";var X5=tO(V.Object({id:V.String(),name:V.String(),subagentType:V.String(),description:V.String(),agentId:V.Optional(V.String()),status:zO(["leader","running","completed","failed","cancelled","unknown"]),result:V.Optional(V.Unknown()),stats:V.Optional(V.Unknown()),worktreePath:V.Optional(V.String())})),V5=tO(V.Object({id:V.String(),subject:V.String(),description:V.String(),status:zO(["pending","blocked","running","completed"]),owner:V.Optional(V.String()),priority:zO(["high","medium","low"]),dependsOn:V.Array(V.String()),blocks:V.Array(V.String()),result:V.Optional(V.String()),createdAt:V.String(),startedAt:V.Optional(V.String()),completedAt:V.Optional(V.String())})),l7=tO(V.Object({name:V.String(),description:V.Optional(V.String()),status:zO(["idle","running","completed","failed","deleted"]),leadAgentId:V.String(),leadSessionId:V.Optional(V.String()),workspaceRoot:V.Optional(V.String()),peerMessagingEnabled:V.Boolean(),createdAt:V.Number(),updatedAt:V.Number(),deletedAt:V.Optional(V.Number()),members:V.Array(X5),tasks:V.Array(V5)})),a$=tO(V.Object({sessionId:V.String({minLength:1}),projectPath:V.String({minLength:1}),name:V.String({minLength:1}),description:V.Optional(V.String()),leadAgentType:V.Optional(V.String()),peerMessagingEnabled:V.Optional(V.Boolean()),members:V.Array(V.Object({name:V.String({minLength:1}),subagentType:V.String({minLength:1}),description:V.Optional(V.String()),prompt:V.String({minLength:10,maxLength:32768})}),{maxItems:32}),tasks:V.Optional(V.Array(V.Object({subject:V.String({minLength:1}),description:V.String({minLength:1}),dependsOn:V.Optional(V.Array(V.String())),assignedTo:V.Optional(V.String()),priority:V.Optional(zO(["high","medium","low"]))}),{maxItems:256}))})),o$=tO(V.Object({sessionId:V.String({minLength:1}),projectPath:V.String({minLength:1}),to:V.String({minLength:1}),message:V.String({minLength:1,maxLength:32768})})),n$=tO(V.Object({sessionId:V.String({minLength:1}),projectPath:V.String({minLength:1}),memberId:V.String({minLength:1})}));var w5=ZO("Service"),O2=()=>{let O=new z5;return O.onError((x,$)=>{if(x instanceof WO)return $.json(x.toObject(),x.statusCode);return w5.error("[TeamRoutes] Unhandled route error:",x),$.json(new JO("Team operation failed").toObject(),500)}),O.get("/",async(x)=>{p0();let $=await v0(x.req.query("sessionId"),x.req.query("projectPath"));return x.json(await u0($.projectPath).list($))}),O.post("/",async(x)=>{p0();let $=p(a$,await K4(x.req));if(!$.success)throw new K("Invalid team request");let Q=await v0($.data.sessionId,$.data.projectPath),Z=await y.findSessionMetadata(Q.sessionId,Q.projectPath);return x.json(await u0(Q.projectPath).create({name:$.data.name,description:$.data.description,leadAgentType:$.data.leadAgentType,owner:Q,modelId:Z?.selectedModelId,peerMessagingEnabled:$.data.peerMessagingEnabled,members:$.data.members,tasks:$.data.tasks}),201)}),O.get("/:teamName",async(x)=>{p0();let $=await v0(x.req.query("sessionId"),x.req.query("projectPath"));return x.json(await u0($.projectPath).getSnapshot(x.req.param("teamName"),$))}),O.post("/:teamName/messages",async(x)=>{p0();let $=p(o$,await K4(x.req));if(!$.success)throw new K("Invalid team message");let Q=await v0($.data.sessionId,$.data.projectPath),Z=await u0(Q.projectPath).sendMessage({name:x.req.param("teamName"),to:$.data.to,body:$.data.message,owner:Q});return x.json({messages:Z})}),O.post("/:teamName/tasks/claim",async(x)=>{p0();let $=p(n$,await K4(x.req));if(!$.success)throw new K("Invalid team task claim");let Q=await v0($.data.sessionId,$.data.projectPath);return x.json({task:await u0(Q.projectPath).claimTask(x.req.param("teamName"),$.data.memberId,Q)})}),O.delete("/:teamName",async(x)=>{p0();let $=await v0(x.req.query("sessionId"),x.req.query("projectPath"));return x.json(await u0($.projectPath).delete(x.req.param("teamName"),{owner:$,killRunning:!0}))}),O};function u0(O){return new e$({configDir:f1(),subagentRegistry:r$(O)})}function p0(){if(s$().config.config?.agentTeamsEnabled!==!0)throw new KO("Agent Teams are disabled")}async function v0(O,x){if(!O||!x||!t$.isAbsolute(x))throw new K("sessionId and absolute projectPath are required");let $=t$.resolve(x);if(!await y.findSessionMetadata(O,$))throw new v(`Session not found: ${O}`);return{sessionId:O,projectPath:$}}async function K4(O){try{return await O.json()}catch{throw new K("Invalid request body")}}import{Hono as G5}from"hono";var w0=ZO("Service"),d0=new Map,x2=2097152,$2=65536;function Q2(){return typeof globalThis.Bun<"u"}async function U5(O,x,$){if(Q2()){let{spawn:Y}=await import("bun-pty"),W=Y(O,x,{name:"xterm-256color",cwd:$.cwd,env:$.env});return{pid:W.pid,write:(U)=>W.write(U),resize:(U,A)=>W.resize(U,A),kill:()=>W.kill(),onData:(U)=>W.onData(U),onExit:(U)=>W.onExit(U)}}let Z=(await import("node-pty")).spawn(O,x,{name:"xterm-256color",cwd:$.cwd,env:$.env,cols:80,rows:24});return{pid:Z.pid,write:(Y)=>Z.write(Y),resize:(Y,W)=>Z.resize(Y,W),kill:()=>Z.kill(),onData:(Y)=>{Z.onData(Y)},onExit:(Y)=>{Z.onExit(Y)}}}var D4=void 0,L4;if(Q2())try{let{createBunWebSocket:O}=await import("hono/bun"),x=O();L4=x.upgradeWebSocket,D4=x.websocket}catch(O){w0.warn("[Terminal] Failed to initialize Bun WebSocket support:",O)}async function Z2(O,x){let $=`term-${Date.now()}`;w0.info(`[Terminal] New connection: ${$}, cwd: ${O}`);let Q=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",Z=Q.endsWith("sh")?["-l"]:[],Y=await U5(Q,Z,{cwd:O,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),W={id:$,process:Y,cwd:O,buffer:"",subscribers:new Set};if(d0.set($,W),W.subscribers.add(x),Y.onData((U)=>{let A=!1;for(let B of W.subscribers)try{B.send(U),A=!0}catch{W.subscribers.delete(B)}if(A)return;if(W.buffer+=U,W.buffer.length>x2)W.buffer=W.buffer.slice(-x2)}),Y.onExit(({exitCode:U})=>{w0.info(`[Terminal] Process exited: ${$}, code: ${U}`);for(let A of W.subscribers)try{A.close()}catch{}d0.delete($)}),W.buffer){let U=W.buffer;W.buffer="";for(let A=0;A<U.length;A+=$2)x.send(U.slice(A,A+$2))}return{session:W,cleanup:()=>{if(w0.info(`[Terminal] Connection closed: ${$}`),W.subscribers.delete(x),W.subscribers.size===0){try{W.process.kill()}catch{}d0.delete($)}}}}function J2(O,x){O.on("connection",async($,Q)=>{let Z=new URL(Q.url||"/",`http://${Q.headers.host}`);if(!Z.pathname.endsWith("/terminal/ws")){$.close();return}let Y=Z.searchParams.get("cwd")||x()||$O();try{let{session:W,cleanup:U}=await Z2(Y,{send:(A)=>$.send(A),close:()=>$.close()});$.on("message",(A)=>{try{W.process.write(String(A))}catch(B){w0.error("[Terminal] Failed to write to PTY:",B)}}),$.on("close",U),$.on("error",U)}catch(W){w0.error("[Terminal] Failed to spawn PTY:",W),$.close()}})}var Y2=()=>{let O=new G5;if(O.get("/status",(x)=>{let $=Array.from(d0.values()).map((Q)=>({id:Q.id,cwd:Q.cwd}));return x.json({active:$.length,terminals:$})}),O.post("/kill/:terminalId",(x)=>{let $=x.req.param("terminalId"),Q=d0.get($);if(Q){try{Q.process.kill()}catch{}for(let Z of Q.subscribers)Z.close();return d0.delete($),x.json({success:!0})}return x.json({success:!1,error:"Terminal not found"},404)}),L4)O.get("/ws",L4((x)=>{let $=x.req.query("cwd")||x.get("directory")||$O(),Q;return{async onOpen(Z,Y){try{Q=await Z2($,{send:(W)=>Y.send(W),close:()=>Y.close()})}catch(W){w0.error("[Terminal] Failed to spawn PTY:",W),Y.close()}},onMessage(Z){if(!Q)return;try{Q.session.process.write(String(Z.data))}catch(Y){w0.error("[Terminal] Failed to write to PTY:",Y)}},onClose(){Q?.cleanup()}}}));else O.get("/ws",(x)=>{return x.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return O};import B5 from"node:path";import{Hono as _5}from"hono";var K5=V.Object({projectPath:V.String({minLength:1}),action:zO(["trust","revoke"])});function N2(O){if(!B5.isAbsolute(O))throw new K("projectPath must be absolute")}var X2=()=>{let O=new _5;return O.get("/",async(x)=>{let $=x.req.query("projectPath");if(!$)throw new K("projectPath query parameter is required");return N2($),x.json(await H4.getInstance().getStatus($))}),O.post("/",async(x)=>{let $=p(K5,await x.req.json());if(!$.success)throw new K("Invalid workspace trust request");let{projectPath:Q,action:Z}=$.data;N2(Q);let Y=H4.getInstance(),W=Z==="trust"?await Y.trust(Q):await Y.revoke(Q);return await W2(),x.json({...W,reloadRequired:W.sensitiveSources>0})}),O};var qO=ZO("Service"),M4=[],m1,c0,i0,R0,l0,V2=new Map,z2=new Map,R5=new Set([".css",".html",".js",".json",".svg"]),S5=1024,f5=3600000;function C5(O,x){if(!O)return 0;let $=O.split(",").map((Q)=>{let[Z,...Y]=Q.trim().toLowerCase().split(";"),W=Y.find((A)=>A.trim().startsWith("q=")),U=W?Number(W.trim().slice(2)):1;return{name:Z,quality:Number.isFinite(U)?Math.max(0,Math.min(1,U)):0}});return $.find((Q)=>Q.name===x)?.quality??$.find((Q)=>Q.name==="*")?.quality??0}function w2(){if(i0)return;let O=()=>{y.collectStaleEmptySessions().then((x)=>{if(x>0)qO.info(`[SessionGC] removed ${x} stale empty session(s)`)}).catch((x)=>{qO.warn("[SessionGC] failed to collect stale empty sessions:",x)})};O(),i0=setInterval(O,f5),i0.unref?.()}function E5(){if(!i0)return;clearInterval(i0),i0=void 0}function P5(O){return["br","gzip"].map(($)=>({encoding:$,quality:C5(O,$)})).filter(($)=>$.quality>0).sort(($,Q)=>Q.quality-$.quality||($.encoding==="br"?-1:1))[0]?.encoding}function k5(O){let x=V2.get(O);if(x)return x;let $=_1(O);return V2.set(O,$),$}function m5(O,x,$){let Q=`${$}:${O}`,Z=z2.get(Q);if(Z)return Z;let Y=$==="br"?j5(x,{params:{[A5.BROTLI_PARAM_QUALITY]:5}}):M5(x,{level:6});return z2.set(Q,Y),Y}function h5(){let O=D5(b5(import.meta.url)),x=[G0(O,"web"),G0($O(),"dist/web"),G0($O(),"packages/cli/dist/web")];for(let $ of x){let Q=G0($,"index.html");if(j4(Q)){if(_1(Q,"utf-8").includes("/assets/"))return qO.debug(`[Server] Found web dist at: ${$}`),$}}return null}function y5(){let O=new T5;O.onError((Z,Y)=>{if(qO.error("[Server] Request error:",Z),Z instanceof B2){let U=new dO(Z.message,{resource:"workspace_agent_resources",limit:Z.capacity});return Y.json(U.toObject(),429)}if(Z instanceof WO)return Y.json(Z.toObject(),Z.statusCode);let W=Z instanceof Error?Z.message:String(Z);return Y.json({error:{code:"INTERNAL_ERROR",message:W}},500)}),O.use(async(Z,Y)=>{let W=process.env.BLADE_SERVER_PASSWORD;if(!W)return Y();let U=Z.req.path;if(U==="/"||U==="/favicon.svg"||U.startsWith("/assets/")||U.endsWith(".html")||U.endsWith(".js")||U.endsWith(".css"))return Y();let A=Z.req.header("Authorization");if(!A?.startsWith("Basic "))return Z.header("WWW-Authenticate",'Basic realm="Blade Server"'),Z.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let B=Buffer.from(A.slice(6),"base64").toString(),[M,H]=B.split(":"),T=process.env.BLADE_SERVER_USERNAME??"blade";if(M!==T||H!==W)return Z.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return Y()}),O.use(async(Z,Y)=>{let W=Z.req.path==="/health"||Z.req.path==="/global/health"||Z.req.path.startsWith("/assets/");if(!W)qO.debug(`[Server] ${Z.req.method} ${Z.req.path}`);let U=Date.now();if(await Y(),!W){let A=Date.now()-U;qO.debug(`[Server] ${Z.req.method} ${Z.req.path} - ${Z.res.status} (${A}ms)`)}}),O.use(I5({origin(Z){if(!Z)return;if(Z.startsWith("http://localhost:"))return Z;if(Z.startsWith("http://127.0.0.1:"))return Z;if(Z==="tauri://localhost"||Z==="http://tauri.localhost")return Z;if(M4.includes(Z))return Z;return}})),O.use(async(Z,Y)=>{let W=Z.req.query("directory")||Z.req.header("x-blade-directory")||$O();try{W=decodeURIComponent(W)}catch{}return Z.set("directory",W),Y()});let x=J$(),$=v4();R0=x,l0=$,m1=x.recoverQueuedTasks,c0=new d1({dispatch:(Z)=>x.dispatchTask(Z),store:b4}),O.route("/global",l4()),O.route("/events",$.app),O.route("/sessions",x.app),O.route("/tasks",i$(x)),O.route("/teams",O2()),O.route("/schedules",E$(b4,c0)),O.route("/configs",P4()),O.route("/permissions",N$()),O.route("/plugins",H$()),O.route("/hooks",t4()),O.route("/workspace-trust",X2()),O.route("/providers",R$()),O.route("/models",Jx()),O.route("/projects",M$()),O.route("/suggestions",p$()),O.route("/terminal",Y2()),O.route("/mcp",e4()),O.route("/skills",y$()),O.get("/health",(Z)=>{return Z.json({healthy:!0,version:C0()})});let Q=h5();if(Q)qO.info(`[Server] Serving static files from ${Q}`),O.get("/favicon.svg",()=>{let Z=G0(Q,"favicon.svg");if(!j4(Z))return new Response(null,{status:404});return new Response(_1(Z),{headers:{"Content-Type":"image/svg+xml","Cache-Control":"public, max-age=86400"}})}),O.get("/assets/*",(Z)=>{let Y=G0(Q,Z.req.path);if(!j4(Y))return Z.json({error:{code:"NOT_FOUND",message:`File not found: ${Z.req.path}`}},404);let W=k5(Y),U=H5(Y).toLowerCase(),B={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[U]||"application/octet-stream",M=R5.has(U)&&W.byteLength>=S5?P5(Z.req.header("Accept-Encoding")):void 0,H=M?m5(Y,W,M):W;return new Response(new Uint8Array(H),{headers:{"Content-Type":B,"Content-Length":String(H.byteLength),"Cache-Control":"public, max-age=31536000, immutable",Vary:"Accept-Encoding",...M?{"Content-Encoding":M}:{}}})}),O.get("/",(Z)=>{let Y=G0(Q,"index.html"),W=_1(Y,"utf-8");return Z.html(W,200,{"Cache-Control":"no-cache"})}),O.get("*",(Z)=>{let Y=Z.req.path;if(Y.includes("."))return Z.json({error:{code:"NOT_FOUND",message:`File not found: ${Y}`}},404);let W=G0(Q,"index.html"),U=_1(W,"utf-8");return Z.html(U,200,{"Cache-Control":"no-cache"})});else qO.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),O.get("/",(Z)=>{return Z.json({message:"Blade API Server",version:C0(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),O.all("*",(Z)=>{return Z.json({error:{code:"NOT_FOUND",message:`Route not found: ${Z.req.path}`}},404)});return O}function g5(){let O=L5(),x=[];for(let $ of Object.keys(O)){let Q=O[$];if(!Q)continue;for(let Z of Q){if(Z.internal||Z.family!=="IPv4")continue;if(Z.address.startsWith("172."))continue;x.push(Z.address)}}return x}function G2(){return typeof globalThis.Bun<"u"}function U2(O,x){let $=globalThis.Bun,Q=(Y)=>{try{return $.serve({hostname:x.hostname,port:Y,fetch:O.fetch,idleTimeout:0,websocket:D4})}catch(W){qO.error("Failed to start Bun server:",W);return}},Z=x.port===0?Q(4096)??Q(0):Q(x.port);if(!Z)throw Error(`Failed to start Bun server on port ${x.port}`);return{url:Z.url,port:Z.port,hostname:Z.hostname,stop:async()=>{Z.stop(!0)}}}function u5(O,x){return new Promise(($,Q)=>{let Z=F5(async(B,M)=>{let H=new AbortController,T=()=>{if(!H.signal.aborted)H.abort("client-disconnected")},k=()=>T(),q=()=>{if(!M.writableEnded)T()};if(B.once("aborted",k),M.once("close",q),B.aborted||M.destroyed)T();try{let P=new URL(B.url||"/",`http://${B.headers.host}`),n=new Headers;for(let[QO,S]of Object.entries(B.headers))if(S)if(Array.isArray(S))for(let HO of S)n.append(QO,HO);else n.set(QO,S);let r;if(B.method!=="GET"&&B.method!=="HEAD")r=(await new Promise((S,HO)=>{let c=[],xO=()=>{B.off("data",e),B.off("end",OO),B.off("error",bO),H.signal.removeEventListener("abort",t)},e=(EO)=>c.push(EO),OO=()=>{xO(),S(Buffer.concat(c))},bO=(EO)=>{xO(),HO(EO)},t=()=>{xO(),HO(H.signal.reason)};if(B.on("data",e),B.once("end",OO),B.once("error",bO),H.signal.addEventListener("abort",t,{once:!0}),H.signal.aborted)t()})).toString();let L=new Request(P.toString(),{method:B.method,headers:n,body:r,signal:H.signal}),i=await O.fetch(L);if(M.statusCode=i.status,i.headers.forEach((QO,S)=>{M.setHeader(S,QO)}),i.body){let QO=i.body.getReader(),S=async()=>{let{done:HO,value:c}=await QO.read();if(HO){M.end();return}return M.write(c),S()};await S()}else{let QO=await i.text();M.end(QO)}}catch(P){if(H.signal.aborted)return;qO.error("[Server] Node request error:",P),M.statusCode=500,M.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}finally{B.off("aborted",k),M.off("close",q)}}),Y=new q5({noServer:!0}),W=$O();J2(Y,()=>W),Z.on("upgrade",(B,M,H)=>{if(new URL(B.url||"/",`http://${B.headers.host}`).pathname==="/terminal/ws")Y.handleUpgrade(B,M,H,(k)=>{Y.emit("connection",k,B)});else M.destroy()});let U=(B)=>{return new Promise((M,H)=>{Z.once("error",(T)=>{if(T.code==="EADDRINUSE")H(T);else H(T)}),Z.listen(B,x.hostname,()=>{let T=Z.address();if(T&&typeof T==="object")M(T.port);else M(B)})})};(async()=>{let B;if(x.port===0)try{B=await U(4096)}catch{B=await U(0)}else B=await U(x.port);let M=new URL(`http://${x.hostname==="0.0.0.0"?"localhost":x.hostname}:${B}`);$({url:M,port:B,hostname:x.hostname,stop:async()=>{return new Promise((H)=>{Y.close(()=>{Z.close(()=>H())})})}})})().catch(Q)})}var K2;((tQ)=>{let O,x,$,Q=(M,H,T)=>{if(O!==M)return Promise.resolve();if($)return $;let k,q,P,n,r,L;try{r=H?.shutdown("server-shutdown")}catch(i){k=i}try{L=T?.shutdown("server-shutdown")}catch(i){q=i}try{c0?.stop()}catch(i){P=i}try{E5()}catch(i){n=i}return $=(async()=>{let i=Promise.resolve().then(()=>M.stop()),[QO,S,HO]=await Promise.allSettled([r??Promise.resolve(),L??Promise.resolve(),i]),c;try{_2()}catch(OO){c=OO}let e=[k,QO.status==="rejected"?QO.reason:void 0,q,S.status==="rejected"?S.reason:void 0,P,n,HO.status==="rejected"?HO.reason:void 0,c].find((OO)=>OO!==void 0);if(e!==void 0){if(O===M)$=void 0;throw e}if(O===M){if(O=void 0,x=void 0,R0===H)R0=void 0;if(l0===T)l0=void 0;m1=void 0,c0=void 0}qO.info("[Server] Blade server stopped")})(),$};function Z(){if(!x)x=y5();return x}tQ.getApp=Z;function Y(M){M4=M.cors??[];let H=Z();if(G2())O=U2(H,M),$=void 0,qO.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let T=O,k=R0,q=l0;return m1?.().catch((P)=>{qO.warn("[Server] Failed to recover queued tasks:",P)}),c0?.start(),w2(),{url:T.url,port:T.port,hostname:T.hostname,stop:()=>Q(T,k,q)}}tQ.listen=Y;async function W(M){M4=M.cors??[];let H=Z();if(G2())O=U2(H,M),qO.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else O=await u5(H,M),qO.info(`[Server] Blade server listening on ${O.url} (Node.js runtime)`);$=void 0;let T=O,k=R0,q=l0;try{await m1?.()}catch(P){qO.warn("[Server] Failed to recover queued tasks:",P)}return c0?.start(),w2(),{url:T.url,port:T.port,hostname:T.hostname,stop:()=>Q(T,k,q)}}tQ.listenAsync=W;function U(){return O!==void 0}tQ.isRunning=U;function A(){return R0?.getCoordinationStats()}tQ.getSessionCoordinationStatsForTests=A;function B(){return{global:l0?.getSseConnectionStats(),session:R0?.getSseConnectionStats()}}tQ.getSseConnectionStatsForTests=B})(K2||={});export{v5 as a,d5 as b,g5 as c,K2 as d};
|
package/dist/chunk-s7peh6kf.js
DELETED
package/dist/chunk-ws6gtw33.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Oa as V,Qa as W,Ra as O,hb as J}from"./chunk-q3y3s16v.js";import"./chunk-96w8ay2h.js";import"./chunk-s7peh6kf.js";import{si as Q}from"./chunk-ted1hyvb.js";import"./chunk-r04vwtej.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";import F from"chalk";var K=(f)=>typeof f==="string"&&f.length>0?f:void 0;function X(f){let z=K(f.cron),G=K(f.every),H=K(f.at);if([z,G,H].filter(Boolean).length!==1)throw Error("Provide exactly one of --cron, --every, or --at");if(z)return{kind:"cron",cron:z};if(G){let P=V(G);if(!P)throw Error(`Invalid --every value "${G}" (use e.g. 30m, 2h, 1d)`);return{kind:"interval",intervalMs:P}}let N=new Date(H);if(Number.isNaN(N.getTime()))throw Error(`Invalid --at value "${H}" (use an ISO timestamp)`);return{kind:"once",runAt:N.toISOString()}}var Y={command:"create <prompt>",describe:"创建定时任务",builder:(f)=>f.positional("prompt",{type:"string",describe:"定时任务运行时发送给 Agent 的提示词",demandOption:!0}).option("cron",{type:"string",describe:"5 段 cron 表达式(本地时区)"}).option("every",{type:"string",describe:"间隔(如 30m、2h、1d)"}).option("at",{type:"string",describe:"一次性运行的 ISO 时间点"}).option("project-path",{alias:["projectPath","project"],type:"string",describe:"目标项目路径(默认当前目录)"}).option("title",{type:"string",describe:"定时任务标题"}).option("model",{alias:"m",type:"string",describe:"模型 ID"}).option("permission-mode",{type:"string",choices:["default","autoEdit","yolo","plan"],default:"default",describe:"权限模式"}).option("isolation",{type:"string",choices:["local","worktree"],default:"worktree",describe:"执行隔离方式"}).example([['$0 schedule create "跑测试并汇报失败" --every 1h',"每小时运行一次"],['$0 schedule create "生成每日站会摘要" --cron "0 9 * * 1-5"',"工作日 9 点运行"]]),handler:async(f)=>{try{let z=X(f),G=W(z);if(G)throw Error(G);let H={prompt:f.prompt,projectPath:K(f.projectPath)??Q(),title:K(f.title),trigger:z,modelId:K(f.model),isolation:K(f.isolation)??"worktree",permissionMode:K(f.permissionMode)??"default",enabled:!0},B=await J.create(H);console.log(F.green(`✓ 已创建定时任务 ${B.id}`)),console.log(` ${O(B.trigger)}`),console.log(` 项目: ${B.projectPath}`),console.log(` 下次运行: ${B.nextRunAt?new Date(B.nextRunAt).toLocaleString():"(无)"}`),process.exit(0)}catch(z){console.error(F.red(`创建定时任务失败: ${z instanceof Error?z.message:z}`)),process.exit(1)}}},Z={command:"list",aliases:["ls"],describe:"列出所有定时任务",handler:async()=>{let f=await J.list();if(f.length===0)console.log(F.dim("尚无定时任务。使用 `blade schedule create` 创建。")),process.exit(0);for(let z of f){let G=z.enabled?F.green("启用"):F.dim("停用"),H=z.nextRunAt?new Date(z.nextRunAt).toLocaleString():"—",B=z.lastRunAt?`${new Date(z.lastRunAt).toLocaleString()} (${z.lastStatus??"?"})`:"从未";console.log(`${F.cyan(z.id)} [${G}] ${z.title??z.prompt.slice(0,40)}`),console.log(` ${O(z.trigger)} · 下次: ${H} · 上次: ${B} · 运行 ${z.runCount} 次`),console.log(F.dim(` 项目: ${z.projectPath}`))}process.exit(0)}},_={command:"show <id>",describe:"查看定时任务详情",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{let z=await J.get(f.id);if(!z)console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(JSON.stringify(z,null,2)),process.exit(0)}},$={command:"remove <id>",aliases:["rm"],describe:"删除定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.remove(f.id))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已删除定时任务 ${f.id}`)),process.exit(0)}},q={command:"enable <id>",describe:"启用定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.setEnabled(f.id,!0))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已启用定时任务 ${f.id}`)),process.exit(0)}},x={command:"disable <id>",describe:"停用定时任务",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}),handler:async(f)=>{if(!await J.setEnabled(f.id,!1))console.error(F.red(`未找到定时任务 ${f.id}`)),process.exit(1);console.log(F.green(`✓ 已停用定时任务 ${f.id}`)),process.exit(0)}},D={command:"run <id>",describe:"立即运行定时任务(需要 blade serve)",builder:(f)=>f.positional("id",{type:"string",describe:"定时任务 ID",demandOption:!0}).option("server",{type:"string",default:process.env.BLADE_SERVER_URL??"http://127.0.0.1:4097",describe:"Blade server 地址"}),handler:async(f)=>{let z=f.id,G=(K(f.server)??"http://127.0.0.1:4097").replace(/\/$/,""),H={};if(process.env.BLADE_SERVER_PASSWORD){let B=process.env.BLADE_SERVER_USERNAME??"blade";H.Authorization=`Basic ${Buffer.from(`${B}:${process.env.BLADE_SERVER_PASSWORD}`).toString("base64")}`}try{let B=await fetch(`${G}/schedules/${encodeURIComponent(z)}/run`,{method:"POST",headers:H});if(!B.ok){let N=await B.json().catch(()=>{return});throw Error(N?.error?.message??`Schedule run failed (${B.status})`)}console.log(F.green(`✓ 已触发定时任务 ${z}`)),process.exit(0)}catch(B){console.error(F.red(`运行定时任务失败: ${B instanceof Error?B.message:B}`)),process.exit(1)}}},R={command:"schedule",describe:"管理定时任务",builder:(f)=>f.command(Y).command(Z).command(_).command($).command(q).command(x).command(D).demandCommand(1,"请提供子命令:create | list | show | remove | enable | disable | run"),handler:()=>{}};export{R as scheduleCommands};
|
package/dist/chunk-wtmhqy5s.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{bf as a,cf as b,df as c,ef as d,ff as e,gf as f,hf as g,if as h,jf as i,kf as j,lf as k,mf as l,nf as m,of as n,pf as o,qf as p,rf as q}from"./chunk-jxc67ydz.js";import"./chunk-v508x7cg.js";import"./chunk-xshrj2nd.js";import"./chunk-6v2hhgka.js";import"./chunk-nx8xb7dm.js";import"./chunk-96w8ay2h.js";import"./chunk-s7peh6kf.js";import"./chunk-ted1hyvb.js";import"./chunk-xzfc1s6k.js";import"./chunk-r04vwtej.js";import"./chunk-atema2rc.js";import"./chunk-gxwkwkhp.js";import"./chunk-b408cqg1.js";import"./chunk-6m4sqwj0.js";import"./chunk-1xg7qx35.js";import"./chunk-xnstybjm.js";import"./chunk-mm05y2c5.js";export{a as vanillaStore,c as sessionActions,l as getThinkingModeEnabled,b as getState,n as getServiceTier,o as getResponseVerbosity,m as getReasoningEffort,j as getModelById,e as getMessages,k as getMcpServers,i as getCurrentModel,f as getConfig,p as getCommunicationStyle,h as getAllModels,g as ensureStoreInitialized,q as configActions,d as appActions};
|