blade-code 0.10.133 → 0.10.136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-0qq64xqm.js +25 -0
  3. package/dist/{chunk-d881py5y.js → chunk-13sdjfks.js} +2 -2
  4. package/dist/{chunk-x1w3fvhr.js → chunk-1cbaqh71.js} +2 -2
  5. package/dist/chunk-1dscf8xj.js +23 -0
  6. package/dist/chunk-1n5d6b5k.js +1 -0
  7. package/dist/{chunk-961nemng.js → chunk-1p9sjb8d.js} +1 -1
  8. package/dist/{chunk-ks67gd2j.js → chunk-1pmvyqed.js} +1 -1
  9. package/dist/chunk-1qdemrkr.js +1 -0
  10. package/dist/{chunk-2qyh6qhb.js → chunk-24rsvr6e.js} +2 -2
  11. package/dist/{chunk-xgz1yanb.js → chunk-46jmq302.js} +1 -1
  12. package/dist/{chunk-z5mm9g1y.js → chunk-5sknjz9b.js} +1 -1
  13. package/dist/{chunk-0xph7bhe.js → chunk-6rvrx275.js} +2 -2
  14. package/dist/{chunk-yvk8w63g.js → chunk-77x1rrz9.js} +1 -1
  15. package/dist/{chunk-ms360ds6.js → chunk-82x77b2p.js} +2 -2
  16. package/dist/chunk-83nxcfz3.js +1 -0
  17. package/dist/{chunk-bj8cgfbr.js → chunk-91pb41e7.js} +1 -1
  18. package/dist/{chunk-p8y5kk56.js → chunk-9y7j565j.js} +2 -2
  19. package/dist/{chunk-cz9mqkn2.js → chunk-9z9v8v4j.js} +1 -1
  20. package/dist/{chunk-rkjrft19.js → chunk-acsfh1cw.js} +2 -2
  21. package/dist/chunk-as8stb2j.js +10 -0
  22. package/dist/chunk-azaqc1b6.js +1 -0
  23. package/dist/{chunk-0d440hhe.js → chunk-bdtpq7j9.js} +1 -1
  24. package/dist/chunk-c5rfnzhf.js +171 -0
  25. package/dist/{chunk-0ap8b3sw.js → chunk-c85xvthj.js} +1 -1
  26. package/dist/{chunk-4xhawy0e.js → chunk-cgkbdh2m.js} +1 -1
  27. package/dist/chunk-e1warjkn.js +171 -0
  28. package/dist/{chunk-1tfjaazq.js → chunk-f7hsagj6.js} +1 -1
  29. package/dist/{chunk-f4pn5tmr.js → chunk-ffh4c30x.js} +1 -1
  30. package/dist/{chunk-7zvwfz85.js → chunk-fnc97xg7.js} +2 -2
  31. package/dist/chunk-g13jmewd.js +1 -0
  32. package/dist/{chunk-ndgdf5jx.js → chunk-g45camrd.js} +1 -1
  33. package/dist/{chunk-bzp08nf6.js → chunk-g4vgnxh4.js} +1 -1
  34. package/dist/{chunk-ar3sdj0w.js → chunk-g7h0peka.js} +2 -2
  35. package/dist/{chunk-3csj18f1.js → chunk-gdnyt8a7.js} +1 -1
  36. package/dist/chunk-gq7fdc8c.js +2 -0
  37. package/dist/chunk-gwjah260.js +1 -0
  38. package/dist/{chunk-mkvqtawj.js → chunk-hqwpnb0x.js} +2 -2
  39. package/dist/{chunk-e1q1hvty.js → chunk-hx10bph0.js} +2 -2
  40. package/dist/{chunk-8xem2mzy.js → chunk-jb8stg10.js} +1 -1
  41. package/dist/{chunk-be2csw9m.js → chunk-jc28ddt0.js} +1 -1
  42. package/dist/{chunk-cfamqqgv.js → chunk-kbnxbb23.js} +2 -2
  43. package/dist/{chunk-jy61b0v8.js → chunk-mm1atkae.js} +2 -2
  44. package/dist/{chunk-h123tjsg.js → chunk-mq1mk3v5.js} +2 -2
  45. package/dist/{chunk-555ffyze.js → chunk-mxe4pr8t.js} +2 -2
  46. package/dist/chunk-n238rdz8.js +1 -0
  47. package/dist/{chunk-fjvt9mwv.js → chunk-na3nregt.js} +1 -1
  48. package/dist/{chunk-679b7s58.js → chunk-nfzad4te.js} +1 -1
  49. package/dist/{chunk-w3y69e4e.js → chunk-ntd69c0k.js} +1 -1
  50. package/dist/{chunk-5x3h9ak8.js → chunk-nzwh9v6t.js} +1 -1
  51. package/dist/chunk-pnanbvn3.js +1 -0
  52. package/dist/chunk-pz91qga3.js +1 -0
  53. package/dist/{chunk-r4bgsfj6.js → chunk-q0s3gcjm.js} +1 -1
  54. package/dist/chunk-qjydadex.js +14 -0
  55. package/dist/{chunk-gv24cgpb.js → chunk-qm96k94k.js} +3 -3
  56. package/dist/{chunk-h6tr3zz7.js → chunk-r51afpkk.js} +1 -1
  57. package/dist/{chunk-rcthrb7h.js → chunk-s3a017q7.js} +2 -2
  58. package/dist/{chunk-sxqydew5.js → chunk-s4b1r3my.js} +1 -1
  59. package/dist/{chunk-nfdfthhb.js → chunk-sv5z5sna.js} +1 -1
  60. package/dist/{chunk-f1wnva76.js → chunk-sy0vxdc3.js} +379 -377
  61. package/dist/{chunk-n7pydthh.js → chunk-t6cajkaj.js} +2 -2
  62. package/dist/chunk-tah2002b.js +1 -0
  63. package/dist/{chunk-87ycd3f8.js → chunk-tev70rzj.js} +2 -2
  64. package/dist/chunk-tzfd2fza.js +1 -0
  65. package/dist/{chunk-7hxyxv4x.js → chunk-v2qxszks.js} +2 -2
  66. package/dist/chunk-v3veeja5.js +1 -0
  67. package/dist/chunk-vptn8fhx.js +2 -0
  68. package/dist/{chunk-7j628q12.js → chunk-vvawhvea.js} +1 -1
  69. package/dist/{chunk-dnt4c3gy.js → chunk-w2n1vwzg.js} +2 -2
  70. package/dist/{chunk-2nv0kg12.js → chunk-wj16pvvn.js} +1 -1
  71. package/dist/chunk-wj813rcc.js +1 -0
  72. package/dist/{chunk-77efqpdc.js → chunk-wzkh3e6a.js} +1 -1
  73. package/dist/{chunk-nyk5q71k.js → chunk-xtngc0th.js} +1 -1
  74. package/dist/{chunk-3ndwbb7h.js → chunk-yacv7f7h.js} +1 -1
  75. package/dist/{chunk-53h87fmt.js → chunk-z3hpstky.js} +1 -1
  76. package/dist/{chunk-rmm7n9n3.js → chunk-zy2etr3v.js} +2 -2
  77. package/dist/web/assets/ChatView-Bc9twpWM.js +63 -0
  78. package/dist/web/assets/{CodeBlockHighlighter-D0yM8QTf.js → CodeBlockHighlighter-41xRPXs2.js} +1 -1
  79. package/dist/web/assets/{FilePreview-CaTCjV5i.js → FilePreview-lcc_hL7J.js} +15 -20
  80. package/dist/web/assets/{KanbanBoard-BY0SXCol.js → KanbanBoard-BHgM338V.js} +4 -4
  81. package/dist/web/assets/{MarkdownRenderer-zKto-Pty.js → MarkdownRenderer-BMAuTkc6.js} +3 -3
  82. package/dist/web/assets/{ScrollArea-1qPJ8lcT.js → ScrollArea-DJq2Kdpi.js} +1 -1
  83. package/dist/web/assets/{SessionHistorySurface-Ce9xX62q.js → SessionHistorySurface-DSe8ePBJ.js} +2 -2
  84. package/dist/web/assets/{SettingsModal-BxKOMuIm.js → SettingsModal-Cih4bWul.js} +1 -1
  85. package/dist/web/assets/{Sidebar-CEF6lGps.js → Sidebar-DnWlUKmO.js} +2 -2
  86. package/dist/web/assets/{TaskSwitcher-C-EY0nVG.js → TaskSwitcher-D3mrXv_i.js} +2 -2
  87. package/dist/web/assets/{TerminalPanel-C3PVDyAr.js → TerminalPanel-BNKHhBVM.js} +2 -2
  88. package/dist/web/assets/{archive-D5Nuw__Q.js → archive-Dof4YpyT.js} +1 -1
  89. package/dist/web/assets/{arrow-left-DaOpfgEz.js → arrow-left-DGFXaGox.js} +1 -1
  90. package/dist/web/assets/{calendar-clock-DA_D4ppV.js → calendar-clock-BoxUNOvH.js} +1 -1
  91. package/dist/web/assets/{chevron-right-COQAoZf3.js → chevron-right-Brb1rhaA.js} +1 -1
  92. package/dist/web/assets/chevrons-up-down-N-VshXV_.js +16 -0
  93. package/dist/web/assets/{clock-3-DJ-pSj3t.js → clock-3-gdZEKe2U.js} +1 -1
  94. package/dist/web/assets/{copy-5c0ESKoo.js → copy-d9M8JUfQ.js} +1 -1
  95. package/dist/web/assets/{download-VkaTciEH.js → download-CQ-Pwfq0.js} +1 -1
  96. package/dist/web/assets/{external-link-BypdqupZ.js → external-link-GRAtjoO2.js} +1 -1
  97. package/dist/web/assets/{folder-B8znObPL.js → folder-CqLD0IBh.js} +1 -1
  98. package/dist/web/assets/index-CPpIFWLG.css +1 -0
  99. package/dist/web/assets/index-DiRs2_w4.js +203 -0
  100. package/dist/web/assets/{pause-BWbHHYG6.js → pause-BqsFgQi0.js} +1 -1
  101. package/dist/web/assets/{pencil-BPyvvR59.js → pencil-Ca9289F-.js} +1 -1
  102. package/dist/web/assets/{play-CLJgUH4S.js → play-DmEPnYDS.js} +1 -1
  103. package/dist/web/assets/{plus-D1VVvu-z.js → plus-kIBLgk0p.js} +1 -1
  104. package/dist/web/assets/session-events-BqQQkbAN.js +29 -0
  105. package/dist/web/assets/{settings-CGCgC_NX.js → settings-BuSrJl6s.js} +1 -1
  106. package/dist/web/assets/teamService-B7Fp8Oyg.js +1 -0
  107. package/dist/web/assets/{terminal-pA96HZrI.js → terminal-Qkr_gcNu.js} +1 -1
  108. package/dist/web/index.html +2 -2
  109. package/package.json +1 -1
  110. package/dist/chunk-00zazdct.js +0 -25
  111. package/dist/chunk-04yas0t8.js +0 -1
  112. package/dist/chunk-2242dshn.js +0 -2
  113. package/dist/chunk-2nxev7f2.js +0 -1
  114. package/dist/chunk-43a0n5rw.js +0 -1
  115. package/dist/chunk-78wwep9f.js +0 -1
  116. package/dist/chunk-88jmtcv7.js +0 -171
  117. package/dist/chunk-avf9spct.js +0 -1
  118. package/dist/chunk-azv25dg2.js +0 -10
  119. package/dist/chunk-b8c1vj8c.js +0 -1
  120. package/dist/chunk-bbw6s542.js +0 -1
  121. package/dist/chunk-eetva9y8.js +0 -1
  122. package/dist/chunk-kjjpn49y.js +0 -1
  123. package/dist/chunk-kx61g7xw.js +0 -1
  124. package/dist/chunk-m30sbsnw.js +0 -1
  125. package/dist/chunk-n589jxsm.js +0 -1
  126. package/dist/chunk-nry7d26k.js +0 -2
  127. package/dist/chunk-py92cy57.js +0 -14
  128. package/dist/chunk-sr9gqacp.js +0 -1
  129. package/dist/chunk-t52v91dy.js +0 -23
  130. package/dist/chunk-v7zt3pft.js +0 -171
  131. package/dist/web/assets/ChatView-hYd9mmJ6.js +0 -53
  132. package/dist/web/assets/chevrons-up-down-B_WSFixv.js +0 -11
  133. package/dist/web/assets/index-B4186fIT.css +0 -1
  134. package/dist/web/assets/index-DorkRCqS.js +0 -210
  135. package/dist/web/assets/session-events-C6fPz20c.js +0 -22
  136. package/dist/web/assets/teamService-DsYRmp6u.js +0 -1
@@ -1 +0,0 @@
1
- import{ag as a,bg as b,cg as c}from"./chunk-87ycd3f8.js";import"./chunk-7j628q12.js";import"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.js";export{b as resolveModelConfig,c as getModelDisplayName,a as getModelApiKeyEnvironmentVariable};
@@ -1,10 +0,0 @@
1
- import{a as T,b as W,c as X,d as Y}from"./chunk-py92cy57.js";import"./chunk-ks67gd2j.js";import"./chunk-h6tr3zz7.js";import"./chunk-cz9mqkn2.js";import"./chunk-xgz1yanb.js";import"./chunk-bzp08nf6.js";import"./chunk-f1wnva76.js";import"./chunk-2qyh6qhb.js";import"./chunk-e1q1hvty.js";import"./chunk-2242dshn.js";import"./chunk-88jmtcv7.js";import"./chunk-77efqpdc.js";import"./chunk-555ffyze.js";import"./chunk-53h87fmt.js";import"./chunk-h123tjsg.js";import"./chunk-7zvwfz85.js";import{if as R}from"./chunk-7hxyxv4x.js";import"./chunk-cfamqqgv.js";import{Ef as Q}from"./chunk-00zazdct.js";import"./chunk-v508x7cg.js";import"./chunk-r4bgsfj6.js";import"./chunk-rkjrft19.js";import"./chunk-87ycd3f8.js";import"./chunk-7j628q12.js";import"./chunk-ms360ds6.js";import"./chunk-x1w3fvhr.js";import"./chunk-z5mm9g1y.js";import"./chunk-1tfjaazq.js";import"./chunk-nfdfthhb.js";import"./chunk-gv24cgpb.js";import"./chunk-yvk8w63g.js";import"./chunk-jy61b0v8.js";import"./chunk-3csj18f1.js";import"./chunk-nry7d26k.js";import"./chunk-be2csw9m.js";import"./chunk-679b7s58.js";import"./chunk-8xem2mzy.js";import"./chunk-ar3sdj0w.js";import"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import{Dj as M}from"./chunk-dnt4c3gy.js";import"./chunk-rmm7n9n3.js";import"./chunk-961nemng.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.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};
@@ -1 +0,0 @@
1
- import{$b as p,Bb as a,Cb as b,Eb as c,Ib as d,Jb as e,Kb as f,Lb as g,Mb as h,Nb as i,Ob as j,Pb as k,Wb as l,Xb as m,Yb as n,Zb as o,ac as q,bc as r}from"./chunk-88jmtcv7.js";import"./chunk-77efqpdc.js";import"./chunk-555ffyze.js";import"./chunk-53h87fmt.js";import"./chunk-h123tjsg.js";import"./chunk-7zvwfz85.js";import"./chunk-r4bgsfj6.js";import"./chunk-rkjrft19.js";import"./chunk-7j628q12.js";import"./chunk-z5mm9g1y.js";import"./chunk-1tfjaazq.js";import"./chunk-gv24cgpb.js";import"./chunk-yvk8w63g.js";import"./chunk-3csj18f1.js";import"./chunk-nry7d26k.js";import"./chunk-be2csw9m.js";import"./chunk-679b7s58.js";import"./chunk-8xem2mzy.js";import"./chunk-ar3sdj0w.js";import"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import"./chunk-dnt4c3gy.js";import"./chunk-961nemng.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.js";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,d as isRootSystemPrompt,m as handleTaskListUpdate,n as handleSkillActivation,o as extractModelSwitch,r as executeLoopGenerator,f as drainLoop,c as checkStopHook,a as checkOutputRecovery,b as checkIncompleteIntent,q as checkAndCompactInLoop,p as applyToolDomainEffects,l as StreamingToolExecutor,e as ConversationState};
@@ -1 +0,0 @@
1
- import{Ij as a,Jj as b,Kj as c}from"./chunk-rmm7n9n3.js";import"./chunk-961nemng.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.js";export{b as isWorkspaceTrusted,c as WorkspaceTrustService,a as MAX_RESIDENT_WORKSPACE_TRUST_STATUSES};
@@ -1 +0,0 @@
1
- import{$f as a}from"./chunk-rkjrft19.js";import"./chunk-8xem2mzy.js";import"./chunk-ar3sdj0w.js";import"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.js";export{a as createChatServiceAsync};
@@ -1 +0,0 @@
1
- import{df as a,ef as b,ff as c}from"./chunk-n7pydthh.js";import"./chunk-d881py5y.js";import"./chunk-00zazdct.js";import"./chunk-v508x7cg.js";import"./chunk-r4bgsfj6.js";import"./chunk-nfdfthhb.js";import"./chunk-jy61b0v8.js";import"./chunk-3csj18f1.js";import"./chunk-nry7d26k.js";import"./chunk-be2csw9m.js";import"./chunk-679b7s58.js";import"./chunk-8xem2mzy.js";import"./chunk-ar3sdj0w.js";import"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import"./chunk-dnt4c3gy.js";import"./chunk-rmm7n9n3.js";import"./chunk-961nemng.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
@@ -1 +0,0 @@
1
- import{k as a,l as b,m as c,n as d,o as e}from"./chunk-bj8cgfbr.js";import"./chunk-dnt4c3gy.js";import"./chunk-w3y69e4e.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
@@ -1 +0,0 @@
1
- import{Cj as a,Dj as b,Ej as c,Fj as d,Gj as e,Hj as f}from"./chunk-dnt4c3gy.js";import"./chunk-w3y69e4e.js";export{b as getVersion,c as getPackageName,a as getPackageInfo,e as getFormattedVersion,d as getDescription,f as getCopyright};
@@ -1 +0,0 @@
1
- import{Bg as a,Cg as b,Dg as c,Eg as d,Fg as e,Gg as f,Hg as g,Ig as h,Jg as i,Kg as j,Lg as k}from"./chunk-x1w3fvhr.js";import"./chunk-z5mm9g1y.js";import"./chunk-1tfjaazq.js";import"./chunk-nfdfthhb.js";import"./chunk-gv24cgpb.js";import"./chunk-yvk8w63g.js";import"./chunk-jy61b0v8.js";import"./chunk-3csj18f1.js";import"./chunk-nry7d26k.js";import"./chunk-be2csw9m.js";import"./chunk-679b7s58.js";import"./chunk-8xem2mzy.js";import"./chunk-ar3sdj0w.js";import"./chunk-rcthrb7h.js";import"./chunk-0d440hhe.js";import"./chunk-dnt4c3gy.js";import"./chunk-rmm7n9n3.js";import"./chunk-961nemng.js";import"./chunk-fjvt9mwv.js";import"./chunk-w3y69e4e.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};
@@ -1,2 +0,0 @@
1
- var _=20,E=5242880,T=32768,A=1e6,S=4194304;
2
- export{_ as Bi,E as Ci,T as Di,A as Ei,S as Fi};
@@ -1,14 +0,0 @@
1
- import{e as i2,f as c2,g as Y3,h as l0,i as N3}from"./chunk-ks67gd2j.js";import{j as u1}from"./chunk-h6tr3zz7.js";import{v as p0,w as w2}from"./chunk-cz9mqkn2.js";import{A as E0,x as H2,y as B2,z as D2}from"./chunk-xgz1yanb.js";import{B as z2,C as O$,D as $$,E as Q$,F as $0,G as Z$}from"./chunk-bzp08nf6.js";import{$ as w0,Ba as H3,J as $2,K as k1,L as w3,O as Q2,P as c0,Q as S4,R as y1,S as T$,T as K4,U as J2,V as J0,W as Y2,X as N2,Y as Y$,Z as Y1,_ as F4,aa as q0,da as x1,ea as L1,fa as q3,ga as X2,ha as V2,ia as q2,ja as E2,ka as S2,la as C2,ma as f2,na as P2,oa as k2,pa as m2,qa as h2,ta as l2,wa as g3}from"./chunk-f1wnva76.js";import{Ia as F$,Oa as PO}from"./chunk-e1q1hvty.js";import{$a as f4,Sa as r1,Va as D3,Wa as C4,Xa as G2,Ya as U2,Za as x3,_a as L3,ab as M3,bb as P0,cb as n2,db as o2,eb as t2,fb as W2,gb as _2,hb as K2,ib as F2,jb as t4,kb as p4}from"./chunk-2242dshn.js";import{Kb as _4,Tb as f0,vb as kO,wb as o,yb as k,zb as Z2}from"./chunk-88jmtcv7.js";import{cc as H4}from"./chunk-77efqpdc.js";import{Cc as i$,Ed as B1,Fd as B4,Gd as D1,Id as u0,Jc as c$,Kc as z4,Lc as a$,Ld as G4,Mc as G1,Nc as n$,Qc as Y4,Qd as O2,Rd as U4,Sd as W4,Td as v,bd as o$,md as t$,wd as K1,xd as C0}from"./chunk-555ffyze.js";import{pe as s$,we as r$,xe as e$}from"./chunk-h123tjsg.js";import{$e as Z3,Se as r2,We as e2,Xe as O3,Ye as $3,Ze as Q3,_e as q4,af as J3}from"./chunk-7zvwfz85.js";import{Df as DO,Hf as D$,Of as uO,zf as I3}from"./chunk-00zazdct.js";import{Pf as h1}from"./chunk-r4bgsfj6.js";import{eg as d$}from"./chunk-7j628q12.js";import{gg as P1}from"./chunk-ms360ds6.js";import{Dg as a3,Gg as tO,Hg as z1,Lg as g4,pg as R3,rg as z3,ug as R2,yg as X1,zg as V1}from"./chunk-x1w3fvhr.js";import{$g as x$,ah as l$}from"./chunk-1tfjaazq.js";import{eh as U$,fh as g0}from"./chunk-gv24cgpb.js";import{Nh as m$,Qh as h$,Sh as y$,Th as g$,Uh as A$,Vh as b$,Wh as s4,ai as p$,di as v$,fi as u$,si as W$,xh as K$,xi as N1}from"./chunk-jy61b0v8.js";import{Ai as X4}from"./chunk-3csj18f1.js";import{Ci as p1,Fi as V4}from"./chunk-nry7d26k.js";import{Ji as NO}from"./chunk-be2csw9m.js";import{Ki as y,Mi as z,Ni as rO,Pi as YO}from"./chunk-679b7s58.js";import{pj as $O}from"./chunk-ar3sdj0w.js";import{vj as j0}from"./chunk-rcthrb7h.js";import{Aj as B$,Bj as k$,xj as H$,yj as P$}from"./chunk-0d440hhe.js";import{Dj as y0}from"./chunk-dnt4c3gy.js";import{Kj as y4}from"./chunk-rmm7n9n3.js";import{Nj as g1,fk as _O,hk as S1,pk as X$}from"./chunk-fjvt9mwv.js";import{sk as k4}from"./chunk-w3y69e4e.js";var h6={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 y6(O){return{port:O.port??0,hostname:O.hostname??"127.0.0.1",cors:O.cors??[]}}import{existsSync as v4,readFileSync as b1}from"node:fs";import{createServer as W6}from"node:http";import{networkInterfaces as _6}from"node:os";import{dirname as K6,extname as F6,join as L0}from"node:path";import{fileURLToPath as w6}from"node:url";import{brotliCompressSync as H6,gzipSync as B6,constants as D6}from"node:zlib";import{Hono as x6}from"hono";import{cors as L6}from"hono/cors";import{WebSocketServer as M6}from"ws";var h0=$O("Service"),V5=30000,z5=new Set(["completed","failed","cancelled","interrupted"]);class e1{dispatch;store;tickMs;timer;unsubscribeBus;ticking=!1;inFlight=new Set;constructor(O){this.dispatch=O.dispatch,this.store=O.store??t4.getInstance(),this.tickMs=O.tickMs??V5}start(){if(this.timer)return;h0.info("[TaskScheduler] Starting scheduler tick loop"),this.timer=setInterval(()=>{this.tick()},this.tickMs),this.timer.unref?.(),this.unsubscribeBus=k.subscribe((O)=>{if(O.type!=="task.status")return;let $=O.properties.taskStatus;if(typeof $!=="string"||!z5.has($))return;this.recordTerminalStatus(O.sessionId,$,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,h0.info("[TaskScheduler] Stopped scheduler tick loop")}async tick(O=new Date){if(this.ticking)return;this.ticking=!0;try{let $=await this.store.list();for(let Q of $)await this.evaluate(Q,O)}catch($){h0.warn("[TaskScheduler] Tick failed:",$)}finally{this.ticking=!1}}async evaluate(O,$){if(!O.enabled)return;if(this.inFlight.has(O.id))return;if(O.expiresAt&&new Date(O.expiresAt).getTime()<=$.getTime()){await this.store.update(O.id,{enabled:!1,nextRunAt:null}),h0.info(`[TaskScheduler] Schedule ${O.id} expired; disabled`);return}if(!O.nextRunAt)return;if(!(new Date(O.nextRunAt).getTime()<=$.getTime()))return;await this.fire(O,$)}async fire(O,$=new Date,Q={}){if(this.inFlight.has(O.id))throw Error(`Schedule ${O.id} is already dispatching`);this.inFlight.add(O.id);let Z=$.toISOString();try{let J=await this.dispatch({prompt:O.prompt,title:O.title??G5(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}),N=O.trigger.kind==="once"?null:Q.manual?O.nextRunAt?new Date(O.nextRunAt):null:r1(O.trigger,$,$);await this.store.update(O.id,{lastRunAt:Z,lastRunSessionId:J.session.sessionId,lastStatus:J.status,lastError:void 0,runCount:O.runCount+1,nextRunAt:N?N.toISOString():null,enabled:O.trigger.kind==="once"?!1:O.enabled}),k.publish({sessionId:J.session.sessionId,projectPath:O.projectPath},"schedule.fired",{scheduleId:O.id,firedAt:Z,sessionId:J.session.sessionId,runId:J.runId,status:J.status}),h0.info(`[TaskScheduler] Fired schedule ${O.id} -> session ${J.session.sessionId} (${J.status})`)}catch(J){let N=J instanceof Error?J.message:String(J);h0.warn(`[TaskScheduler] Schedule ${O.id} dispatch failed:`,J);let X=O.trigger.kind==="once"?null:Q.manual?O.nextRunAt?new Date(O.nextRunAt):null:r1(O.trigger,$,$);await this.store.update(O.id,{lastRunAt:Z,lastStatus:"error",lastError:N,nextRunAt:X?X.toISOString():null,enabled:O.trigger.kind==="once"?!1:O.enabled})}finally{this.inFlight.delete(O.id)}}async recordTerminalStatus(O,$,Q){let J=(await this.store.list()).find((N)=>N.lastRunSessionId===O);if(!J)return;await this.store.update(J.id,{lastStatus:$,...Q?{lastError:Q}:{lastError:void 0}})}}function G5(O){return`Scheduled: ${O.prompt.trim().replace(/\s+/g," ").slice(0,60)}`}class zO extends Error{code;statusCode;details;constructor(O,$,Q=500,Z){super($);this.code=O;this.statusCode=Q;this.details=Z;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message,...this.details?{details:this.details}:{}}}}}class l extends zO{constructor(O,$){super("NOT_FOUND",$?`${O} not found: ${$}`:`${O} not found`,404)}}class w extends zO{constructor(O){super("BAD_REQUEST",O,400)}}class u extends zO{constructor(O){super("CONFLICT",O,409)}}class cO extends zO{constructor(O,$){super("TOO_MANY_REQUESTS",O,429,$)}}class BO extends zO{constructor(O="Server is shutting down"){super("SERVICE_UNAVAILABLE",O,503)}}class q1 extends zO{constructor(O){super("SESSION_WORKSPACE_UNAVAILABLE","This session workspace is no longer available",409,{reason:O})}}class fO extends zO{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class JO extends zO{constructor(O="Internal server error"){super("INTERNAL_ERROR",O,500)}}var c6=z.Object({error:z.Object({code:z.String(),message:z.String(),details:z.Optional(z.Record(z.String(),z.Unknown()))})});import{Hono as U5}from"hono";var O4=$O("Service"),W5=z.Object({updates:z.Record(z.String(),z.Any()),options:z.Optional(z.Object({scope:z.Optional(YO(["local","project","global"])),immediate:z.Optional(z.Boolean())}))});function _5(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 r4=()=>{let O=new U5;return O.get("/",async($)=>{try{let Q=DO();return $.json(Q?_5(Q):{})}catch(Q){return O4.error("[ConfigRoutes] Failed to get config:",Q),$.json({})}}),O.put("/",async($)=>{try{let Q=await $.req.json(),Z=y(W5,Q);if(!Z.success)throw new w("Invalid config update format");let{updates:J,options:N}=Z.data;return await uO().updateConfig(J,N),$.json({success:!0,updates:J})}catch(Q){if(Q instanceof s4)throw new w(Q.message);throw O4.error("[ConfigRoutes] Failed to update config:",Q),Q}}),O.get("/permissions",async($)=>{try{let Q=DO();return $.json(Q?.permissions||{})}catch(Q){return O4.error("[ConfigRoutes] Failed to get permissions:",Q),$.json({})}}),O};import{Hono as K5}from"hono";import{streamSSE as F5}from"hono/streaming";function e4(O){let $="";if(O.id!==void 0)$+=`id: ${O.id}
2
- `;if(O.event!==void 0)$+=`event: ${O.event}
3
- `;for(let Q of O.data.split(/\r\n|\r|\n/))$+=`data: ${Q}
4
- `;if(O.retry!==void 0)$+=`retry: ${O.retry}
5
- `;return $+=`
6
- `,Buffer.byteLength($)}class Z1{serial;buffered=[];bufferedBytes=0;nextOrder=0;phase="buffering";highestDeliveredSequence=0;highestReplaySequence=0;failure;maxPendingItems;maxPendingBytes;constructor(O){this.maxPendingItems=O.maxPendingItems??O$,this.maxPendingBytes=O.maxPendingBytes??$$,this.serial=new Z$({maxPendingItems:this.maxPendingItems,maxPendingBytes:this.maxPendingBytes,writeTimeoutMs:O.writeTimeoutMs??Q$,sizeOf:e4,write:O.write,onFailure:($)=>{this.failure=$,this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,O.onFailure?.($)}})}async writeInitial(O){await this.offerDirect(O)}observe(O,$){if(this.phase==="closed")return;if(this.phase==="buffering"){this.buffer(O,$);return}this.offerLive(O,$)}async writeReplay(O,$){if(!Number.isSafeInteger($)||$<=0)throw this.fail(new $0("invalid_size","SSE committed sequence must be a positive safe integer")),this.currentFailure();if($<=this.highestReplaySequence)return;await this.offerDirect(O),this.highestReplaySequence=$,this.highestDeliveredSequence=$}finishInitialization(O){if(this.phase!=="buffering")return;let $=this.buffered.splice(0);this.bufferedBytes=0,this.phase="live";let Q=O.replayed?$.filter((J)=>J.sequence!==void 0&&J.sequence>this.highestReplaySequence).sort((J,N)=>J.sequence-N.sequence||J.order-N.order):$.sort((J,N)=>J.order-N.order),Z;for(let J of Q){if(O.replayed&&J.sequence!==void 0&&J.sequence===Z)continue;if(this.offerLive(J.message,J.sequence),this.serial.stats().closed)return;Z=J.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,$){let Q=e4(O),Z=this.serial.stats();if(Q>this.maxPendingBytes){this.fail(new $0("oversized",`SSE frame requires ${Q} bytes; limit is ${this.maxPendingBytes}`,{pendingItems:Z.pendingItems+this.buffered.length,pendingBytes:Z.pendingBytes+this.bufferedBytes}));return}if(Z.pendingItems+this.buffered.length>=this.maxPendingItems||Z.pendingBytes+this.bufferedBytes+Q>this.maxPendingBytes){this.fail(new $0("overflow","SSE initialization buffer limit exceeded",{pendingItems:Z.pendingItems+this.buffered.length,pendingBytes:Z.pendingBytes+this.bufferedBytes}));return}this.nextOrder+=1,this.buffered.push({message:O,bytes:Q,sequence:$,order:this.nextOrder}),this.bufferedBytes+=Q}offerLive(O,$){if($!==void 0){if($<=this.highestReplaySequence)return;if($<=this.highestDeliveredSequence){this.fail(new $0("write_failed","SSE committed sequence regressed"));return}this.highestDeliveredSequence=$}if(!this.serial.offer(O).accepted)this.phase="closed"}async offerDirect(O){if(this.phase==="closed")throw this.currentFailure();let $=this.serial.offer(O);if(!$.accepted)throw this.phase="closed",$.error;await $.completion}fail(O){this.serial.close(O)}currentFailure(){return this.failure??new $0("closed","SSE egress is closed")}}var w5=15000,H5=$O("Service"),B5=new Set(["task.status","task.delivery","session.created","session.updated","session.deleted","schedule.fired","permission.asked","question.required","elicitation.required","interaction.resolved"]),D5=new Set(["queued","running","completed","failed","cancelled","interrupted"]),x5=new Set(["high","medium","low"]),L5=new Set(["feature","bug","maintenance","research"]);function M5(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let $=O,Q=["changedFiles","additions","deletions","commits"];if(Q.some((Z)=>typeof $[Z]!=="number"||!Number.isInteger($[Z])||$[Z]<0))return;return Object.fromEntries(Q.map((Z)=>[Z,$[Z]]))}function J1(O,$){return typeof O==="number"&&Number.isInteger(O)&&O>=$?O:void 0}function A5(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let $=O;if(!["applied","discarded","conflicted"].includes(String($.status))||typeof $.updatedAt!=="string")return;return{status:$.status,updatedAt:$.updatedAt,...typeof $.sourceCommit==="string"?{sourceCommit:$.sourceCommit}:{},...J1($.changedFiles,0)!==void 0?{changedFiles:$.changedFiles}:{},...typeof $.message==="string"?{message:$.message}:{}}}function J$(O,$){return $&&O instanceof $0&&(O.kind==="closed"||O.kind==="aborted")}var N$=()=>{let O=new K5,$=new Y1;return O.onError((Q,Z)=>{if(Q instanceof BO)return Z.json(Q.toObject(),503);throw Q}),O.get("/",async(Q)=>{let Z;try{Z=$.enter(Q.req.raw.signal)}catch(N){if(N instanceof Y$)throw new BO;throw N}let J=!1;try{let N=F5(Q,async(X)=>{let W,D,F=!1,I,T,x=new Promise((B)=>{T=B}),R,A=()=>{if(D!==void 0)clearInterval(D),D=void 0;W?.(),W=void 0},S=(B)=>{if(R)return R;return F=!0,R=(async()=>{try{A(),I?.close(B),X.close()}finally{T()}})(),R},h=()=>{S(Z.signal.reason)};if(Z.signal.addEventListener("abort",h,{once:!0}),X.onAbort(()=>{S()}),Z.signal.aborted){await S(Z.signal.reason),Z.signal.removeEventListener("abort",h),Z.release();return}I=new Z1({write:async(B)=>{await X.writeSSE(B)},onFailure:(B)=>{if(J$(B,F))return;H5.warn(`[EventRoutes] SSE egress closed: kind=${B.kind} pendingItems=${B.pendingItems??0} pendingBytes=${B.pendingBytes??0}`),S(B)}});let m=(B,r)=>{I?.observe({data:JSON.stringify({type:B,properties:r})})};W=k.subscribe((B)=>{if(!B5.has(B.type))return;if(B.type==="permission.asked"||B.type==="question.required"||B.type==="elicitation.required"){let ZO=B.properties.requestId;if(typeof ZO!=="string"||!ZO)return;m("interaction.pending",{sessionId:B.sessionId,projectPath:B.projectPath,interactionType:B.type==="question.required"?"question":B.type==="elicitation.required"?"elicitation":"permission",requestId:ZO});return}if(B.type==="interaction.resolved"){let ZO=B.properties.requestId;if(typeof ZO!=="string"||!ZO)return;m(B.type,{sessionId:B.sessionId,projectPath:B.projectPath,requestId:ZO});return}if(B.type==="session.created"||B.type==="session.deleted"){m(B.type,{sessionId:B.sessionId,projectPath:B.projectPath});return}if(B.type==="session.updated"){let ZO=B.properties.title,MO=B.properties.taskPriority,OO=B.properties.taskKind,gO=B.properties.taskDueAt,K0=typeof ZO==="string"&&Boolean(ZO.trim()),bO=x5.has(String(MO)),K=L5.has(String(OO)),XO=gO===null||typeof gO==="string"&&Number.isFinite(Date.parse(gO));if(!K0&&!bO&&!K&&!XO)return;m(B.type,{sessionId:B.sessionId,projectPath:B.projectPath,...K0?{title:ZO}:{},...bO?{taskPriority:MO}:{},...K?{taskKind:OO}:{},...XO?{taskDueAt:gO}:{}});return}if(B.type==="task.delivery"){let ZO=A5(B.properties.taskDelivery);if(!ZO)return;m(B.type,{sessionId:B.sessionId,projectPath:B.projectPath,taskDelivery:ZO,...B.properties.taskWorktreeRemoved===!0?{taskWorktreeRemoved:!0}:{},...typeof B.properties.updatedAt==="string"?{updatedAt:B.properties.updatedAt}:{}});return}if(B.type==="schedule.fired"){let ZO=B.properties.scheduleId,MO=B.properties.firedAt;if(typeof ZO!=="string"||typeof MO!=="string")return;m(B.type,{scheduleId:ZO,firedAt:MO,sessionId:B.sessionId,projectPath:B.projectPath,...typeof B.properties.runId==="string"?{runId:B.properties.runId}:{},...typeof B.properties.status==="string"?{status:B.properties.status}:{}});return}let r=B.properties.taskStatus;if(typeof r!=="string"||!D5.has(r))return;let c=M5(B.properties.taskDiffStat),C=J1(B.properties.taskQueuePosition,1),IO=J1(B.properties.taskQueueDepth,0),t=J1(B.properties.taskConcurrencyLimit,1),s=J1(B.properties.taskInFlight,0),QO=typeof B.properties.taskAdmissionPaused==="boolean"?B.properties.taskAdmissionPaused:void 0;m(B.type,{sessionId:B.sessionId,projectPath:B.projectPath,taskStatus:r,...typeof B.properties.taskStatusReason==="string"?{taskStatusReason:B.properties.taskStatusReason}:{},...B.properties.taskFailure&&typeof B.properties.taskFailure==="object"?{taskFailure:B.properties.taskFailure}:{},...typeof B.properties.taskStartedAt==="string"?{taskStartedAt:B.properties.taskStartedAt}:{},...typeof B.properties.taskCompletedAt==="string"?{taskCompletedAt:B.properties.taskCompletedAt}:{},...typeof B.properties.updatedAt==="string"?{updatedAt:B.properties.updatedAt}:{},...c?{taskDiffStat:c}:{},...C!==void 0?{taskQueuePosition:C}:{},...IO!==void 0?{taskQueueDepth:IO}:{},...t!==void 0?{taskConcurrencyLimit:t}:{},...s!==void 0?{taskInFlight:s}:{},...QO!==void 0?{taskAdmissionPaused:QO}:{}})});try{if(X.aborted||F)return;if(await I.writeInitial({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),X.aborted||F)return;if(I.finishInitialization({replayed:!1}),X.aborted||F)return;D=setInterval(()=>{if(X.aborted||F)return;I?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},w5),await x}catch(B){if(J$(B,F))return;throw B}finally{await S(),Z.signal.removeEventListener("abort",h),Z.release()}});return J=!0,N}catch(N){if(!J)Z.release();throw N}}),{app:O,shutdown:(Q)=>$.shutdown(Q),getSseConnectionStats:()=>$.stats()}};import{Hono as b5}from"hono";var T5=z.Object({paused:z.Boolean()}),V$=()=>{let O=new b5;return O.get("/health",($)=>{return $.json({healthy:!0,version:y0()})}),O.get("/info",($)=>{let Q=NO(),Z=DO();if(Z)w0.configure(Z.maxConcurrentTasks,Z.maxQueuedTasks,Z.maxQueuedTaskBytes);let J=w0.getStats();return $.json({version:y0(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:Q,gitBranch:X$(Q),taskAdmission:{inFlight:J.inFlight,queued:J.queued,maxConcurrent:J.maxConcurrent,maxQueued:J.maxQueued,paused:J.paused}})}),O.put("/task-admission",async($)=>{let Q;try{Q=await $.req.json()}catch{throw new w("Invalid request body")}let Z=y(T5,Q);if(!Z.success)throw new w("Invalid task admission control request");w0.setPaused(Z.data.paused);let J=w0.getStats();return $.json({inFlight:J.inFlight,queued:J.queued,maxConcurrent:J.maxConcurrent,maxQueued:J.maxQueued,paused:J.paused})}),O};import{Hono as j5}from"hono";var I5=z.Object({projectPath:z.String({minLength:1}),action:YO(["trust","revoke"]),expectedDigest:z.Optional(z.String())}),R5=z.Object({projectPath:z.String({minLength:1}),sessionId:z.String({minLength:1}),enabled:z.Boolean()});function $4(O){if(!O)throw new w("projectPath must be absolute");try{return _O(O)}catch{throw new w("projectPath must reference a local workspace")}}function z$(O){if(!O)throw new w("sessionId is required");try{S1(O)}catch($){throw new w($ instanceof Error?$.message:"sessionId is invalid")}return O}async function E1(O){let $=$4(O),Q=DO()?.hooks??W$.hooks,Z=await N1.getInstance().loadWorkspaceHooks($,Q,{includeBaseForCurrentWorkspace:!1});return z1($,async()=>{V1($);let J=g0.getInstance();return J.loadConfig(Z,$),await X1($),J.getConfig($)})}function G$(O,$){let Q=g0.getInstance(),Z=Q.getConfig($).enabled,J=Q.isSessionPaused(O,$);return{sessionId:O,projectPath:$,enabled:Q.isSessionEnabled(O,$),paused:J,configEnabled:Z}}var _$=()=>{let O=new j5;return O.get("/trust",async($)=>{let Q=$.req.query("projectPath");if(!Q)throw new w("projectPath query parameter is required");return await E1(Q),$.json(await g0.getInstance().getTrustStatus(Q))}),O.post("/trust",async($)=>{let Q=y(I5,await $.req.json());if(!Q.success)throw new w("Invalid hook trust request");let{projectPath:Z,action:J,expectedDigest:N}=Q.data;await E1(Z);let X=g0.getInstance(),W;try{W=J==="trust"?await X.trustProject(Z,N):await X.revokeProjectTrust(Z)}catch(D){if(D instanceof U$)throw new u(D.message);throw D}return $.json(W)}),O.get("/session",async($)=>{let Q=$4($.req.query("projectPath")),Z=z$($.req.query("sessionId"));return await E1(Q),$.json(G$(Z,Q))}),O.post("/session",async($)=>{let Q=y(R5,await $.req.json());if(!Q.success)throw new w("Invalid hook session request");let Z=$4(Q.data.projectPath),J=z$(Q.data.sessionId);await E1(Z);let N=g0.getInstance();if(Q.data.enabled)N.enableSession(J,Z);else N.disableSession(J,Z);return $.json(G$(J,Z))}),O};import{Hono as q5}from"hono";var Q0=$O("Service");function E5(O){try{return F$(O)}catch{return[]}}function S5(O){if(!C1(O)||!C1(O.reference)||!C1(O.argument))throw Error("Invalid MCP completion request");let $=O.reference.type,Q=$==="prompt"&&typeof O.reference.name==="string"?{type:"prompt",name:O.reference.name}:$==="resource"&&typeof O.reference.uri==="string"?{type:"resource",uri:O.reference.uri}:void 0;if(!Q||typeof O.argument.name!=="string"||typeof O.argument.value!=="string")throw Error("Invalid MCP completion request");let Z;if(O.context!==void 0){if(!C1(O.context))throw Error("Invalid MCP completion context");Z=Object.create(null);for(let[J,N]of Object.entries(O.context)){if(typeof N!=="string")throw Error("Invalid MCP completion context");Z[J]=N}}return{reference:Q,argument:{name:O.argument.name,value:O.argument.value},...Z?{context:Z}:{}}}function C1(O){return O!==null&&typeof O==="object"&&!Array.isArray(O)}async function H0(O,$){let Q=DO()?.mcpServers??{};for(let[Z,J]of Object.entries(Q)){if($&&Z!==$)continue;if(!O.getServerStatus(Z))await O.registerServer(Z,J,{connect:!1})}}var w$=()=>{let O=new q5;return O.get("/",async($)=>{try{let Q=PO.getInstance();await H0(Q);let Z=Q.getAllServers(),J=await Promise.all(Array.from(Z.entries()).map(async([N,X])=>({id:N,name:N,status:X.status==="connected"?"connected":X.status==="reconnecting"?"reconnecting":X.status==="connecting"?"connecting":X.lastError?"error":"offline",endpoint:X.config.command?`${X.config.command} ${(X.config.args||[]).join(" ")}`.trim():X.config.url||"Unknown",description:`MCP server: ${N}`,tools:X.tools.map((W)=>W.name),completionSupported:X.client.completionSupported,tasks:X.client.tasks,resources:X.contentCatalog.resources,resourceTemplates:X.contentCatalog.resourceTemplates.map((W)=>({...W,variables:E5(W.uriTemplate)})),prompts:X.contentCatalog.prompts,connectedAt:X.connectedAt?.toISOString(),error:X.lastError?.message,recovery:X.recovery,logging:X.logging,instructions:X.instructions,oauthEnabled:X.client.oauthEnabled,oauthStatus:await X.client.getOAuthStatus()})));return $.json(J)}catch(Q){return Q0.error("[McpRoutes] Failed to get MCP servers:",Q),$.json({error:Q instanceof Error?Q.message:"Failed to get MCP servers"},500)}}),O.post("/:name/connect",async($)=>{try{let Q=$.req.param("name"),Z=PO.getInstance();return await H0(Z,Q),await Z.connectServer(Q),$.json({success:!0})}catch(Q){return Q0.error("[McpRoutes] Failed to connect MCP server:",Q),$.json({success:!1,error:Q.message},500)}}),O.post("/:name/disconnect",async($)=>{try{let Q=$.req.param("name"),Z=PO.getInstance();return await H0(Z,Q),await Z.disconnectServer(Q),$.json({success:!0})}catch(Q){return Q0.error("[McpRoutes] Failed to disconnect MCP server:",Q),$.json({success:!1,error:Q.message},500)}}),O.get("/:name/logs",async($)=>{try{let Q=$.req.param("name"),Z=Number($.req.query("limit")??20),J=Number($.req.query("afterRevision")??0);if(!Number.isSafeInteger(Z)||Z<1||Z>100||!Number.isSafeInteger(J)||J<0)return $.json({error:"Invalid MCP log pagination"},400);let N=PO.getInstance();return await H0(N,Q),$.json(N.getLogSnapshot(Q,{limit:Z,afterRevision:J}))}catch(Q){return Q0.error("[McpRoutes] Failed to get MCP logs:",Q),$.json({error:Q.message},500)}}),O.post("/:name/logging-level",async($)=>{try{let Q=$.req.param("name"),Z=await $.req.json();if(!K$(Z.level))return $.json({success:!1,error:"Invalid MCP logging level"},400);let J=PO.getInstance();return await H0(J,Q),await J.setServerLoggingLevel(Q,Z.level),$.json({success:!0,level:Z.level})}catch(Q){return Q0.error("[McpRoutes] Failed to set MCP logging level:",Q),$.json({success:!1,error:Q.message},400)}}),O.post("/:name/complete",async($)=>{try{let Q=$.req.param("name"),Z=S5(await $.req.json()),J=PO.getInstance();await H0(J,Q);let N=await J.complete(Q,Z);return $.json(N)}catch(Q){return Q0.error("[McpRoutes] Failed to complete MCP argument:",Q),$.json({error:Q.message},400)}}),O.post("/:name/oauth/login",async($)=>{try{let Q=$.req.param("name"),Z=PO.getInstance();await H0(Z,Q);let J=await Z.beginOAuthLogin(Q);return $.json({success:!0,flowId:J.flowId,authorizationUrl:J.authorizationUrl},202)}catch(Q){return Q0.error("[McpRoutes] Failed to start MCP OAuth login:",Q),$.json({success:!1,error:Q.message},400)}}),O.post("/:name/oauth/logout",async($)=>{try{let Q=$.req.param("name"),Z=PO.getInstance();return await H0(Z,Q),await Z.logoutOAuth(Q),$.json({success:!0})}catch(Q){return Q0.error("[McpRoutes] Failed to log out MCP OAuth:",Q),$.json({success:!1,error:Q.message},400)}}),O.delete("/:name",async($)=>{try{let Q=$.req.param("name");await PO.getInstance().unregisterServer(Q);let J=DO();if(J?.mcpServers){let{[Q]:N,...X}=J.mcpServers;await uO().updateConfig({mcpServers:X})}return $.json({success:!0})}catch(Q){return Q0.error("[McpRoutes] Failed to delete MCP server:",Q),$.json({success:!1,error:Q.message},500)}}),O.post("/",async($)=>{try{let Q=await $.req.json(),{name:Z,config:J}=Q;if(!Z||!J)return $.json({success:!1,error:"Missing name or config"},400);await PO.getInstance().registerServer(Z,J);let X=DO();return await uO().updateConfig({mcpServers:{...X?.mcpServers,[Z]:J}}),$.json({success:!0})}catch(Q){return Q0.error("[McpRoutes] Failed to add MCP server:",Q),$.json({success:!1,error:Q.message},500)}}),O};import{getSupportedThinkingLevels as C5}from"@earendil-works/pi-ai";import{Hono as f5}from"hono";var f1=$O("Service");function P5(O){let $=O||NO();try{return _O($,O?"directory":"cwd")}catch(Q){throw new w(Q instanceof Error?Q.message:"directory is invalid")}}function k5(O,$,Q=x$.list()){return{id:O.id,displayName:O.displayName,provider:O.provider,model:O.model,overrides:O.overrides,fallbackModels:O.fallbackModels,contextWindow:$.contextWindow,maxTokens:$.maxTokens,reasoning:$.reasoning,supportedReasoningEfforts:C5($),supportedServiceTiers:B$($),supportedResponseVerbosities:H$($),communicationStyles:Q,input:$.input}}function m5(O){L$(O.overrides);let $={displayName:O.displayName||void 0,overrides:O.overrides||void 0};if(O.model)$.model=O.model;return $}function L$(O){let $=O?.streamIdleTimeout;if($!==void 0&&(!Number.isFinite($)||$<1000))throw new w("streamIdleTimeout must be at least 1000ms")}var M$=()=>{let O=new f5;return O.get("/",async($)=>{try{let Q=DO();if(!Q)throw Error("Config not initialized");let Z=P5($.get("directory")),[J,N]=await Promise.all([P1(Z,Q),tO(Z)]),X=J.config.models,W=X.find((T)=>T.id===J.config.currentModelId)??X[0],D=J.catalog,F=N.communicationStyles.list(),I=(T)=>k5(T,D.resolveConfig(T),F);return $.json({configured:X.map(I),current:W?I(W):null})}catch(Q){if(Q instanceof w)throw Q;f1.error("[ModelsRoutes] Failed to get models:",Q);let Z=new JO("Failed to get models");return $.json(Z.toObject(),500)}}),O.post("/",async($)=>{let Q=j0(),Z,J;try{let N=await $.req.json(),{provider:X,displayName:W,model:D,overrides:F,apiKey:I,modelProvider:T}=N;if(!X||!D)throw new w("provider and model are required");L$(F);let x;if(T){if(T.id!==X)throw new w("modelProvider.id must match the model provider");if(DO()?.modelProviders[X])throw new w(`model provider already exists: ${X}`);x={name:T.name,baseUrl:T.baseUrl,wireApi:T.wireApi,...T.apiKeyEnv?{apiKeyEnv:T.apiKeyEnv}:{}};try{Q.registerModelProvider(X,x,[D]),J=X}catch(S){throw new w(S instanceof Error?S.message:"Invalid model provider")}}else Q.getModel(X,D);if(I?.trim()){if(await Q.setApiKey(X,I.trim()),x)Z=X}let R={provider:X,displayName:W||void 0,model:D,overrides:F||void 0},A=x?await uO().addModelWithProvider(R,x):await uO().addModel(R);return $.json({success:!0,model:A})}catch(N){if(Z)await Q.credentials.delete(Z);if(J){let X=DO();Q.configureModelProviders(X?.modelProviders??{},X?.models??[])}throw f1.error("[ModelsRoutes] Failed to add model:",N),N}}),O.put("/:modelId",async($)=>{try{let Q=$.req.param("modelId"),Z=await $.req.json(),{displayName:J,overrides:N,model:X}=Z,W=D$(Q);if(!W)throw new w("model config not found");if(X)j0().getModel(W.provider,X);return await uO().updateModel(Q,m5({displayName:J,overrides:N,model:X})),$.json({success:!0})}catch(Q){throw f1.error("[ModelsRoutes] Failed to update model:",Q),Q}}),O.delete("/:modelId",async($)=>{try{let Q=$.req.param("modelId");return await uO().removeModel(Q),$.json({success:!0})}catch(Q){throw f1.error("[ModelsRoutes] Failed to delete model:",Q),Q}}),O};import{Hono as X9}from"hono";import{Mutex as u5}from"async-mutex";import{Hono as d5}from"hono";import{streamSSE as l5}from"hono/streaming";import{LRUCache as i5}from"lru-cache";import{nanoid as v0}from"nanoid";class sO extends Error{limit;resource="resident_session_projections";retryable=!0;constructor(O){super("Session projection capacity is full");this.limit=O;this.name="SessionProjectionCapacityError"}}class I0 extends Error{reason;constructor(O="Session projection residency is closed"){super(O);this.reason=O;this.name="SessionProjectionResidencyClosedError"}}class Z0 extends Error{key;constructor(O,$=`Session projection residency already owns key: ${O}`){super($);this.key=O;this.name="SessionProjectionResidencyConflictError"}}class Q4 extends Error{deadlineAt;constructor(O){super(`Session projection close wait timed out at ${O}`);this.deadlineAt=O;this.name="SessionProjectionResidencyCloseTimeoutError"}}function h5(O,$){if(O.size!==$.size)return!1;for(let[Q,Z]of O)if(!$.has(Q)||$.get(Q)!==Z)return!1;return!0}class Z4{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(!A$(O.maxResident))throw Error("Invalid max resident Session projection limit");if(!b$(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 Z0(O);let $=this.residents.get(O);if(!$||$.value===void 0)return;return $.pins++,this.createLease($)}reserve(O){this.assertNotClosed(),this.assertKeyOpen(O),this.makeCapacityForReservation();let $={key:O,generation:this.allocateGeneration()};return this.reservations.set(O,$),this.createReservation($)}snapshot(O){let $=this.residents.get(O);if(!$||$.value===void 0)return;return this.projectSnapshot($.value)}snapshotAll(){let O=[];for(let $ of this.residents.values()){if($.value===void 0)continue;let Q=this.projectSnapshot($.value);if(Q!==void 0)O.push(Q)}return O}beginCloseMany(O,$){this.assertNotClosed();let Q=[...new Set(O)].sort((A,S)=>A.localeCompare(S));for(let A of Q)if(this.closings.has(A))throw new Z0(A,`Session projection residency is already closing key: ${A}`);let Z=new Map,J=new Map,N=new Map,X=new Set;for(let A of Q){let S=this.reservations.get(A);if(S)this.reservations.delete(A);let h=this.residents.get(A);if(h){if(this.residents.delete(A),h.phase="closing",N.set(A,h),this.closings.set(A,h),Z.set(A,h.generation),X.add(A),h.value!==void 0){let B=this.projectSnapshot(h.value);if(B!==void 0)J.set(A,B)}continue}let m={key:A,generation:S?.generation??this.allocateGeneration(),value:void 0,pins:0,lastUsedAt:this.now(),phase:"closing"};N.set(A,m),this.closings.set(A,m),Z.set(A,m.generation)}let W={keys:Q,generations:Z,snapshots:J,entries:N,originalResidentKeys:X,waiters:new Set,state:"open"};this.closeStates.add(W),this.notifyCapacityAvailableIf(!0);let D=()=>{if(W.state==="committed")throw new I0("Session projection close set is already committed");if(W.state==="rolled_back")throw new I0("Session projection close set is already rolled back")},F=()=>{for(let A of W.entries.values())if(A.pins>0)return!1;return!0},I=()=>{if(!F())return;for(let A of W.waiters){if(A.timer!==void 0)clearTimeout(A.timer);A.removeAbortListener?.(),A.resolve()}W.waiters.clear()},T=({signal:A,deadlineAt:S}={})=>{if(W.state!=="open"||F())return Promise.resolve();if(S!==void 0&&S<=this.now())return Promise.reject(new Q4(S));return new Promise((h,m)=>{let B={resolve:()=>h(),reject:m,timer:void 0,removeAbortListener:void 0};if(W.waiters.add(B),S!==void 0){let r=Math.max(0,S-this.now());B.timer=setTimeout(()=>{W.waiters.delete(B),B.removeAbortListener?.(),m(new Q4(S))},r)}if(A){let r=()=>{if(W.waiters.delete(B),B.timer!==void 0)clearTimeout(B.timer);A.removeEventListener("abort",r),m(A.reason instanceof Error?A.reason:Error(String(A.reason??"AbortError")))};if(A.addEventListener("abort",r,{once:!0}),B.removeAbortListener=()=>{A.removeEventListener("abort",r)},A.aborted)r()}})},x=()=>{if(W.state==="committed")return;if(D(),!F())throw new Z0(W.keys[0]??"","Session projection close set still has active pins");let A=!1;for(let S of W.keys){let h=W.entries.get(S);if(!h)continue;if(this.closings.get(S)===h){if(this.closings.delete(S),h.value!==void 0)A=!0}}W.state="committed",this.closeStates.delete(W),I(),this.notifyCapacityAvailableIf(A)},R=(A)=>{if(this.closed)throw new I0(this.closedReason);if(W.state==="committed")throw new I0("Session projection close set is already committed");if(W.state==="rolled_back"){if(!W.rollbackReplacements)return;if(!h5(W.rollbackReplacements,A))throw new Z0(W.keys[0]??"","Session projection close set rollback replacements changed");return}if(!F())throw new Z0(W.keys[0]??"","Session projection close set still has active pins");for(let B of W.originalResidentKeys)if(!A.has(B))throw new Z0(B,`Session projection close rollback requires replacement for key: ${B}`);let S=!1,h=!1,m=this.now();for(let B of W.keys){let r=W.entries.get(B);if(!r)continue;if(this.closings.get(B)===r)this.closings.delete(B);if(!W.originalResidentKeys.has(B)){S||=r.value!==void 0;continue}let c=A.get(B);if(c===void 0){S||=r.value!==void 0;continue}if(r.value=c,r.phase="resident",r.lastUsedAt=m,this.residents.set(B,r),r.pins===0)h=!0}W.rollbackReplacements=new Map(A),W.state="rolled_back",this.closeStates.delete(W),I(),this.notifyCapacityAvailableIf(S||h)};return{keys:W.keys,generations:W.generations,snapshots:W.snapshots,waitForIdle:T,commit:x,rollback:R}}invalidateAll(O){if(this.closed&&this.invalidationPromise)return this.invalidationPromise;this.closed=!0,this.closedReason=O;for(let $ of[...this.reservations.keys()])this.reservations.delete($);for(let[$,Q]of[...this.residents.entries()])this.residents.delete($),Q.phase="closing",this.closings.set($,Q);return this.invalidationPromise=new Promise(($)=>{this.resolveInvalidation=$}),this.maybeFinishInvalidation(),this.invalidationPromise}sweepIdle(){if(this.closed)return 0;let O=this.now(),$=0;while(!0){let Q=[...this.residents.values()].filter((Z)=>Z.pins===0).sort((Z,J)=>Z.lastUsedAt-J.lastUsedAt||Z.generation-J.generation).find((Z)=>O-Z.lastUsedAt>=this.idleMs);if(!Q)return $;this.residents.delete(Q.key),$++,this.notifyCapacityAvailableIf(!0)}}onCapacityAvailable(O){return this.capacityListeners.add(O),()=>{this.capacityListeners.delete(O)}}getStats(){let O=0,$=0,Q=this.reservations.size,Z=0;for(let J of this.residents.values())if(O++,J.pins>0)Z++;for(let J of this.closings.values())if($++,J.pins>0)Z++;return{resident:O,closing:$,reserved:Q,pinned:Z,retained:O+Q+this.countClosingWithValue(),maxResident:this.maxResident,idleMs:this.idleMs}}getDebugStats(){let O=0,$=0;for(let Q of this.closings.values())if(Q.value===void 0)O++;for(let Q of this.closeStates)$+=Q.waiters.size;return{tombstones:O,waiters:$,listeners:this.capacityListeners.size}}assertNotClosed(){if(this.closed)throw new I0(this.closedReason)}assertKeyOpen(O){if(this.residents.has(O)||this.reservations.has(O)||this.closings.has(O))throw new Z0(O)}retainedCount(){return this.residents.size+this.reservations.size+this.countClosingWithValue()}countClosingWithValue(){let O=0;for(let $ of this.closings.values())if($.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 $=!1;return{key:O.key,generation:O.generation,commit:(Q)=>{if($)throw new Z0(O.key);if(this.closed)throw this.reservations.delete(O.key),$=!0,new I0(this.closedReason);if(this.reservations.get(O.key)!==O)throw $=!0,new Z0(O.key);this.reservations.delete(O.key);let Z={key:O.key,generation:O.generation,value:Q,pins:1,lastUsedAt:this.now(),phase:"resident"};return this.residents.set(O.key,Z),$=!0,this.createLease(Z)},cancel:()=>{if($)return;if(this.reservations.get(O.key)===O)this.reservations.delete(O.key),this.notifyCapacityAvailableIf(!0);$=!0}}}createLease(O){let $=!1;return{key:O.key,generation:O.generation,get value(){return O.value},isCurrent:()=>{let Q=this.residents.get(O.key);if(Q===O&&Q.generation===O.generation)return!0;let Z=this.closings.get(O.key);return Z===O&&Z.generation===O.generation},release:()=>{if($)return;$=!0;let Q=this.residents.get(O.key),Z=this.closings.get(O.key),J=Q===O&&Q.generation===O.generation?Q:Z===O&&Z.generation===O.generation?Z:void 0;if(!J)return;J.pins=Math.max(0,J.pins-1),J.lastUsedAt=this.now(),this.notifyCapacityAvailableIf(!0),this.resolveIdleWaitersForEntry(J),this.maybeFinishInvalidation()}}}makeCapacityForReservation(){while(this.retainedCount()>=this.maxResident){let O=[...this.residents.values()].filter(($)=>$.pins===0).sort(($,Q)=>$.lastUsedAt-Q.lastUsedAt||$.generation-Q.generation)[0];if(!O)throw new sO(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 $ of this.closeStates){if(!$.entries.has(O.key))continue;let Q=!0;for(let Z of $.entries.values())if(Z.pins>0){Q=!1;break}if(!Q)continue;for(let Z of $.waiters){if(Z.timer!==void 0)clearTimeout(Z.timer);Z.removeAbortListener?.(),Z.resolve()}$.waiters.clear()}}maybeFinishInvalidation(){if(!this.closed||!this.resolveInvalidation)return;for(let $ of this.closings.values())if($.pins>0)return;this.closings.clear();let O=this.resolveInvalidation;this.resolveInvalidation=void 0,O()}notifyCapacityAvailableIf(O){if(!O)return;for(let $ of[...this.capacityListeners])try{$()}catch{}}}class J4{runtimes=new Map;createRuntime;constructor(O={}){this.createRuntime=O.createRuntime??(($)=>new T$($.projectPath,`web-browser:${$.sessionId}`,{exposeArtifactPaths:!1}))}get(O){let $=o(O),Q=this.runtimes.get($);if(Q?.state==="live")return Q.runtime;if(Q)throw new k1("browser_disposed","Browser Session Runtime is closed",{retryable:!0});let Z=this.createRuntime(O);return this.runtimes.set($,{state:"live",runtime:Z}),Z}async reset(O){let $=this.runtimes.get(o(O));if($?.state==="live")await $.runtime.page({action:{kind:"reset"}})}dispose(O){let $=o(O),Q=this.runtimes.get($);if(!Q)return Promise.resolve();if(Q.state==="disposing")return Q.disposePromise;return this.disposeKey($,Q.runtime)}async disposeAll(){let $=(await Promise.allSettled([...this.runtimes.keys()].map((Q)=>{let Z=this.runtimes.get(Q);if(!Z)return Promise.resolve();if(Z.state==="disposing")return Z.disposePromise;return this.disposeKey(Q,Z.runtime)}))).find((Q)=>Q.status==="rejected");if($)throw $.reason}stats(){let O=0,$=0,Q=0;for(let Z of this.runtimes.values()){if(Z.state==="live")O++;if(Z.state==="disposing")$++;if(Z.state==="failed")Q++}return{sessions:this.runtimes.size,live:O,disposing:$,failed:Q}}disposeKey(O,$){let Q=$.dispose().then(()=>{if(this.runtimes.get(O)?.runtime===$)this.runtimes.delete(O)},(Z)=>{if(this.runtimes.get(O)?.runtime===$)this.runtimes.set(O,{state:"failed",runtime:$,error:Z});throw Z});return this.runtimes.set(O,{state:"disposing",runtime:$,disposePromise:Q}),Q}}import{Hono as g5}from"hono";var j$=z.Object({action:YO(["accept","dismiss"])},{additionalProperties:!1}),y5=rO(z.Union([z.Object({kind:z.Literal("click"),dialog:z.Optional(j$)},{additionalProperties:!1}),z.Object({kind:z.Literal("click_at"),screenshotId:z.String({minLength:1,maxLength:G1}),x:z.Integer({minimum:0,maximum:Y4}),y:z.Integer({minimum:0,maximum:Y4}),dialog:z.Optional(j$)},{additionalProperties:!1}),z.Object({kind:z.Literal("hover")},{additionalProperties:!1}),z.Object({kind:z.Literal("fill"),value:z.String()},{additionalProperties:!1}),z.Object({kind:z.Literal("type"),value:z.String()},{additionalProperties:!1}),z.Object({kind:z.Literal("press"),key:YO(["Enter","Tab","Escape","Backspace","Delete","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Space"])},{additionalProperties:!1}),z.Object({kind:z.Literal("select"),values:z.Array(z.String())},{additionalProperties:!1}),z.Object({kind:z.Literal("check")},{additionalProperties:!1}),z.Object({kind:z.Literal("uncheck")},{additionalProperties:!1}),z.Object({kind:z.Literal("scroll"),direction:YO(["up","down","left","right"]),amount:z.Integer()},{additionalProperties:!1})])),I$=rO(z.Object({action:z.Optional(YO(["goto","back","forward","reload"])),url:z.Optional(z.String()),pageId:z.Optional(z.String()),expectedOrigin:z.Optional(z.String()),waitUntil:z.Optional(YO(["commit","domcontentloaded","load"])),timeoutMs:z.Optional(z.Integer())},{additionalProperties:!1})),R$=rO(z.Object({pageId:z.String(),snapshotId:z.String(),ref:z.Optional(z.String()),expectedOrigin:z.String(),action:y5,timeoutMs:z.Optional(z.Integer())},{additionalProperties:!1}));function q$(O,$){if(O===void 0)return;let Q=Number(O);if(!Number.isSafeInteger(Q))throw new w(`${$} must be an integer`);return Q}function p5(O,$){if(O===void 0)return;if(O==="true")return!0;if(O==="false")return!1;throw new w(`${$} must be true or false`)}function v5(O){let $=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 zO(O.code.toUpperCase(),O.message,$,O.details)}function E$(O){let $=new g5;$.use("*",(Z,J)=>O.withAdmission(J)),$.onError((Z,J)=>{let N=Z instanceof k1?v5(Z):Z instanceof zO?Z:new JO;return J.json(N.toObject(),N.statusCode)});let Q=(Z,J)=>O.resolveSessionRef(Z,J);return $.post("/:sessionId/browser/navigate",async(Z)=>{let J=await Z.req.json().catch(()=>{return}),N=y(I$,J);if(!N.success)throw new w("Invalid browser navigation request");let X=await Q(Z.req.param("sessionId"),Z.req.query("projectPath"));return Z.json(await O.getRuntime(X).navigate(N.data))}),$.post("/:sessionId/browser/interact",async(Z)=>{let J=await Z.req.json().catch(()=>{return}),N=y(R$,J);if(!N.success)throw new w("Invalid browser interaction request");let X=await Q(Z.req.param("sessionId"),Z.req.query("projectPath"));return Z.json(await O.getRuntime(X).interact(N.data))}),$.get("/:sessionId/browser/snapshot",async(Z)=>{let J=await Q(Z.req.param("sessionId"),Z.req.query("projectPath")),N=q$(Z.req.query("depth"),"depth"),X=p5(Z.req.query("includeBoxes"),"includeBoxes");return Z.json(await O.getRuntime(J).snapshot({...Z.req.query("pageId")?{pageId:Z.req.query("pageId")}:{},...N===void 0?{}:{depth:N},...X===void 0?{}:{includeBoxes:X}}))}),$.get("/:sessionId/browser/inspect",async(Z)=>{let J=await Q(Z.req.param("sessionId"),Z.req.query("projectPath")),N=Z.req.query("target"),X=Z.req.query("pageId"),W=Z.req.query("expectedOrigin");if(N==="screenshot"){let I=Z.req.query("source")??"user";if(I!=="user"&&I!=="agent")throw new w("Unsupported browser screenshot source");if(I==="agent"&&(!X||!W))throw new w("Agent browser screenshots require pageId and expectedOrigin");let T={...X?{pageId:X}:{},...W?{expectedOrigin:W}:{}},x=I==="agent"?await O.captureAgentScreenshot(J,T):await O.getRuntime(J).screenshot(T);return new Response(new Uint8Array(x),{headers:{"Content-Type":"image/png","Content-Length":String(x.length),"Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}let D=q$(Z.req.query("limit"),"limit"),F={...X?{pageId:X}:{},...W?{expectedOrigin:W}:{}};if(N==="find"){let I=Z.req.query("text");if(!I)throw new w("text is required for browser find");return Z.json(await O.getRuntime(J).inspect({...F,target:{kind:"find",text:I,...D===void 0?{}:{limit:D}}}))}if(N!=="console"&&N!=="page-errors"&&N!=="network")throw new w("Unsupported browser inspection target");return Z.json(await O.getRuntime(J).inspect({...F,target:{kind:N,...D===void 0?{}:{limit:D}}}))}),$.post("/:sessionId/browser/reset",async(Z)=>{let J=await Q(Z.req.param("sessionId"),Z.req.query("projectPath"));return await O.resetRuntime(J),Z.json({success:!0})}),$}var i=$O("Service"),m1="web-pending-resume-recovery-budget-exhausted";class W1 extends Error{evidence;constructor(O){super(O.taskFailure.message);this.evidence=O;this.name="WebAgentRunFailure"}}var c5=z.Object({title:z.Optional(z.String()),projectPath:z.Optional(z.String())}),a5=W2,n5=z.Object({title:z.Optional(z.String()),projectPath:z.Optional(z.String())}),o5=z.Object({projectPath:z.String()}),t5=z.Object({objective:z.String({minLength:1}),tokenBudget:z.Optional(z.Integer({minimum:1})),permissionMode:z.Optional(YO(["default","autoEdit","plan","yolo"]))}),s5=z.Union([z.Object({action:z.Literal("pause")}),z.Object({action:z.Literal("resume")}),z.Object({action:z.Literal("edit"),objective:z.String({minLength:1})})]),Y0,F1,O0=new Map,V0=new Map,eO=new Map,v1=new i5({max:100,ttl:1800000});function r5(O){let $=structuredClone({...O,createdAt:O.createdAt.toISOString(),updatedAt:O.updatedAt.toISOString()});return{...$,createdAt:new Date($.createdAt),updatedAt:new Date($.updatedAt)}}function S$(O){return{sessionId:O.sessionId,projectPath:O.projectPath}}function qO(O){if(!O)return;return O0.get(O)??v1.get(O)}function e5(O){if(O0.get(O.id)!==O)return;O0.delete(O.id),v1.set(O.id,O)}function O9(O){O0.delete(O),v1.delete(O)}function RO(O){return O?.status==="queued"||O?.status==="running"||O?.status==="waiting_permission"}function w1(O,$="user-cancel"){if(O.status==="cancelled"||O.status==="completed"||O.status==="failed"||O.status==="attention_required")return!1;let Q=O.pendingPermission;if(O.pendingPermission=void 0,Q?.resolve({approved:!1,reason:H4}),Q)k.publish(S$(O),"interaction.resolved",{requestId:Q.permissionId});return O.abortController.abort($),O.status="cancelled",k.publish(S$(O),"run.cancelled",{runId:O.id}),!0}function x2(O,$=!1){let{permissionId:Q,details:Z}=O;if(Z.type==="askUserQuestion"&&Z.questions)return{type:"question.required",properties:{requestId:Q,toolCallId:Z.toolCallId??Q,questions:Z.questions,details:Z,...$?{replayed:!0}:{}}};if(Z.type==="mcpElicitation"&&Z.mcpElicitation)return{type:"elicitation.required",properties:{requestId:Q,toolCallId:Z.toolCallId??Q,elicitation:Z.mcpElicitation,...$?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:Q,toolName:Z.toolName,description:Z.message,args:Z.args,details:Z,...$?{replayed:!0}:{}}}}function $9(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 Q9(){let O=Y0;if(O)O.accepting=!1,O.invalidateAll("route-reset");Y0=void 0;for(let $ of O0.values())w1($,"route-reset");O0.clear();for(let $ of V0.values())$.controller.abort("route-reset");V0.clear(),v1.clear(),F1?.(),F1=void 0}function Z9(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let $=O,Q=$.code,Z=$.reason,J=$.scope,N=$.kind,X=$.limit;if(Q!=="tool_busy"&&Q!=="tool_batch_full"||Z!=="queue_full"&&Z!=="wait_timeout"&&Z!=="turn_limit"||J!=="global"&&J!=="session"||typeof $.retryable!=="boolean"||!Number.isSafeInteger(X)||X<=0||N!==void 0&&N!=="readonly"&&N!=="write"&&N!=="execute")return;return{code:Q,reason:Z,scope:J,retryable:$.retryable,...N===void 0?{}:{kind:N},limit:X}}var H1=(O,$)=>{if(!$||typeof $!=="object")return $;let Q={...$},Z=Z9(Q.tool_admission);if(Z)Q.tool_admission=Z;else delete Q.tool_admission;if($2(O)){let X=Q.browser&&typeof Q.browser==="object"&&!Array.isArray(Q.browser)?Q.browser:{},W={},D=(F,I,T)=>{let x=X[F];if(typeof x==="string"&&Buffer.byteLength(x)<=I&&(!T||T.test(x)))W[F]=x};if(D("action",64),D("status",16,/^(?:ok|warning|error)$/),D("pageId",G1,/^browser_page_[a-f0-9-]+$/),D("snapshotId",G1,/^browser_snapshot_[a-f0-9-]+$/),D("origin",z4),D("candidateOrigin",z4),D("url",c$),D("title",a$),D("errorCode",64,/^browser_[a-z_]+$/),typeof X.truncated==="boolean")W.truncated=X.truncated;if(typeof X.actionApplied==="boolean"||X.actionApplied==="unknown")W.actionApplied=X.actionApplied;if(typeof X.sideEffectsUncertain==="boolean")W.sideEffectsUncertain=X.sideEffectsUncertain;if(typeof X.diagnosticCount==="number"&&Number.isSafeInteger(X.diagnosticCount)&&X.diagnosticCount>=0&&X.diagnosticCount<=i$)W.diagnosticCount=X.diagnosticCount;if(X.interaction&&typeof X.interaction==="object"&&!Array.isArray(X.interaction)){let F=X.interaction,I=new Set(["click","hover","fill","type","press","select","check","uncheck","scroll"]);if(typeof F.action==="string"&&I.has(F.action)){let T={action:F.action};if(typeof F.ref==="string"&&Buffer.byteLength(F.ref)<=n$&&/^[a-z][a-z0-9]*$/.test(F.ref))T.ref=F.ref;let x=(R,A,S)=>typeof R==="number"&&Number.isFinite(R)&&R>=A&&R<=S;if(F.viewport&&typeof F.viewport==="object"&&!Array.isArray(F.viewport)){let R=F.viewport;if(x(R.width,1,16384)&&x(R.height,1,16384))T.viewport={width:R.width,height:R.height}}if(F.targetBox&&typeof F.targetBox==="object"&&!Array.isArray(F.targetBox)){let R=F.targetBox;if(x(R.x,-16384,32768)&&x(R.y,-16384,32768)&&x(R.width,0,16384)&&x(R.height,0,16384))T.targetBox={x:R.x,y:R.y,width:R.width,height:R.height}}W.interaction=T}}if(X.artifact&&typeof X.artifact==="object"&&!Array.isArray(X.artifact)){let F=X.artifact;if(typeof F.id==="string"&&/^[a-f0-9]{64}$/.test(F.id)&&F.sha256===F.id&&F.kind==="image"&&F.mimeType==="image/png"&&typeof F.size==="number"&&Number.isSafeInteger(F.size)&&F.size>=0&&F.size<=o$&&F.persisted===!0)W.artifact={id:F.id,sha256:F.sha256,kind:F.kind,mimeType:F.mimeType,size:F.size,persisted:!0,...typeof F.path==="string"&&Buffer.byteLength(F.path)<=8192?{path:F.path}:{}}}return{...typeof Q.summary==="string"?{summary:Q.summary.slice(0,512)}:{},browser:W,...Z?{tool_admission:Z}:{}}}if(O==="Bash"){let X={},W=["message","signal","status","summary"],D=["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"],F=["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 T of W){let x=Q[T];if(typeof x==="string")X[T]=x.slice(0,8192)}for(let T of D){let x=Q[T];if(typeof x==="boolean")X[T]=x}for(let T of F){let x=Q[T];if(typeof x==="number"&&Number.isSafeInteger(x)&&x>=0)X[T]=x}if(Q.exit_code===null||typeof Q.exit_code==="number"&&Number.isSafeInteger(Q.exit_code))X.exit_code=Q.exit_code;if(Q.terminal_transport==="local"||Q.terminal_transport==="acp"||Q.terminal_transport==="local_fallback")X.terminal_transport=Q.terminal_transport;if(Q.background_reason==="explicit"||Q.background_reason==="foreground_budget")X.background_reason=Q.background_reason;for(let T of["bash_id","shell_id"]){let x=Q[T];if(typeof x==="string"&&x.length<=128&&/^bash_[A-Za-z0-9-]+$/.test(x))X[T]=x}if(Z)X.tool_admission=Z;let I=Q.background_shell_admission;if(I&&typeof I==="object"&&!Array.isArray(I)){let T=I;if(T.code==="background_shell_busy"&&(T.scope==="session"||T.scope==="global")&&T.retryable===!0&&Number.isSafeInteger(T.limit)&&T.limit>0)X.background_shell_admission={code:T.code,scope:T.scope,retryable:T.retryable,limit:T.limit}}return X}let J=200000,N=(X,W)=>typeof X==="number"&&Number.isSafeInteger(X)&&X>=0&&X<=W?X:0;if(typeof Q.oldContent==="string"&&Q.oldContent.length>J)delete Q.oldContent;if(typeof Q.newContent==="string"&&Q.newContent.length>J)delete Q.newContent;if(Q.mcpResult&&typeof Q.mcpResult==="object"&&!Array.isArray(Q.mcpResult)){let X=Q.mcpResult,W=Array.isArray(X.artifacts)?X.artifacts.slice(0,64).flatMap((D)=>{if(!D||typeof D!=="object"||Array.isArray(D))return[];let F=D,I=new Set(["text","image","audio","resource"]);if(typeof F.id!=="string"||!/^[a-f0-9]{64}$/.test(F.id)||typeof F.sha256!=="string"||F.sha256!==F.id||typeof F.kind!=="string"||!I.has(F.kind)||N(F.size,67108864)!==F.size||typeof F.persisted!=="boolean")return[];return[{id:F.id.slice(0,128),sha256:F.sha256.slice(0,128),kind:F.kind,size:F.size,persisted:F.persisted,...typeof F.mimeType==="string"?{mimeType:F.mimeType.slice(0,256)}:{},...typeof F.sourceUri==="string"?{sourceUri:F.sourceUri.slice(0,8192)}:{},...typeof F.path==="string"?{path:F.path.slice(0,8192)}:{}}]}):[];Q.mcpResult={isError:X.isError===!0,contentCount:N(X.contentCount,64),textBytes:N(X.textBytes,4194304),structuredBytes:N(X.structuredBytes,4194304),artifactCount:N(X.artifactCount,64),truncated:X.truncated===!0,binaryOmitted:X.binaryOmitted===!0,artifacts:W}}else delete Q.mcpResult;return Q};function J9(O){let $=typeof O.seq==="number"?{seq:O.seq}:{};if(O.type==="part_created"&&O.data.partType==="tool_call"){let Q=O.data.payload;return{type:"tool.start",...$,properties:{messageId:O.data.messageId,toolCallId:Q.toolCallId??O.data.partId,toolName:Q.toolName??"unknown",arguments:JSON.stringify(Q.input??{})}}}if(O.type==="part_created"&&O.data.partType==="tool_result"){let Q=O.data.payload,Z=Q.toolName??"unknown",J=B4(Q),N=D1(x1(Z,J),B1);return{type:"tool.result",...$,properties:{messageId:O.data.messageId,toolCallId:Q.toolCallId??O.data.partId,toolName:Z,success:J.success,status:J.success?"completed":"failed",summary:J.metadata?.summary,output:L1(N),metadata:H1(Z,J.metadata)}}}return{type:`committed.${O.type}`,...$,properties:{event:O}}}function Y9(O,$,Q){switch(Q.kind){case"tool_start":if("function"in Q.toolCall)k.publish(O,"subagent.update",{subagentSessionId:$,toolName:Q.toolCall.function.name}),k.publish(O,"subagent.tool.start",{subagentSessionId:$,toolCallId:Q.toolCall.id,toolName:Q.toolCall.function.name,arguments:Q.toolCall.function.arguments,toolKind:Q.toolKind});break;case"tool_result":if("function"in Q.toolCall)k.publish(O,"subagent.tool.result",{subagentSessionId:$,toolCallId:Q.toolCall.id,toolName:Q.toolCall.function.name,success:Q.result.success,summary:Q.result.metadata?.summary,output:L1(D1(x1(Q.toolCall.function.name,Q.result),B1)),metadata:H1(Q.toolCall.function.name,Q.result.metadata)});break;case"tool_progress":if("function"in Q.toolCall)k.publish(O,"subagent.tool.progress",{subagentSessionId:$,toolCallId:Q.toolCall.id,toolName:Q.toolCall.function.name,...Q.update});break;case"content_delta":k.publish(O,"subagent.delta",{subagentSessionId:$,delta:Q.delta});break;case"thinking_delta":k.publish(O,"subagent.thinking.delta",{subagentSessionId:$,delta:Q.delta});break;case"stream_end":k.publish(O,"subagent.stream.end",{subagentSessionId:$});break;case"provider_admission":k.publish(O,"subagent.provider.admission",{subagentSessionId:$,phase:Q.phase,requestClass:Q.requestClass,resource:Q.resource,scope:Q.scope,reason:Q.reason,queuePosition:Q.queuePosition,queueDepth:Q.queueDepth,inFlight:Q.inFlight,limit:Q.limit,waitMs:Q.waitMs,maxWaitMs:Q.maxWaitMs,recoveryRemainingMs:Q.recoveryRemainingMs});break;case"provider_circuit":k.publish(O,"subagent.provider.circuit",{subagentSessionId:$,phase:Q.phase,reason:Q.reason,statusCode:Q.statusCode,retryAfterMs:Q.retryAfterMs,nextProbeAt:Q.nextProbeAt,openDurationMs:Q.openDurationMs,sampleCount:Q.sampleCount,failureCount:Q.failureCount,recoveryRemainingMs:Q.recoveryRemainingMs});break;case"provider_retry":k.publish(O,"subagent.provider.retry",{subagentSessionId:$,phase:Q.phase,attempt:Q.attempt,maxRetries:Q.maxRetries,reason:Q.reason,statusCode:Q.statusCode,delayMs:Q.delayMs,nextRetryAt:Q.nextRetryAt,mode:Q.mode,recoveryBudgetMs:Q.recoveryBudgetMs,recoveryElapsedMs:Q.recoveryElapsedMs,recoveryRemainingMs:Q.recoveryRemainingMs,exhaustedBy:Q.exhaustedBy});break;case"provider_stall":k.publish(O,"subagent.provider.stall",{subagentSessionId:$,phase:Q.phase,stallCount:Q.stallCount,durationMs:Q.durationMs,warningAfterMs:Q.warningAfterMs,timeoutMs:Q.timeoutMs,outputStarted:Q.outputStarted});break;case"action_stationarity":k.publish(O,"subagent.action.stationarity",{subagentSessionId:$,phase:Q.phase,toolName:Q.toolName,runLength:Q.runLength,nudgeThreshold:Q.nudgeThreshold,haltThreshold:Q.haltThreshold,progressAware:Q.progressAware});break;case"mcp_catalog_changed":k.publish(O,"subagent.mcp.catalog.changed",{subagentSessionId:$,revision:Q.revision,serverName:Q.serverName,added:Q.added,removed:Q.removed,updated:Q.updated});break;case"mcp_content_changed":k.publish(O,"subagent.mcp.content.changed",{subagentSessionId:$,revision:Q.revision,serverName:Q.serverName,contentKind:Q.contentKind,added:Q.added,removed:Q.removed,updated:Q.updated});break;case"mcp_resource_updated":k.publish(O,"subagent.mcp.resource.updated",{subagentSessionId:$,revision:Q.revision,serverName:Q.serverName,uri:Q.uri});break;case"mcp_connection_changed":k.publish(O,"subagent.mcp.connection.changed",{subagentSessionId:$,revision:Q.revision,serverName:Q.serverName,phase:Q.phase,reason:Q.reason,attempt:Q.attempt,maxAttempts:Q.maxAttempts,nextRetryAt:Q.nextRetryAt,error:Q.error});break;case"mcp_log":k.publish(O,"subagent.mcp.log",{subagentSessionId:$,revision:Q.revision,serverName:Q.serverName,level:Q.level,logger:Q.logger,message:Q.message,projectedBytes:Q.projectedBytes,dataSha256:Q.dataSha256,truncated:Q.truncated,detailsOmitted:Q.detailsOmitted,timestamp:Q.timestamp,synthetic:Q.synthetic});break;case"mcp_instructions_changed":k.publish(O,"subagent.mcp.instructions.changed",{subagentSessionId:$,revision:Q.revision,serverName:Q.serverName,action:Q.action,reason:Q.reason,text:Q.text,sourceBytes:Q.sourceBytes,projectedBytes:Q.projectedBytes,sha256:Q.sha256,truncated:Q.truncated,detailsOmitted:Q.detailsOmitted});break;case"mcp_task_changed":k.publish(O,"subagent.mcp.task.changed",{subagentSessionId:$,revision:Q.revision,taskId:Q.taskId,serverName:Q.serverName,toolName:Q.toolName,status:Q.status,statusMessage:Q.statusMessage,createdAt:Q.createdAt,updatedAt:Q.updatedAt,completedAt:Q.completedAt,hasResult:Q.hasResult,error:Q.error});break;case"project_rules_loaded":k.publish(O,"subagent.project.rules.loaded",{subagentSessionId:$,files:Q.files,triggerPaths:Q.triggerPaths,blockedWrite:Q.blockedWrite});break;default:break}}function S0(O,$="projectPath"){try{return _O(O,$)}catch(Q){throw new w(Q instanceof Error?Q.message:`${$} is invalid`)}}function _1(O){try{S1(O)}catch($){throw new w($ instanceof Error?$.message:`Invalid session ID: ${O}`)}}function GO(O){return{sessionId:O.id,projectPath:O.projectPath}}function U1(O,$){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:$,messageCount:O.messageCount}}function N4(O){return O.flatMap(($)=>{if(!s$($)||$.role==="system"||$.role==="tool"&&$.name===u0)return[];let Q=$.tool_calls?.filter((X)=>!("function"in X)||X.function.name!==u0),Z=typeof $.content==="string"?$.content.trim():"";if($.role==="assistant"&&$.tool_calls?.length&&!Q?.length&&!Z&&!$.reasoningContent&&!$.metadata)return[];let J={...$,...$.tool_calls?{tool_calls:Q&&Q.length>0?Q:void 0}:{}};if($.role==="tool"){let X=$.metadata&&typeof $.metadata==="object"&&!Array.isArray($.metadata)?$.metadata:void 0,W=$.name??(typeof X?.toolName==="string"?X.toolName:"unknown");if(X!==void 0&&(Object.hasOwn(X,"output")||Object.hasOwn(X,"error"))){let F=B4(X),I=D1(x1(W,F),B1);return[{...J,name:W,content:L1(I),metadata:H1(W,{...F.metadata,status:F.success?"completed":"failed"})}]}return[{...J,name:W,metadata:H1(W,X)}]}let N=e$($.metadata);return[N?{...J,content:r$(N)}:J]})}function N0(O,$){O.title=$.title??O.title,O.taskStatus=$.taskStatus,O.taskStatusReason=$.taskStatusReason,O.taskFailure=$.taskFailure,O.taskStartedAt=$.taskStartedAt,O.taskCompletedAt=$.taskCompletedAt,O.taskPromptSummary=$.taskPromptSummary,O.taskPriority=$.taskPriority,O.taskKind=$.taskKind,O.taskDueAt=$.taskDueAt,O.taskModelId=$.taskModelId,O.selectedModelId=$.selectedModelId,O.permissionMode=$.permissionMode,O.reasoningEffort=$.reasoningEffort,O.serviceTier=$.serviceTier,O.responseVerbosity=$.responseVerbosity,O.communicationStyle=$.communicationStyle,O.communicationStyleDigest=$.communicationStyleDigest,O.projectInstructionsDigest=$.projectInstructionsDigest,O.pendingInteraction=$.pendingInteraction,O.taskRetryAvailable=$.taskRetryAvailable,O.taskRetriedFrom=$.taskRetriedFrom,O.taskDelivery=$.taskDelivery,O.taskIsolation=$.taskIsolation,O.taskSourceProjectPath=$.taskSourceProjectPath,O.taskWorktreePath=$.taskWorktreePath,O.taskWorktreeBranch=$.taskWorktreeBranch,O.taskBaseCommit=$.taskBaseCommit,O.taskDiffStat=$.taskDiffStat,O.taskQueuePosition=$.taskQueuePosition,O.taskQueueDepth=$.taskQueueDepth,O.taskConcurrencyLimit=$.taskConcurrencyLimit,O.archivedAt=$.archivedAt,O.archivedBySessionId=$.archivedBySessionId,O.messageCount=$.messageCount,O.updatedAt=new Date($.lastMessageTime)}async function z0(O){let $=await v.findSessionMetadata(O.id,O.projectPath);if($)N0(O,$)}function R0(O){let $=qO(O.currentRunId),Q=$?.status==="waiting_permission"?"running":$?.status==="attention_required"?"interrupted":$?.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:Q,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:Q==="queued"?O.taskQueuePosition:void 0,taskQueueDepth:Q==="queued"?O.taskQueueDepth:void 0,taskConcurrencyLimit:O.taskConcurrencyLimit,archivedAt:O.archivedAt,archivedBySessionId:O.archivedBySessionId,pendingInteraction:$?.pendingPermission?{type:$.pendingPermission.details.type==="askUserQuestion"?"question":$.pendingPermission.details.type==="mcpElicitation"?"elicitation":"permission",requestId:$.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 EO(O,$){let Q=Y0;if(Q?.accepting)return Q.resolveSessionRef(O,$);if(_1(O),$!==void 0){let J=kO({sessionId:O,projectPath:S0($)}),N=await v.findSessionMetadata(J.sessionId,J.projectPath);if(!N)throw new l("Session",O);return kO({sessionId:N.sessionId,projectPath:N.projectPath})}let Z=new Map;for(let J of await v.listSessions()){if(J.sessionId!==O)continue;let N=kO({sessionId:J.sessionId,projectPath:J.projectPath});Z.set(o(N),N)}if(Z.size===0)try{let J=await v.findSessionMetadata(O);if(!J)throw new l("Session",O);return kO({sessionId:J.sessionId,projectPath:J.projectPath})}catch(J){if(J instanceof l)throw J;if(J instanceof Error&&J.message.startsWith("Ambiguous session ID:"))throw new fO;throw J}if(Z.size>1)throw new fO;return Z.values().next().value}function w4(O){if(typeof O==="string")return O;return O.filter(($)=>$.type==="text").map(($)=>$.text).join(`
7
- `)}function C$(O,$){let Q=($??[]).filter((J)=>J.type==="image"&&typeof J.content==="string").map((J)=>({type:"image_url",image_url:{url:J.content}}));if(Q.length===0)return O;let Z=[];if(O.trim())Z.push({type:"text",text:O});return Z.push(...Q),Z}function f$(O,$){return $&&O instanceof $0&&(O.kind==="closed"||O.kind==="aborted")}var L2=()=>{Q9();let O=new d5;O.onError((Y,U)=>{if(Y instanceof p0){let V=new cO("Session runtime capacity is full",{resource:Y.resource,limit:Y.limit});return U.json(V.toObject(),429)}if(Y instanceof sO){let V=new cO("Session projection capacity is full",{resource:Y.resource,limit:Y.limit,retryable:Y.retryable});return U.json(V.toObject(),429)}if(Y instanceof zO)return U.json(Y.toObject(),Y.statusCode);return i.error("[SessionRoutes] Unhandled route error:",Y),U.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let $=new Map,Q=new J4,Z=new Map,J=new Map,N=new Map,X=new Set,W=new X4,D=new X4,F=new u5,I=DO(),T=new w2({maxResident:I?.maxResidentSessionRuntimes??p$,idleMs:I?.sessionRuntimeIdleMs??v$}),x=new Z4({maxResident:I?.maxResidentSessionProjections??m$,idleMs:I?.sessionProjectionIdleMs??h$,toSnapshot:r5}),R=new Y1,A=new Y1,S=setInterval(()=>{T.sweepIdle().catch((Y)=>{i.warn("[SessionRoutes] Session Runtime idle sweep failed:",Y)})},u$);S.unref?.();let h=setInterval(()=>{try{x.sweepIdle()}catch(Y){i.warn("[SessionRoutes] Session projection idle sweep failed:",Y)}},y$);h.unref?.();let m,B=new Map,r=1,c,C=(Y)=>{let U=Y.projectionLease;Y.projectionLease=void 0,U?.release()},IO=()=>{for(let Y of B.values()){if(Y.timer)clearTimeout(Y.timer);C(Y)}B.clear()};F1=IO;let t=async(Y)=>{let U;try{U=R.enter()}catch{throw new BO}try{return await Y()}finally{U.release()}};O.use("*",async(Y,U)=>{if(Y.req.method==="GET"||Y.req.method==="HEAD")return U();return t(U)});let s=(Y,U)=>W.runExclusive(o(Y),U),QO=(Y,U)=>{let V=o(Y),G=B.get(V);if(!G||U!==void 0&&G.generation!==U)return;if(G.timer)clearTimeout(G.timer);C(G),B.delete(V)},ZO=(Y,U)=>{let V=B.get(o(GO(Y)));return V?.generation===U.generation&&V.attempt===U.attempt&&V.inFlight&&!V.terminal},MO=(Y,U)=>{let V=o(GO(Y)),G=B.get(V);if(G){if(U?.release(),G.inFlight||G.timer||G.terminal)return}else{if(!U)throw new BO;G={attempt:0,generation:r++,inFlight:!1,projectedInputIds:new Set,projectionLease:U,startedAt:Date.now(),terminal:!1,timer:void 0},B.set(V,G)}return G.inFlight=!0,G.attempt++,{attempt:G.attempt,deadlineAt:G.startedAt+B2,generation:G.generation,projectedInputIds:G.projectedInputIds}},OO=(Y,U,V,G,_)=>{k.publish(Y,"pending.resume",{phase:U,kind:"pending_input",attempt:V,maxAttempts:H2,..._===void 0?{}:{delayMs:_,nextRetryAt:Date.now()+_},...G?{failure:{code:G.code,retryable:G.retryable,...G.resource?{resource:G.resource}:{}}}:{}})},gO=(Y,U,V,G,_,L)=>{let H=GO(Y),b=o(H),j=B.get(b);if(!j||j.generation!==U.generation)return!1;if(L)return j.inFlight=!1,j.terminal=!0,C(j),OO(H,"exhausted",U.attempt,V.taskFailure),!1;let M=D2({sessionIdentity:b,failedAttempt:U.attempt,recoveryStartedAt:j.startedAt,workStillPending:G,evidence:V});if(M.phase!=="retry_scheduled")return j.inFlight=!1,j.terminal=!0,C(j),OO(H,M.phase,U.attempt,V.taskFailure),!1;if(!j.projectionLease)return!1;let E=setTimeout(()=>{(async()=>{if(await _.completion,B.get(b)!==j||j.timer!==E)return;await s(H,async()=>{if(B.get(b)!==j||j.timer!==E)return;j.timer=void 0,j.inFlight=!1;let q=MO(Y);if(!q)return;try{await c(Y,q)}catch(f){if(B.get(b)!==j)return;let p=C0(f);j.inFlight=!1,j.terminal=!0;try{let WO=new Date().toISOString(),VO;try{VO=await v.updateSessionMetadata(Y.id,Y.projectPath,{taskStatus:"failed",taskStatusReason:p.message,taskFailure:p,taskCompletedAt:WO,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null})}catch{i.error(`[SessionRoutes] Failed to persist terminal pending input state for ${Y.id}`)}if(B.get(b)!==j||!j.terminal)return;if(Y.taskStatus="failed",Y.taskStatusReason=p.message,Y.taskFailure=p,Y.taskCompletedAt=WO,VO)N0(Y,VO);OO(H,"failed",q.attempt,p),k.publish(H,"session.error",{error:p.message,taskFailure:p}),k.publish(H,"session.status",{status:"error"})}finally{C(j)}}})})().catch((q)=>{i.error(`[SessionRoutes] Failed to retry pending input for ${Y.id}:`,q)})},M.delayMs);return E.unref?.(),j.timer=E,j.inFlight=!1,OO(H,"retry_scheduled",U.attempt+1,V.taskFailure,M.delayMs),!0},K0=(Y,U)=>{let V=GO(Y),G=B.get(o(V));if(!G||G.generation!==U.generation)return!1;if(U.attempt>1)OO(V,"recovered",U.attempt);return QO(V,U.generation),!0},bO=(Y,U)=>D.runExclusive(o(Y),U),K=(Y)=>[...O0.values()].some((U)=>U.sessionId===Y.sessionId&&U.projectPath===Y.projectPath&&RO(U)),XO=async(Y,U,V)=>{let G=J.get(U);if(!G)G=(async()=>{if($.get(U)===V)$.delete(U);for(let[L,H]of $)if(H===V)$.delete(L);let _=GO(Y);if(iO(_)?.id===Y.id&&!K(_)&&!V0.has(U)&&!eO.has(U))await a1(_,"route-reset").catch(()=>{return});if(await V.dispose(),$.size===0)await PO.getInstance().disconnectAll()})().finally(()=>{if(J.get(U)===G)J.delete(U)}),J.set(U,G);await G},nO=async(Y,U={})=>{let V=GO(Y),G=o(V);await J.get(G);let _=T.acquire(G);if(_){if($.get(G)!==_.value)throw _.release(),Error("Session Runtime residency identity is inconsistent");return _}if(T.owns(G))throw new p0(T.getStats().maxResident);let L=Z.get(G);if(!L){let H=U.communicationStyle??Y.communicationStyle;L=(async()=>{let b=await T.reserve(G,{surface:"web",allowEviction:!0}),j;try{j=await q0.create({sessionId:Y.id,workspaceRoot:Y.projectPath,permissionMode:U.permissionMode??Y.permissionMode??"default",...Y.reasoningEffort?{reasoningEffort:Y.reasoningEffort}:{},...Y.serviceTier?{serviceTier:Y.serviceTier}:{},...Y.responseVerbosity?{responseVerbosity:Y.responseVerbosity}:{},...H?{communicationStyle:H}:{},...H===Y.communicationStyle&&Y.communicationStyleDigest?{communicationStyleDigest:Y.communicationStyleDigest}:{},...Y.projectInstructionsDigest?{projectInstructionsDigest:Y.projectInstructionsDigest}:{},...Y.taskWorktree?{taskWorktree:Y.taskWorktree}:{},...Y.taskIsolation?{taskIsolation:Y.taskIsolation}:{},...Y.messageCount>0?{sessionStart:{isResume:!0,resumeSessionId:Y.id}}:{}});let M=j.getCurrentModelId();if(M&&(Y.selectedModelId||Y.taskModelId)&&M!==Y.selectedModelId){let f=await v.updateSessionMetadata(Y.id,Y.projectPath,{selectedModelId:M}).catch((p)=>{i.warn(`[SessionRoutes] Failed to migrate restored model for ${Y.id}:`,p);return});if(f)Y.selectedModelId=f.selectedModelId,Y.updatedAt=new Date(f.lastMessageTime)}let E=j,q=b.commit({key:G,surface:"web",value:E,canEvict:()=>!K(V)&&!V0.has(G)&&!eO.has(G)&&!Z.has(G)&&!J.has(G)&&E.isIdleForResidency(),dispose:()=>XO(Y,G,E)});return j=void 0,$.set(G,E),{runtime:E,claimLease:()=>{if(q){let p=q;return q=void 0,p}let f=T.acquire(G);if(!f||f.value!==E)throw Error("Initialized Session Runtime lost residency");return f}}}catch(M){if(b.cancel(),j)await j.dispose().catch((E)=>{i.warn(`[SessionRoutes] Failed to dispose uncommitted Runtime for ${Y.id}:`,E)});if(M instanceof J2)throw new q1(M.reason);throw M}})(),Z.set(G,L)}try{return(await L).claimLease()}finally{if(Z.get(G)===L)Z.delete(G)}},lO=async(Y,U,V={})=>{let G=await nO(Y,V);try{return await U(G.value)}finally{G.release()}},M0=async(Y,U)=>{let V=o(GO(Y)),G=Z.get(V);if(G)await G.catch(()=>{return});Z.delete(V);let _=U??$.get(V);if(!_)return;if(!await T.remove(V,_))throw Error(`Session Runtime is pinned and cannot be disposed: ${V}`)},T1=(Y,U)=>{if(U==="delete")throw new l("Session",Y.sessionId);if(U==="archive")throw new u("Session is archived");throw new BO},A0=(Y,U,V)=>{if(V.invalidatedBy)T1(Y,V.invalidatedBy);if(N.get(U)!==V)throw new BO},m0=(Y,U)=>{let V=o(Y),G=N.get(V);if(!G)return;if(G.invalidatedBy??=U,G.cancelReservation?.(),G.cancelReservation=void 0,N.get(V)===G)N.delete(V)},j1=(Y)=>{for(let U of X)U.invalidatedBy??=Y,U.cancelReservation?.(),U.cancelReservation=void 0;N.clear()},iO=(Y)=>x.snapshot(o(Y)),I1=()=>x.snapshotAll(),a1=async(Y,U)=>{m0(Y,U);let V=o(Y);if(!iO(Y))return;let G=x.beginCloseMany([V],U);await G.waitForIdle({deadlineAt:Date.now()+g$}),G.commit()},t3=async(Y,U)=>{if(U!==void 0)return _1(Y),kO({sessionId:Y,projectPath:S0(U)});return n1(Y,U)},n1=async(Y,U)=>{if(_1(Y),U!==void 0){let G=kO({sessionId:Y,projectPath:S0(U)});if(iO(G))return G;let _=await v.findSessionMetadata(G.sessionId,G.projectPath);if(!_)throw new l("Session",Y);return kO({sessionId:_.sessionId,projectPath:_.projectPath})}let V=new Map;for(let G of I1()){if(G.id!==Y)continue;let _=GO(G);V.set(o(_),_)}for(let G of await v.listSessions()){if(G.sessionId!==Y)continue;let _=kO({sessionId:G.sessionId,projectPath:G.projectPath});V.set(o(_),_)}if(V.size===0)try{let G=await v.findSessionMetadata(Y);if(!G)throw new l("Session",Y);return kO({sessionId:G.sessionId,projectPath:G.projectPath})}catch(G){if(G instanceof l)throw G;if(G instanceof Error&&G.message.startsWith("Ambiguous session ID:"))throw new fO;throw G}if(V.size>1)throw new fO;return V.values().next().value},F0=async(Y)=>{let U=Y0;if(!U?.accepting||U.acquireOrHydrateSession!==F0)throw new BO;let V=o(Y),G=x.acquire(V);if(G)return G;let _=N.get(V);if(!_){let H;H={promise:Promise.resolve().then(async()=>{let j=x.acquire(V);if(j){j.release();return}A0(Y,V,H);let M=x.reserve(V);H.cancelReservation=()=>M.cancel();try{let E=await v.findSessionMetadata(Y.sessionId,Y.projectPath);if(A0(Y,V,H),!E)throw new l("Session",Y.sessionId);let q=await v.findSessionTaskWorktree(Y.sessionId,Y.projectPath);A0(Y,V,H);let f=U1(E,q);A0(Y,V,H);let p=M.commit(f);H.cancelReservation=void 0,p.release()}catch(E){throw H.cancelReservation?.(),H.cancelReservation=void 0,E}})},_=H,N.set(V,_),X.add(_)}try{await _.promise}finally{if(X.delete(_),N.get(V)===_)N.delete(V)}let L=x.acquire(V);if(!L)throw new BO;return L},s3=async(Y,U)=>{let V=await F0(Y);try{return await U(V.value)}finally{V.release()}},R1=async(Y,U)=>{let V=await n1(Y,U);try{await v.assertSessionWritable(V.sessionId,V.projectPath)}catch(G){if(G instanceof U4)throw new u(G.message);throw G}return F0(V)},b0=(Y)=>{let U=x.acquire(Y.key);if(!U||U.generation!==Y.generation)throw U?.release(),new BO;return U},d4=async(Y)=>{let U=await F0(Y);try{return b0(U)}finally{U.release()}},oO=async(Y,U,V)=>{let G=await R1(Y,U);try{let _=G.value;return await V(_,GO(_),G)}finally{G.release()}},r3=async(Y,U)=>{let V=await R1(Y.sessionId,Y.projectPath);try{return await U(V.value,V)}finally{V.release()}},l4=async(Y,U)=>{if(Y.permissionMode===U)return;let V=await v.setSessionPermissionMode(Y.id,Y.projectPath,U);Y.permissionMode=V.permissionMode,Y.updatedAt=new Date(V.lastMessageTime),k.publish(GO(Y),"session.updated",{permissionMode:U})},O1=(Y,U,V,G)=>{if(!R.stats().accepting)throw new BO;let _=v0(12),L={id:_,sessionId:Y.id,projectPath:Y.projectPath,status:"running",abortController:new AbortController,disposeRuntimeOnSettle:Y.taskIsolation!==void 0&&G.runtimeLease!==void 0,pendingResume:G.pendingResume,projectionLease:G.projectionLease,createdAt:new Date};if(Y.taskIsolation&&G.runtimeLease){let H=G.runtimeLease.value,b=w0.admit({key:`${Y.projectPath}\x00${Y.id}`,...H.getTaskAdmissionLimits(),pendingBytes:X2({content:U,outputSchema:G.outputSchema,pendingMessages:H.getPendingSteeringMessages()}),signal:L.abortController.signal,onUpdate:(M)=>{L.status=M.state,Y.taskStatus=M.state,Y.taskQueuePosition=M.queuePosition,Y.taskQueueDepth=M.queueDepth,Y.taskConcurrencyLimit=M.maxConcurrent,L.taskAdmissionUpdate=(L.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await H.setTaskAdmission(M)}).catch((E)=>{i.warn(`[SessionRoutes] Failed to persist admission for ${Y.id}:`,E)})}});L.taskAdmission=b;let j=b.getSnapshot();L.status=j.state,Y.taskStatus=j.state,Y.taskQueuePosition=j.queuePosition,Y.taskQueueDepth=j.queueDepth,Y.taskConcurrencyLimit=j.maxConcurrent}return O0.set(_,L),Y.currentRunId=_,L.completion=N9(L,Y,U,V,nO,{pendingInputOnly:G.pendingInputOnly,preparedInputTurn:G.preparedInputTurn,goalContinuationOnly:G.goalContinuationOnly,outputSchema:G.outputSchema,taskAdmission:L.taskAdmission,runtimeLease:G.runtimeLease,projectionLease:G.projectionLease,disposeRuntime:M0,pendingResume:G.pendingResume,onPendingResumeFailure:(H,b,j,M)=>gO(Y,H,b,j,L,M),onPendingResumeSuccess:(H)=>K0(Y,H),onPendingResumeCancelled:(H)=>QO(GO(Y),H.generation)}).catch((H)=>{i.error(`[SessionRoutes] Run ${_} failed:`,H)}),L},e3=async(Y)=>{let U;if(Y.outputSchema)try{U=G4(Y.outputSchema).schema}catch(g){throw new w(g instanceof Error?g.message:"Invalid output schema")}let V=h1("task",12),G=S0(Y.sourceProjectPath),_=Y.modelId?.trim(),L=DO();if(!L)throw new w("Config not initialized");let[H,b]=await Promise.all([P1(G,L),tO(G)]);if(_&&!H.config.models.some((g)=>g.id===_))throw new w(`Task model not found: ${_}`);let j=_||H.config.models.find((g)=>g.id===H.config.currentModelId)?.id||H.config.models[0]?.id;if(!j)throw new w("No model is configured. Add or select a model before dispatching a task.");let M=H.config.models.find((g)=>g.id===j);if(!M)throw new w(`Task model not found: ${j}`);let E=Y.reasoningEffort??"off",q=Y.serviceTier??"auto",f=Y.responseVerbosity??"auto",p=Y.communicationStyle??"auto",WO,VO=b.projectRules?.staticRules(G),a=VO&&VO.files.length>0?VO.provenanceSha256:void 0;try{let g=H.catalog.resolveConfig(M);d$(g,E),k$(g,q),P$(g,f);let wO=l$(p,b.communicationStyles);WO=wO.source==="built-in"?void 0:wO.contentSha256}catch(g){throw new w(g instanceof Error?g.message:"Invalid reasoning effort")}let mO={version:1,prompt:Y.prompt,...Y.title?{title:Y.title}:{},...Y.taskPriority?{taskPriority:Y.taskPriority}:{},...Y.taskKind?{taskKind:Y.taskKind}:{},...Y.taskDueAt?{taskDueAt:Y.taskDueAt}:{},sourceProjectPath:G,isolation:Y.isolation,permissionMode:Y.permissionMode,modelId:j,reasoningEffort:E,serviceTier:q,responseVerbosity:f,communicationStyle:p,...WO?{communicationStyleDigest:WO}:{},...a?{projectInstructionsDigest:a}:{},...Y.attachments?{attachments:Y.attachments.map((g)=>({...g}))}:{},...U?{outputSchema:U}:{}},hO,n,KO,d,FO,pO;try{let g=await F.runExclusive(async()=>{pO=o(kO({sessionId:V,projectPath:G})),FO=x.reserve(pO);try{return await z2.createSessionTask({sessionId:V,prompt:Y.prompt,title:Y.title,taskPriority:Y.taskPriority,taskKind:Y.taskKind,taskDueAt:Y.taskDueAt,sourceProjectPath:G,isolation:Y.isolation,dispatch:mO,retriedFrom:Y.retriedFrom})}catch(LO){throw FO?.cancel(),FO=void 0,LO}}),{metadata:wO}=g;if(hO=g.taskWorktree,n=U1(wO,hO),!FO)throw new BO;let yO=o(GO(n));if(pO!==yO)FO.cancel(),FO=x.reserve(yO),pO=yO;d=FO.commit(n),FO=void 0,pO=void 0;let P=GO(n);k.publish(P,"task.status",{taskStatus:wO.taskStatus,updatedAt:wO.lastMessageTime});let e=C$(Y.prompt,Y.attachments);KO=await nO(n);let UO=KO.value,xO=U?await UO.prepareInputTurn(e,{outputSchema:U}):await UO.prepareInputTurn(e);if(!xO.accepted)throw new u(`Task prompt was not accepted: ${xO.reason}`);if(!d)throw new BO;let vO=O1(n,e,Y.permissionMode,{preparedInputTurn:xO,runtimeLease:KO,projectionLease:d,outputSchema:U});return d=void 0,KO=void 0,await vO.taskAdmissionUpdate,{session:R0(n),runId:vO.id,messageId:xO.messageId,status:vO.status==="queued"?"queued":"running",queuePosition:n.taskQueuePosition,queueDepth:n.taskQueueDepth,maxConcurrentTasks:n.taskConcurrencyLimit}}catch(g){if(FO?.cancel(),FO=void 0,pO=void 0,d?.release(),d=void 0,KO?.release(),KO=void 0,g instanceof sO&&!n)throw new cO("Session projection capacity is full",{resource:g.resource,limit:g.limit,retryable:g.retryable});if((g instanceof F4||g instanceof p0||g instanceof sO)&&n){if(hO)await J0.exit({sessionId:n.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await M0(n).catch(()=>{return}),await v.deleteSession(n.id,n.projectPath).catch(()=>{return}),new cO(g instanceof sO?"Session projection capacity is full":g instanceof p0?"Session runtime capacity is full":"Task admission capacity is full",{resource:g.resource,limit:g.limit,...g instanceof sO?{retryable:g.retryable}:{}})}if(n){let wO=await v.findSessionMetadata(n.id,n.projectPath).catch(()=>{return});if(!wO||wO.taskStatus==="queued"){let yO=C0(g),P=await v.updateSessionMetadata(n.id,n.projectPath,{taskStatus:"failed",taskStatusReason:yO.message,taskFailure:yO,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});n.taskStatus=P?.taskStatus??"failed",n.taskStatusReason=P?.taskStatusReason??yO.message,n.taskFailure=P?.taskFailure??yO,n.taskCompletedAt=P?.taskCompletedAt}else n.taskStatus=wO.taskStatus,n.taskStatusReason=wO.taskStatusReason,n.taskFailure=wO.taskFailure,n.taskCompletedAt=wO.taskCompletedAt}throw g}},i4=(Y)=>t(()=>e3(Y)),O5=async(Y,U)=>{let V=await EO(Y,U),G=await v.findSessionMetadata(V.sessionId,V.projectPath);if(!G)throw new l("Session",V.sessionId);if(!["failed","interrupted","cancelled"].includes(G.taskStatus))throw new u(`Task cannot be retried while status is ${G.taskStatus}`);let _=await v.findSessionTaskDispatch(V.sessionId,V.projectPath);if(!_)throw new u("Task retry payload is unavailable");return i4({prompt:_.prompt,title:G.title??_.title,taskPriority:G.taskPriority??_.taskPriority,taskKind:G.taskKind??_.taskKind,taskDueAt:G.taskDueAt,sourceProjectPath:_.sourceProjectPath,isolation:_.isolation,permissionMode:_.permissionMode,modelId:_.modelId,reasoningEffort:_.reasoningEffort,serviceTier:_.serviceTier,responseVerbosity:_.responseVerbosity,communicationStyle:_.communicationStyle,attachments:_.attachments,outputSchema:_.outputSchema,retriedFrom:V})},$5=(Y,U)=>t(()=>O5(Y,U)),Q5=(Y,U,V)=>t(async()=>{let G=await EO(Y,V);if(!await v.findSessionMetadata(G.sessionId,G.projectPath))throw new l("Session",G.sessionId);let L=await v.updateSessionMetadata(G.sessionId,G.projectPath,U),H=iO(G);if(H)N0(H,L);return k.publish(G,"session.updated",{...L.title?{title:L.title}:{},...L.taskPriority?{taskPriority:L.taskPriority}:{},...L.taskKind?{taskKind:L.taskKind}:{},taskDueAt:L.taskDueAt??null}),H?R0(H):{...L,isActive:!1}}),Z5=async(Y,U)=>{return oO(Y,U,async(V)=>{if(!V.taskWorktree)throw new w("Session does not have a task worktree");try{await J0.restoreSession(V.taskWorktree);let G=await J0.getDiffArtifact(V.id);if(!G)throw new u("Task diff artifact is unavailable");return{sessionId:V.id,projectPath:V.projectPath,...G}}catch(G){if(G instanceof u)throw G;throw i.error("[SessionRoutes] Failed to load task diff artifact:",G),new u("Task diff artifact is unavailable")}})},J5=async(Y,U,V)=>{let G=await EO(Y,V);return bO(G,async()=>{return r3(G,async(_)=>{if(["queued","running"].includes(_.taskStatus))throw new u(`Task artifacts cannot be delivered while status is ${_.taskStatus}`);if(_.taskDelivery?.status==="applied")throw new u("Task changes have already been applied");if(_.taskDelivery?.status==="discarded")throw new u("Task changes have already been discarded");if(!_.taskWorktree)throw new u("Task worktree is unavailable");let L=async(H,b=!1)=>{let j=await v.updateSessionMetadata(_.id,_.projectPath,{taskDelivery:H,...b?{taskWorktree:null}:{}});if(N0(_,j),b)_.taskWorktree=void 0;return k.publish(G,"task.delivery",{taskDelivery:H,...b?{taskWorktreeRemoved:!0}:{},updatedAt:j.lastMessageTime}),R0(_)};try{if(U==="discard"){try{await J0.restoreSession(_.taskWorktree)}catch(j){return i.warn(`[SessionRoutes] Abandoning unavailable task worktree for ${_.id}:`,j),L({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:_.taskDiffStat?.changedFiles??0,message:"Task artifact discarded; worktree was unavailable"},!0)}let b=await J0.exit({sessionId:_.id,action:"remove",discardChanges:!0});return L({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:b.discardedFiles??0,message:"Task worktree removed"},!0)}try{await J0.restoreSession(_.taskWorktree)}catch(b){throw i.warn(`[SessionRoutes] Task worktree is unavailable for ${_.id}:`,b),new K4("artifact_unavailable","Task worktree is unavailable")}let H=await J0.apply(_.id);return L({status:"applied",updatedAt:new Date().toISOString(),sourceCommit:H.sourceCommit,changedFiles:H.changedFiles,message:"Task changes applied to the source workspace"})}catch(H){if(H instanceof K4)throw await L({status:"conflicted",updatedAt:new Date().toISOString(),message:H.message}),new u(H.message);throw H}})})},Y5=(Y,U,V)=>t(()=>J5(Y,U,V)),c4=async(Y,U)=>{let V=GO(Y),G=o(V),_=B.get(G);if(!U&&_?.terminal)return;let L=qO(Y.currentRunId);if(RO(L)){if(U)QO(GO(Y),U.generation);return}let H=Y.taskIsolation&&Y.taskStatus!=="queued"&&Y.taskStatus!=="running",b=H?await q0.hasRecoverableTurn(Y.projectPath,Y.id):!1;if(H&&!b){if(U)QO(GO(Y),U.generation);return}let j=await q0.hasPendingInbox(Y.projectPath,Y.id),M=!j&&await q0.hasActiveGoal(Y.projectPath,Y.id);if(!j&&!M&&!b)b=await q0.hasRecoverableTurn(Y.projectPath,Y.id);if(!j&&!M&&!b){QO(GO(Y));return}if(U&&!j){QO(GO(Y),U.generation);return}let E=await nO(Y),q=!1,f,p;try{let WO=E.value,VO=qO(Y.currentRunId);if(RO(VO)){if(U)QO(GO(Y),U.generation);return}if(j&&WO.getPendingSteeringCount()===0)await WO.reloadPendingInbox();let a=WO.getPendingSteeringCount()>0,mO=a?null:await WO.getGoal(),hO=mO?.status==="active"||mO?.status==="verifying",n=WO.getTurnRecoveryAssessment();if(n.state!=="none"&&(n.state==="requires_attention"||!a&&!hO))k.publish({sessionId:Y.id,projectPath:Y.projectPath},"turn.recovery",{assessment:n});if(n.state==="requires_attention"||H||!a&&!hO||WO.hasTurnOwner()){if(U||!a)QO(GO(Y),U?.generation);return}let KO=U;if(a&&!Y.taskIsolation&&!KO){let d=await d4(V);try{KO=MO(Y,d);let FO=B.get(G);if(KO&&FO?.generation===KO.generation&&FO.projectionLease===d)p=KO,d=void 0}finally{d?.release()}}if(a&&!Y.taskIsolation&&!KO)return;if(U&&!ZO(Y,U))return;f=U?(()=>{let d=_?.projectionLease;if(!d)throw new BO;return b0(d)})():await d4(GO(Y)),O1(Y,"",Y.permissionMode??"default",{pendingInputOnly:a,goalContinuationOnly:hO,runtimeLease:E,projectionLease:f,pendingResume:a?KO:void 0}),f=void 0,p=void 0,q=!0}finally{if(f?.release(),p)QO(V,p.generation);if(!q)E.release()}};c=async(Y,U)=>{let V;try{V=R.enter()}catch{return}try{let G=qO(Y.currentRunId);if(RO(G)){if(U)QO(GO(Y),U.generation);return}if(Y.taskIsolation){await c4(Y);return}await c4(Y,U)}finally{V.release()}};let o1={accepting:!0,resolveSessionRef:n1,getProjectionSnapshot:iO,snapshotAll:I1,acquireOrHydrateSession:F0,invalidateAll:j1,resumeRecoveredInteraction:c};Y0=o1;let N5=async()=>{let Y={scheduled:0,failed:0,deferred:0};if(!R.stats().accepting)return Y;let U=(await v.listSessions({taskStatus:"queued"})).filter((V)=>V.taskIsolation!==void 0).sort((V,G)=>V.firstMessageTime.localeCompare(G.firstMessageTime)||V.projectPath.localeCompare(G.projectPath)||V.sessionId.localeCompare(G.sessionId));for(let[V,G]of U.entries()){let _={sessionId:G.sessionId,projectPath:G.projectPath};try{if(!await q0.hasPendingInbox(G.projectPath,G.sessionId)){let b=C0("Queued task input is missing");await v.updateSessionMetadata(G.sessionId,G.projectPath,{taskStatus:"failed",taskStatusReason:b.message,taskFailure:b,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),Y.failed++;continue}let L=await F0(_),H=L.value;if(L.release(),await c(H),H.currentRunId)Y.scheduled++}catch(L){if(L instanceof F4||L instanceof p0){Y.deferred+=U.length-V;break}i.warn(`[SessionRoutes] Failed to recover queued task ${G.sessionId}:`,L),Y.deferred++}}return Y};return O.route("/",E$({withAdmission:t,resolveSessionRef:async(Y,U)=>{try{let V=await t3(Y,U);return(await F0(V)).release(),V}catch(V){if(V instanceof sO)throw new cO("Session projection capacity is full",{resource:V.resource,limit:V.limit,retryable:V.retryable});throw V}},getRuntime:(Y)=>Q.get(Y),captureAgentScreenshot:async(Y,U)=>{return s3(Y,(V)=>lO(V,(G)=>G.captureBrowserScreenshot(U)))},resetRuntime:(Y)=>Q.reset(Y)})),O.get("/",async(Y)=>{try{let U=await v.listSessions(),V=new Set(U.filter((M)=>M.relationType==="subagent").map((M)=>o({sessionId:M.sessionId,projectPath:M.projectPath}))),G=I1().filter((M)=>!V.has(o(GO(M)))&&M.relationType!=="subagent").map((M)=>R0(M)),_=new Set(G.map((M)=>o({sessionId:M.sessionId,projectPath:M.projectPath}))),L=U.filter((M)=>{if(M.relationType==="subagent")return!1;return!_.has(o({sessionId:M.sessionId,projectPath:M.projectPath}))}),H=new Set(_),b=L.filter((M)=>{let E=o({sessionId:M.sessionId,projectPath:M.projectPath});if(H.has(E))return!1;return H.add(E),!0}),j=[...G,...b.map((M)=>({...M,isActive:!1}))];return Y.json(j)}catch(U){throw i.error("[SessionRoutes] Failed to list sessions:",U),new JO("Failed to list sessions")}}),O.get("/catalog",async(Y)=>{try{let U=Y.req.query("limit"),V=U===void 0?void 0:Number(U),G=Y.req.query("cursor"),_=Y.req.query("projectPath"),L=Y.req.query("archived");if(L!==void 0&&L!=="true"&&L!=="false")throw new w("archived must be true or false");let H=L==="true",b=await v.listSessionPage({..._?{cwd:S0(_)}:{},...G?{cursor:G}:{},...V===void 0?{}:{limit:V},includeSubagents:!1,archived:H}),j=new Map((H?[]:I1()).filter((M)=>M.relationType!=="subagent").map((M)=>[o(GO(M)),R0(M)]));return Y.json({sessions:b.sessions.map((M)=>j.get(o({sessionId:M.sessionId,projectPath:M.projectPath}))??M),...b.nextCursor?{nextCursor:b.nextCursor}:{}})}catch(U){if(U instanceof w)throw U;if(U instanceof Error&&(U.message.startsWith("Invalid session cursor")||U.message.startsWith("Session cursor scope")||U.message.startsWith("Session catalog")))throw new w(U.message);throw i.error("[SessionRoutes] Failed to list session catalog:",U),new JO("Failed to list session catalog")}}),O.post("/",async(Y)=>{try{let U=await Y.req.json(),V=y(c5,U);if(!V.success)throw new w("Invalid request body");let{title:G,projectPath:_}=V.data,L=h1("web",12),H=S0(_||Y.get("directory")||NO(),_?"projectPath":"directory"),b=kO({sessionId:L,projectPath:H}),j=await F.runExclusive(async()=>{let E=x.reserve(o(b));try{let q=await v.createSessionMetadata(L,H,{title:G,taskStatus:"completed"}),f=U1(q);return E.commit(f)}catch(q){throw E.cancel(),q}}),M=j.value;return j.release(),k.publish(b,"session.created",{}),Y.json({...R0(M),status:void 0,agentType:void 0,model:void 0})}catch(U){if(i.error("[SessionRoutes] Failed to create session:",U),U instanceof w||U instanceof zO||U instanceof sO)throw U;throw new JO("Failed to create session")}}),O.get("/:sessionId/export",async(Y)=>{let U=Y.req.param("sessionId");try{let V=Y.req.query("includeReasoning");if(V!==void 0&&V!=="true"&&V!=="false")throw new w("includeReasoning must be true or false");let G=await EO(U,Y.req.query("projectPath")),_=await v.exportSessionMarkdown(G.sessionId,G.projectPath,{includeReasoning:V==="true"});return Y.body(_.markdown,200,{"Cache-Control":"no-store","Content-Disposition":`attachment; filename="${_.filename}"`,"Content-Length":String(Buffer.byteLength(_.markdown,"utf8")),"Content-Type":"text/markdown; charset=utf-8","X-Blade-Content-Sha256":_.contentSha256,"X-Blade-Export-Activities":String(_.activityCount),"X-Blade-Export-Messages":String(_.messageCount),"X-Blade-Export-Redactions":String(_.redactionCount)})}catch(V){if(V instanceof w||V instanceof l||V instanceof fO)throw V;if(V instanceof Error&&V.message==="No conversation content to export")throw new u(V.message);throw i.error("[SessionRoutes] Failed to export session:",V),new JO("Failed to export session")}}),O.post("/:sessionId/fork",async(Y)=>{let U=Y.req.param("sessionId");try{_1(U);let V=await Y.req.json(),G=y(o5,V);if(!G.success)throw new w("Invalid request body");let _=S0(G.data.projectPath),L=h1("fork"),H,b=await F.runExclusive(async()=>{let E=await v.findSessionMetadata(U,_);if(!E)throw new l("Session",U);let q;try{q=x.reserve(o({sessionId:L,projectPath:E.projectPath}))}catch(f){if(!(f instanceof sO))throw f}try{let f=await v.forkSession(U,{newSessionId:L,sourceProjectPath:E.projectPath,targetProjectPath:E.projectPath});if(q){let p=U1(f.metadata);H=q.commit(p)}return f}catch(f){throw q?.cancel(),f}}),j=U1(b.metadata),M=GO(j);return H?.release(),k.publish(M,"task.status",{taskStatus:b.metadata.taskStatus,...b.metadata.taskCompletedAt?{taskCompletedAt:b.metadata.taskCompletedAt}:{},updatedAt:b.metadata.lastMessageTime}),Y.json({session:b.metadata,messages:N4(b.messages)},201)}catch(V){if(V instanceof w||V instanceof l||V instanceof u)throw V;if(V instanceof O2)throw new u("Session has no durable creation record");throw i.error("[SessionRoutes] Failed to fork session:",V),new JO("Failed to fork session")}}),O.get("/:sessionId",async(Y)=>{let U=Y.req.param("sessionId");try{let V=await EO(U,Y.req.query("projectPath")),G=iO(V);if(G)return Y.json(R0(G));let _=await v.findSessionMetadata(V.sessionId,V.projectPath);if(!_)throw new l("Session",U);return Y.json(_)}catch(V){if(V instanceof w||V instanceof l||V instanceof fO)throw V;throw i.error("[SessionRoutes] Failed to get session:",V),new JO("Failed to get session")}}),O.patch("/:sessionId",async(Y)=>{let U=Y.req.param("sessionId");try{let V=await Y.req.json(),G=y(n5,V);if(!G.success)throw new w("Invalid request body");if(G.data.title===void 0)throw new w("title is required");let _=await EO(U,G.data.projectPath),L=await v.updateSessionMetadata(_.sessionId,_.projectPath,{title:G.data.title}),H=x.acquire(o(_));try{let b=H?.value;if(b)b.title=L.title??b.title,b.updatedAt=new Date(L.lastMessageTime)}finally{H?.release()}if(L.title)k.publish(_,"session.updated",{title:L.title});return Y.json({success:!0,title:L.title})}catch(V){if(i.error("[SessionRoutes] Failed to update session:",V),V instanceof w||V instanceof l||V instanceof fO)throw V;throw new JO("Failed to update session")}}),O.get("/:sessionId/rewind",async(Y)=>{return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),(U)=>lO(U,async(V)=>Y.json({checkpoints:await V.listRewindCheckpoints()})))}),O.post("/:sessionId/rewind",async(Y)=>{let U=y(G2,await Y.req.json());if(!U.success)throw new w("Invalid rewind request");return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),async(V,G,_)=>s(G,async()=>{let L=qO(V.currentRunId);if(RO(L))throw new u("Cannot rewind while a run is active");return lO(V,async(H)=>{let b;try{b=await H.rewindSession(U.data)}catch(M){if(M instanceof Error&&M.message.startsWith("Cannot rewind while"))throw new u(M.message);throw M}await z0(V);let j=N4(b.messages);return k.publish(G,"session.rewound",{targetMessageId:b.checkpoint.messageId,mode:b.mode,removedTurns:b.removedTurns,restoredFiles:b.restoredFiles,messages:j}),Y.json({...b,messages:j})})}))}),O.get("/:sessionId/review",async(Y)=>{let U=Y.req.param("sessionId"),V=await EO(U,Y.req.query("projectPath")),G=await E0.list(V.projectPath,V.sessionId);return Y.json({reviews:G.map((_)=>({..._,content:_.completion?t$(_.start,_.completion):void 0}))})}),O.post("/:sessionId/review",async(Y)=>{let U=Y.req.param("sessionId"),V=y(F2,await Y.req.json());if(!V.success)throw new w("Invalid code review request");let G=await R1(U,V.data.projectPath),_=G.value,L=GO(_),H=o(L);try{return await s(L,async()=>{if(RO(qO(_.currentRunId)))throw new u("Cannot start a review during an active turn");if(eO.has(H))throw new u("Session already has an active review");return lO(_,async(b)=>{if(await E0.recoverInterrupted(L.projectPath,L.sessionId,b),V.data.modelId&&!b.getModelById(V.data.modelId))throw new w(`Model not found: ${V.data.modelId}`);if(V.data.modelId&&b.getCurrentModelId()!==V.data.modelId)await b.refresh({modelId:V.data.modelId});if(V.data.modelId&&_.selectedModelId!==V.data.modelId){let f=await v.updateSessionMetadata(_.id,_.projectPath,{selectedModelId:V.data.modelId});N0(_,f)}let j=new AbortController,M,E;try{M=b0(G),E=await E0.start({sessionId:L.sessionId,projectPath:L.projectPath,runtime:b,request:{kind:V.data.kind,...V.data.ref?{ref:V.data.ref}:{},...V.data.instructions?{instructions:V.data.instructions}:{}},signal:j.signal,onEvent:(f)=>{if(f.kind==="tool_start")k.publish(L,"review.tool.started",{reviewId:E?.reviewId,toolCallId:f.toolCall.id,toolName:f.toolCall.function.name});else if(f.kind==="tool_progress")k.publish(L,"review.tool.progress",{reviewId:E?.reviewId,toolCallId:f.toolCall.id,message:f.update.message.slice(0,1000)});else if(f.kind==="tool_result")k.publish(L,"review.tool.completed",{reviewId:E?.reviewId,toolCallId:f.toolCall.id,success:f.result.success})}})}catch(f){if(M?.release(),f instanceof Error&&(f.message.includes("active review")||f.message.includes("interrupted review")||f.message.includes("active turn")))throw new u(f.message);if(f instanceof Error&&(f.message.includes("review")||f.message.includes("Git")||f.message.includes("changes")||f.message.includes("ref")))throw new w(f.message);throw f}if(!E)throw new JO("Code review failed to start");await z0(_),k.publish(L,"review.started",{reviewId:E.reviewId,kind:V.data.kind}),k.publish(L,"task.status",{taskStatus:_.taskStatus,..._.taskStatusReason?{taskStatusReason:_.taskStatusReason}:{},..._.taskStartedAt?{taskStartedAt:_.taskStartedAt}:{},..._.taskPromptSummary?{taskPromptSummary:_.taskPromptSummary}:{},updatedAt:new Date().toISOString()});let q=E.completion.then(async(f)=>{await z0(_),k.publish(L,"task.status",{taskStatus:_.taskStatus,..._.taskStatusReason?{taskStatusReason:_.taskStatusReason}:{},..._.taskFailure?{taskFailure:_.taskFailure}:{},..._.taskStartedAt?{taskStartedAt:_.taskStartedAt}:{},..._.taskCompletedAt?{taskCompletedAt:_.taskCompletedAt}:{},..._.taskPromptSummary?{taskPromptSummary:_.taskPromptSummary}:{},updatedAt:new Date().toISOString()}),k.publish(L,"review.completed",{reviewId:E.reviewId,status:f.status,findings:f.findings.length})}).catch((f)=>{i.error(`[SessionRoutes] Code review ${E.reviewId} failed:`,f)}).finally(()=>{if(eO.get(H)?.reviewId===E.reviewId)eO.delete(H);M?.release()});return eO.set(H,{reviewId:E.reviewId,controller:j,completion:q,projectionLease:M}),Y.json({reviewId:E.reviewId,status:"running"},202)})})}finally{G.release()}}),O.get("/:sessionId/subagents",async(Y)=>{return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),(U)=>lO(U,(V)=>Y.json({subagents:V.listSubagents().map(y1)})))}),O.post("/:sessionId/subagents/:agentId/resume",async(Y)=>{_1(Y.req.param("agentId"));let U=U2.safeParse(await Y.req.json());if(!U.success)throw new w("Invalid subagent resume request");return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),async(V,G,_)=>s(G,async()=>{let L=qO(V.currentRunId);if(RO(L))throw new u("Cannot resume a subagent while a parent run is active");return lO(V,async(H)=>{let b=!1,j,M=(q)=>{k.publish(G,"subagent.complete",{subagentSessionId:q.id,success:q.status==="completed",status:q.status,summary:q.result?.message?.slice(0,500),type:q.subagentType,verificationVerdict:q.result?.verificationVerdict,resumedFrom:q.resumedFrom,rootAgentId:q.rootAgentId,resumeDepth:q.resumeDepth})},E;try{E=H.resumeSubagent({agentId:Y.req.param("agentId"),prompt:U.data.prompt,onEvent:(q,f)=>{Y9(G,f,q)},onCompleted:(q)=>{if(b)M(q);else j=q}})}catch(q){if(q instanceof Error&&(q.message.startsWith("Cannot resume")||q.message.startsWith("Subagent cannot")))throw new u(q.message);if(q instanceof Error&&q.message.startsWith("Subagent not found"))throw new l(q.message);throw q}if(k.publish(G,"subagent.start",{subagentSessionId:E.session.id,type:E.session.subagentType,description:E.session.description,resumedFrom:E.source.id,rootAgentId:E.session.rootAgentId,resumeDepth:E.session.resumeDepth}),b=!0,j)M(j);return Y.json({source:y1(E.source),session:y1(E.session)})})}))}),O.get("/:sessionId/goal",async(Y)=>{return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),async(U)=>Y.json({goal:await new Q2(U.projectPath,U.id).get()}))}),O.put("/:sessionId/goal",async(Y)=>{let U=y(t5,await Y.req.json());if(!U.success)throw new w("Invalid goal request");return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),async(V,G,_)=>s(G,async()=>{let L=qO(V.currentRunId);if(RO(L))return Y.json({status:"rejected",reason:"run_active"},409);let b=U.data.permissionMode??V.permissionMode??"default";if(V.permissionMode!==b)await l4(V,b);let j=await nO(V),M=!1,E;try{let q=await j.value.createGoal(U.data);k.publish(G,"goal.updated",{goal:q}),E=b0(_);let f=O1(V,"",b,{goalContinuationOnly:!0,runtimeLease:j,projectionLease:E});return M=!0,E=void 0,await f.taskAdmissionUpdate,Y.json({status:f.status==="queued"?"queued":"running",runId:f.id,goal:q,queuePosition:V.taskQueuePosition,queueDepth:V.taskQueueDepth,maxConcurrentTasks:V.taskConcurrencyLimit},202)}finally{if(E?.release(),!M)j.release()}}))}),O.patch("/:sessionId/goal",async(Y)=>{let U=y(s5,await Y.req.json());if(!U.success)throw new w("Invalid goal update");return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),async(V,G,_)=>s(G,async()=>{let L=await nO(V),H=!1,b;try{let j=L.value,M;if(U.data.action==="pause")M=await j.pauseGoal();else if(U.data.action==="edit")M=await j.editGoal(U.data.objective);else M=await j.resumeGoal();if(k.publish(G,"goal.updated",{goal:M}),M.status==="active"&&!RO(qO(V.currentRunId))){b=b0(_);let E=O1(V,"","default",{goalContinuationOnly:!0,runtimeLease:L,projectionLease:b});return H=!0,b=void 0,await E.taskAdmissionUpdate,Y.json({status:E.status==="queued"?"queued":"running",runId:E.id,goal:M,queuePosition:V.taskQueuePosition,queueDepth:V.taskQueueDepth,maxConcurrentTasks:V.taskConcurrencyLimit},202)}return Y.json({status:M.status,goal:M})}finally{if(b?.release(),!H)L.release()}}))}),O.delete("/:sessionId/goal",async(Y)=>{return oO(Y.req.param("sessionId"),Y.req.query("projectPath"),(U,V)=>lO(U,async(G)=>{let _=await G.clearGoal();if(_)k.publish(V,"goal.cleared",{});return Y.json({cleared:_})}))}),O.post("/:sessionId/archive",async(Y)=>{let U=Y.req.param("sessionId");try{let V=await EO(U,Y.req.query("projectPath")),G=await v.listSessionArchiveMembers(V.sessionId,V.projectPath);for(let L of G){let H=kO({sessionId:L.sessionId,projectPath:L.projectPath}),b=iO(H);if(RO(qO(b?.currentRunId)))throw new u(`Stop session ${L.sessionId} before archiving this session tree`)}for(let L of G){let H=kO({sessionId:L.sessionId,projectPath:L.projectPath}),b=iO(H);if(b)await M0(b)}let _=await v.archiveSession(V.sessionId,V.projectPath);for(let L of G){let H=kO({sessionId:L.sessionId,projectPath:L.projectPath}),b=o(H);m0(H,"archive"),await a1(H,"archive").catch(()=>{return}),Z.delete(b),k.publish(H,"session.archived",{archiveRootId:V.sessionId,archivedAt:_.archivedAt})}if($.size===0)await PO.getInstance().disconnectAll();return Y.json({session:_,archivedSessionIds:G.map((L)=>L.sessionId)})}catch(V){if(V instanceof w||V instanceof l||V instanceof fO||V instanceof u)throw V;if(V instanceof W4)throw new u(V.message);throw i.error("[SessionRoutes] Failed to archive session:",V),new JO("Failed to archive session")}}),O.post("/:sessionId/unarchive",async(Y)=>{let U=Y.req.param("sessionId");try{let V=await EO(U,Y.req.query("projectPath")),G=await v.listSessionArchiveMembers(V.sessionId,V.projectPath),_=await v.unarchiveSession(V.sessionId,V.projectPath),L=G.filter((H)=>H.sessionId===V.sessionId||H.archivedBySessionId===V.sessionId).map((H)=>H.sessionId);for(let H of L)k.publish({sessionId:H,projectPath:V.projectPath},"session.unarchived",{archiveRootId:V.sessionId});return Y.json({session:_,restoredSessionIds:L})}catch(V){if(V instanceof w||V instanceof l||V instanceof fO)throw V;if(V instanceof W4)throw new u(V.message);throw i.error("[SessionRoutes] Failed to unarchive session:",V),new JO("Failed to unarchive session")}}),O.delete("/:sessionId",async(Y)=>{let U=Y.req.param("sessionId"),V=Y.req.query("projectPath");try{let G=await EO(U,V);QO(G);let _=o(G),L=x.acquire(_),H=L?.value,b=H?.currentRunId,j=$.get(_),M=H?.taskWorktree??await v.findSessionTaskWorktree(G.sessionId,G.projectPath);L?.release();let E;if(b){let p=qO(b);if(p)w1(p),await p.completion,E=p.id}let q=eO.get(_);if(q)q.controller.abort("session-delete"),await q.completion;if(j)await j.clearGoal().catch((p)=>{i.warn("[SessionRoutes] Failed to clear session goal:",p)});if(await Q.dispose(G),await v.deleteSession(G.sessionId,G.projectPath),m0(G,"delete"),E)O9(E);await a1(G,"delete").catch(()=>{return}),Z.delete(_),k.publish(G,"session.deleted",{});let f=$.get(_);if(f){if(!await T.remove(_,f))throw new u("Session Runtime is still active and cannot be deleted")}if(M)try{await J0.restoreSession(M),await J0.exit({sessionId:G.sessionId,action:"remove",discardChanges:!0})}catch(p){i.warn(`[SessionRoutes] Failed to remove deleted task worktree ${G.sessionId}:`,p)}return Y.json({success:!0})}catch(G){if(i.error("[SessionRoutes] Failed to delete session:",G),G instanceof w||G instanceof l||G instanceof fO)throw G;throw new JO("Failed to delete session")}}),O.get("/:sessionId/message",async(Y)=>{let U=Y.req.param("sessionId");try{let V=await EO(U,Y.req.query("projectPath")),G=await v.loadSession(V.sessionId,V.projectPath);return Y.json(N4(G))}catch(V){if(i.error("[SessionRoutes] Failed to get messages:",V),V instanceof w||V instanceof l||V instanceof fO)throw V;throw new JO("Failed to get messages")}}),O.get("/:sessionId/events",async(Y)=>{let U=Y.req.param("sessionId"),V;try{V=A.enter(Y.req.raw.signal)}catch{throw new BO}let G=!1;try{let _=await EO(U,Y.req.query("projectPath"));try{await v.assertSessionWritable(_.sessionId,_.projectPath)}catch(q){if(q instanceof U4)throw new u(q.message);throw q}let L=await F0(_),H=L.value,b=Y.req.header("Last-Event-ID")??Y.req.query("lastEventId"),j=b?Number.parseInt(b,10):Number.NaN,M=Number.isInteger(j)?j+1:void 0,E=l5(Y,async(q)=>{let p=new Set,WO,VO,a=!1,mO,hO,n=new Promise((P)=>{hO=P}),KO,d=new Set,FO=(P)=>{let e=P;return p.add(e),P.finally(()=>{p.delete(e)})},pO=()=>{if(WO?.(),WO=void 0,VO!==void 0)clearInterval(VO),VO=void 0},g=(P)=>{if(KO)return KO;return a=!0,KO=(async()=>{try{pO(),mO?.close(P),q.close()}finally{hO()}})(),KO},wO=()=>{g(V.signal.reason)},yO=async(P)=>{await g(P),await Promise.allSettled([...p]),V.signal.removeEventListener("abort",wO),V.release()};if(V.signal.addEventListener("abort",wO,{once:!0}),q.onAbort(()=>{g()}),V.signal.aborted){await yO(V.signal.reason);return}mO=new Z1({write:async(P)=>{await q.writeSSE(P)},onFailure:(P)=>{if(f$(P,a))return;i.warn(`[SessionRoutes] SSE egress closed for ${_.sessionId}: kind=${P.kind} pendingItems=${P.pendingItems??0} pendingBytes=${P.pendingBytes??0}`),g(P)}}),WO=k.subscribe((P)=>{if(a)return;if(P.sessionId!==_.sessionId||P.projectPath!==_.projectPath)return;let e=P.properties.requestId;if((P.type==="permission.asked"||P.type==="question.required"||P.type==="elicitation.required")&&typeof e==="string"){if(d.has(e))return;d.add(e)}if(P.type==="subagent.completion.queued"){let UO=s(_,()=>c(H)).catch((xO)=>{i.error(`[SessionRoutes] Failed to wake background completion for ${H.id}:`,xO)});FO(UO)}if(P.type==="team.message.received"&&typeof P.properties.teamName==="string"&&typeof P.properties.messageId==="string"&&typeof P.properties.content==="string"&&N2(P.properties.metadata,{messageId:P.properties.messageId,teamName:P.properties.teamName})){let UO=P.properties.teamName,xO=P.properties.messageId,vO=P.properties.content,LO=P.properties.metadata,HO=s(_,async()=>{let TO=await nO(H),$1=!1;try{let T0=await TO.value.enqueueSteering(vO,{allowBeforeTurn:!0,messageId:xO,origin:"team_message",metadata:LO});if(!T0.accepted)return;await new Y2(UO,g1()).markDelivered([xO]),$1=T0.delivery==="next_turn"}finally{TO.release()}if(!$1)return;await c(H).catch((T0)=>{i.error(`[SessionRoutes] Failed to wake teammate delivery for ${H.id}:`,T0)})}).catch((TO)=>{i.error(`[SessionRoutes] Failed to deliver teammate message for ${H.id}:`,TO)});FO(HO)}if(P.type==="subagent.completion.queued"||P.type==="team.message.received")return;mO?.observe($9(P),P.seq)});try{if(q.aborted||a)return;let P=qO(H.currentRunId),e=RO(P)?await nO(H):void 0;try{let LO=e?.value,HO=LO?.getPendingSteeringCount()??0;await mO.writeInitial({data:JSON.stringify({type:"connected",properties:{sessionId:_.sessionId,projectPath:_.projectPath,timestamp:Date.now(),status:RO(P)?P.status:"idle",runId:RO(P)?P.id:void 0,queued:HO,pendingInputDelivery:HO>0?LO?.hasActiveTurn()?"current_turn":"next_turn":null,recovered:LO?.getRecoveredSteeringCount()??0}})})}finally{e?.release()}if(q.aborted||a)return;if(M!==void 0){if(await Z2.for(_.sessionId,_.projectPath).replay({onCommitted:async(HO)=>{if(q.aborted||a)return;let TO=J9(HO);if(TO.seq===void 0)return;await mO.writeReplay({...typeof HO.seq==="number"?{id:String(HO.seq)}:{},data:JSON.stringify({type:TO.type,...TO.seq!==void 0?{seq:TO.seq}:{},properties:{...TO.properties,sessionId:_.sessionId,projectPath:_.projectPath}})},TO.seq)}},M),q.aborted||a)return}if(mO.finishInitialization({replayed:M!==void 0}),q.aborted||a)return;if(!P&&!eO.has(o(_))){let HO=(await E0.list(_.projectPath,_.sessionId)).some((TO)=>TO.completion===void 0)?await lO(H,(TO)=>E0.recoverInterrupted(_.projectPath,_.sessionId,TO)):void 0;if(HO)await z0(H),k.publish(_,"review.completed",{reviewId:HO.reviewId,status:HO.status,findings:0,recovered:!0})}if(q.aborted||a)return;if(!P)await f0.recoverResponded(_.projectPath,_.sessionId);if(q.aborted||a)return;let UO=P?void 0:await f0.findPending(_.projectPath,_.sessionId),xO=P?.pendingPermission??(UO?{permissionId:UO.request.requestId,details:f0.confirmationDetails(UO),resolve:()=>{return}}:void 0);if(xO){d.add(xO.permissionId);let LO=x2(xO,!0);mO.observe({data:JSON.stringify({type:LO.type,properties:{...LO.properties,sessionId:_.sessionId,projectPath:_.projectPath}})})}if(q.aborted||a)return;let vO=c(H).catch(async(LO)=>{if(LO instanceof q1){await z0(H).catch(()=>{return});let HO=H.taskFailure?.code==="workspace_unavailable"?H.taskFailure:K1("workspace_unavailable");H.taskStatus="failed",H.taskStatusReason=HO.message,H.taskFailure=HO,k.publish(_,"session.error",{error:HO.message,taskFailure:HO}),k.publish(_,"session.status",{status:"error"})}i.error(`[SessionRoutes] Failed to resume pending input for ${U}:`,LO)});if(FO(vO),q.aborted||a)return;VO=setInterval(()=>{if(q.aborted||a)return;mO?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},15000),await n}catch(P){if(f$(P,a))return;throw P}finally{await yO()}});return G=!0,L.release(),E}catch(_){if(!G)V.release();throw _}}),O.post("/:sessionId/message",async(Y)=>{let U=Y.req.param("sessionId"),V=await Y.req.json(),G=y(a5,V);if(!G.success)throw new w("Invalid message format");let{content:_,attachments:L,modelId:H,reasoningEffort:b,serviceTier:j,responseVerbosity:M,communicationStyle:E,permissionMode:q,projectPath:f,outputSchema:p}=G.data,WO;if(p)try{WO=G4(p).schema}catch(g){throw new w(g instanceof Error?g.message:"Invalid output schema")}let VO=E;if(Buffer.byteLength(_,"utf8")>V4)throw new w(`Message text exceeds the ${V4}-byte limit`);let a=H?.trim();if((L??[]).reduce((g,wO)=>g+(typeof wO.content==="string"?Buffer.byteLength(wO.content):0),0)>p1)throw new w("Message attachments exceed the 5 MiB limit");let hO=q,n=C$(_,L),KO=await R1(U,f??Y.req.query("projectPath")),d=KO.value,FO=GO(d),pO=hO??d.permissionMode??"default";try{return await s(FO,async()=>{let g=qO(d.currentRunId);if(RO(g)){if(WO)throw new u("Wait for the active turn to finish before setting an output schema");return lO(d,async(e)=>{if(a&&!e.getModelById(a))throw new w(`Model not found: ${a}`);if(a&&e.getCurrentModelId()!==a)throw new u("Wait for the active turn to finish before switching models");if(b&&e.getReasoningConfiguration().selection!==b)throw new u("Wait for the active turn to finish before switching reasoning effort");if(j&&e.getServiceTierConfiguration().selection!==j)throw new u("Wait for the active turn to finish before switching service tier");if(M&&e.getResponseVerbosityConfiguration().selection!==M)throw new u("Wait for the active turn to finish before switching response verbosity");if(VO&&e.getCommunicationStyleConfiguration().selection!==VO)throw new u("Wait for the active turn to finish before switching communication style");if(hO&&d.permissionMode!==hO)throw new u("Wait for the active turn to finish before switching permission mode");let UO=await e.enqueueSteering(n,{allowBeforeTurn:!0});if(!UO.accepted)return Y.json({status:"rejected",reason:UO.reason??"turn_unavailable"},409);let xO=UO.messageId??v0(12),vO=UO.queued;k.publish(FO,"message.created",{messageId:xO,role:"user",content:w4(n)});let LO=UO.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(k.publish(FO,LO,{runId:g.id,messageId:xO,queued:vO}),UO.delivery==="next_turn"&&g.status!=="running"&&g.status!=="waiting_permission")c(d).catch((HO)=>{i.error(`[SessionRoutes] Failed to wake queued follow-up for ${U}:`,HO)});if(UO.delivery==="next_turn")g.pendingFollowUpRequested=!0;return Y.json({runId:g.id,messageId:xO,status:UO.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:vO},202)})}if(QO(FO),d.permissionMode!==pO)await l4(d,pO);let wO=await nO(d,{permissionMode:pO,...VO&&!VO.includes(":")?{communicationStyle:VO}:{}}),yO=!1,P;try{let e=wO.value;if(a&&!e.getModelById(a))throw new w(`Model not found: ${a}`);if(b)try{e.resolveReasoningConfiguration(b,a)}catch(AO){throw new w(AO instanceof Error?AO.message:"Invalid reasoning effort")}if(j)try{e.resolveServiceTierConfiguration(j,a)}catch(AO){throw new w(AO instanceof Error?AO.message:"Invalid service tier")}if(M)try{e.resolveResponseVerbosityConfiguration(M,a)}catch(AO){throw new w(AO instanceof Error?AO.message:"Invalid response verbosity")}let UO=VO?e.resolveCommunicationStyleConfiguration(VO):void 0;if(UO?.source!==void 0&&UO.source!=="built-in"&&!UO.contentSha256)throw new w("Custom communication style has no provenance");let xO=e.getCurrentModelId(),vO=e.getReasoningConfiguration(),LO=e.getServiceTierConfiguration(),HO=e.getResponseVerbosityConfiguration(),TO=e.getCommunicationStyleConfiguration(),$1=Boolean(a)&&xO!==a,T0=Boolean(b)&&vO.selection!==b,a4=Boolean(j)&&LO.selection!==j,n4=Boolean(M)&&HO.selection!==M,o4=Boolean(VO)&&TO.selection!==VO;if($1||T0||a4||n4||o4)await e.refresh({...a?{modelId:a}:{},...b?{reasoningEffort:b}:{},...j?{serviceTier:j}:{},...M?{responseVerbosity:M}:{},...VO?{communicationStyle:VO}:{}});let t1={...a&&d.selectedModelId!==a?{selectedModelId:a}:{},...b&&d.reasoningEffort!==b?{reasoningEffort:b}:{},...j&&d.serviceTier!==j?{serviceTier:j}:{},...M&&d.responseVerbosity!==M?{responseVerbosity:M}:{},...UO&&(d.communicationStyle!==VO||d.communicationStyleDigest!==UO.contentSha256)?{communicationStyle:VO,communicationStyleDigest:UO.source==="built-in"?null:UO.contentSha256}:{}};if(Object.keys(t1).length>0)try{let AO=await v.updateSessionMetadata(d.id,d.projectPath,t1);d.permissionMode=AO.permissionMode,d.selectedModelId=AO.selectedModelId,d.reasoningEffort=AO.reasoningEffort,d.serviceTier=AO.serviceTier,d.responseVerbosity=AO.responseVerbosity,d.communicationStyle=AO.communicationStyle,d.communicationStyleDigest=AO.communicationStyleDigest,d.updatedAt=new Date(AO.lastMessageTime),k.publish(FO,"session.updated",t1)}catch(AO){if($1||T0||a4||n4||o4)await e.refresh({...xO?{modelId:xO}:{},reasoningEffort:vO.selection,serviceTier:LO.selection,responseVerbosity:HO.selection,communicationStyle:TO.selection}).catch((X5)=>i.error("[SessionRoutes] Failed to roll back non-durable model settings:",X5));throw AO}let Q1=WO?await e.prepareInputTurn(n,{outputSchema:WO}):await e.prepareInputTurn(n);if(!Q1.accepted)return Y.json({status:"rejected",reason:Q1.reason},Q1.reason==="queue_full"?429:409);P=b0(KO);let s1=O1(d,n,pO,{preparedInputTurn:Q1,outputSchema:WO,runtimeLease:wO,projectionLease:P});return yO=!0,P=void 0,await s1.taskAdmissionUpdate,Y.json({runId:s1.id,messageId:Q1.messageId,status:s1.status==="queued"?"queued":"running",queuePosition:d.taskQueuePosition,queueDepth:d.taskQueueDepth,maxConcurrentTasks:d.taskConcurrencyLimit},202)}finally{if(P?.release(),!yO)wO.release()}})}finally{KO.release()}}),O.post("/:sessionId/side-question",async(Y)=>{let U=Y.req.param("sessionId"),V=y(K2,await Y.req.json());if(!V.success)throw new w("Invalid side conversation request");return oO(U,V.data.projectPath??Y.req.query("projectPath"),(G)=>lO(G,async(_)=>{let L=await _.askSideQuestion(V.data.question,{signal:Y.req.raw.signal});return Y.json({...L,..._.getCurrentModelId()?{modelId:_.getCurrentModelId()}:{}})}))}),O.post("/:sessionId/shell",async(Y)=>{let U=Y.req.param("sessionId"),V=y(_2,await Y.req.json());if(!V.success)throw new w("Invalid user shell command");return oO(U,V.data.projectPath??Y.req.query("projectPath"),(G,_,L)=>{let H=o(_);return s(_,async()=>{if(V0.has(H))throw new u("A user shell command is already running in this Session");let b=await nO(G),j=b0(L),M=b.value,E=new AbortController,q,f=new Promise((p)=>{q=p});V0.set(H,{controller:E,completion:f,projectionLease:j});try{let p=await M.executeUserShellCommand(V.data.command,{signal:E.signal});await z0(G);let WO=qO(G.currentRunId);if(p.delivery==="next_turn"&&RO(WO))WO.pendingFollowUpRequested=!0;return Y.json({executionId:p.executionId,messageId:p.messageId,record:p.record,auxiliary:p.auxiliary,...p.delivery?{delivery:p.delivery}:{},...p.queued!==void 0?{queued:p.queued}:{}})}finally{V0.delete(H),q(),b.release(),j.release()}})})}),O.post("/:sessionId/abort",async(Y)=>{let U=Y.req.param("sessionId"),V=await EO(U,Y.req.query("projectPath"));QO(V);let G=iO(V);if(G?.currentRunId){let H=qO(G.currentRunId);if(H)w1(H),await H.completion}let _=V0.get(o(V));if(_)_.controller.abort("user-cancel"),await _.completion;let L=eO.get(o(V));if(L)L.controller.abort("user-cancel"),await L.completion;return Y.json({success:!0})}),O.get("/:sessionId/status",async(Y)=>{let U=Y.req.param("sessionId"),V=await EO(U,Y.req.query("projectPath")),G=iO(V),_=eO.get(o(V));if(_)return Y.json({sessionId:U,projectPath:V.projectPath,reviewId:_.reviewId,status:"reviewing"});if(!G?.currentRunId)return Y.json({sessionId:U,projectPath:V.projectPath,status:"idle"});let L=qO(G.currentRunId);return Y.json({sessionId:U,projectPath:V.projectPath,runId:G.currentRunId,status:L?.status==="attention_required"?"idle":L?.status??"idle"})}),{app:O,dispatchTask:i4,retryTask:$5,updateTask:Q5,getTaskDiff:Z5,deliverTask:Y5,recoverQueuedTasks:N5,getRuntimeResidencyStats:()=>T.getStats(),getProjectionResidencyStats:()=>x.getStats(),getCoordinationStats:()=>({messageSubmissions:W.getStats(),taskDeliveries:D.getStats()}),getSseConnectionStats:()=>A.stats(),shutdown:(Y="server-shutdown")=>{if(m)return m;R.close(Y);let U=A.shutdown(Y);o1.accepting=!1,j1("server-shutdown");let V=Promise.allSettled([...X].map((G)=>G.promise));return clearInterval(S),clearInterval(h),IO(),m=(async()=>{let G,_=async(M)=>{let E=await Promise.allSettled(M);for(let q of E)if(q.status==="rejected")G??=q.reason},L=new Set,H=()=>{for(let M of O0.values()){if(M.completion)L.add(M.completion);if(RO(M))w1(M,Y)}for(let M of V0.values())M.controller.abort(Y),L.add(M.completion);for(let M of eO.values())M.controller.abort(Y),L.add(M.completion)},b=R.waitForIdle(),j=!1;b.then(()=>{j=!0});while(!j)H(),await Promise.race([b,new Promise((M)=>setImmediate(M))]);if(await b,H(),await _([...L]),await V,await _([...Z.values()]),H(),await _([...L]),await _([U]),await _([...Z.values()]),await _([T.disposeAll()]),$.clear(),await _([...J.values()]),await _([Q.disposeAll()]),await _([PO.getInstance().disconnectAll()]),Z.clear(),J.clear(),N.clear(),X.clear(),Y0===o1)Y0=void 0;if(F1===IO)F1=void 0;if(G!==void 0)throw G})(),m}}};async function N9(O,$,Q,Z,J,N={}){let{abortController:X,sessionId:W,id:D}=O,F=N.preparedInputTurn?.messageId??v0(12),T=N.pendingInputOnly===!0||N.preparedInputTurn?.mode==="pending"||N.goalContinuationOnly===!0?void 0:v0(12),x=N.runtimeLease,R=N.projectionLease,A,S,h=!1,m=!1,B,r=GO($),c=async(t)=>{let s=t.metadata?.recoveryAttention;if(!s||!A)return!1;if(N.preparedInputTurn)await A.finishTurn(N.preparedInputTurn.handle,{preserveStartupRecovery:!0,outcome:{status:"aborted",cause:"failed",turnsCount:0,toolCallsCount:0,durationMs:0}}).catch(()=>{return});let QO=`Turn recovery requires attention: ${s.reason}`,ZO=await A.setTaskStatus("interrupted",QO).catch(()=>{return});if(ZO)N0($,ZO);else $.taskStatus="interrupted",$.taskStatusReason=QO,$.taskCompletedAt=void 0;return O.status="attention_required",C("session.status",{status:"idle"}),!0},C=(t,s)=>{k.publish(r,t,s)},IO=async()=>{let t=String(X.signal.reason||"Task run cancelled");if($.taskIsolation){if(!x)x=await J($).catch(()=>{return});let s=A??x?.value;if(t==="user-cancel")await s?.discardPendingInput().catch((ZO)=>{i.warn(`[SessionRoutes] Failed to discard cancelled input for ${$.id}:`,ZO)});let QO=await s?.setTaskStatus("cancelled",t).catch(()=>{return});if(QO)N0($,QO);else await z0($).catch(()=>{return})}$.taskStatus="cancelled",$.taskStatusReason=t,$.taskCompletedAt??=new Date().toISOString()};try{if(N.pendingResume){let K=N.pendingResume.deadlineAt-Date.now();if(K<=0)throw X.abort(m1),new W1({taskFailure:K1("timeout"),outputStarted:!1,toolExecutionStarted:!1,toolCallsCount:0});else B=setTimeout(()=>{X.abort(m1);let XO=O.pendingPermission;if(O.pendingPermission=void 0,XO?.resolve({approved:!1,reason:H4}),XO)C("interaction.resolved",{requestId:XO.permissionId})},K),B.unref?.()}if(N.taskAdmission){if(await N.taskAdmission.ready,await O.taskAdmissionUpdate,X.signal.aborted)throw Error(String(X.signal.reason||"Task run cancelled"))}if($.taskStatus="running",$.taskStatusReason=void 0,$.taskStartedAt=new Date().toISOString(),$.taskCompletedAt=void 0,!N.pendingInputOnly&&!N.goalContinuationOnly)C("message.created",{messageId:F,role:"user",content:w4(Q)});if(C("session.status",{status:"running"}),T)C("message.created",{messageId:T,role:"assistant",content:""});x??=await J($),A=x.value;let t=A,s=Boolean(N.outputSchema??t.getPendingSteeringMessages().find((K)=>K.outputSchema)?.outputSchema);S=await V2.createWithRuntime(t,{sessionId:W,...$.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}});let QO=async(K)=>{let XO=K.interactionRequestId??v0(12),nO=300000;O.status="waiting_permission";let lO=new Promise((m0)=>{let j1=setTimeout(()=>{i.warn(`[SessionRoutes] Permission ${XO} timed out after 300000ms`),C("permission.timeout",{requestId:XO}),m0({approved:!1,reason:"timeout"})},300000);O.pendingPermission={permissionId:XO,resolve:(iO)=>{clearTimeout(j1),m0(iO)},details:K}}),M0=O.pendingPermission;if(!M0)throw Error("Permission request was not registered");let T1=x2(M0);C(T1.type,T1.properties),i.info(`[SessionRoutes] Permission request created: ${XO}, runId: ${D}`);let A0=await lO;if(i.info(`[SessionRoutes] Permission response received: ${XO}, approved: ${A0.approved}`),!X.signal.aborted)O.status="running";if(O.pendingPermission===M0)O.pendingPermission=void 0;return C("interaction.resolved",{requestId:XO}),A0},MO={messages:await v.loadSessionModelContext($.id,$.projectPath),userId:"web-user",sessionId:W,workspaceRoot:$.projectPath,signal:X.signal,permissionMode:Z,onPermissionModeChange:async(K)=>{$.permissionMode=K,$.updatedAt=new Date,C("session.updated",{permissionMode:K})},...$.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:QO}},OO=()=>{if(!T)T=v0(12),C("message.created",{messageId:T,role:"assistant",content:""});return T},gO=async(K)=>{switch(K.kind){case"content_delta":if(K.delta.length>0)h=!0;if(s)break;C("message.delta",{messageId:OO(),delta:K.delta});break;case"structured_output":h=!0,C("structured.output",{messageId:OO(),output:K.output,schemaDigest:K.schemaDigest});break;case"thinking_delta":if(K.delta.length>0)h=!0;C("thinking.delta",{messageId:OO(),delta:K.delta});break;case"tool_start":if(m=!0,"function"in K.toolCall){if(K.toolCall.function.name===u0)break;C("tool.start",{messageId:OO(),toolName:K.toolCall.function.name,toolCallId:K.toolCall.id,arguments:K.toolCall.function.arguments,toolKind:K.toolKind})}break;case"tool_result":if(m=!0,"function"in K.toolCall){if(K.toolCall.function.name===u0)break;C("tool.result",{messageId:OO(),toolName:K.toolCall.function.name,toolCallId:K.toolCall.id,success:K.result.success,summary:K.result.metadata?.summary,output:L1(D1(x1(K.toolCall.function.name,K.result),B1)),metadata:H1(K.toolCall.function.name,K.result.metadata)})}break;case"tool_progress":if(m=!0,"function"in K.toolCall){if(K.toolCall.function.name===u0)break;C("tool.progress",{messageId:OO(),toolName:K.toolCall.function.name,toolCallId:K.toolCall.id,...K.update})}break;case"token_usage":C("token.usage",{...K.usage});break;case"turn_start":C("turn.started",{turn:K.turn,maxTurns:K.maxTurns});break;case"turn_recovery":C("turn.recovery",{assessment:K.assessment});break;case"provider_admission":C("provider.admission",{phase:K.phase,requestClass:K.requestClass,resource:K.resource,scope:K.scope,reason:K.reason,queuePosition:K.queuePosition,queueDepth:K.queueDepth,inFlight:K.inFlight,limit:K.limit,waitMs:K.waitMs,maxWaitMs:K.maxWaitMs,recoveryRemainingMs:K.recoveryRemainingMs});break;case"provider_circuit":C("provider.circuit",{phase:K.phase,reason:K.reason,statusCode:K.statusCode,retryAfterMs:K.retryAfterMs,nextProbeAt:K.nextProbeAt,openDurationMs:K.openDurationMs,sampleCount:K.sampleCount,failureCount:K.failureCount,recoveryRemainingMs:K.recoveryRemainingMs});break;case"provider_retry":C("provider.retry",{phase:K.phase,attempt:K.attempt,maxRetries:K.maxRetries,reason:K.reason,statusCode:K.statusCode,delayMs:K.delayMs,nextRetryAt:K.nextRetryAt,mode:K.mode,recoveryBudgetMs:K.recoveryBudgetMs,recoveryElapsedMs:K.recoveryElapsedMs,recoveryRemainingMs:K.recoveryRemainingMs,exhaustedBy:K.exhaustedBy});break;case"provider_stall":C("provider.stall",{phase:K.phase,stallCount:K.stallCount,durationMs:K.durationMs,warningAfterMs:K.warningAfterMs,timeoutMs:K.timeoutMs,outputStarted:K.outputStarted});break;case"action_stationarity":C("action.stationarity",{phase:K.phase,toolName:K.toolName,runLength:K.runLength,nudgeThreshold:K.nudgeThreshold,haltThreshold:K.haltThreshold,progressAware:K.progressAware});break;case"mcp_catalog_changed":C("mcp.catalog.changed",{messageId:OO(),revision:K.revision,serverName:K.serverName,added:K.added,removed:K.removed,updated:K.updated});break;case"mcp_content_changed":C("mcp.content.changed",{messageId:OO(),revision:K.revision,serverName:K.serverName,contentKind:K.contentKind,added:K.added,removed:K.removed,updated:K.updated});break;case"mcp_resource_updated":C("mcp.resource.updated",{messageId:OO(),revision:K.revision,serverName:K.serverName,uri:K.uri});break;case"mcp_connection_changed":C("mcp.connection.changed",{messageId:OO(),revision:K.revision,serverName:K.serverName,phase:K.phase,reason:K.reason,attempt:K.attempt,maxAttempts:K.maxAttempts,nextRetryAt:K.nextRetryAt,error:K.error});break;case"mcp_log":C("mcp.log",{messageId:OO(),revision:K.revision,serverName:K.serverName,level:K.level,logger:K.logger,message:K.message,projectedBytes:K.projectedBytes,dataSha256:K.dataSha256,truncated:K.truncated,detailsOmitted:K.detailsOmitted,timestamp:K.timestamp,synthetic:K.synthetic});break;case"mcp_instructions_changed":C("mcp.instructions.changed",{messageId:OO(),revision:K.revision,serverName:K.serverName,action:K.action,reason:K.reason,text:K.text,sourceBytes:K.sourceBytes,projectedBytes:K.projectedBytes,sha256:K.sha256,truncated:K.truncated,detailsOmitted:K.detailsOmitted});break;case"mcp_task_changed":C("mcp.task.changed",{messageId:OO(),revision:K.revision,taskId:K.taskId,serverName:K.serverName,toolName:K.toolName,status:K.status,statusMessage:K.statusMessage,createdAt:K.createdAt,updatedAt:K.updatedAt,completedAt:K.completedAt,hasResult:K.hasResult,error:K.error});break;case"project_rules_loaded":C("project.rules.loaded",{messageId:OO(),files:K.files,triggerPaths:K.triggerPaths,blockedWrite:K.blockedWrite});break;case"steering_applied":C("steering.applied",{runId:D,messageIds:K.messageIds,count:K.count,recovered:K.recovered,delivery:K.delivery,queued:t.getPendingSteeringCount()});break;case"follow_up_started":{if(T)C("message.complete",{messageId:T}),T=void 0;for(let XO of K.messages){if(!XO.recovered||XO.persisted)continue;if(N.pendingResume?.projectedInputIds.has(XO.id))continue;C("message.created",{messageId:XO.id,role:"user",content:w4(XO.content),recovered:!0}),N.pendingResume?.projectedInputIds.add(XO.id)}C("follow_up.started",{runId:D,queued:K.queued,recovered:K.recovered}),OO();break}case"goal_updated":C("goal.updated",{goal:K.goal});break;case"goal_continuation_started":C("goal.continuation.started",{goal:K.goal,continuation:K.continuation,...K.prematureStopPattern?{prematureStopPattern:K.prematureStopPattern}:{},...K.prematureStopCount!==void 0?{prematureStopCount:K.prematureStopCount}:{}}),OO();break;case"compaction":C(K.phase==="start"?"compaction.started":"compaction.completed",{...K.reason?{reason:K.reason}:{},...K.strategy?{strategy:K.strategy}:{},...K.outcome?{outcome:K.outcome}:{},...K.preTokens!==void 0?{preTokens:K.preTokens}:{},...K.preTokenSource?{preTokenSource:K.preTokenSource}:{},...K.estimatedPendingTokens!==void 0?{estimatedPendingTokens:K.estimatedPendingTokens}:{},...K.postTokens!==void 0?{postTokens:K.postTokens}:{},...K.sampleAttempts!==void 0?{sampleAttempts:K.sampleAttempts}:{},...K.inputReductions!==void 0?{inputReductions:K.inputReductions}:{},...K.messagesOmitted!==void 0?{messagesOmitted:K.messagesOmitted}:{},...K.filesOmitted!==void 0?{filesOmitted:K.filesOmitted}:{},...K.imagesOmitted!==void 0?{imagesOmitted:K.imagesOmitted}:{},...K.fallbackTargetTokens!==void 0?{fallbackTargetTokens:K.fallbackTargetTokens}:{},...K.fallbackMessagesOmitted!==void 0?{fallbackMessagesOmitted:K.fallbackMessagesOmitted}:{},...K.fallbackMessagesTruncated!==void 0?{fallbackMessagesTruncated:K.fallbackMessagesTruncated}:{},...K.failureReason?{failureReason:K.failureReason}:{}});break;case"model_fallback":C("model.fallback",{});break;case"task_update":C("task.updated",{tasks:K.tasks});break;case"goal_frontier_updated":C("goal.frontier.updated",{goalId:K.goal.goalId,goalStatus:K.goal.status,frontier:K.frontier,stall:K.goal.frontierStall});break;default:break}},K0=(K)=>{let XO=K.metadata?.toolCallsCount;return new W1({taskFailure:C0(K.error?.details??K.error?.message??"Agent run failed"),outputStarted:h,toolExecutionStarted:m,toolCallsCount:typeof XO==="number"&&Number.isInteger(XO)?XO:-1})},bO=await _4(S.chatStream(Q,MO,{stream:!0,pendingInputOnly:N.pendingInputOnly,preparedInputTurn:N.preparedInputTurn,goalContinuationOnly:N.goalContinuationOnly,outputSchema:N.outputSchema,taskAdmission:N.taskAdmission}),gO);if(await c(bO))return;if(!bO.success)throw K0(bO);for(let K=0;K<20;K++){let XO=O.pendingFollowUpRequested===!0;if(O.pendingFollowUpRequested=!1,t.getPendingSteeringCount()===0){if(!XO)break;continue}if(X.signal.aborted)break;if(bO=await _4(S.chatStream("",MO,{stream:!0,pendingInputOnly:!0,taskAdmission:N.taskAdmission}),gO),await c(bO))return;if(!bO.success)throw K0(bO)}if(await z0($),N.pendingResume&&X.signal.aborted&&X.signal.reason===m1)throw new W1({taskFailure:K1("timeout"),outputStarted:h,toolExecutionStarted:m,toolCallsCount:Number.isInteger(bO.metadata?.toolCallsCount)?bO.metadata?.toolCallsCount??-1:-1});if(X.signal.aborted||O.status==="cancelled"){await IO(),C("session.status",{status:"idle"});return}if(N.pendingResume)N.onPendingResumeSuccess?.(N.pendingResume);if(T)C("message.complete",{messageId:T});C("thinking.completed",{}),O.status="completed",$.taskStatus="completed",$.taskCompletedAt??=new Date().toISOString(),C("session.completed",{runId:D,outputTruncated:bO.metadata?.outputTruncated??!1}),C("session.status",{status:"idle"})}catch(t){if(A&&N.preparedInputTurn)await(A.getTurnRecoveryAssessment().state==="requires_attention"?A.finishTurn(N.preparedInputTurn.handle,{preserveStartupRecovery:!0}):A.finishTurn(N.preparedInputTurn.handle)).catch(()=>{return});let s=N.pendingResume!==void 0&&X.signal.aborted&&X.signal.reason===m1;if(X.signal.aborted&&!s||O.status==="cancelled"){if(N.pendingResume)N.onPendingResumeCancelled?.(N.pendingResume);w1(O,"runtime-abort"),await IO(),C("session.status",{status:"idle"});return}let QO=t instanceof W1?t.evidence:s?{taskFailure:K1("timeout"),outputStarted:h,toolExecutionStarted:m,toolCallsCount:-1}:N.pendingResume?{taskFailure:C0(t),outputStarted:!0,toolExecutionStarted:!0,toolCallsCount:-1}:void 0,ZO=N.pendingResume!==void 0&&QO!==void 0&&N.onPendingResumeFailure?.(N.pendingResume,QO,s||(A?.getPendingSteeringCount()??0)>0,s)===!0;if(O.status="failed",ZO){let OO=await A?.setTaskStatus("running").catch(()=>{return});if(OO)N0($,OO);$.taskStatus="running",$.taskStatusReason=void 0,$.taskFailure=void 0,$.taskCompletedAt=void 0,C("session.status",{status:"running"});return}await z0($).catch(()=>{return}),i.error("[SessionRoutes] Agent execution error:",t),$.taskStatus="failed",$.taskCompletedAt??=new Date().toISOString();let MO=QO?.taskFailure??C0(t);if(!$.taskFailure){let OO=A?await A.setTaskStatus("failed",t).catch(()=>{return}):await v.updateSessionMetadata($.id,$.projectPath,{taskStatus:"failed",taskStatusReason:MO.message,taskFailure:MO,taskCompletedAt:$.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(OO)N0($,OO)}$.taskStatusReason??=MO.message,$.taskFailure??=MO,C("session.error",{error:$.taskFailure.message,taskFailure:$.taskFailure}),C("session.status",{status:"error"})}finally{if(B)clearTimeout(B);if(N.taskAdmission?.release(),N.taskAdmission){let t=w0.getStats();C("task.status",{taskStatus:$.taskStatus,...$.taskStatusReason?{taskStatusReason:$.taskStatusReason}:{},...$.taskFailure?{taskFailure:$.taskFailure}:{},...$.taskStartedAt?{taskStartedAt:$.taskStartedAt}:{},...$.taskCompletedAt?{taskCompletedAt:$.taskCompletedAt}:{},...$.taskDiffStat?{taskDiffStat:$.taskDiffStat}:{},taskQueueDepth:t.queued,taskConcurrencyLimit:t.maxConcurrent,taskInFlight:t.inFlight,taskAdmissionPaused:t.paused,updatedAt:new Date().toISOString()})}if(await S?.destroy().catch(()=>{return}),x?.release(),R?.release(),O.disposeRuntimeOnSettle&&N.disposeRuntime)await N.disposeRuntime($,A).catch((t)=>{i.warn(`[SessionRoutes] Failed to dispose terminal task runtime ${$.id}:`,t)});e5(O)}}async function M2(O,$,Q){i.info(`[SessionRoutes] Looking for permission ${$} in session ${O.sessionId}`),i.info(`[SessionRoutes] Active runs: ${O0.size}`);for(let[X,W]of O0.entries())if(i.info(`[SessionRoutes] Checking run ${X}: sessionId=${W.sessionId}, projectPath=${W.projectPath}, pendingPermission=${W.pendingPermission?.permissionId}`),W.sessionId===O.sessionId&&W.projectPath===O.projectPath&&W.pendingPermission?.permissionId===$){if(W.pendingPermission.details.interactionRequestId)await f0.respond(O.projectPath,O.sessionId,$,Q);return W.pendingPermission.resolve(Q),i.info(`[SessionRoutes] Permission ${$} responded, runId: ${W.id}`),!0}let Z=await f0.findPending(O.projectPath,O.sessionId);if(!Z||Z.request.requestId!==$)return i.error(`[SessionRoutes] Permission not found: ${$}`),!1;await f0.respondAndRecover(O.projectPath,O.sessionId,$,Q),k.publish(O,"interaction.resolved",{requestId:$});let J=Y0;if(!J?.accepting)return!0;let N;try{N=await J.acquireOrHydrateSession(O);let X=N.value,W=await v.findSessionMetadata(O.sessionId,O.projectPath);if(Y0!==J||!J.accepting||!N.isCurrent())return!0;if(W)N0(X,W);J.resumeRecoveredInteraction(X).catch((D)=>{i.error(`[SessionRoutes] Failed to resume recovered interaction ${$}:`,D)})}catch(X){if(Y0!==J||!J.accepting)return!0;throw X}finally{N?.release()}return!0}var D4=$O("Service"),V9=z.Object({approved:z.Boolean(),remember:z.Optional(z.Boolean()),scope:z.Optional(YO(["once","session","project"])),targetMode:z.Optional(YO(["default","autoEdit","plan","yolo"])),feedback:z.Optional(z.String({maxLength:4000})),answers:z.Optional(z.Record(z.String({maxLength:80}),z.Union([z.String({maxLength:4000}),z.Array(z.String({maxLength:1000}),{maxItems:4})]),{maxProperties:4})),elicitation:z.Optional(z.Object({action:YO(["accept","decline","cancel"]),content:z.Optional(z.Record(z.String(),z.Union([z.String({maxLength:4000}),z.Number(),z.Boolean(),z.Array(z.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))}),A2=()=>{let O=new X9;return O.post("/:permissionId",async($)=>{let Q=$.req.param("permissionId"),Z=$.req.query("sessionId"),J=$.req.query("projectPath");D4.info(`[PermissionRoutes] Received permission response: permissionId=${Q}, sessionId=${Z}`);try{let N=await $.req.json(),X=y(V9,N);if(!X.success)throw new w("Invalid permission response format");let{approved:W,remember:D,scope:F,targetMode:I,feedback:T,answers:x,elicitation:R}=X.data;if(!Z)throw new w("sessionId query parameter is required");let A=await EO(Z,J);if(!await M2(A,Q,{approved:W,reason:T,scope:F,targetMode:I,feedback:T,answers:x,elicitation:R}))throw new l("Permission request",Q);return D4.info(`[PermissionRoutes] Permission ${Q} ${W?"approved":"denied"}`),$.json({success:!0,approved:W,remember:D})}catch(N){if(D4.error("[PermissionRoutes] Failed to respond to permission:",N),N instanceof w||N instanceof fO||N instanceof l||N instanceof zO)throw N;throw N}}),O};import{homedir as b2}from"node:os";import x4 from"node:path";import{Hono as z9}from"hono";var G9=z.Object({projectPath:z.String({minLength:1}),enabled:z.Boolean(),scope:z.Optional(YO(["local","project","global"]))}),U9=z.Object({projectPath:z.String({minLength:1})}),W9=z.Object({projectPath:z.String({minLength:1}),source:z.String({minLength:1}),trust:z.Literal(!0),ref:z.Optional(z.String({minLength:1}))}),_9=z.Object({projectPath:z.String({minLength:1}),trust:z.Literal(!0)}),K9=z.Object({projectPath:z.String({minLength:1}),confirm:z.Literal(!0)}),F9=z.Object({projectPath:z.String({minLength:1}),source:z.String({minLength:1}),ref:z.Optional(z.String({minLength:1}))}),T2=z.Object({projectPath:z.String({minLength:1}),confirm:z.Optional(z.Literal(!0))}),w9=z.Object({projectPath:z.String({minLength:1}),scope:z.Optional(YO(["local","project","global"])),policy:z.Object({restrictToAllowedSources:z.Boolean(),requireGitCommitSha:z.Boolean(),allowedGitHosts:z.Array(z.String()),allowedMarketplaces:z.Array(z.String()),allowedLocalRoots:z.Array(z.String())})});function aO(O){if(!O)throw new w("projectPath must be absolute");try{return _O(O)}catch{throw new w("projectPath must reference a local workspace")}}function H9(O){return x4.isAbsolute(O)||O.startsWith("./")||O.startsWith("../")||O==="~"||O.startsWith("~/")}function j2(O,$){if(!H9(O))return;let Q=O==="~"?b2():O.startsWith("~/")?x4.join(b2(),O.slice(2)):O;try{_O(x4.resolve($,Q))}catch{throw new w("Plugin source must reference a local workspace")}}async function I2(O){let[$,Q]=await Promise.all([tO(O),N1.getInstance().loadWorkspacePluginSettingsResolution(O)]);return $.plugins.getAll().map((Z)=>({name:Z.manifest.name,description:Z.manifest.description,version:Z.manifest.version,source:Z.source,enabled:Z.status==="active",status:Z.status,commands:Z.commands.length,skills:Z.skills.length,agents:Z.agents.length,hooks:Z.hooks?Object.values(Z.hooks).reduce((J,N)=>J+(Array.isArray(N)?N.length:0),0):0,mcpServers:Object.keys(Z.mcpServers??{}).length,configurable:Z.source!=="cli",managed:Z.installation!==void 0,marketplace:Z.installation?.source.type==="marketplace"?Z.installation.source.marketplace:void 0,revision:Z.installation?.revision,installedAt:Z.installation?.installedAt,updatedAt:Z.installation?.updatedAt,compatibilityIssues:Z.compatibilityIssues??[],effectiveScope:Z.source==="cli"?"invocation":Q.settings[Z.manifest.name]?.effectiveScope??"default",settingLayers:Z.source==="cli"?{invocation:!0}:Q.settings[Z.manifest.name]?.layers??{}}))}async function B9(){let O=R2(),[$,Q]=await Promise.all([O.listCatalogs(),O.listInstallationRecords()]),Z=new Map(Q.map((J)=>[J.name,J]));return $.map(({marketplace:J,manifest:N})=>({name:J.name,description:N.description??N.metadata?.description??"",sourceType:J.source.type,revision:J.revision,updatedAt:J.updatedAt,plugins:N.plugins.map((X)=>{let W=Z.get(X.name);return{name:X.name,description:X.description??"",version:X.version,category:X.category,tags:X.tags??[],installed:W!==void 0,installedVersion:W?.version}})}))}function d0(O,$){if(!O.success)throw new w(O.error??$)}var y2=()=>{let O=new z9;return O.get("/",async($)=>{let Q=aO($.req.query("projectPath"));return $.json(await I2(Q))}),O.post("/refresh",async($)=>{let Q=y(U9,await $.req.json());if(!Q.success)throw new w("Invalid plugin refresh request");let Z=aO(Q.data.projectPath),J=await E2(Z);return $.json({plugins:await I2(Z),errors:J.discovery.errors.map((N)=>({code:N.code??"LOAD_ERROR",error:N.error}))})}),O.get("/catalog",async($)=>{return aO($.req.query("projectPath")),$.json(await B9())}),O.get("/policy",async($)=>{let Q=aO($.req.query("projectPath")),Z=await N1.getInstance().loadWorkspacePluginSourcePolicy(Q);return $.json({policy:Z,environmentRequiresSha:process.env.BLADE_PLUGIN_REQUIRE_SHA==="1"||process.env.BLADE_PLUGIN_REQUIRE_SHA==="true"})}),O.post("/policy",async($)=>{let Q=y(w9,await $.req.json());if(!Q.success)throw new w("Invalid plugin source policy request");let Z=aO(Q.data.projectPath),J=await S2(Z,Q.data.policy,Q.data.scope??"global");return $.json({policy:J})}),O.post("/install",async($)=>{let Q=y(W9,await $.req.json());if(!Q.success)throw new w("Invalid plugin install request; explicit source trust is required");let Z=aO(Q.data.projectPath);j2(Q.data.source,Z);let{result:J}=await C2(Z,Q.data.source,{trusted:Q.data.trust,ref:Q.data.ref});return d0(J,"Plugin installation failed"),$.json({name:J.pluginName,version:J.manifest?.version,revision:J.installation?.revision,changed:J.changed,installedDependencies:J.installedDependencies??[]})}),O.post("/marketplaces",async($)=>{let Q=y(F9,await $.req.json());if(!Q.success)throw new w("Invalid marketplace add request");let Z=aO(Q.data.projectPath);j2(Q.data.source,Z);let J=await k2(Z,Q.data.source,Q.data.ref);return d0(J,"Marketplace installation failed"),$.json({name:J.marketplace?.name,plugins:J.manifest?.plugins.length??0,revision:J.marketplace?.revision,changed:J.changed})}),O.post("/marketplaces/:name/refresh",async($)=>{let Q=y(T2,await $.req.json());if(!Q.success)throw new w("Invalid marketplace refresh request");let Z=await m2(aO(Q.data.projectPath),$.req.param("name"));return d0(Z,"Marketplace refresh failed"),$.json({name:Z.marketplace?.name,plugins:Z.manifest?.plugins.length??0,revision:Z.marketplace?.revision,changed:Z.changed})}),O.post("/marketplaces/:name/remove",async($)=>{let Q=y(T2,await $.req.json());if(!Q.success||Q.data.confirm!==!0)throw new w("Invalid marketplace removal request; explicit confirmation is required");aO(Q.data.projectPath);let Z=await h2($.req.param("name"),!0);return d0(Z,"Marketplace removal failed"),$.json({name:Z.marketplace?.name,removed:!0})}),O.post("/:name/update",async($)=>{let Q=y(_9,await $.req.json());if(!Q.success)throw new w("Invalid plugin update request; explicit source trust is required");let Z=aO(Q.data.projectPath),{result:J}=await f2(Z,$.req.param("name"),{trusted:Q.data.trust});return d0(J,"Plugin update failed"),$.json({name:J.pluginName,version:J.manifest?.version,revision:J.installation?.revision,changed:J.changed,updatedDependencies:J.updatedDependencies??[]})}),O.post("/:name/uninstall",async($)=>{let Q=y(K9,await $.req.json());if(!Q.success)throw new w("Invalid plugin uninstall request; explicit confirmation is required");let Z=aO(Q.data.projectPath),{result:J}=await P2(Z,$.req.param("name"),Q.data.confirm);return d0(J,"Plugin uninstall failed"),$.json({name:J.pluginName,removed:!0})}),O.post("/:name/state",async($)=>{let Q=y(G9,await $.req.json());if(!Q.success)throw new w("Invalid plugin state request");let Z=aO(Q.data.projectPath),J=$.req.param("name"),X=(await tO(Z)).plugins.get(J);if(!X)throw new l("Plugin",J);if(X.source==="cli")throw new w(`Plugin "${J}" was loaded with --plugin-dir and is invocation-scoped`);let W=await q2(Z,J,Q.data.enabled,Q.data.scope??"local");return $.json(W)}),O};import{Hono as A9}from"hono";import{execFile as D9}from"node:child_process";import x9 from"node:path";var A4="__BLADE_DIRECTORY_PICKER_CANCELLED__",L9=900000;function M9(O,$){return new Promise((Q)=>{D9(O,[...$],{timeout:L9,maxBuffer:65536,windowsHide:!0},(Z,J,N)=>{let X=Z?.code;Q({stdout:J,stderr:N,exitCode:typeof X==="number"?X:Z?1:0,...typeof X==="string"?{errorCode:X}:{}})})})}function L4(O){let $=O.replace(/[\r\n]+$/,"");if(!$||$===A4)return{cancelled:!0};if(!x9.isAbsolute($))throw Error("The folder picker returned an invalid path");return{cancelled:!1,path:$}}function M4(O){return O.exitCode!==0||Boolean(O.errorCode)}class g2{platform;runCommand;activeSelection=null;constructor(O={}){this.platform=O.platform??process.platform,this.runCommand=O.runCommand??M9}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 "${A4}"`,"end try"].join(`
8
- `),$=await this.runCommand("osascript",["-e",O]);if(M4($))throw Error("Unable to open the macOS folder picker");return L4($.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("${A4}")`,"}"].join("; "),$=await this.runCommand("powershell.exe",["-NoProfile","-STA","-Command",O]);if(M4($))throw Error("Unable to open the Windows folder picker");return L4($.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 $ of O){let Q=await this.runCommand($.command,$.args);if(Q.errorCode==="ENOENT")continue;if(Q.exitCode===1&&!Q.stdout.trim()&&!Q.stderr.trim())return{cancelled:!0};if(M4(Q))throw Error("Unable to open the Linux folder picker");return L4(Q.stdout)}throw Error("Install zenity or kdialog to use native folder selection")}}var p2=new g2;var b9=z.Object({path:z.String({minLength:1})});function v2(O){try{return _O(O)}catch($){throw new w($ instanceof Error?$.message:"Project path is invalid")}}function T9(O){if(!O)return!1;if(O==="tauri://localhost"||O==="http://tauri.localhost")return!0;try{let $=new URL(O).hostname;return $==="localhost"||$==="127.0.0.1"||$==="::1"||$==="[::1]"}catch{return!1}}var u2=(O={})=>{let $=new A9,Q=O.pickDirectory??(()=>p2.pick()),Z=O.allowDirectoryPickerRequest??T9;return $.get("/",async(J)=>{return J.json(await u1.list(NO()))}),$.post("/",async(J)=>{let N;try{N=await J.req.json()}catch{throw new w("A valid JSON body is required")}let X=y(b9,N);if(!X.success)throw new w("A project path is required");try{let W=v2(X.data.path),D=await u1.bind(W,NO());return J.json(D,201)}catch(W){throw new w(W instanceof Error?W.message:"Failed to bind project")}}),$.post("/pick",async(J)=>{if(!Z(J.req.header("Origin")))throw new zO("LOCAL_ACCESS_REQUIRED","Folder selection is only available from this machine",403);try{return J.json(await Q())}catch(N){throw new w(N instanceof Error?N.message:"Failed to select a folder")}}),$.delete("/",async(J)=>{let N=J.req.query("path");if(!N)throw new w("A project path is required");try{let X=await u1.unbind(v2(N));return J.json({success:!0,removed:X})}catch(X){throw new w(X instanceof Error?X.message:"Failed to unbind project")}}),$};import{Hono as j9}from"hono";var d2=$O("Service"),a2=()=>{let O=new j9;return O.get("/",async($)=>{try{let Q=await i2();return $.json(Q)}catch(Q){return d2.error("[ProviderRoutes] Failed to list providers:",Q),$.json([])}}),O.get("/:provider/models",async($)=>{let Q=$.req.param("provider");try{let Z=await c2(Q);return $.json(Z)}catch(Z){return d2.error("[ProviderRoutes] Failed to list models:",Z),$.json([])}}),O.put("/:provider/credential",async($)=>{let Q=$.req.param("provider"),Z=await $.req.json();if(!Z.apiKey?.trim())throw new w("apiKey is required");return await j0().setApiKey(Q,Z.apiKey.trim()),$.json({success:!0})}),O.delete("/:provider/credential",async($)=>{return await j0().clearCredential($.req.param("provider")),$.json({success:!0})}),O.put("/:provider",async($)=>{let Q=$.req.param("provider"),Z=DO(),J=Z?.modelProviders[Q];if(!Z||!J)throw new l("Model provider",Q);let N=await $.req.json();if(!N.name||!N.baseUrl||!N.wireApi)throw new w("name, baseUrl and wireApi are required");let X="apiKeyEnv"in N?N.apiKeyEnv?.trim():J.apiKeyEnv,W={name:N.name,baseUrl:N.baseUrl,wireApi:N.wireApi,...X?{apiKeyEnv:X}:{}},D=j0(),F=N.apiKey?.trim()?await D.credentials.read(Q):void 0;if(N.apiKey?.trim())await D.setApiKey(Q,N.apiKey.trim());try{return await uO().updateModelProvider(Q,W),$.json({success:!0})}catch(I){if(N.apiKey?.trim())if(F)await D.credentials.modify(Q,async()=>F);else await D.credentials.delete(Q);if(I instanceof Error&&(I.message.includes("modelProviders.")||I.message.includes("built-in provider")))throw new w(I.message);throw I}}),O.delete("/:provider",async($)=>{let Q=$.req.param("provider");if(!DO()?.modelProviders[Q])throw new l("Model provider",Q);let J=$.req.query("removeModels");if(J!==void 0&&J!=="true"&&J!=="false")throw new w("removeModels must be true or false");try{let N=await uO().removeModelProvider(Q,{removeModels:J==="true"});return $.json({success:!0,...N})}catch(N){if(N instanceof Error&&(N.message.includes("still referenced")||N.message.includes("owns the only model")))throw new u(N.message);throw N}}),O.post("/:provider/probe",async($)=>{let Q=$.req.param("provider"),Z=DO();if(!Z?.modelProviders[Q])throw new l("Model provider",Q);let J=await $.req.json().catch(()=>({})),N=Z.models.filter((W)=>W.provider===Q),X=J.modelId?N.find((W)=>W.id===J.modelId):N[0];if(!X)throw new w(J.modelId?"modelId does not reference this provider":"Model provider has no configured model to probe");return $.json(await l2(X,Z))}),O};import{Hono as I9}from"hono";var R9=$O("Service"),s2=(O,$)=>{let Q=new I9;return Q.onError((Z,J)=>{if(Z instanceof zO)return J.json(Z.toObject(),Z.statusCode);return R9.error("[ScheduleRoutes] Unhandled route error:",Z),J.json(new JO("Schedule request failed").toObject(),500)}),Q.get("/",async(Z)=>{let J=await O.list();return Z.json(t2.parse({schedules:J}))}),Q.post("/",async(Z)=>{let J;try{J=await Z.req.json()}catch{throw new w("Invalid request body")}let N=y(n2,J);if(!N.success)throw new w("Invalid schedule request");let X;try{X=_O(N.data.projectPath||Z.get("directory")||NO())}catch{throw new w("projectPath must reference a local workspace")}try{let W=await O.create({...N.data,projectPath:X});return Z.json(P0.parse(W),201)}catch(W){throw new w(W instanceof Error?W.message:"Failed to create schedule")}}),Q.get("/:id",async(Z)=>{let J=await O.get(Z.req.param("id"));if(!J)throw new l("Schedule not found");return Z.json(P0.parse(J))}),Q.patch("/:id",async(Z)=>{let J;try{J=await Z.req.json()}catch{throw new w("Invalid request body")}let N=y(o2,J);if(!N.success)throw new w("Invalid schedule update");let{modelId:X,reasoningEffort:W,serviceTier:D,responseVerbosity:F,communicationStyle:I,isolation:T,permissionMode:x,...R}=N.data,A={...X!==void 0?{modelId:X}:{},...W!==void 0?{reasoningEffort:W}:{},...D!==void 0?{serviceTier:D}:{},...F!==void 0?{responseVerbosity:F}:{},...I!==void 0?{communicationStyle:I}:{},...T!==void 0?{isolation:T}:{},...x!==void 0?{permissionMode:x}:{}};try{let S=await O.update(Z.req.param("id"),{...R,...Object.keys(A).length>0?{dispatch:A}:{}});if(!S)throw new l("Schedule not found");return Z.json(P0.parse(S))}catch(S){if(S instanceof zO)throw S;throw new w(S instanceof Error?S.message:"Failed to update schedule")}}),Q.delete("/:id",async(Z)=>{if(!await O.remove(Z.req.param("id")))throw new l("Schedule not found");return Z.json({ok:!0})}),Q.post("/:id/enable",async(Z)=>{let J=await O.setEnabled(Z.req.param("id"),!0);if(!J)throw new l("Schedule not found");return Z.json(P0.parse(J))}),Q.post("/:id/disable",async(Z)=>{let J=await O.setEnabled(Z.req.param("id"),!1);if(!J)throw new l("Schedule not found");return Z.json(P0.parse(J))}),Q.post("/:id/run",async(Z)=>{let J=await O.get(Z.req.param("id"));if(!J)throw new l("Schedule not found");if(!$)throw new JO("Scheduler is not running in this process");await $.fire(J,new Date,{manual:!0});let N=await O.get(J.id);return Z.json(P0.parse(N??J),202)}),Q};import{createHash as q9}from"node:crypto";import{Hono as E9}from"hono";var b4={invalid_session_surface_request:400,invalid_session_locator:400,session_surface_not_found:404,workspace_binding_mismatch:409,session_surface_cursor_invalid:400,session_surface_snapshot_changed:409,session_surface_read_only:409,session_surface_capability_unavailable:403,session_surface_capacity:429,session_surface_unavailable:503,session_surface_state_invalid:500},S9=z.Object({cursor:z.Optional(z.String({minLength:1})),limit:z.Optional(z.String({pattern:"^(?:[1-9]|[1-9][0-9]|100)$"})),archived:z.Optional(YO(["true","false"])),workspaceKind:z.Optional(YO(["local","acp-remote"]))},{additionalProperties:!1}),d1=65536,C9=new Set(["cursor","limit","archived","workspaceKind"]),f9=new Set(["locator","limit"]),P9=new Set(["locator","cursor","expectedSnapshot","limit"]),k9=new Set(["locator"]),m9=new Set(["version","sessionId","workspace"]),h9=new Set(["kind","projectPath","workspaceRef"]),y9=$O("Service");function X3(O={}){let $=O.service?void 0:new Y3(O.cursorRegistryOptions),Q=O.service??new N3({database:O.database,cursorRegistry:$}),Z=O.logger??y9,J=new E9,N=!0,X=0,W,D=new Set,F=()=>new l0("session_surface_unavailable"),I=()=>{if(X===0)return Promise.resolve();return new Promise((x)=>D.add(x))};return J.onError((x,R)=>{let A=v9(x);return Z.warn(`[SessionSurfaceRoutes] method=${R.req.method} path=${R.req.path} code=${A.error.code} kind=${R.get("surfaceKind")??"unknown"} locator=${R.get("surfaceLocatorDigest")??"none"}`),R.json(A,b4[A.error.code])}),J.use("*",async(x,R)=>{if(x.set("surfaceKind","unknown"),x.set("surfaceLocatorDigest","none"),!N){let A=l1(F());return x.json(A,b4[A.error.code])}X+=1;try{if(await R(),!N){let A=l1(F());x.res=x.json(A,b4[A.error.code])}return x.res}finally{if(X-=1,X===0){for(let A of D)A();D.clear()}}}),J.get("/catalog",async(x)=>{let R=g9(x.req.url),A=await Q.listPage(R);return x.json(O3.parse(A))}),J.post("/open",async(x)=>{T4(x.req.url);let R=await R4(x.req.raw);M1(R,f9,SO());let A=j4(R);I4(x,A);let S=y(Q3,R);if(!S.success)throw SO();let h=await Q.open(A,{limit:S.data.limit});return x.json(q4.parse(h))}),J.post("/history",async(x)=>{T4(x.req.url);let R=await R4(x.req.raw);M1(R,P9,SO());let A=j4(R);I4(x,A);let S=y(Z3,R);if(!S.success)throw SO();let h=await Q.historyPage(A,{cursor:S.data.cursor,expectedSnapshot:S.data.expectedSnapshot,limit:S.data.limit});return x.json($3.parse(h))}),J.post("/fork",async(x)=>{T4(x.req.url);let R=await R4(x.req.raw);M1(R,k9,SO());let A=j4(R);if(I4(x,A),!y(J3,R).success)throw SO();let h=await Q.fork(A);return x.json(q4.parse(h))}),{app:J,getStats:()=>({accepting:N,active:X,cursors:$?.stats().entryCount??0}),shutdown:(x="server-shutdown")=>{if(W)return W;return N=!1,W=(async()=>{let A=(await Promise.allSettled([Promise.resolve().then(()=>Q.close(x)),I()])).find((S)=>S.status==="rejected");if(A)throw A.reason})(),W}}}function SO(){return new l0("invalid_session_surface_request")}function g9(O){let $=new URL(O).searchParams,Q={},Z=new Set;for(let[N,X]of $){if(!C9.has(N)||Z.has(N))throw SO();Z.add(N),Q[N]=X}let J=y(S9,Q);if(!J.success)throw SO();return{...J.data.archived!==void 0?{archived:J.data.archived==="true"}:{},...J.data.cursor!==void 0?{cursor:J.data.cursor}:{},...J.data.limit!==void 0?{limit:Number(J.data.limit)}:{},...J.data.workspaceKind!==void 0?{workspaceKind:J.data.workspaceKind}:{}}}function T4(O){if(new URL(O).searchParams.size>0)throw SO()}function M1(O,$,Q){if(!O||typeof O!=="object"||Array.isArray(O))throw Q;if(Object.keys(O).some((Z)=>!$.has(Z)))throw Q}function j4(O){if(!O||typeof O!=="object"||Array.isArray(O))throw SO();let $=Reflect.get(O,"locator");if($===void 0)throw SO();let Q=new l0("invalid_session_locator");M1($,m9,Q),M1(Reflect.get($,"workspace"),h9,Q);let Z=y(r2,$);if(!Z.success)throw Q;return Z.data}function I4(O,$){O.set("surfaceKind",$.workspace.kind),O.set("surfaceLocatorDigest",u9($))}async function R4(O){let $=O.headers.get("content-length");if($!==null&&(!/^\d+$/.test($)||Number($)>d1))throw SO();let Q=O.body?.getReader();if(!Q)throw SO();let Z=[],J=0;try{while(!0){let{done:D,value:F}=await Q.read();if(D)break;if(J+=F.byteLength,J>d1){try{await Q.cancel()}catch{}throw SO()}Z.push(F)}}finally{Q.releaseLock()}let N=new Uint8Array(J),X=0;for(let D of Z)N.set(D,X),X+=D.byteLength;let W=new TextDecoder().decode(N);if(!W)throw SO();try{return p9(W),JSON.parse(W)}catch{throw SO()}}function p9(O){let $=0,Q=()=>{while(/\s/.test(O[$]??""))$+=1},Z=()=>{let N=$;if(O[$]!=='"')throw Error("expected string");$+=1;while($<O.length){let X=O[$];if(X==="\\"){$+=2;continue}if($+=1,X==='"')return JSON.parse(O.slice(N,$))}throw Error("unterminated string")},J=()=>{Q();let N=O[$];if(N==="{"){$+=1,Q();let W=new Set;if(O[$]==="}"){$+=1;return}while($<O.length){Q();let D=Z();if(W.has(D))throw Error("duplicate key");if(W.add(D),Q(),O[$]!==":")throw Error("expected colon");if($+=1,J(),Q(),O[$]==="}"){$+=1;return}if(O[$]!==",")throw Error("expected comma");$+=1}throw Error("unterminated object")}if(N==="["){if($+=1,Q(),O[$]==="]"){$+=1;return}while($<O.length){if(J(),Q(),O[$]==="]"){$+=1;return}if(O[$]!==",")throw Error("expected comma");$+=1}throw Error("unterminated array")}if(N==='"'){Z();return}let X=/^(?:true|false|null|-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)/.exec(O.slice($))?.[0];if(!X)throw Error("invalid primitive");$+=X.length};if(J(),Q(),$!==O.length)throw Error("trailing JSON")}function v9(O){if(O instanceof l0)return l1(O);return l1(new l0("session_surface_state_invalid"))}function l1(O){return e2.parse({error:{code:O.code,message:O.message,retryable:O.retryable}})}function u9(O){if(!O)return"none";return q9("sha256").update("session-surface-route-locator-v2\x00").update(JSON.stringify(O)).digest("hex").slice(0,16)}import*as D0 from"node:fs/promises";import{homedir as G3}from"node:os";import*as dO from"node:path";import{Hono as d9}from"hono";var k0=$O("Service"),V3=dO.join(G3(),".blade","skills"),E4=dO.join(G3(),".blade","skills-config.json");function i1(O){try{return _O(O,"directory")}catch{throw new w("directory must reference a local workspace")}}async function U3(){try{let O=await D0.readFile(E4,"utf-8");return JSON.parse(O)}catch{return{disabled:[]}}}async function l9(O){await D0.mkdir(dO.dirname(E4),{recursive:!0}),await D0.writeFile(E4,JSON.stringify(O,null,2))}async function i9(O,$){let Q=await U3();if($)Q.disabled=Q.disabled.filter((Z)=>Z!==O);else if(!Q.disabled.includes(O))Q.disabled.push(O);await l9(Q)}var B0=null,c9=300000,a9=6;async function n9(){if(B0&&Date.now()-B0.timestamp<c9)return B0.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(k0.warn(`GitHub API returned ${O.status}`),B0)return B0.data;throw Error(`GitHub skills catalog returned ${O.status}`)}let Q=(await O.json()).filter((X)=>X.type==="dir"),Z=Array(Q.length),J=0,N=Math.min(a9,Q.length);return await Promise.all(Array.from({length:N},async()=>{while(J<Q.length){let X=J++,W=Q[X];if(!W)continue;let D=`Official ${W.name} skill`;try{let F=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${W.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(F.ok){let T=(await F.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(T)D=T[1].trim().slice(0,100)}}catch{}Z[X]={name:W.name,description:D,tag:"Official",author:"Anthropic"}}})),B0={data:Z,timestamp:Date.now()},Z}catch(O){if(k0.warn("Failed to fetch skills catalog from GitHub:",O),B0)return B0.data;throw O}}var W3=()=>{let O=new d9;return O.get("/",async($)=>{try{let Q=i1($.get("directory")||NO()),J=(await tO(Q)).skills.getAll(),N=await U3(),X=J.map((W)=>({id:W.name,name:W.name,enabled:!N.disabled.includes(W.name),description:W.description||"",version:W.version||"1.0.0",provider:"Local",location:W.source==="builtin"?"Built-in":W.basePath,removable:W.source==="user"&&dO.dirname(dO.resolve(W.basePath))===dO.resolve(V3),capabilities:["prompts"],allowedTools:W.allowedTools||[]}));return $.json(X)}catch(Q){if(Q instanceof w)throw Q;return k0.error("[SkillsRoutes] Failed to get skills:",Q),$.json({error:Q instanceof Error?Q.message:"Failed to get skills"},500)}}),O.post("/:name/toggle",async($)=>{try{let Q=$.req.param("name"),Z=await $.req.json();return await i9(Q,Z.enabled),$.json({success:!0,enabled:Z.enabled})}catch(Q){return k0.error("[SkillsRoutes] Failed to toggle skill:",Q),$.json({success:!1,error:Q.message},500)}}),O.delete("/:name",async($)=>{try{let Q=$.req.param("name"),Z=i1($.get("directory")||NO());return z1(Z,async(J)=>{let N=J.skills,X=N.get(Q);if(!X)return $.json({success:!1,error:"Skill not found"},404);let W=dO.resolve(X.basePath),D=dO.resolve(V3);if(X.source!=="user"||dO.dirname(W)!==D)return $.json({success:!1,error:"Only Blade user skills can be uninstalled"},400);return await D0.rm(W,{recursive:!0,force:!0}),await N.refresh(),V1(Z),await X1(Z),$.json({success:!0})})}catch(Q){if(Q instanceof w)throw Q;return k0.error("[SkillsRoutes] Failed to uninstall skill:",Q),$.json({success:!1,error:Q.message},500)}}),O.post("/install",async($)=>{try{let Q=await $.req.json(),Z=z3(),J=i1($.get("directory")||NO());return z1(J,async(N)=>{let X=N.skills,W=!1;if(Q.source==="catalog"&&Q.name){if(W=await Z.installOfficialSkill(Q.name),!W)return $.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(Q.source==="repo"&&Q.url){if(W=await Z.installFromRepo(Q.url,Q.name),!W)return $.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(Q.source==="local"&&Q.path){let D=i1(dO.resolve(Q.path));if(W=await Z.installFromLocal(D,Q.name),!W)return $.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 $.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await X.refresh(),V1(J),await X1(J),$.json({success:!0})})}catch(Q){if(Q instanceof w)throw Q;return k0.error("[SkillsRoutes] Failed to install skill:",Q),$.json({success:!1,error:Q.message},500)}}),O.get("/catalog",async($)=>{try{let Q=await n9();return $.json(Q)}catch(Q){return k0.error("[SkillsRoutes] Failed to get catalog:",Q),$.json({error:Q instanceof Error?Q.message:"Failed to get skills catalog"},502)}}),O};import{execSync as o9}from"node:child_process";import{readdir as t9,realpath as s9}from"node:fs/promises";import G0 from"node:path";import r9 from"fast-glob";import{Hono as e9}from"hono";var A1=$O("Service"),O6=(O)=>{try{return o9("git rev-parse --abbrev-ref HEAD",{cwd:O,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},$6=[...c0.map((O)=>`${O}/**`),...c0,...c0.map((O)=>`**/${O}/**`),...c0.map((O)=>`**/${O}`),...S4.map((O)=>`**/${O}`)],Q6=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]);function i0(O){try{return _O(O,"directory")}catch($){throw new w($ instanceof Error?$.message:"directory is invalid")}}function _3(O,$){let Q=G0.relative(O,$);return Q===""||Q!==".."&&!Q.startsWith(`..${G0.sep}`)&&!G0.isAbsolute(Q)}async function K3(O){let $=G0.resolve(O),Q=[];while(!0)try{return G0.resolve(await s9($),...Q.reverse())}catch(Z){let J=Z.code;if(J!=="ENOENT"&&J!=="ENOTDIR")throw Z;let N=G0.dirname($);if(N===$)return G0.resolve(O);Q.push(G0.basename($)),$=N}}async function F3(O,$){let Q=G0.resolve(O,$);if(!_3(O,Q))return null;let Z=await K3(O),J=await K3(Q);if(!_3(Z,J))return null;try{i0(J)}catch{return null}return J}var B3=()=>{let O=new e9;return O.get("/commands",async($)=>{let Q=i0($.get("directory")||NO());try{let Z=$.req.query("q")||"",J=await tO(Q),N=H3(Z,Q,J).filter((X)=>!Q6.has(X.command));return $.json(N)}catch(Z){return A1.error("[SuggestionsRoutes] Failed to get command suggestions:",Z),$.json([])}}),O.get("/files",async($)=>{let Q=i0($.get("directory")||NO());try{let Z=$.req.query("q")||"",J=Math.min(Number($.req.query("limit"))||100,1000),N=$.req.query("type")==="file",W=(await r9("**/*",{cwd:Q,dot:!1,followSymbolicLinks:!1,onlyFiles:N,markDirectories:!0,unique:!0,ignore:$6})).map((I)=>I.replace(/\\/g,"/"));if(!Z)return $.json(W.slice(0,J));let D=Z.toLowerCase(),F=W.filter((I)=>I.toLowerCase().includes(D)).slice(0,J);return $.json(F)}catch(Z){return A1.error("[SuggestionsRoutes] Failed to get file suggestions:",Z),$.json([])}}),O.get("/files/tree",async($)=>{let Q=i0($.get("directory")||NO());try{let Z=$.req.query("path")||"",J=await F3(Q,Z);if(!J)return $.json({error:"Invalid file path"},400);let X=(await t9(J,{withFileTypes:!0})).map((F)=>({name:F.name,path:Z?`${Z}/${F.name}`:F.name,type:F.isDirectory()?"dir":"file"}));X.sort((F,I)=>{if(F.type!==I.type)return F.type==="dir"?-1:1;return F.name.localeCompare(I.name)});let W=new Set(c0),D=X.filter((F)=>{let I=F.name;if(I.startsWith("."))return!1;if(W.has(I))return!1;for(let T of S4)if(I.match(new RegExp(T.replace("*",".*"))))return!1;return!0});return $.json(D)}catch(Z){return A1.error("[SuggestionsRoutes] Failed to get file tree:",Z),$.json([])}}),O.get("/files/content",async($)=>{let Q=i0($.get("directory")||NO());try{let Z=$.req.query("path");if(!Z)return $.json({error:"Missing file path"},400);let J=await F3(Q,Z);if(!J)return $.json({error:"Invalid file path"},400);let N=w3(),X=await N.stat(J);if(!X?.isFile)return $.json({error:"File not found"},404);let W=200000,D=await N.readTextFile(J),F=D.length>W;return $.json({path:Z,content:F?D.slice(0,W):D,truncated:F,size:X.size})}catch(Z){return A1.error("[SuggestionsRoutes] Failed to get file content:",Z),$.json({error:"Failed to read file"},500)}}),O.get("/git-info",async($)=>{let Q=i0($.get("directory")||NO());try{let Z=O6(Q);return $.json({branch:Z})}catch(Z){return A1.error("[SuggestionsRoutes] Failed to get git info:",Z),$.json({branch:null})}}),O};import{Hono as Z6}from"hono";var a0=$O("Service"),A3=(O)=>{let $=new Z6;return $.onError((Q,Z)=>{if(Q instanceof zO)return Z.json(Q.toObject(),Q.statusCode);return a0.error("[TaskRoutes] Unhandled route error:",Q),Z.json(new JO("Failed to dispatch task").toObject(),500)}),$.post("/",async(Q)=>{let Z;try{Z=await Q.req.json()}catch{throw new w("Invalid request body")}let J=y(x3,Z);if(!J.success)throw new w("Invalid task request");if((J.data.attachments??[]).reduce((X,W)=>X+(typeof W.content==="string"?Buffer.byteLength(W.content):0),0)>p1)throw new w("Task attachments exceed the 5 MiB limit");if(J.data.taskDueAt&&!Number.isFinite(Date.parse(J.data.taskDueAt)))throw new w("Invalid task due date");try{let X=await O.dispatchTask({prompt:J.data.prompt,title:J.data.title,taskPriority:J.data.taskPriority,taskKind:J.data.taskKind,taskDueAt:J.data.taskDueAt?new Date(J.data.taskDueAt).toISOString():void 0,sourceProjectPath:J.data.projectPath||Q.get("directory")||NO(),isolation:J.data.isolation,permissionMode:J.data.permissionMode,modelId:J.data.modelId,reasoningEffort:J.data.reasoningEffort,serviceTier:J.data.serviceTier,responseVerbosity:J.data.responseVerbosity,communicationStyle:J.data.communicationStyle,attachments:J.data.attachments,outputSchema:J.data.outputSchema});return Q.json(f4.parse(X),202)}catch(X){if(X instanceof w||X instanceof u||X instanceof BO||X instanceof cO)throw X;throw a0.error("[TaskRoutes] Failed to dispatch task:",X),new JO("Failed to dispatch task")}}),$.patch("/:sessionId",async(Q)=>{let Z;try{Z=await Q.req.json()}catch{throw new w("Invalid request body")}let J=y(L3,Z);if(!J.success)throw new w("Invalid task update");if(J.data.title===void 0&&J.data.taskPriority===void 0&&J.data.taskKind===void 0&&J.data.taskDueAt===void 0)throw new w("Task update must include at least one field");if(typeof J.data.taskDueAt==="string"&&!Number.isFinite(Date.parse(J.data.taskDueAt)))throw new w("Invalid task due date");try{let N=await O.updateTask(Q.req.param("sessionId"),{...J.data,...typeof J.data.taskDueAt==="string"?{taskDueAt:new Date(J.data.taskDueAt).toISOString()}:{}},Q.req.query("projectPath"));return Q.json(C4.parse(N))}catch(N){if(N instanceof w||N instanceof l||N instanceof u)throw N;throw a0.error("[TaskRoutes] Failed to update task:",N),new JO("Failed to update task")}}),$.post("/:sessionId/retry",async(Q)=>{try{let Z=await O.retryTask(Q.req.param("sessionId"),Q.req.query("projectPath"));return Q.json(f4.parse(Z),202)}catch(Z){if(Z instanceof w||Z instanceof l||Z instanceof u||Z instanceof BO||Z instanceof cO)throw Z;throw a0.error("[TaskRoutes] Failed to retry task:",Z),new JO("Failed to retry task")}}),$.get("/:sessionId/diff",async(Q)=>{try{let Z=await O.getTaskDiff(Q.req.param("sessionId"),Q.req.query("projectPath"));return Q.json(D3.parse(Z))}catch(Z){if(Z instanceof w||Z instanceof l||Z instanceof u)throw Z;throw a0.error("[TaskRoutes] Failed to load task diff:",Z),new JO("Failed to load task diff")}}),$.post("/:sessionId/delivery",async(Q)=>{let Z;try{Z=await Q.req.json()}catch{throw new w("Invalid request body")}let J=y(M3,Z);if(!J.success)throw new w("Invalid task delivery request");try{let N=await O.deliverTask(Q.req.param("sessionId"),J.data.action,Q.req.query("projectPath"));return Q.json(C4.parse(N))}catch(N){if(N instanceof w||N instanceof l||N instanceof u)throw N;throw a0.error("[TaskRoutes] Failed to deliver task:",N),new JO("Failed to deliver task")}}),$};import{Hono as N6}from"hono";var J6=rO(z.Object({id:z.String(),name:z.String(),subagentType:z.String(),description:z.String(),agentId:z.Optional(z.String()),status:YO(["leader","running","completed","failed","cancelled","unknown"]),result:z.Optional(z.Unknown()),stats:z.Optional(z.Unknown()),worktreePath:z.Optional(z.String())})),Y6=rO(z.Object({id:z.String(),subject:z.String(),description:z.String(),status:YO(["pending","blocked","running","completed"]),owner:z.Optional(z.String()),priority:YO(["high","medium","low"]),dependsOn:z.Array(z.String()),blocks:z.Array(z.String()),result:z.Optional(z.String()),createdAt:z.String(),startedAt:z.Optional(z.String()),completedAt:z.Optional(z.String())})),$J=rO(z.Object({name:z.String(),description:z.Optional(z.String()),status:YO(["idle","running","completed","failed","deleted"]),leadAgentId:z.String(),leadSessionId:z.Optional(z.String()),workspaceRoot:z.Optional(z.String()),peerMessagingEnabled:z.Boolean(),createdAt:z.Number(),updatedAt:z.Number(),deletedAt:z.Optional(z.Number()),members:z.Array(J6),tasks:z.Array(Y6)})),b3=rO(z.Object({sessionId:z.String({minLength:1}),projectPath:z.String({minLength:1}),name:z.String({minLength:1}),description:z.Optional(z.String()),leadAgentType:z.Optional(z.String()),peerMessagingEnabled:z.Optional(z.Boolean()),members:z.Array(z.Object({name:z.String({minLength:1}),subagentType:z.String({minLength:1}),description:z.Optional(z.String()),prompt:z.String({minLength:10,maxLength:32768})}),{maxItems:32}),tasks:z.Optional(z.Array(z.Object({subject:z.String({minLength:1}),description:z.String({minLength:1}),dependsOn:z.Optional(z.Array(z.String())),assignedTo:z.Optional(z.String()),priority:z.Optional(YO(["high","medium","low"]))}),{maxItems:256}))})),T3=rO(z.Object({sessionId:z.String({minLength:1}),projectPath:z.String({minLength:1}),to:z.String({minLength:1}),message:z.String({minLength:1,maxLength:32768})})),j3=rO(z.Object({sessionId:z.String({minLength:1}),projectPath:z.String({minLength:1}),memberId:z.String({minLength:1})}));var X6=$O("Service"),E3=()=>{let O=new N6;return O.onError(($,Q)=>{if($ instanceof zO)return Q.json($.toObject(),$.statusCode);return X6.error("[TeamRoutes] Unhandled route error:",$),Q.json(new JO("Team operation failed").toObject(),500)}),O.get("/",async($)=>{o0();let Q=await t0($.req.query("sessionId"),$.req.query("projectPath"));return $.json(await n0(Q.projectPath).list(Q))}),O.post("/",async($)=>{o0();let Q=y(b3,await P4($.req));if(!Q.success)throw new w("Invalid team request");let Z=await t0(Q.data.sessionId,Q.data.projectPath),J=await v.findSessionMetadata(Z.sessionId,Z.projectPath);return $.json(await n0(Z.projectPath).create({name:Q.data.name,description:Q.data.description,leadAgentType:Q.data.leadAgentType,owner:Z,modelId:J?.selectedModelId,peerMessagingEnabled:Q.data.peerMessagingEnabled,members:Q.data.members,tasks:Q.data.tasks}),201)}),O.get("/:teamName",async($)=>{o0();let Q=await t0($.req.query("sessionId"),$.req.query("projectPath"));return $.json(await n0(Q.projectPath).getSnapshot($.req.param("teamName"),Q))}),O.post("/:teamName/messages",async($)=>{o0();let Q=y(T3,await P4($.req));if(!Q.success)throw new w("Invalid team message");let Z=await t0(Q.data.sessionId,Q.data.projectPath),J=await n0(Z.projectPath).sendMessage({name:$.req.param("teamName"),to:Q.data.to,body:Q.data.message,owner:Z});return $.json({messages:J})}),O.post("/:teamName/tasks/claim",async($)=>{o0();let Q=y(j3,await P4($.req));if(!Q.success)throw new w("Invalid team task claim");let Z=await t0(Q.data.sessionId,Q.data.projectPath);return $.json({task:await n0(Z.projectPath).claimTask($.req.param("teamName"),Q.data.memberId,Z)})}),O.delete("/:teamName",async($)=>{o0();let Q=await t0($.req.query("sessionId"),$.req.query("projectPath"));return $.json(await n0(Q.projectPath).delete($.req.param("teamName"),{owner:Q,killRunning:!0}))}),O};function n0(O){return new q3({configDir:g1(),subagentRegistry:R3(O)})}function o0(){if(I3().config.config?.agentTeamsEnabled!==!0)throw new BO("Agent Teams are disabled")}async function t0(O,$){if(!O||!$)throw new w("sessionId and absolute projectPath are required");let Q;try{Q=_O($)}catch{throw new w("sessionId and local projectPath are required")}if(!await v.findSessionMetadata(O,Q))throw new l(`Session not found: ${O}`);return{sessionId:O,projectPath:Q}}async function P4(O){try{return await O.json()}catch{throw new w("Invalid request body")}}import{Hono as V6}from"hono";var x0=$O("Service"),s0=new Map,S3=2097152,C3=65536;function f3(){return typeof globalThis.Bun<"u"}function P3(O,$){return _O(O||$||NO(),"cwd")}async function z6(O,$,Q){if(f3()){let{spawn:N}=await import("bun-pty"),X=N(O,$,{name:"xterm-256color",cwd:Q.cwd,env:Q.env});return{pid:X.pid,write:(W)=>X.write(W),resize:(W,D)=>X.resize(W,D),kill:()=>X.kill(),onData:(W)=>X.onData(W),onExit:(W)=>X.onExit(W)}}let J=(await import("node-pty")).spawn(O,$,{name:"xterm-256color",cwd:Q.cwd,env:Q.env,cols:80,rows:24});return{pid:J.pid,write:(N)=>J.write(N),resize:(N,X)=>J.resize(N,X),kill:()=>J.kill(),onData:(N)=>{J.onData(N)},onExit:(N)=>{J.onExit(N)}}}var h4=void 0,m4;if(f3())try{let{createBunWebSocket:O}=await import("hono/bun"),$=O();m4=$.upgradeWebSocket,h4=$.websocket}catch(O){x0.warn("[Terminal] Failed to initialize Bun WebSocket support:",O)}async function k3(O,$){let Q=`term-${Date.now()}`;x0.info(`[Terminal] New connection: ${Q}, cwd: ${O}`);let Z=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",J=Z.endsWith("sh")?["-l"]:[],N=await z6(Z,J,{cwd:O,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),X={id:Q,process:N,cwd:O,buffer:"",subscribers:new Set};if(s0.set(Q,X),X.subscribers.add($),N.onData((W)=>{let D=!1;for(let F of X.subscribers)try{F.send(W),D=!0}catch{X.subscribers.delete(F)}if(D)return;if(X.buffer+=W,X.buffer.length>S3)X.buffer=X.buffer.slice(-S3)}),N.onExit(({exitCode:W})=>{x0.info(`[Terminal] Process exited: ${Q}, code: ${W}`);for(let D of X.subscribers)try{D.close()}catch{}s0.delete(Q)}),X.buffer){let W=X.buffer;X.buffer="";for(let D=0;D<W.length;D+=C3)$.send(W.slice(D,D+C3))}return{session:X,cleanup:()=>{if(x0.info(`[Terminal] Connection closed: ${Q}`),X.subscribers.delete($),X.subscribers.size===0){try{X.process.kill()}catch{}s0.delete(Q)}}}}function m3(O,$){O.on("connection",async(Q,Z)=>{try{let J=new URL(Z.url||"/",`http://${Z.headers.host}`);if(!J.pathname.endsWith("/terminal/ws")){Q.close();return}let N=P3(J.searchParams.get("cwd")??void 0,$()),{session:X,cleanup:W}=await k3(N,{send:(D)=>Q.send(D),close:()=>Q.close()});Q.on("message",(D)=>{try{X.process.write(String(D))}catch(F){x0.error("[Terminal] Failed to write to PTY:",F)}}),Q.on("close",W),Q.on("error",W)}catch(J){x0.error("[Terminal] Failed to spawn PTY:",J),Q.close()}})}var h3=()=>{let O=new V6;if(O.get("/status",($)=>{let Q=Array.from(s0.values()).map((Z)=>({id:Z.id,cwd:Z.cwd}));return $.json({active:Q.length,terminals:Q})}),O.post("/kill/:terminalId",($)=>{let Q=$.req.param("terminalId"),Z=s0.get(Q);if(Z){try{Z.process.kill()}catch{}for(let J of Z.subscribers)J.close();return s0.delete(Q),$.json({success:!0})}return $.json({success:!1,error:"Terminal not found"},404)}),m4)O.get("/ws",async($,Q)=>{let Z=$.req.query("cwd")??void 0,J;try{J=P3(Z,$.get("directory"))}catch(W){let D=W instanceof Error?W.message:"cwd must reference a local workspace";return $.text(D,400)}let N;return m4(()=>{return{async onOpen(W,D){try{N=await k3(J,{send:(F)=>D.send(F),close:()=>D.close()})}catch(F){x0.error("[Terminal] Failed to spawn PTY:",F),D.close()}},onMessage(W){if(!N)return;try{N.session.process.write(String(W.data))}catch(D){x0.error("[Terminal] Failed to write to PTY:",D)}},onClose(){N?.cleanup()}}})($,Q)});else O.get("/ws",($)=>{return $.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return O};import{Hono as G6}from"hono";var U6=z.Object({projectPath:z.String({minLength:1}),action:YO(["trust","revoke"])});function y3(O){try{return _O(O)}catch{throw new w("projectPath must reference a local workspace")}}var p3=()=>{let O=new G6;return O.get("/",async($)=>{let Q=$.req.query("projectPath");if(!Q)throw new w("projectPath query parameter is required");let Z=y3(Q);return $.json(await y4.getInstance().getStatus(Z))}),O.post("/",async($)=>{let Q=y(U6,await $.req.json());if(!Q.success)throw new w("Invalid workspace trust request");let{action:Z}=Q.data,J=y3(Q.data.projectPath),N=y4.getInstance(),X=Z==="trust"?await N.trust(J):await N.revoke(J);return await g3(),$.json({...X,reloadRequired:X.sensitiveSources>0})}),O};var jO=$O("Service"),u4=[],r0,_0,e0,X0,U0,W0,v3=new Map,u3=new Map,A6=new Set([".css",".html",".js",".json",".svg"]),b6=1024,T6=3600000;class c1 extends Error{}function j6(O){return O==="/sessions/v2"||O.startsWith("/sessions/v2/")}function I6(O,$,Q){return new Promise((Z,J)=>{let N=[],X=0,W=()=>{O.off("data",D),O.off("end",F),O.off("error",I),$.removeEventListener("abort",T)},D=(R)=>{if(X+=R.byteLength,Q!==void 0&&X>Q){W(),O.resume(),J(new c1);return}N.push(R)},F=()=>{W(),Z(Buffer.concat(N,X))},I=(R)=>{W(),J(R)},T=()=>{W(),J($.reason)},x=O.headers["content-length"];if(Q!==void 0&&x!==void 0&&(!/^\d+$/.test(x)||Number(x)>Q)){O.resume(),J(new c1);return}if(O.on("data",D),O.once("end",F),O.once("error",I),$.addEventListener("abort",T,{once:!0}),$.aborted)T()})}function R6(O,$){if(!O)return 0;let Q=O.split(",").map((Z)=>{let[J,...N]=Z.trim().toLowerCase().split(";"),X=N.find((D)=>D.trim().startsWith("q=")),W=X?Number(X.trim().slice(2)):1;return{name:J,quality:Number.isFinite(W)?Math.max(0,Math.min(1,W)):0}});return Q.find((Z)=>Z.name===$)?.quality??Q.find((Z)=>Z.name==="*")?.quality??0}function d3(){if(e0)return;let O=()=>{v.collectStaleEmptySessions().then(($)=>{if($>0)jO.info(`[SessionGC] removed ${$} stale empty session(s)`)}).catch(($)=>{jO.warn("[SessionGC] failed to collect stale empty sessions:",$)})};O(),e0=setInterval(O,T6),e0.unref?.()}function l3(){if(!e0)return;clearInterval(e0),e0=void 0}function q6(O){return["br","gzip"].map((Q)=>({encoding:Q,quality:R6(O,Q)})).filter((Q)=>Q.quality>0).sort((Q,Z)=>Z.quality-Q.quality||(Q.encoding==="br"?-1:1))[0]?.encoding}function E6(O){let $=v3.get(O);if($)return $;let Q=b1(O);return v3.set(O,Q),Q}function S6(O,$,Q){let Z=`${Q}:${O}`,J=u3.get(Z);if(J)return J;let N=Q==="br"?H6($,{params:{[D6.BROTLI_PARAM_QUALITY]:5}}):B6($,{level:6});return u3.set(Z,N),N}function C6(){let O=K6(w6(import.meta.url)),$=[L0(O,"web"),L0(NO(),"dist/web"),L0(NO(),"packages/cli/dist/web")];for(let Q of $){let Z=L0(Q,"index.html");if(v4(Z)){if(b1(Z,"utf-8").includes("/assets/"))return jO.debug(`[Server] Found web dist at: ${Q}`),Q}}return null}function f6(){let O=new x6;O.onError((N,X)=>{if(jO.error("[Server] Request error:",N),N instanceof a3){let D=new cO(N.message,{resource:"workspace_agent_resources",limit:N.capacity});return X.json(D.toObject(),429)}if(N instanceof zO)return X.json(N.toObject(),N.statusCode);let W=N instanceof Error?N.message:String(N);return X.json({error:{code:"INTERNAL_ERROR",message:W}},500)}),O.use(async(N,X)=>{let W=process.env.BLADE_SERVER_PASSWORD;if(!W)return X();let D=N.req.path;if(D==="/"||D==="/favicon.svg"||D.startsWith("/assets/")||D.endsWith(".html")||D.endsWith(".js")||D.endsWith(".css"))return X();let F=N.req.header("Authorization");if(!F?.startsWith("Basic "))return N.header("WWW-Authenticate",'Basic realm="Blade Server"'),N.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let I=Buffer.from(F.slice(6),"base64").toString(),[T,x]=I.split(":"),R=process.env.BLADE_SERVER_USERNAME??"blade";if(T!==R||x!==W)return N.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return X()}),O.use(async(N,X)=>{let W=N.req.path==="/health"||N.req.path==="/global/health"||N.req.path.startsWith("/assets/");if(!W)jO.debug(`[Server] ${N.req.method} ${N.req.path}`);let D=Date.now();if(await X(),!W){let F=Date.now()-D;jO.debug(`[Server] ${N.req.method} ${N.req.path} - ${N.res.status} (${F}ms)`)}}),O.use(L6({origin(N){if(!N)return;if(N.startsWith("http://localhost:"))return N;if(N.startsWith("http://127.0.0.1:"))return N;if(N==="tauri://localhost"||N==="http://tauri.localhost")return N;if(u4.includes(N))return N;return}})),O.use(async(N,X)=>{let W=N.req.query("directory")||N.req.header("x-blade-directory")||NO();try{W=decodeURIComponent(W)}catch{}return N.set("directory",W),X()});let $,Q,Z;try{$=L2(),Q=X3(),Z=N$(),X0=$,U0=Q,W0=Z,r0=$.recoverQueuedTasks,_0=new e1({dispatch:(N)=>$.dispatchTask(N),store:p4}),O.route("/global",V$()),O.route("/events",Z.app),O.route("/sessions/v2",Q.app),O.route("/sessions",$.app),O.route("/tasks",A3($)),O.route("/teams",E3()),O.route("/schedules",s2(p4,_0)),O.route("/configs",r4()),O.route("/permissions",A2()),O.route("/plugins",y2()),O.route("/hooks",_$()),O.route("/workspace-trust",p3()),O.route("/providers",a2()),O.route("/models",M$()),O.route("/projects",u2()),O.route("/suggestions",B3()),O.route("/terminal",h3()),O.route("/mcp",w$()),O.route("/skills",W3())}catch(N){throw n3($,Q,Z,"server-startup-failure").catch((X)=>{jO.error("[Server] Failed to clean up route controllers:",X)}),X0=void 0,U0=void 0,W0=void 0,r0=void 0,_0=void 0,N}O.get("/health",(N)=>{return N.json({healthy:!0,version:y0()})});let J=C6();if(J)jO.info(`[Server] Serving static files from ${J}`),O.get("/favicon.svg",()=>{let N=L0(J,"favicon.svg");if(!v4(N))return new Response(null,{status:404});return new Response(b1(N),{headers:{"Content-Type":"image/svg+xml","Cache-Control":"public, max-age=86400"}})}),O.get("/assets/*",(N)=>{let X=L0(J,N.req.path);if(!v4(X))return N.json({error:{code:"NOT_FOUND",message:`File not found: ${N.req.path}`}},404);let W=E6(X),D=F6(X).toLowerCase(),I={".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"}[D]||"application/octet-stream",T=A6.has(D)&&W.byteLength>=b6?q6(N.req.header("Accept-Encoding")):void 0,x=T?S6(X,W,T):W;return new Response(new Uint8Array(x),{headers:{"Content-Type":I,"Content-Length":String(x.byteLength),"Cache-Control":"public, max-age=31536000, immutable",Vary:"Accept-Encoding",...T?{"Content-Encoding":T}:{}}})}),O.get("/",(N)=>{let X=L0(J,"index.html"),W=b1(X,"utf-8");return N.html(W,200,{"Cache-Control":"no-cache"})}),O.get("*",(N)=>{let X=N.req.path;if(X.includes("."))return N.json({error:{code:"NOT_FOUND",message:`File not found: ${X}`}},404);let W=L0(J,"index.html"),D=b1(W,"utf-8");return N.html(D,200,{"Cache-Control":"no-cache"})});else jO.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),O.get("/",(N)=>{return N.json({message:"Blade API Server",version:y0(),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("*",(N)=>{return N.json({error:{code:"NOT_FOUND",message:`Route not found: ${N.req.path}`}},404)});return O}async function n3(O,$,Q,Z){let J=[],N;for(let D of[O,$,Q])try{J.push(D?.shutdown(Z)??Promise.resolve())}catch(F){N??=F}let W=(await Promise.allSettled(J)).find((D)=>D.status==="rejected");if(N!==void 0)throw N;if(W)throw W.reason}function P6(){let O=_6(),$=[];for(let Q of Object.keys(O)){let Z=O[Q];if(!Z)continue;for(let J of Z){if(J.internal||J.family!=="IPv4")continue;if(J.address.startsWith("172."))continue;$.push(J.address)}}return $}function i3(){return typeof globalThis.Bun<"u"}function c3(O,$){let Q=globalThis.Bun,Z=(N)=>{try{return Q.serve({hostname:$.hostname,port:N,fetch:O.fetch,idleTimeout:0,websocket:h4})}catch(X){jO.error("Failed to start Bun server:",X);return}},J=$.port===0?Z(4096)??Z(0):Z($.port);if(!J)throw Error(`Failed to start Bun server on port ${$.port}`);return{url:J.url,port:J.port,hostname:J.hostname,stop:async()=>{J.stop(!0)}}}function k6(O,$){return new Promise((Q,Z)=>{let J=W6(async(F,I)=>{let T=new AbortController,x=()=>{if(!T.signal.aborted)T.abort("client-disconnected")},R=()=>x(),A=()=>{if(!I.writableEnded)x()};if(F.once("aborted",R),I.once("close",A),F.aborted||I.destroyed)x();try{let S=new URL(F.url||"/",`http://${F.headers.host}`),h=new Headers;for(let[c,C]of Object.entries(F.headers))if(C)if(Array.isArray(C))for(let IO of C)h.append(c,IO);else h.set(c,C);let m;if(F.method!=="GET"&&F.method!=="HEAD")m=(await I6(F,T.signal,j6(S.pathname)?d1:void 0)).toString();let B=new Request(S.toString(),{method:F.method,headers:h,body:m,signal:T.signal}),r=await O.fetch(B);if(I.statusCode=r.status,r.headers.forEach((c,C)=>{I.setHeader(C,c)}),r.body){let c=r.body.getReader(),C=async()=>{let{done:IO,value:t}=await c.read();if(IO){I.end();return}return I.write(t),C()};await C()}else{let c=await r.text();I.end(c)}}catch(S){if(T.signal.aborted)return;if(S instanceof c1){I.statusCode=400,I.setHeader("content-type","application/json; charset=UTF-8"),I.setHeader("connection","close"),I.end(JSON.stringify({error:{code:"invalid_session_surface_request",message:"Session surface request is invalid",retryable:!1}}));return}jO.error("[Server] Node request error:",S),I.statusCode=500,I.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}finally{F.off("aborted",R),I.off("close",A)}}),N=new M6({noServer:!0}),X=NO();m3(N,()=>X),J.on("upgrade",(F,I,T)=>{let x;try{x=new URL(F.url||"/",`http://${F.headers.host}`)}catch{I.end(`HTTP/1.1 400 Bad Request\r
9
- Connection: close\r
10
- \r
11
- `);return}if(x.pathname==="/terminal/ws"){try{_O(x.searchParams.get("cwd")||X,"cwd")}catch{I.end(`HTTP/1.1 400 Bad Request\r
12
- Connection: close\r
13
- \r
14
- `);return}N.handleUpgrade(F,I,T,(R)=>{N.emit("connection",R,F)})}else I.destroy()});let W=(F)=>{return new Promise((I,T)=>{J.once("error",(x)=>{if(x.code==="EADDRINUSE")T(x);else T(x)}),J.listen(F,$.hostname,()=>{let x=J.address();if(x&&typeof x==="object")I(x.port);else I(F)})})};(async()=>{let F;if($.port===0)try{F=await W(4096)}catch{F=await W(0)}else F=await W($.port);let I=new URL(`http://${$.hostname==="0.0.0.0"?"localhost":$.hostname}:${F}`);Q({url:I,port:F,hostname:$.hostname,stop:async()=>{return new Promise((T)=>{N.close(()=>{J.close(()=>T())})})}})})().catch(Z)})}var o3;((GY)=>{let O,$,Q,Z=async(x,R,A,S)=>{let h=[],m=_0,B=[];if($=void 0,X0===x)X0=void 0;if(U0===R)U0=void 0;if(W0===A)W0=void 0;if(r0=void 0,_0=void 0,S&&O===S)O=void 0,Q=void 0;try{B.push(n3(x,R,A,"server-startup-failure"))}catch(c){h.push(c)}try{m?.stop()}catch(c){h.push(c)}try{l3()}catch(c){h.push(c)}try{g4()}catch(c){h.push(c)}if(S)try{B.push(S.stop())}catch(c){h.push(c)}let r=await Promise.allSettled(B);for(let c of r)if(c.status==="rejected")h.push(c.reason);for(let c of h)jO.error("[Server] Startup cleanup failed:",c)},J=(x,R,A,S)=>{if(O!==x)return Promise.resolve();if(Q)return Q;let h,m,B,r,c,C,IO,t;try{C=R?.shutdown("server-shutdown")}catch(s){h=s}try{IO=A?.shutdown("server-shutdown")}catch(s){m=s}try{t=S?.shutdown("server-shutdown")}catch(s){B=s}try{_0?.stop()}catch(s){r=s}try{l3()}catch(s){c=s}return Q=(async()=>{let s=Promise.resolve().then(()=>x.stop()),[QO,ZO,MO,OO]=await Promise.allSettled([C??Promise.resolve(),IO??Promise.resolve(),t??Promise.resolve(),s]),gO;try{g4()}catch(K){gO=K}let bO=[h,QO.status==="rejected"?QO.reason:void 0,m,ZO.status==="rejected"?ZO.reason:void 0,B,MO.status==="rejected"?MO.reason:void 0,r,c,OO.status==="rejected"?OO.reason:void 0,gO].find((K)=>K!==void 0);if(bO!==void 0){if(O===x)Q=void 0;throw bO}if(O===x){if(O=void 0,$=void 0,X0===R)X0=void 0;if(U0===A)U0=void 0;if(W0===S)W0=void 0;r0=void 0,_0=void 0}jO.info("[Server] Blade server stopped")})(),Q};function N(){if(!$)$=f6();return $}GY.getApp=N;function X(x){u4=x.cors??[];let R=N(),A=X0,S=U0,h=W0,m;try{if(i3())m=c3(R,x),O=m,Q=void 0,jO.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");r0?.().catch((B)=>{jO.warn("[Server] Failed to recover queued tasks:",B)}),_0?.start(),d3()}catch(B){throw Z(A,S,h,m),B}if(!m)throw Error("Server transport failed to initialize");return{url:m.url,port:m.port,hostname:m.hostname,stop:()=>J(m,A,S,h)}}GY.listen=X;async function W(x){u4=x.cors??[];let R=N(),A=X0,S=U0,h=W0,m;try{if(i3())m=c3(R,x),O=m,jO.info(`[Server] Blade server listening on ${m.url} (Bun runtime)`);else m=await k6(R,x),O=m,jO.info(`[Server] Blade server listening on ${m.url} (Node.js runtime)`);Q=void 0;try{await r0?.()}catch(B){jO.warn("[Server] Failed to recover queued tasks:",B)}_0?.start(),d3()}catch(B){throw await Z(A,S,h,m),B}if(!m)throw Error("Server transport failed to initialize");return{url:m.url,port:m.port,hostname:m.hostname,stop:()=>J(m,A,S,h)}}GY.listenAsync=W;function D(){return O!==void 0}GY.isRunning=D;function F(){return X0?.getCoordinationStats()}GY.getSessionCoordinationStatsForTests=F;function I(){return U0?.getStats()}GY.getSessionSurfaceStatsForTests=I;function T(){return{global:W0?.getSseConnectionStats(),session:X0?.getSseConnectionStats()}}GY.getSseConnectionStatsForTests=T})(o3||={});export{h6 as a,y6 as b,P6 as c,o3 as d};
@@ -1 +0,0 @@
1
- import{bf as a,cf as b}from"./chunk-mkvqtawj.js";import"./chunk-dnt4c3gy.js";import"./chunk-w3y69e4e.js";export{a as globalOptions,b as cliConfig};