@band-app/server 0.36.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/client/assets/TerminalPanel-CddLlPAX.js +1 -0
  2. package/dist/client/assets/{_basePickBy-D1cW8RfA.js → _basePickBy-Mr2ui_ok.js} +1 -1
  3. package/dist/client/assets/{_baseUniq-DCImWVn2.js → _baseUniq-BbCun8O9.js} +1 -1
  4. package/dist/client/assets/{arc-Jv1JrzDM.js → arc-D72GLVnK.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DJTHV1y7.js → architectureDiagram-VXUJARFQ-CtL_pV38.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-Cj_bRlht.js → blockDiagram-VD42YOAC-DqyIIG7r.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-xPUaEy7L.js → c4Diagram-YG6GDRKO-nrzjw8-Z.js} +1 -1
  8. package/dist/client/assets/channel-CLpfxzfv.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-DWHXL8Ea.js → chunk-4BX2VUAB-CxMLZjJR.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-Bd7QCFS0.js → chunk-55IACEB6-mmYFV3uk.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-By14k0HA.js → chunk-B4BG7PRW-D5v9xl9X.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-D6pCQEj8.js → chunk-DI55MBZ5-D265fj7U.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-DYeXE4xT.js → chunk-FMBD7UC4-Dup-9g-C.js} +1 -1
  14. package/dist/client/assets/{chunk-QN33PNHL-DcLmw7kN.js → chunk-QN33PNHL-C-rWtyk3.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-CRzbN_tm.js → chunk-QZHKN3VN-DFPCO41y.js} +1 -1
  16. package/dist/client/assets/{chunk-TZMSLE5B-B75f53t3.js → chunk-TZMSLE5B-DsmBPBDj.js} +1 -1
  17. package/dist/client/assets/classDiagram-2ON5EDUG-CHqpXULX.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CHqpXULX.js +1 -0
  19. package/dist/client/assets/clone-kZf8-x5k.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-BkAK4OL7.js → cose-bilkent-S5V4N54A-CCWn4YDT.js} +1 -1
  21. package/dist/client/assets/{dagre-6UL2VRFP-DncmS6YY.js → dagre-6UL2VRFP-CnSoXX5n.js} +1 -1
  22. package/dist/client/assets/{diagram-PSM6KHXK-Cn4L1emn.js → diagram-PSM6KHXK-D9Zqn5kT.js} +1 -1
  23. package/dist/client/assets/{diagram-QEK2KX5R-PfH1MBS7.js → diagram-QEK2KX5R-B22XMhhn.js} +1 -1
  24. package/dist/client/assets/{diagram-S2PKOQOG-DIyYe2yo.js → diagram-S2PKOQOG-CtPm91f8.js} +1 -1
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-DWSS5ilU.js → erDiagram-Q2GNP2WA-Ctgsmx_B.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-D8sgfoe8.js → flowDiagram-NV44I4VS-BCt5r11U.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-CY0uwMQo.js → ganttDiagram-JELNMOA3-P1o9TA7p.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-C5HEaqeu.js → gitGraphDiagram-V2S2FVAM-CxVbFEsr.js} +1 -1
  29. package/dist/client/assets/{graph-CHdAVft2.js → graph-HCBV9xMB.js} +1 -1
  30. package/dist/client/assets/{highlighted-body-B3W2YXNL-fz7u7Bcv.js → highlighted-body-B3W2YXNL-Gaqu4_Bi.js} +1 -1
  31. package/dist/client/assets/{index-xQGEDauU.js → index-B8S7APPC.js} +1 -1
  32. package/dist/client/assets/{index-BooiqIu5.js → index-B9QUYOAR.js} +1 -1
  33. package/dist/client/assets/{index-Ru2Dc5A_.js → index-BQlNjJ1Y.js} +1 -1
  34. package/dist/client/assets/{index-Clbffg3I.js → index-BR7y3Gjm.js} +1 -1
  35. package/dist/client/assets/{index-DQOFyUau.js → index-Bl-ZW84y.js} +1 -1
  36. package/dist/client/assets/{index-8d72uArR.js → index-BsNWuo_5.js} +1 -1
  37. package/dist/client/assets/{index-Dz2ryCk3.js → index-C6aNqpcf.js} +1 -1
  38. package/dist/client/assets/{index-D-HgfXJR.js → index-CfHnPAjk.js} +1 -1
  39. package/dist/client/assets/{index-DMwXny-D.js → index-CnoZP7Fs.js} +1 -1
  40. package/dist/client/assets/{index-D6YofG76.js → index-D05HI19D.js} +1 -1
  41. package/dist/client/assets/{index-DZYkmDwN.js → index-D854qjw6.js} +1 -1
  42. package/dist/client/assets/{index-DWJFPU_5.js → index-DIJ2_F70.js} +1 -1
  43. package/dist/client/assets/{index-CrBImo8f.js → index-Gh5XAQRT.js} +1 -1
  44. package/dist/client/assets/{infoDiagram-HS3SLOUP-D0hp75aO.js → infoDiagram-HS3SLOUP-CmsTlZB8.js} +1 -1
  45. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-91HWCjRU.js → journeyDiagram-XKPGCS4Q-D-GI9JIi.js} +1 -1
  46. package/dist/client/assets/{kanban-definition-3W4ZIXB7-BzioXfF6.js → kanban-definition-3W4ZIXB7-55Qs5mRI.js} +1 -1
  47. package/dist/client/assets/{layout-DfQbFp33.js → layout-B2VqN6hx.js} +1 -1
  48. package/dist/client/assets/{main-Dqe_6Q3-.js → main-BYGBqn5C.js} +253 -248
  49. package/dist/client/assets/main-uTpkFvkD.css +1 -0
  50. package/dist/client/assets/{mindmap-definition-VGOIOE7T-C_jxHaxD.js → mindmap-definition-VGOIOE7T-5E-mnLiw.js} +1 -1
  51. package/dist/client/assets/{pieDiagram-ADFJNKIX-Kn_LfuP0.js → pieDiagram-ADFJNKIX--iuEHqnb.js} +1 -1
  52. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CbeGV886.js → quadrantDiagram-AYHSOK5B-DuZPB3Et.js} +1 -1
  53. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-COoa_fat.js → requirementDiagram-UZGBJVZJ-CZiE6M78.js} +1 -1
  54. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-TXccJBqI.js → sankeyDiagram-TZEHDZUN-Dp81iX-I.js} +1 -1
  55. package/dist/client/assets/{sequenceDiagram-WL72ISMW-Llnk43Jx.js → sequenceDiagram-WL72ISMW-BHT8ZcM2.js} +1 -1
  56. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DsQWz-Kg.js → stateDiagram-FKZM4ZOC-15v8J55n.js} +1 -1
  57. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DKjPuiuj.js +1 -0
  58. package/dist/client/assets/{timeline-definition-IT6M3QCI-B16mbiqF.js → timeline-definition-IT6M3QCI-C4Y7a-dk.js} +1 -1
  59. package/dist/client/assets/{treemap-GDKQZRPO-CN_Il1TD.js → treemap-GDKQZRPO-1nZ3vFhH.js} +1 -1
  60. package/dist/client/assets/{workspace._workspaceId-CXgdRFSq.js → workspace._workspaceId-BflC9g6E.js} +1 -1
  61. package/dist/client/assets/{workspace._workspaceId-DJz9r6Bk.js → workspace._workspaceId-FEoumKx5.js} +1 -1
  62. package/dist/client/assets/{xychartDiagram-PRI3JC2R-RSssrHeJ.js → xychartDiagram-PRI3JC2R-Cdm6l1QL.js} +1 -1
  63. package/dist/openapi.json +118 -44
  64. package/dist/server/assets/{TerminalPanel-BE1IBqp5.js → TerminalPanel-DFfLVpnD.js} +6 -6
  65. package/dist/server/assets/{_basePickBy-CHo3_xmm.js → _basePickBy-BJp7LAxW.js} +2 -2
  66. package/dist/server/assets/{_baseUniq-CSupPFs6.js → _baseUniq-C6AsZ3Xv.js} +1 -1
  67. package/dist/server/assets/_tanstack-start-manifest_v-CY2brxDW.js +4 -0
  68. package/dist/server/assets/{arc-D44kAr9U.js → arc-CdG8tMD4.js} +1 -1
  69. package/dist/server/assets/{architecture-7HQA4BMR-vXckakYr.js → architecture-7HQA4BMR-DAiqr3_e.js} +6 -6
  70. package/dist/server/assets/{architectureDiagram-VXUJARFQ-CR2ITyvh.js → architectureDiagram-VXUJARFQ-B5KfJFud.js} +6 -6
  71. package/dist/server/assets/{blockDiagram-VD42YOAC-DEeR9cDU.js → blockDiagram-VD42YOAC-DHqCP2b4.js} +6 -6
  72. package/dist/server/assets/{c4Diagram-YG6GDRKO-DBRRCTXb.js → c4Diagram-YG6GDRKO-BxUADYG0.js} +2 -2
  73. package/dist/server/assets/{channel-C5tRsfJG.js → channel-AccynRMn.js} +1 -1
  74. package/dist/server/assets/{chunk-4BX2VUAB-bf7NCd3y.js → chunk-4BX2VUAB-Dr1erjpr.js} +1 -1
  75. package/dist/server/assets/{chunk-55IACEB6-DWdn6VWI.js → chunk-55IACEB6-Bp9fy_-K.js} +1 -1
  76. package/dist/server/assets/{chunk-B4BG7PRW-Dkh6IKnk.js → chunk-B4BG7PRW-DIekCOU0.js} +4 -4
  77. package/dist/server/assets/{chunk-DI55MBZ5-DBWVZkkA.js → chunk-DI55MBZ5-DdsSqZAU.js} +3 -3
  78. package/dist/server/assets/{chunk-FMBD7UC4-BdS42WOu.js → chunk-FMBD7UC4-yK1qgpi7.js} +1 -1
  79. package/dist/server/assets/{chunk-QN33PNHL-B8Ct7vG8.js → chunk-QN33PNHL-BbG6vBLZ.js} +1 -1
  80. package/dist/server/assets/{chunk-QZHKN3VN-B9nHGxsX.js → chunk-QZHKN3VN-x8T6uBe6.js} +1 -1
  81. package/dist/server/assets/{chunk-TZMSLE5B-BlzccDyU.js → chunk-TZMSLE5B-DLaeAZ2i.js} +1 -1
  82. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-Chmrw_oF.js → classDiagram-2ON5EDUG-Dm_cGVOP.js} +5 -5
  83. package/dist/server/assets/{classDiagram-2ON5EDUG-Chmrw_oF.js → classDiagram-v2-WZHVMYZB-Dm_cGVOP.js} +5 -5
  84. package/dist/server/assets/{clone-aEnx_Sae.js → clone-CORmWwEs.js} +1 -1
  85. package/dist/server/assets/{cose-bilkent-S5V4N54A-Bc5NoQXq.js → cose-bilkent-S5V4N54A-BfBG7OY2.js} +1 -1
  86. package/dist/server/assets/{dagre-6UL2VRFP-H_kNmEPM.js → dagre-6UL2VRFP-LXGdLIDl.js} +6 -6
  87. package/dist/server/assets/{diagram-PSM6KHXK-BcsANBT1.js → diagram-PSM6KHXK-Dq-nGhg0.js} +7 -7
  88. package/dist/server/assets/{diagram-QEK2KX5R-k-zPaYMJ.js → diagram-QEK2KX5R-rd29zHZp.js} +6 -6
  89. package/dist/server/assets/{diagram-S2PKOQOG-DjbSY-6m.js → diagram-S2PKOQOG-pULTY82u.js} +6 -6
  90. package/dist/server/assets/{erDiagram-Q2GNP2WA-CydybEEO.js → erDiagram-Q2GNP2WA-BB0T0Xnn.js} +4 -4
  91. package/dist/server/assets/{flowDiagram-NV44I4VS-tA99onXp.js → flowDiagram-NV44I4VS-DpODroRz.js} +5 -5
  92. package/dist/server/assets/{ganttDiagram-JELNMOA3-DsJKSbMm.js → ganttDiagram-JELNMOA3-Cv3UNeb8.js} +1 -1
  93. package/dist/server/assets/{gitGraph-G5XIXVHT-BNHu-oQ-.js → gitGraph-G5XIXVHT-Gi_FOXtP.js} +6 -6
  94. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-CzPNHl73.js → gitGraphDiagram-V2S2FVAM-BJPLdwXn.js} +7 -7
  95. package/dist/server/assets/{graph-BnMaPr50.js → graph-DZvAvEGU.js} +2 -2
  96. package/dist/server/assets/{highlighted-body-B3W2YXNL-BdiOjvlf.js → highlighted-body-B3W2YXNL-BpysDJ-x.js} +1 -1
  97. package/dist/server/assets/{index-Z2HsI7K-.js → index-1E-3f8Qq.js} +1 -1
  98. package/dist/server/assets/{index-BDjoQgaj.js → index-BERXawHP.js} +1 -1
  99. package/dist/server/assets/{index-C1sJw8Wd.js → index-BN_8r_Ld.js} +1 -1
  100. package/dist/server/assets/{index-BcHVcca2.js → index-C3lgs4G4.js} +1 -1
  101. package/dist/server/assets/{index-CGb2LUtT.js → index-CKDVINR-.js} +1 -1
  102. package/dist/server/assets/{index-DKZU081P.js → index-CSCKMAKA.js} +1 -1
  103. package/dist/server/assets/{index-BuEcvcgH.js → index-ChLbrNFl.js} +1 -1
  104. package/dist/server/assets/{index-CPWcRp4N.js → index-ChPBr3vZ.js} +1 -1
  105. package/dist/server/assets/{index-BbZG02I3.js → index-CzlCSrfR.js} +1 -1
  106. package/dist/server/assets/{index-CvQ9Ebcc.js → index-D1exxtRP.js} +1 -1
  107. package/dist/server/assets/{index-BdUQ01QB.js → index-U-1MZOIQ.js} +1 -1
  108. package/dist/server/assets/{index-DYrcmtj8.js → index-Y0CJ6FO8.js} +1 -1
  109. package/dist/server/assets/{index-B5Ou6PeY.js → index-iqainN_h.js} +1 -1
  110. package/dist/server/assets/{info-VBDWY6EO-C24hC3ph.js → info-VBDWY6EO-Ba8HLWBX.js} +6 -6
  111. package/dist/server/assets/{infoDiagram-HS3SLOUP-CSvzttKw.js → infoDiagram-HS3SLOUP-BYfrlW-j.js} +5 -5
  112. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-Bb7ADiou.js → journeyDiagram-XKPGCS4Q-VV4qbZDl.js} +4 -4
  113. package/dist/server/assets/{kanban-definition-3W4ZIXB7-BCi9DXfZ.js → kanban-definition-3W4ZIXB7-TtjjtFt_.js} +2 -2
  114. package/dist/server/assets/{layout-CBoh_yzS.js → layout-CxNf3z_2.js} +4 -4
  115. package/dist/server/assets/{mermaid-3ZIDBTTL-DrE5sAWk.js → mermaid-3ZIDBTTL-ChndXjXw.js} +1 -1
  116. package/dist/server/assets/{mermaid-parser.core-C6_1Cugd.js → mermaid-parser.core-nvqu-aiP.js} +11 -11
  117. package/dist/server/assets/{mindmap-definition-VGOIOE7T-yqPdoOIb.js → mindmap-definition-VGOIOE7T-DME5Y_pR.js} +3 -3
  118. package/dist/server/assets/{packet-DYOGHKS2-DJmc50nE.js → packet-DYOGHKS2-Bt1WHvgh.js} +6 -6
  119. package/dist/server/assets/{pie-VRWISCQL-CvrR2-yk.js → pie-VRWISCQL-WTXmin9S.js} +6 -6
  120. package/dist/server/assets/{pieDiagram-ADFJNKIX-CFOW6PnN.js → pieDiagram-ADFJNKIX-CUbwYVab.js} +7 -7
  121. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-3A-aZNyC.js → quadrantDiagram-AYHSOK5B-BB6u0IN3.js} +1 -1
  122. package/dist/server/assets/{radar-ZZBFDIW7-Cfbkh5bz.js → radar-ZZBFDIW7-BWKvWMhz.js} +6 -6
  123. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-Dlll26uf.js → requirementDiagram-UZGBJVZJ-BLRtjxGN.js} +3 -3
  124. package/dist/server/assets/{router-B261twKF.js → router-BjXwm096.js} +1518 -885
  125. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-BQaOXs3v.js → sankeyDiagram-TZEHDZUN-BF1Ts-tv.js} +1 -1
  126. package/dist/server/assets/{sequenceDiagram-WL72ISMW-BCAnfOwu.js → sequenceDiagram-WL72ISMW-DB8euEl-.js} +3 -3
  127. package/dist/server/assets/{stateDiagram-FKZM4ZOC-BqJZtxdF.js → stateDiagram-FKZM4ZOC-CgrYrlDa.js} +8 -8
  128. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-1ifEjgYq.js → stateDiagram-v2-4FDKWEC3-Ch28pf2n.js} +4 -4
  129. package/dist/server/assets/{timeline-definition-IT6M3QCI-CAWbczQG.js → timeline-definition-IT6M3QCI-jW-suedf.js} +2 -2
  130. package/dist/server/assets/{treemap-GDKQZRPO-BK5fWRQl.js → treemap-GDKQZRPO-ClNoljcd.js} +6 -6
  131. package/dist/server/assets/{workspace._workspaceId-C895SrvA.js → workspace._workspaceId-CBpMR_kd.js} +1 -1
  132. package/dist/server/assets/{workspace._workspaceId-DJjGZFKN.js → workspace._workspaceId-CD0MjjsK.js} +1 -1
  133. package/dist/server/assets/{xychartDiagram-PRI3JC2R-DfSubvZj.js → xychartDiagram-PRI3JC2R-BKGpeSar.js} +1 -1
  134. package/dist/server/server.js +2 -2
  135. package/dist/start-server.mjs +677 -421
  136. package/package.json +5 -5
  137. package/dist/client/assets/TerminalPanel-6-rt7Tzp.js +0 -1
  138. package/dist/client/assets/channel-BObJvFJf.js +0 -1
  139. package/dist/client/assets/classDiagram-2ON5EDUG-B4j3Xs8O.js +0 -1
  140. package/dist/client/assets/classDiagram-v2-WZHVMYZB-B4j3Xs8O.js +0 -1
  141. package/dist/client/assets/clone-D1oJjm-k.js +0 -1
  142. package/dist/client/assets/main-CXgf0iaP.css +0 -1
  143. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BZgMRt9_.js +0 -1
  144. package/dist/server/assets/_tanstack-start-manifest_v-Cnfw-Mtl.js +0 -4
@@ -702,7 +702,7 @@ function pipeReducer(prev, fn2) {
702
702
  }
703
703
  function observableToPromise(observable$1) {
704
704
  const ac = new AbortController();
705
- const promise2 = new Promise((resolve12, reject) => {
705
+ const promise2 = new Promise((resolve13, reject) => {
706
706
  let isDone = false;
707
707
  function onDone() {
708
708
  if (isDone) return;
@@ -715,7 +715,7 @@ function observableToPromise(observable$1) {
715
715
  const obs$ = observable$1.subscribe({
716
716
  next(data2) {
717
717
  isDone = true;
718
- resolve12(data2);
718
+ resolve13(data2);
719
719
  onDone();
720
720
  },
721
721
  error(data2) {
@@ -888,15 +888,15 @@ function resolveSelfTuple(promise2) {
888
888
  return Unpromise.proxy(promise2).then(() => [promise2]);
889
889
  }
890
890
  function withResolvers() {
891
- let resolve12;
891
+ let resolve13;
892
892
  let reject;
893
893
  const promise2 = new Promise((_resolve, _reject) => {
894
- resolve12 = _resolve;
894
+ resolve13 = _resolve;
895
895
  reject = _reject;
896
896
  });
897
897
  return {
898
898
  promise: promise2,
899
- resolve: resolve12,
899
+ resolve: resolve13,
900
900
  reject
901
901
  };
902
902
  }
@@ -933,8 +933,8 @@ function timerResource(ms) {
933
933
  let timer = null;
934
934
  return makeResource({ start() {
935
935
  if (timer) throw new Error("Timer already started");
936
- const promise2 = new Promise((resolve12) => {
937
- timer = setTimeout(() => resolve12(disposablePromiseTimerResult), ms);
936
+ const promise2 = new Promise((resolve13) => {
937
+ timer = setTimeout(() => resolve13(disposablePromiseTimerResult), ms);
938
938
  });
939
939
  return promise2;
940
940
  } }, () => {
@@ -979,15 +979,15 @@ function _takeWithGrace() {
979
979
  return _takeWithGrace.apply(this, arguments);
980
980
  }
981
981
  function createDeferred() {
982
- let resolve12;
982
+ let resolve13;
983
983
  let reject;
984
984
  const promise2 = new Promise((res, rej) => {
985
- resolve12 = res;
985
+ resolve13 = res;
986
986
  reject = rej;
987
987
  });
988
988
  return {
989
989
  promise: promise2,
990
- resolve: resolve12,
990
+ resolve: resolve13,
991
991
  reject
992
992
  };
993
993
  }
@@ -2057,8 +2057,8 @@ var init_resolveResponse_BLZa62_J = __esm({
2057
2057
  status: "fulfilled",
2058
2058
  value
2059
2059
  };
2060
- subscribers === null || subscribers === void 0 || subscribers.forEach(({ resolve: resolve12 }) => {
2061
- resolve12(value);
2060
+ subscribers === null || subscribers === void 0 || subscribers.forEach(({ resolve: resolve13 }) => {
2061
+ resolve13(value);
2062
2062
  });
2063
2063
  });
2064
2064
  if ("catch" in thenReturn) thenReturn.catch((reason) => {
@@ -11697,21 +11697,21 @@ var require_react_development = __commonJS({
11697
11697
  );
11698
11698
  actScopeDepth = prevActScopeDepth;
11699
11699
  }
11700
- function recursivelyFlushAsyncActWork(returnValue, resolve12, reject) {
11700
+ function recursivelyFlushAsyncActWork(returnValue, resolve13, reject) {
11701
11701
  var queue = ReactSharedInternals.actQueue;
11702
11702
  if (null !== queue)
11703
11703
  if (0 !== queue.length)
11704
11704
  try {
11705
11705
  flushActQueue(queue);
11706
11706
  enqueueTask(function() {
11707
- return recursivelyFlushAsyncActWork(returnValue, resolve12, reject);
11707
+ return recursivelyFlushAsyncActWork(returnValue, resolve13, reject);
11708
11708
  });
11709
11709
  return;
11710
11710
  } catch (error40) {
11711
11711
  ReactSharedInternals.thrownErrors.push(error40);
11712
11712
  }
11713
11713
  else ReactSharedInternals.actQueue = null;
11714
- 0 < ReactSharedInternals.thrownErrors.length ? (queue = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, reject(queue)) : resolve12(returnValue);
11714
+ 0 < ReactSharedInternals.thrownErrors.length ? (queue = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, reject(queue)) : resolve13(returnValue);
11715
11715
  }
11716
11716
  function flushActQueue(queue) {
11717
11717
  if (!isFlushing) {
@@ -11898,7 +11898,7 @@ var require_react_development = __commonJS({
11898
11898
  ));
11899
11899
  });
11900
11900
  return {
11901
- then: function(resolve12, reject) {
11901
+ then: function(resolve13, reject) {
11902
11902
  didAwaitActCall = true;
11903
11903
  thenable.then(
11904
11904
  function(returnValue) {
@@ -11908,7 +11908,7 @@ var require_react_development = __commonJS({
11908
11908
  flushActQueue(queue), enqueueTask(function() {
11909
11909
  return recursivelyFlushAsyncActWork(
11910
11910
  returnValue,
11911
- resolve12,
11911
+ resolve13,
11912
11912
  reject
11913
11913
  );
11914
11914
  });
@@ -11922,7 +11922,7 @@ var require_react_development = __commonJS({
11922
11922
  ReactSharedInternals.thrownErrors.length = 0;
11923
11923
  reject(_thrownError);
11924
11924
  }
11925
- } else resolve12(returnValue);
11925
+ } else resolve13(returnValue);
11926
11926
  },
11927
11927
  function(error40) {
11928
11928
  popActScope(prevActQueue, prevActScopeDepth);
@@ -11944,15 +11944,15 @@ var require_react_development = __commonJS({
11944
11944
  if (0 < ReactSharedInternals.thrownErrors.length)
11945
11945
  throw callback = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, callback;
11946
11946
  return {
11947
- then: function(resolve12, reject) {
11947
+ then: function(resolve13, reject) {
11948
11948
  didAwaitActCall = true;
11949
11949
  0 === prevActScopeDepth ? (ReactSharedInternals.actQueue = queue, enqueueTask(function() {
11950
11950
  return recursivelyFlushAsyncActWork(
11951
11951
  returnValue$jscomp$0,
11952
- resolve12,
11952
+ resolve13,
11953
11953
  reject
11954
11954
  );
11955
- })) : resolve12(returnValue$jscomp$0);
11955
+ })) : resolve13(returnValue$jscomp$0);
11956
11956
  }
11957
11957
  };
11958
11958
  };
@@ -37623,11 +37623,11 @@ function __metadata(metadataKey, metadataValue) {
37623
37623
  }
37624
37624
  function __awaiter(thisArg, _arguments, P3, generator) {
37625
37625
  function adopt(value) {
37626
- return value instanceof P3 ? value : new P3(function(resolve12) {
37627
- resolve12(value);
37626
+ return value instanceof P3 ? value : new P3(function(resolve13) {
37627
+ resolve13(value);
37628
37628
  });
37629
37629
  }
37630
- return new (P3 || (P3 = Promise))(function(resolve12, reject) {
37630
+ return new (P3 || (P3 = Promise))(function(resolve13, reject) {
37631
37631
  function fulfilled(value) {
37632
37632
  try {
37633
37633
  step(generator.next(value));
@@ -37643,7 +37643,7 @@ function __awaiter(thisArg, _arguments, P3, generator) {
37643
37643
  }
37644
37644
  }
37645
37645
  function step(result) {
37646
- result.done ? resolve12(result.value) : adopt(result.value).then(fulfilled, rejected);
37646
+ result.done ? resolve13(result.value) : adopt(result.value).then(fulfilled, rejected);
37647
37647
  }
37648
37648
  step((generator = generator.apply(thisArg, _arguments || [])).next());
37649
37649
  });
@@ -37834,14 +37834,14 @@ function __asyncValues(o) {
37834
37834
  }, i);
37835
37835
  function verb(n) {
37836
37836
  i[n] = o[n] && function(v2) {
37837
- return new Promise(function(resolve12, reject) {
37838
- v2 = o[n](v2), settle(resolve12, reject, v2.done, v2.value);
37837
+ return new Promise(function(resolve13, reject) {
37838
+ v2 = o[n](v2), settle(resolve13, reject, v2.done, v2.value);
37839
37839
  });
37840
37840
  };
37841
37841
  }
37842
- function settle(resolve12, reject, d2, v2) {
37842
+ function settle(resolve13, reject, d2, v2) {
37843
37843
  Promise.resolve(v2).then(function(v3) {
37844
- resolve12({ value: v3, done: d2 });
37844
+ resolve13({ value: v3, done: d2 });
37845
37845
  }, reject);
37846
37846
  }
37847
37847
  }
@@ -72653,10 +72653,10 @@ function dataLoader(batchLoader) {
72653
72653
  resolve: throwFatalError,
72654
72654
  reject: throwFatalError
72655
72655
  };
72656
- const promise2 = new Promise((resolve12, reject) => {
72656
+ const promise2 = new Promise((resolve13, reject) => {
72657
72657
  var _pendingItems;
72658
72658
  item.reject = reject;
72659
- item.resolve = resolve12;
72659
+ item.resolve = resolve13;
72660
72660
  (_pendingItems = pendingItems) !== null && _pendingItems !== void 0 || (pendingItems = []);
72661
72661
  pendingItems.push(item);
72662
72662
  });
@@ -72780,15 +72780,15 @@ var init_loggerLink_ineCN1PO = __esm({
72780
72780
 
72781
72781
  // ../../node_modules/.pnpm/@trpc+client@11.12.0_@trpc+server@11.12.0_typescript@5.9.3__typescript@5.9.3/node_modules/@trpc/client/dist/wsLink-DSf4KOdW.mjs
72782
72782
  function withResolvers2() {
72783
- let resolve12;
72783
+ let resolve13;
72784
72784
  let reject;
72785
72785
  const promise2 = new Promise((res, rej) => {
72786
- resolve12 = res;
72786
+ resolve13 = res;
72787
72787
  reject = rej;
72788
72788
  });
72789
72789
  return {
72790
72790
  promise: promise2,
72791
- resolve: resolve12,
72791
+ resolve: resolve13,
72792
72792
  reject
72793
72793
  };
72794
72794
  }
@@ -72807,10 +72807,10 @@ async function buildConnectionMessage(connectionParams, encoder) {
72807
72807
  return encoder.encode(message);
72808
72808
  }
72809
72809
  function asyncWsOpen(ws) {
72810
- const { promise: promise2, resolve: resolve12, reject } = withResolvers2();
72810
+ const { promise: promise2, resolve: resolve13, reject } = withResolvers2();
72811
72811
  ws.addEventListener("open", () => {
72812
72812
  ws.removeEventListener("error", reject);
72813
- resolve12();
72813
+ resolve13();
72814
72814
  });
72815
72815
  ws.addEventListener("error", reject);
72816
72816
  return promise2;
@@ -72967,7 +72967,7 @@ var init_wsLink_DSf4KOdW = __esm({
72967
72967
  * @returns A cleanup function to manually remove the request.
72968
72968
  */
72969
72969
  register(message, callbacks) {
72970
- const { promise: end, resolve: resolve12 } = withResolvers2();
72970
+ const { promise: end, resolve: resolve13 } = withResolvers2();
72971
72971
  this.outgoingRequests.push({
72972
72972
  id: String(message.id),
72973
72973
  message,
@@ -72976,18 +72976,18 @@ var init_wsLink_DSf4KOdW = __esm({
72976
72976
  next: callbacks.next,
72977
72977
  complete: () => {
72978
72978
  callbacks.complete();
72979
- resolve12();
72979
+ resolve13();
72980
72980
  },
72981
72981
  error: (e) => {
72982
72982
  callbacks.error(e);
72983
- resolve12();
72983
+ resolve13();
72984
72984
  }
72985
72985
  }
72986
72986
  });
72987
72987
  return () => {
72988
72988
  this.delete(message.id);
72989
72989
  callbacks.complete();
72990
- resolve12();
72990
+ resolve13();
72991
72991
  };
72992
72992
  }
72993
72993
  /**
@@ -78772,10 +78772,10 @@ var require_core_cjs_development = __commonJS({
78772
78772
  easing,
78773
78773
  fill: "forwards"
78774
78774
  });
78775
- return new Promise((resolve12) => {
78775
+ return new Promise((resolve13) => {
78776
78776
  animation.onfinish = () => {
78777
78777
  cleanup == null ? void 0 : cleanup();
78778
- resolve12();
78778
+ resolve13();
78779
78779
  };
78780
78780
  });
78781
78781
  };
@@ -87218,7 +87218,7 @@ var require_compile = __commonJS({
87218
87218
  const schOrFunc = root.refs[ref];
87219
87219
  if (schOrFunc)
87220
87220
  return schOrFunc;
87221
- let _sch = resolve12.call(this, root, ref);
87221
+ let _sch = resolve13.call(this, root, ref);
87222
87222
  if (_sch === void 0) {
87223
87223
  const schema = (_a2 = root.localRefs) === null || _a2 === void 0 ? void 0 : _a2[ref];
87224
87224
  const { schemaId } = this.opts;
@@ -87245,7 +87245,7 @@ var require_compile = __commonJS({
87245
87245
  function sameSchemaEnv(s1, s2) {
87246
87246
  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
87247
87247
  }
87248
- function resolve12(root, ref) {
87248
+ function resolve13(root, ref) {
87249
87249
  let sch;
87250
87250
  while (typeof (sch = this.refs[ref]) == "string")
87251
87251
  ref = sch;
@@ -87820,7 +87820,7 @@ var require_fast_uri = __commonJS({
87820
87820
  }
87821
87821
  return uri;
87822
87822
  }
87823
- function resolve12(baseURI, relativeURI, options2) {
87823
+ function resolve13(baseURI, relativeURI, options2) {
87824
87824
  const schemelessOptions = options2 ? Object.assign({ scheme: "null" }, options2) : { scheme: "null" };
87825
87825
  const resolved = resolveComponent(parse5(baseURI, schemelessOptions), parse5(relativeURI, schemelessOptions), schemelessOptions, true);
87826
87826
  schemelessOptions.skipEscape = true;
@@ -88047,7 +88047,7 @@ var require_fast_uri = __commonJS({
88047
88047
  var fastUri = {
88048
88048
  SCHEMES,
88049
88049
  normalize: normalize3,
88050
- resolve: resolve12,
88050
+ resolve: resolve13,
88051
88051
  resolveComponent,
88052
88052
  equal,
88053
88053
  serialize,
@@ -91039,7 +91039,7 @@ var require_dist5 = __commonJS({
91039
91039
  // start-server.ts
91040
91040
  import { appendFileSync, createReadStream as createReadStream3, mkdirSync as mkdirSync8, readFileSync as readFileSync10, statSync as statSync12 } from "node:fs";
91041
91041
  import { createServer } from "node:http";
91042
- import { basename as basename5, join as join39, resolve as resolve11, sep as sep8 } from "node:path";
91042
+ import { basename as basename5, join as join39, resolve as resolve12, sep as sep8 } from "node:path";
91043
91043
 
91044
91044
  // ../../node_modules/.pnpm/@trpc+server@11.12.0_typescript@5.9.3/node_modules/@trpc/server/dist/adapters/fetch/index.mjs
91045
91045
  init_getErrorShape_vC8mUXJD();
@@ -91281,8 +91281,8 @@ function getWSConnectionHandler(opts) {
91281
91281
  try {
91282
91282
  var _usingCtx = (0, import_usingCtx2.default)();
91283
91283
  const iterator = _usingCtx.a(iteratorResource(iterable));
91284
- const abortPromise = new Promise((resolve12) => {
91285
- abortController$1.signal.onabort = () => resolve12("abort");
91284
+ const abortPromise = new Promise((resolve13) => {
91285
+ abortController$1.signal.onabort = () => resolve13("abort");
91286
91286
  });
91287
91287
  let next;
91288
91288
  let result$1;
@@ -92313,11 +92313,17 @@ function notify(chatId) {
92313
92313
  }
92314
92314
  function cloneMessage(msg) {
92315
92315
  return {
92316
- id: msg.id,
92317
- text: msg.text,
92316
+ ...msg,
92318
92317
  files: msg.files ? msg.files.map((f2) => ({ ...f2 })) : void 0
92319
92318
  };
92320
92319
  }
92320
+ function turnOptions(input) {
92321
+ return {
92322
+ ...input.mode !== void 0 && { mode: input.mode },
92323
+ ...input.model !== void 0 && { model: input.model },
92324
+ ...input.codingAgentId !== void 0 && { codingAgentId: input.codingAgentId }
92325
+ };
92326
+ }
92321
92327
  function subscribeQueue(listener) {
92322
92328
  queueListeners.add(listener);
92323
92329
  return () => {
@@ -92328,7 +92334,8 @@ function pushQueuedMessage(chatId, input) {
92328
92334
  const message = {
92329
92335
  id: randomUUID(),
92330
92336
  text: input.text,
92331
- files: input.files && input.files.length > 0 ? input.files.map((f2) => ({ ...f2 })) : void 0
92337
+ files: input.files && input.files.length > 0 ? input.files.map((f2) => ({ ...f2 })) : void 0,
92338
+ ...turnOptions(input)
92332
92339
  };
92333
92340
  const msgs = store.get(chatId);
92334
92341
  if (msgs) {
@@ -92343,11 +92350,17 @@ function setQueuedMessages(chatId, messages) {
92343
92350
  if (messages.length === 0) {
92344
92351
  store.delete(chatId);
92345
92352
  } else {
92346
- const stored = messages.map((m3) => ({
92347
- id: m3.id ?? randomUUID(),
92348
- text: m3.text,
92349
- files: m3.files && m3.files.length > 0 ? m3.files.map((f2) => ({ ...f2 })) : void 0
92350
- }));
92353
+ const previous = new Map((store.get(chatId) ?? []).map((m3) => [m3.id, m3]));
92354
+ const stored = messages.map((m3) => {
92355
+ const kept = m3.id !== void 0 ? previous.get(m3.id) : void 0;
92356
+ return {
92357
+ id: m3.id ?? randomUUID(),
92358
+ text: m3.text,
92359
+ files: m3.files && m3.files.length > 0 ? m3.files.map((f2) => ({ ...f2 })) : void 0,
92360
+ ...kept && turnOptions(kept),
92361
+ ...turnOptions(m3)
92362
+ };
92363
+ });
92351
92364
  store.set(chatId, stored);
92352
92365
  }
92353
92366
  notify(chatId);
@@ -92355,6 +92368,13 @@ function setQueuedMessages(chatId, messages) {
92355
92368
  function getQueuedMessages(chatId) {
92356
92369
  return (store.get(chatId) ?? []).map(cloneMessage);
92357
92370
  }
92371
+ function hasQueuedMessages(chatId) {
92372
+ return (store.get(chatId)?.length ?? 0) > 0;
92373
+ }
92374
+ function peekQueuedMessage(chatId) {
92375
+ const first = store.get(chatId)?.[0];
92376
+ return first ? cloneMessage(first) : null;
92377
+ }
92358
92378
  function shiftQueuedMessage(chatId) {
92359
92379
  const msgs = store.get(chatId);
92360
92380
  if (!msgs || msgs.length === 0) return null;
@@ -92460,6 +92480,8 @@ import { join as join25 } from "node:path";
92460
92480
 
92461
92481
  // src/server/infra/agents/acp-agent-process.ts
92462
92482
  import { spawn } from "node:child_process";
92483
+ import { realpathSync } from "node:fs";
92484
+ import { resolve as resolve3 } from "node:path";
92463
92485
  import { Readable, Writable } from "node:stream";
92464
92486
 
92465
92487
  // ../../node_modules/.pnpm/@agentclientprotocol+sdk@1.5.0_zod@3.25.76/node_modules/@agentclientprotocol/sdk/dist/schema/index.js
@@ -105777,11 +105799,11 @@ var Connection = class {
105777
105799
  const id2 = this.nextRequestId++;
105778
105800
  let cancel = () => {
105779
105801
  };
105780
- const response = new Promise((resolve12, reject) => {
105802
+ const response = new Promise((resolve13, reject) => {
105781
105803
  const pendingResponse = {
105782
105804
  resolve: (value) => {
105783
105805
  try {
105784
- resolve12(mapResponse ? mapResponse(value) : value);
105806
+ resolve13(mapResponse ? mapResponse(value) : value);
105785
105807
  } catch (error40) {
105786
105808
  reject(error40);
105787
105809
  }
@@ -105838,8 +105860,8 @@ var Connection = class {
105838
105860
  this.stream = stream;
105839
105861
  this.staticHandlers = handlers3;
105840
105862
  this.allowBatches = options2?.allowBatches ?? true;
105841
- this.closedPromise = new Promise((resolve12) => {
105842
- this.abortController.signal.addEventListener("abort", () => resolve12());
105863
+ this.closedPromise = new Promise((resolve13) => {
105864
+ this.abortController.signal.addEventListener("abort", () => resolve13());
105843
105865
  });
105844
105866
  void this.receive();
105845
105867
  }
@@ -106733,8 +106755,8 @@ var AsyncQueue = class {
106733
106755
  if (this.failed) {
106734
106756
  return Promise.reject(this.failure);
106735
106757
  }
106736
- return new Promise((resolve12, reject) => {
106737
- this.waiters.push({ resolve: resolve12, reject });
106758
+ return new Promise((resolve13, reject) => {
106759
+ this.waiters.push({ resolve: resolve13, reject });
106738
106760
  });
106739
106761
  }
106740
106762
  };
@@ -107340,6 +107362,13 @@ var legacyClientNotificationMethods = /* @__PURE__ */ new Set([
107340
107362
 
107341
107363
  // src/server/infra/agents/acp-agent-process.ts
107342
107364
  var log = createLogger("acp-agent");
107365
+ function canonicalPath(path) {
107366
+ try {
107367
+ return realpathSync(path);
107368
+ } catch {
107369
+ return resolve3(path);
107370
+ }
107371
+ }
107343
107372
  var STARTUP_TIMEOUT_MS = 6e4;
107344
107373
  var LOAD_TIMEOUT_MS = 18e4;
107345
107374
  var STOP_TIMEOUT_MS = 3e3;
@@ -107350,8 +107379,42 @@ var CLIENT_CAPABILITIES = {
107350
107379
  // Claude Code's AskUserQuestion arrives as a form elicitation, and is
107351
107380
  // disabled when the client can't render one.
107352
107381
  elicitation: { form: {} },
107353
- session: { notices: {} }
107354
- };
107382
+ session: { notices: {} },
107383
+ // JetBrains AIR extension: the Claude adapter reports background work
107384
+ // (background Bash, Monitor, workflows) as `async_task_*` updates only to
107385
+ // a client that lists `asyncTasks`. Band uses them to keep the process
107386
+ // alive while that work runs.
107387
+ _meta: { jetbrains: { air: { version: 1, capabilities: ["asyncTasks"] } } }
107388
+ };
107389
+ function asAsyncTaskNotification(message) {
107390
+ if (!message || typeof message !== "object") return null;
107391
+ const m3 = message;
107392
+ if (m3.method !== methods.client.session.update) return null;
107393
+ const params = m3.params;
107394
+ const update = params?.update;
107395
+ if (typeof params?.sessionId !== "string" || typeof update?.sessionUpdate !== "string" || !update.sessionUpdate.startsWith("async_task_") || typeof update.asyncTaskId !== "string") {
107396
+ return null;
107397
+ }
107398
+ return params;
107399
+ }
107400
+ function splitAsyncTasks(readable, onAsyncTask) {
107401
+ return readable.pipeThrough(
107402
+ new TransformStream({
107403
+ transform(message, controller) {
107404
+ const task = asAsyncTaskNotification(message);
107405
+ if (!task) {
107406
+ controller.enqueue(message);
107407
+ return;
107408
+ }
107409
+ try {
107410
+ onAsyncTask(task);
107411
+ } catch (err) {
107412
+ log.warn({ err }, "async task handler threw");
107413
+ }
107414
+ }
107415
+ })
107416
+ );
107417
+ }
107355
107418
  function stderrTail() {
107356
107419
  let buf = "";
107357
107420
  return {
@@ -107410,17 +107473,21 @@ var AcpAgentProcess = class _AcpAgentProcess {
107410
107473
  if (child.pid === void 0) liveChildren.delete(child);
107411
107474
  });
107412
107475
  try {
107413
- await new Promise((resolve12, reject) => {
107414
- child.once("spawn", resolve12);
107476
+ await new Promise((resolve13, reject) => {
107477
+ child.once("spawn", resolve13);
107415
107478
  child.once("error", reject);
107416
107479
  });
107417
107480
  } catch (err) {
107418
107481
  throw new Error(`Could not start ${label}: ${err.message}`);
107419
107482
  }
107420
- const stream = ndJsonStream2(
107483
+ const wire = ndJsonStream2(
107421
107484
  Writable.toWeb(child.stdin),
107422
107485
  Readable.toWeb(child.stdout)
107423
107486
  );
107487
+ const stream = {
107488
+ writable: wire.writable,
107489
+ readable: splitAsyncTasks(wire.readable, (n) => handlers3.onAsyncTask?.(n))
107490
+ };
107424
107491
  const connection = client({ name: "band" }).onNotification(methods.client.session.update, (ctx) => {
107425
107492
  handlers3.onUpdate(ctx.params);
107426
107493
  }).onRequest(methods.client.session.requestPermission, async (ctx) => ({
@@ -107525,6 +107592,16 @@ var AcpAgentProcess = class _AcpAgentProcess {
107525
107592
  * the page cap bounds that walk.
107526
107593
  */
107527
107594
  async listSessions(cwd, limit = 200) {
107595
+ const dir = canonicalPath(cwd);
107596
+ const resolved = /* @__PURE__ */ new Map();
107597
+ const inDir = (s2) => {
107598
+ let path = resolved.get(s2.cwd);
107599
+ if (path === void 0) {
107600
+ path = canonicalPath(s2.cwd);
107601
+ resolved.set(s2.cwd, path);
107602
+ }
107603
+ return path === dir;
107604
+ };
107528
107605
  const sessions = [];
107529
107606
  let cursor;
107530
107607
  for (let page = 0; page < 10 && sessions.length < limit; page++) {
@@ -107534,7 +107611,7 @@ var AcpAgentProcess = class _AcpAgentProcess {
107534
107611
  this.label
107535
107612
  )
107536
107613
  );
107537
- sessions.push(...res.sessions);
107614
+ sessions.push(...res.sessions.filter(inDir));
107538
107615
  cursor = res.nextCursor;
107539
107616
  if (!cursor) break;
107540
107617
  }
@@ -107620,16 +107697,16 @@ async function stopAllAgentProcesses() {
107620
107697
  }
107621
107698
  async function stopAgentProcess(child) {
107622
107699
  if (child.pid === void 0) {
107623
- await new Promise((resolve12) => {
107624
- child.once("spawn", () => resolve12());
107625
- child.once("error", () => resolve12());
107700
+ await new Promise((resolve13) => {
107701
+ child.once("spawn", () => resolve13());
107702
+ child.once("error", () => resolve13());
107626
107703
  });
107627
107704
  }
107628
107705
  const pid = child.pid;
107629
107706
  if (pid === void 0) return;
107630
- const exited = new Promise((resolve12) => {
107631
- if (child.exitCode !== null || child.signalCode !== null) resolve12();
107632
- else child.once("exit", () => resolve12());
107707
+ const exited = new Promise((resolve13) => {
107708
+ if (child.exitCode !== null || child.signalCode !== null) resolve13();
107709
+ else child.once("exit", () => resolve13());
107633
107710
  });
107634
107711
  const running = () => {
107635
107712
  if (process.platform === "win32") return child.exitCode === null && child.signalCode === null;
@@ -107647,7 +107724,7 @@ async function stopAgentProcess(child) {
107647
107724
  await Promise.race([exited, delay(1e3)]);
107648
107725
  }
107649
107726
  function delay(ms) {
107650
- return new Promise((resolve12) => setTimeout(resolve12, ms));
107727
+ return new Promise((resolve13) => setTimeout(resolve13, ms));
107651
107728
  }
107652
107729
  function signalGroup(child, pid, signal) {
107653
107730
  try {
@@ -107782,11 +107859,11 @@ function resumeCliInvocation(agentType, sessionId, opts) {
107782
107859
  var CLAUDE_CODE_INTERACTIVE_TOOLS = /* @__PURE__ */ new Set(["AskUserQuestion", "ExitPlanMode"]);
107783
107860
  function mapClaudeCodeHookStatus(payload) {
107784
107861
  const hookEvent = typeof payload.hook_event_name === "string" ? payload.hook_event_name : "";
107785
- const toolName = typeof payload.tool_name === "string" ? payload.tool_name : "";
107862
+ const toolName2 = typeof payload.tool_name === "string" ? payload.tool_name : "";
107786
107863
  if (hookEvent === "Stop") {
107787
107864
  return "needs_attention";
107788
107865
  }
107789
- if ((hookEvent === "PreToolUse" || hookEvent === "PermissionRequest") && CLAUDE_CODE_INTERACTIVE_TOOLS.has(toolName)) {
107866
+ if ((hookEvent === "PreToolUse" || hookEvent === "PermissionRequest") && CLAUDE_CODE_INTERACTIVE_TOOLS.has(toolName2)) {
107790
107867
  return "needs_attention";
107791
107868
  }
107792
107869
  return "working";
@@ -108253,7 +108330,7 @@ import { execFile } from "node:child_process";
108253
108330
  var log3 = createLogger("coding-agent:usage:opencode");
108254
108331
  function createOpenCodeUsageReader(command = OPENCODE_DEFAULT_BINARY) {
108255
108332
  async function listSessions3(dir) {
108256
- const sessions = await new Promise((resolve12, reject) => {
108333
+ const sessions = await new Promise((resolve13, reject) => {
108257
108334
  execFile(
108258
108335
  command,
108259
108336
  ["session", "list", "--format", "json"],
@@ -108264,9 +108341,9 @@ function createOpenCodeUsageReader(command = OPENCODE_DEFAULT_BINARY) {
108264
108341
  return;
108265
108342
  }
108266
108343
  try {
108267
- resolve12(JSON.parse(stdout));
108344
+ resolve13(JSON.parse(stdout));
108268
108345
  } catch {
108269
- resolve12([]);
108346
+ resolve13([]);
108270
108347
  }
108271
108348
  }
108272
108349
  );
@@ -108277,7 +108354,7 @@ function createOpenCodeUsageReader(command = OPENCODE_DEFAULT_BINARY) {
108277
108354
  async function getSessionUsage3(sessionId, _dir) {
108278
108355
  let raw;
108279
108356
  try {
108280
- raw = await new Promise((resolve12, reject) => {
108357
+ raw = await new Promise((resolve13, reject) => {
108281
108358
  execFile(
108282
108359
  command,
108283
108360
  ["export", sessionId],
@@ -108287,7 +108364,7 @@ function createOpenCodeUsageReader(command = OPENCODE_DEFAULT_BINARY) {
108287
108364
  reject(err);
108288
108365
  return;
108289
108366
  }
108290
- resolve12(stdout);
108367
+ resolve13(stdout);
108291
108368
  }
108292
108369
  );
108293
108370
  });
@@ -108423,13 +108500,13 @@ async function shellPath() {
108423
108500
  }
108424
108501
  const shell2 = defaultShell();
108425
108502
  try {
108426
- const result = await new Promise((resolve12, reject) => {
108503
+ const result = await new Promise((resolve13, reject) => {
108427
108504
  execFile2(shell2, ["-li", "-c", "echo $PATH"], { timeout: 5e3 }, (err, stdout) => {
108428
108505
  if (err) {
108429
108506
  reject(err);
108430
108507
  return;
108431
108508
  }
108432
- resolve12(stdout.trim());
108509
+ resolve13(stdout.trim());
108433
108510
  });
108434
108511
  });
108435
108512
  if (result) {
@@ -108446,13 +108523,13 @@ async function whichBinary(name3) {
108446
108523
  const resolvedPath = await shellPath();
108447
108524
  const locator = process.platform === "win32" ? "where" : "which";
108448
108525
  try {
108449
- const result = await new Promise((resolve12, reject) => {
108526
+ const result = await new Promise((resolve13, reject) => {
108450
108527
  execFile2(locator, [name3], { env: { ...process.env, PATH: resolvedPath } }, (err, stdout) => {
108451
108528
  if (err) {
108452
108529
  reject(err);
108453
108530
  return;
108454
108531
  }
108455
- resolve12(stdout.trim());
108532
+ resolve13(stdout.trim());
108456
108533
  });
108457
108534
  });
108458
108535
  const first = result.split(/\r?\n/)[0]?.trim();
@@ -108551,7 +108628,7 @@ async function resolveAcpLaunch(def2) {
108551
108628
 
108552
108629
  // src/server/infra/agents/claude-defaults.ts
108553
108630
  import { execFile as execFile3 } from "node:child_process";
108554
- import { closeSync, openSync, readFileSync, readSync, realpathSync, statSync as statSync4 } from "node:fs";
108631
+ import { closeSync, openSync, readFileSync, readSync, realpathSync as realpathSync2, statSync as statSync4 } from "node:fs";
108555
108632
  import { homedir as homedir5 } from "node:os";
108556
108633
  import { join as join7, resolve as resolvePath2 } from "node:path";
108557
108634
  var EFFORT_LEVELS = /* @__PURE__ */ new Set(["low", "medium", "high", "xhigh", "max"]);
@@ -108634,7 +108711,7 @@ function configuredClaudeDefaults(opts) {
108634
108711
  function transcriptPath(env, cwd, sessionId) {
108635
108712
  let real3 = cwd;
108636
108713
  try {
108637
- real3 = realpathSync(cwd);
108714
+ real3 = realpathSync2(cwd);
108638
108715
  } catch {
108639
108716
  }
108640
108717
  return join7(
@@ -108700,19 +108777,19 @@ function parseClaudeCliArgs(commandLine) {
108700
108777
  return out;
108701
108778
  }
108702
108779
  function listProcesses() {
108703
- return new Promise((resolve12) => {
108780
+ return new Promise((resolve13) => {
108704
108781
  execFile3(
108705
108782
  "ps",
108706
108783
  ["-A", "-o", "pid=,ppid=,args="],
108707
108784
  { maxBuffer: 16 * 1024 * 1024 },
108708
108785
  (err, out) => {
108709
- if (err) return resolve12([]);
108786
+ if (err) return resolve13([]);
108710
108787
  const rows = [];
108711
108788
  for (const line2 of out.split("\n")) {
108712
108789
  const m3 = /^\s*(\d+)\s+(\d+)\s+(.*)$/.exec(line2);
108713
108790
  if (m3) rows.push({ pid: Number(m3[1]), ppid: Number(m3[2]), args: m3[3] ?? "" });
108714
108791
  }
108715
- resolve12(rows);
108792
+ resolve13(rows);
108716
108793
  }
108717
108794
  );
108718
108795
  });
@@ -116817,7 +116894,7 @@ var ChatEventQueries = class {
116817
116894
  ...indexFields(input.event),
116818
116895
  turnStart: input.turnStart ?? false,
116819
116896
  payload: JSON.stringify(input.event),
116820
- createdAt: Date.now()
116897
+ createdAt: input.createdAt ?? Date.now()
116821
116898
  }).returning({ id: chatEvents.id }).get();
116822
116899
  return row.id;
116823
116900
  }
@@ -116917,6 +116994,101 @@ var ChatEventQueries = class {
116917
116994
  }
116918
116995
  };
116919
116996
 
116997
+ // src/server/services/_utils/agent-pending-work.ts
116998
+ var MAX_HOLD_MS = 8 * 60 * 6e4;
116999
+ var MONITOR_DEFAULT_TIMEOUT_MS = 5 * 6e4;
117000
+ function toolName(update) {
117001
+ const meta2 = update._meta;
117002
+ const name3 = meta2?.claudeCode?.toolName ?? update.name;
117003
+ return typeof name3 === "string" ? name3 : void 0;
117004
+ }
117005
+ function finiteNumber(value) {
117006
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
117007
+ }
117008
+ var PendingWork = class {
117009
+ holds = /* @__PURE__ */ new Map();
117010
+ /** Tool calls an async task was announced for. */
117011
+ taskToolCalls = /* @__PURE__ */ new Set();
117012
+ /** Notes what a `session/update` starts or ends. `inTurn` is whether a
117013
+ * Band-started turn is running. */
117014
+ observeUpdate(update, inTurn, now = Date.now()) {
117015
+ if (update.sessionUpdate !== "tool_call" && update.sessionUpdate !== "tool_call_update") return;
117016
+ const key2 = `tool:${update.toolCallId}`;
117017
+ if (this.taskToolCalls.has(update.toolCallId)) return;
117018
+ if (update.status === "failed") {
117019
+ this.holds.delete(key2);
117020
+ return;
117021
+ }
117022
+ const held = this.holds.get(key2);
117023
+ if (update.status === "completed") {
117024
+ if (held?.untilCompleted) this.holds.delete(key2);
117025
+ return;
117026
+ }
117027
+ if (held) return;
117028
+ const hold = this.toolHold(update, now);
117029
+ if (hold) {
117030
+ this.set(key2, hold, now);
117031
+ return;
117032
+ }
117033
+ if (!inTurn && update.sessionUpdate === "tool_call") {
117034
+ this.set(key2, { reason: "tool call", until: now + MAX_HOLD_MS, untilCompleted: true }, now);
117035
+ }
117036
+ }
117037
+ /** Notes an AIR async task starting or ending. */
117038
+ observeAsyncTask(update, now = Date.now()) {
117039
+ const key2 = `task:${update.asyncTaskId}`;
117040
+ if (update.sessionUpdate === "async_task_spawned") {
117041
+ if (update.toolCallId) {
117042
+ this.taskToolCalls.add(update.toolCallId);
117043
+ this.holds.delete(`tool:${update.toolCallId}`);
117044
+ }
117045
+ this.set(
117046
+ key2,
117047
+ { reason: `${update.taskType ?? "background"} task`, until: now + MAX_HOLD_MS },
117048
+ now
117049
+ );
117050
+ } else if (update.sessionUpdate === "async_task_state_update" && (update.state === "completed" || update.state === "failed" || update.state === "stopped")) {
117051
+ this.holds.delete(key2);
117052
+ if (update.toolCallId) this.holds.delete(`tool:${update.toolCallId}`);
117053
+ }
117054
+ }
117055
+ /** The holds still in force, dropping the ones that lapsed. */
117056
+ outstanding(now = Date.now()) {
117057
+ for (const [key2, hold] of this.holds) {
117058
+ if (hold.until <= now) this.holds.delete(key2);
117059
+ }
117060
+ return [...this.holds.values()];
117061
+ }
117062
+ clear() {
117063
+ this.holds.clear();
117064
+ this.taskToolCalls.clear();
117065
+ }
117066
+ toolHold(update, now) {
117067
+ const input = update.rawInput;
117068
+ if (!input || typeof input !== "object") return null;
117069
+ switch (toolName(update)) {
117070
+ case "ScheduleWakeup": {
117071
+ const delaySeconds = finiteNumber(input.delaySeconds);
117072
+ return delaySeconds === void 0 ? null : { reason: "scheduled wakeup", until: now + delaySeconds * 1e3 };
117073
+ }
117074
+ case "CronCreate":
117075
+ return { reason: "cron job", until: now + MAX_HOLD_MS };
117076
+ case "Monitor": {
117077
+ const timeout = finiteNumber(input.timeout_ms) ?? MONITOR_DEFAULT_TIMEOUT_MS;
117078
+ return { reason: "monitor", until: now + timeout };
117079
+ }
117080
+ case "Bash":
117081
+ case "PowerShell":
117082
+ return input.run_in_background === true ? { reason: "background command", until: now + MAX_HOLD_MS, untilCompleted: true } : null;
117083
+ default:
117084
+ return null;
117085
+ }
117086
+ }
117087
+ set(key2, hold, now) {
117088
+ this.holds.set(key2, { ...hold, until: Math.min(hold.until, now + MAX_HOLD_MS) });
117089
+ }
117090
+ };
117091
+
116920
117092
  // src/server/services/_utils/chat-log-replay.ts
116921
117093
  function textChunk(row) {
116922
117094
  const event = row.event;
@@ -116935,7 +117107,8 @@ function rowsToEvents(rows) {
116935
117107
  out.push({
116936
117108
  type: "update",
116937
117109
  update: { ...run2.update, content: { type: "text", text: run2.text } },
116938
- eventId: run2.lastId
117110
+ eventId: run2.lastId,
117111
+ createdAt: run2.createdAt
116939
117112
  });
116940
117113
  run2 = null;
116941
117114
  };
@@ -116951,11 +117124,12 @@ function rowsToEvents(rows) {
116951
117124
  run2 = {
116952
117125
  update: chunk,
116953
117126
  text: chunk.content.type === "text" ? chunk.content.text : "",
116954
- lastId: row.id
117127
+ lastId: row.id,
117128
+ createdAt: row.createdAt
116955
117129
  };
116956
117130
  continue;
116957
117131
  }
116958
- out.push({ ...row.event, eventId: row.id });
117132
+ out.push({ ...row.event, eventId: row.id, createdAt: row.createdAt });
116959
117133
  }
116960
117134
  flush();
116961
117135
  return out;
@@ -126543,6 +126717,10 @@ var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
126543
126717
  // ../../packages/ui/src/components/input.tsx
126544
126718
  var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
126545
126719
 
126720
+ // ../../packages/ui/src/popper.ts
126721
+ var POPPER_MAX_HEIGHT = "max-h-[min(var(--popper-max-height,100dvh),calc(var(--radix-popper-available-height)/var(--app-zoom,1)))]";
126722
+ var POPPER_MAX_WIDTH = "max-w-[calc(var(--radix-popper-available-width)/var(--app-zoom,1))]";
126723
+
126546
126724
  // ../../packages/ui/src/components/popover.tsx
126547
126725
  var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
126548
126726
  function Popover2({ ...props }) {
@@ -126564,7 +126742,9 @@ function PopoverContent2({
126564
126742
  align,
126565
126743
  sideOffset,
126566
126744
  className: cn(
126567
- "ease-out duration-150 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
126745
+ "ease-out duration-150 z-50 w-72 origin-(--radix-popover-content-transform-origin) overflow-y-auto rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
126746
+ POPPER_MAX_HEIGHT,
126747
+ POPPER_MAX_WIDTH,
126568
126748
  className
126569
126749
  ),
126570
126750
  ...props
@@ -126956,10 +127136,10 @@ var DIALOG_CONTENT_VARIANTS = {
126956
127136
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
126957
127137
  // Mobile (< lg): bottom drawer
126958
127138
  "inset-x-0 bottom-0 w-full max-w-none rounded-t-2xl border border-b-0 p-6",
126959
- "max-h-[calc(100dvh-env(safe-area-inset-top)-1.5rem)]",
127139
+ "max-h-[calc(100dvh/var(--app-zoom,1)-env(safe-area-inset-top)-1.5rem)]",
126960
127140
  "max-lg:data-[state=open]:slide-in-from-bottom max-lg:data-[state=closed]:slide-out-to-bottom",
126961
127141
  // Desktop (lg+): revert to the centred modal
126962
- "lg:inset-auto lg:top-[50%] lg:left-[50%] lg:bottom-auto lg:w-full lg:max-w-lg lg:max-h-[85vh] lg:translate-x-[-50%] lg:translate-y-[-50%] lg:rounded-lg lg:border-b",
127142
+ "lg:inset-auto lg:top-[50%] lg:left-[50%] lg:bottom-auto lg:w-full lg:max-w-lg lg:max-h-[calc(85vh/var(--app-zoom,1))] lg:translate-x-[-50%] lg:translate-y-[-50%] lg:rounded-lg lg:border-b",
126963
127143
  "lg:data-[state=open]:zoom-in-95 lg:data-[state=closed]:zoom-out-95"
126964
127144
  ].join(" "),
126965
127145
  "command-palette": [
@@ -126975,13 +127155,13 @@ var DIALOG_CONTENT_VARIANTS = {
126975
127155
  // floats at `bottom: var(--kb-inset)` (keyboard height; 0 when closed) so
126976
127156
  // the input clears the on-screen keyboard — see `useKeyboardInset`.
126977
127157
  "inset-x-0 bottom-[var(--kb-inset,0px)] w-full max-w-none rounded-t-2xl border border-b-0",
126978
- "max-h-[calc(100dvh-var(--kb-inset,0px)-env(safe-area-inset-top)-1.5rem)]",
127158
+ "max-h-[calc(100dvh/var(--app-zoom,1)-var(--kb-inset,0px)-env(safe-area-inset-top)-1.5rem)]",
126979
127159
  "max-lg:[&_[data-slot=command]]:flex-col-reverse",
126980
127160
  "max-lg:[&_[cmdk-input-wrapper]]:border-t max-lg:[&_[cmdk-input-wrapper]]:border-b-0",
126981
127161
  "max-lg:data-[state=open]:slide-in-from-bottom max-lg:data-[state=closed]:slide-out-to-bottom",
126982
127162
  // Desktop (lg+): anchored in the upper third by its TOP edge — no
126983
127163
  // `translate-y`, so the input never moves as the list grows downward.
126984
- "lg:inset-x-auto lg:bottom-auto lg:top-[12vh] lg:left-1/2 lg:w-full lg:max-w-lg lg:max-h-[70vh] lg:-translate-x-1/2 lg:rounded-lg lg:border"
127164
+ "lg:inset-x-auto lg:bottom-auto lg:top-[calc(12vh/var(--app-zoom,1))] lg:left-1/2 lg:w-full lg:max-w-lg lg:max-h-[calc(70vh/var(--app-zoom,1))] lg:-translate-x-1/2 lg:rounded-lg lg:border"
126985
127165
  ].join(" ")
126986
127166
  };
126987
127167
  var keyboardInsetHolders = /* @__PURE__ */ new Set();
@@ -127148,7 +127328,8 @@ function ContextMenuContent2({
127148
127328
  if (event.button === 2) event.stopPropagation();
127149
127329
  },
127150
127330
  className: cn(
127151
- "ease-out duration-150 z-50 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md dark:text-neutral-50 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
127331
+ "ease-out duration-150 z-50 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md dark:text-neutral-50 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
127332
+ POPPER_MAX_HEIGHT,
127152
127333
  className
127153
127334
  ),
127154
127335
  ...props
@@ -127534,8 +127715,8 @@ function hasObjectPrototype(o) {
127534
127715
  return Object.prototype.toString.call(o) === "[object Object]";
127535
127716
  }
127536
127717
  function sleep2(timeout) {
127537
- return new Promise((resolve12) => {
127538
- timeoutManager.setTimeout(resolve12, timeout);
127718
+ return new Promise((resolve13) => {
127719
+ timeoutManager.setTimeout(resolve13, timeout);
127539
127720
  });
127540
127721
  }
127541
127722
  function replaceData(prevData, data2, options2) {
@@ -127673,10 +127854,10 @@ var focusManager = new FocusManager();
127673
127854
 
127674
127855
  // ../../node_modules/.pnpm/@tanstack+query-core@5.90.20/node_modules/@tanstack/query-core/build/modern/thenable.js
127675
127856
  function pendingThenable() {
127676
- let resolve12;
127857
+ let resolve13;
127677
127858
  let reject;
127678
127859
  const thenable = new Promise((_resolve, _reject) => {
127679
- resolve12 = _resolve;
127860
+ resolve13 = _resolve;
127680
127861
  reject = _reject;
127681
127862
  });
127682
127863
  thenable.status = "pending";
@@ -127692,7 +127873,7 @@ function pendingThenable() {
127692
127873
  status: "fulfilled",
127693
127874
  value
127694
127875
  });
127695
- resolve12(value);
127876
+ resolve13(value);
127696
127877
  };
127697
127878
  thenable.reject = (reason) => {
127698
127879
  finalize({
@@ -127871,7 +128052,7 @@ function createRetryer(config2) {
127871
128052
  };
127872
128053
  const canContinue = () => focusManager.isFocused() && (config2.networkMode === "always" || onlineManager.isOnline()) && config2.canRun();
127873
128054
  const canStart = () => canFetch(config2.networkMode) && config2.canRun();
127874
- const resolve12 = (value) => {
128055
+ const resolve13 = (value) => {
127875
128056
  if (!isResolved()) {
127876
128057
  continueFn?.();
127877
128058
  thenable.resolve(value);
@@ -127909,7 +128090,7 @@ function createRetryer(config2) {
127909
128090
  } catch (error40) {
127910
128091
  promiseOrValue = Promise.reject(error40);
127911
128092
  }
127912
- Promise.resolve(promiseOrValue).then(resolve12).catch((error40) => {
128093
+ Promise.resolve(promiseOrValue).then(resolve13).catch((error40) => {
127913
128094
  if (isResolved()) {
127914
128095
  return;
127915
128096
  }
@@ -130973,7 +131154,7 @@ var import_react16 = __toESM(require_react(), 1);
130973
131154
  var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1);
130974
131155
 
130975
131156
  // src/dashboard/components/DashboardShell.tsx
130976
- var import_react33 = __toESM(require_react(), 1);
131157
+ var import_react32 = __toESM(require_react(), 1);
130977
131158
 
130978
131159
  // src/lib/toast-obstructions.ts
130979
131160
  var import_react17 = __toESM(require_react(), 1);
@@ -131614,13 +131795,15 @@ function pullRequestTone(pr, ciState) {
131614
131795
  }
131615
131796
  }
131616
131797
  var TONE_CLASS = {
131617
- failure: "text-red-600 dark:text-red-400",
131618
- pending: "text-yellow-700 dark:text-yellow-400",
131619
- success: "text-green-700 dark:text-green-400",
131620
- neutral: "text-muted-foreground",
131621
- merged: "text-violet-600 dark:text-violet-400",
131622
- closed: "text-muted-foreground line-through"
131623
- };
131798
+ failure: "text-red-600 border-red-600/40 bg-red-500/10 dark:text-red-400 dark:border-red-400/40",
131799
+ pending: "text-yellow-700 border-yellow-600/50 bg-yellow-500/10 dark:text-yellow-400 dark:border-yellow-400/40",
131800
+ success: "text-green-700 border-green-600/40 bg-green-500/10 dark:text-green-400 dark:border-green-400/40",
131801
+ neutral: "text-muted-foreground border-border bg-muted/50",
131802
+ merged: "text-violet-600 border-violet-600/40 bg-violet-500/10 dark:text-violet-400 dark:border-violet-400/40",
131803
+ closed: "text-muted-foreground border-border bg-muted/50 line-through"
131804
+ };
131805
+ var TAG_CLASS = "inline-flex items-center rounded border px-1 py-px leading-none";
131806
+ var NUMBER_CLASS = `${TAG_CLASS} text-[11px] font-semibold tabular-nums`;
131624
131807
  function statusLabel(pr, ciState) {
131625
131808
  if (pr.state === "merged") return "Merged";
131626
131809
  if (pr.state === "closed") return "Closed";
@@ -131682,7 +131865,7 @@ function PullRequestBadge({ pr, ciState, onOpenChecks }) {
131682
131865
  "aria-expanded": open3,
131683
131866
  "data-testid": "workspace-card__pr-badge",
131684
131867
  "data-tone": tone,
131685
- className: `shrink-0 rounded-sm px-0.5 text-[11px] font-semibold leading-none tabular-nums outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring ${TONE_CLASS[tone]}`,
131868
+ className: `shrink-0 outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring ${NUMBER_CLASS} ${TONE_CLASS[tone]}`,
131686
131869
  onPointerEnter: (e) => {
131687
131870
  if (e.pointerType !== "touch") setOpenAfter(true, OPEN_DELAY_MS);
131688
131871
  },
@@ -131757,7 +131940,8 @@ function PullRequestBadge({ pr, ciState, onOpenChecks }) {
131757
131940
  "span",
131758
131941
  {
131759
131942
  "data-testid": "pr-popover__number",
131760
- className: `font-semibold tabular-nums ${TONE_CLASS[tone]}`,
131943
+ "data-tone": tone,
131944
+ className: `${NUMBER_CLASS} ${TONE_CLASS[tone]}`,
131761
131945
  children: [
131762
131946
  "#",
131763
131947
  pr.number
@@ -131768,7 +131952,7 @@ function PullRequestBadge({ pr, ciState, onOpenChecks }) {
131768
131952
  "span",
131769
131953
  {
131770
131954
  "data-testid": "pr-popover__draft",
131771
- className: "rounded-sm border border-border px-1 text-[10px] font-medium text-muted-foreground",
131955
+ className: `${TAG_CLASS} border-border text-[10px] font-medium text-muted-foreground`,
131772
131956
  children: "Draft"
131773
131957
  }
131774
131958
  ),
@@ -132108,14 +132292,11 @@ var WorkspaceCard = (0, import_react29.memo)(function WorkspaceCard2({
132108
132292
  var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
132109
132293
 
132110
132294
  // src/dashboard/components/SettingsPage.tsx
132111
- var import_react32 = __toESM(require_react(), 1);
132295
+ var import_react31 = __toESM(require_react(), 1);
132112
132296
 
132113
132297
  // src/dashboard/hooks/use-terminal-daemon.ts
132114
132298
  init_trpc_client();
132115
132299
 
132116
- // src/dashboard/lib/experimental-flags.ts
132117
- var import_react31 = __toESM(require_react(), 1);
132118
-
132119
132300
  // src/dashboard/components/RestartTerminalDaemonDialog.tsx
132120
132301
  var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
132121
132302
 
@@ -132141,7 +132322,7 @@ var isElectron = typeof window !== "undefined" && "__BAND_DESKTOP__" in window;
132141
132322
 
132142
132323
  // src/dashboard/components/DiffFileContent.tsx
132143
132324
  init_dist2();
132144
- var import_react34 = __toESM(require_react(), 1);
132325
+ var import_react33 = __toESM(require_react(), 1);
132145
132326
 
132146
132327
  // src/dashboard/lib/language-map.ts
132147
132328
  var SUPPORTED_LANGUAGES = [
@@ -132246,12 +132427,12 @@ var diffTheme = EditorView.theme({
132246
132427
  });
132247
132428
 
132248
132429
  // src/dashboard/components/DiffOverviewRuler.tsx
132249
- var import_react35 = __toESM(require_react(), 1);
132430
+ var import_react34 = __toESM(require_react(), 1);
132250
132431
  var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
132251
132432
 
132252
132433
  // src/dashboard/components/FileBrowser.tsx
132253
132434
  var import_lucide_react7 = __toESM(require_lucide_react(), 1);
132254
- var import_react36 = __toESM(require_react(), 1);
132435
+ var import_react35 = __toESM(require_react(), 1);
132255
132436
  var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
132256
132437
  var DRAG_MIME = "application/x-band-tree-entry";
132257
132438
  var DRAG_EXPAND_DELAY_MS = 600;
@@ -132298,11 +132479,11 @@ function EntryNameInput({
132298
132479
  onSubmit,
132299
132480
  onCancel
132300
132481
  }) {
132301
- const [value, setValue2] = (0, import_react36.useState)(initialValue);
132302
- const [submitting, setSubmitting] = (0, import_react36.useState)(false);
132303
- const [error40, setError] = (0, import_react36.useState)(null);
132304
- const inputRef = (0, import_react36.useRef)(null);
132305
- (0, import_react36.useEffect)(() => {
132482
+ const [value, setValue2] = (0, import_react35.useState)(initialValue);
132483
+ const [submitting, setSubmitting] = (0, import_react35.useState)(false);
132484
+ const [error40, setError] = (0, import_react35.useState)(null);
132485
+ const inputRef = (0, import_react35.useRef)(null);
132486
+ (0, import_react35.useEffect)(() => {
132306
132487
  const el = inputRef.current;
132307
132488
  if (!el) return;
132308
132489
  el.focus();
@@ -132766,7 +132947,7 @@ function TreeNode2({
132766
132947
  })()
132767
132948
  ] });
132768
132949
  }
132769
- var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132950
+ var FileBrowser = (0, import_react35.forwardRef)(function FileBrowser2({
132770
132951
  workspaceId: workspaceId2,
132771
132952
  workspacePath,
132772
132953
  onOpenFile,
@@ -132778,24 +132959,24 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132778
132959
  }, handleRef) {
132779
132960
  const adapter = useAdapter();
132780
132961
  const capabilities = useCapabilities();
132781
- const [expandedPaths, setExpandedPaths] = (0, import_react36.useState)(
132962
+ const [expandedPaths, setExpandedPaths] = (0, import_react35.useState)(
132782
132963
  () => new Set(getCachedExpanded(workspaceId2))
132783
132964
  );
132784
- const [dirContents, setDirContents] = (0, import_react36.useState)(
132965
+ const [dirContents, setDirContents] = (0, import_react35.useState)(
132785
132966
  () => new Map(getCachedContents(workspaceId2))
132786
132967
  );
132787
- const [loadingPaths, setLoadingPaths] = (0, import_react36.useState)(/* @__PURE__ */ new Set());
132788
- const [newEntry, setNewEntry] = (0, import_react36.useState)(null);
132789
- const [pendingDelete, setPendingDelete] = (0, import_react36.useState)(null);
132790
- const [deleteError, setDeleteError] = (0, import_react36.useState)(null);
132791
- const [deleteSubmitting, setDeleteSubmitting] = (0, import_react36.useState)(false);
132792
- const [renamingPath, setRenamingPath] = (0, import_react36.useState)(null);
132793
- const [clipboard, setClipboard] = (0, import_react36.useState)(null);
132794
- const [operationError, setOperationError] = (0, import_react36.useState)(null);
132795
- const [treeSelection, setTreeSelection] = (0, import_react36.useState)(() => selectedFile ? { path: selectedFile, kind: "file" } : null);
132796
- const selectedRef = (0, import_react36.useRef)(null);
132797
- const prevWorkspaceRef = (0, import_react36.useRef)(workspaceId2);
132798
- (0, import_react36.useEffect)(() => {
132968
+ const [loadingPaths, setLoadingPaths] = (0, import_react35.useState)(/* @__PURE__ */ new Set());
132969
+ const [newEntry, setNewEntry] = (0, import_react35.useState)(null);
132970
+ const [pendingDelete, setPendingDelete] = (0, import_react35.useState)(null);
132971
+ const [deleteError, setDeleteError] = (0, import_react35.useState)(null);
132972
+ const [deleteSubmitting, setDeleteSubmitting] = (0, import_react35.useState)(false);
132973
+ const [renamingPath, setRenamingPath] = (0, import_react35.useState)(null);
132974
+ const [clipboard, setClipboard] = (0, import_react35.useState)(null);
132975
+ const [operationError, setOperationError] = (0, import_react35.useState)(null);
132976
+ const [treeSelection, setTreeSelection] = (0, import_react35.useState)(() => selectedFile ? { path: selectedFile, kind: "file" } : null);
132977
+ const selectedRef = (0, import_react35.useRef)(null);
132978
+ const prevWorkspaceRef = (0, import_react35.useRef)(workspaceId2);
132979
+ (0, import_react35.useEffect)(() => {
132799
132980
  if (prevWorkspaceRef.current !== workspaceId2) {
132800
132981
  prevWorkspaceRef.current = workspaceId2;
132801
132982
  setExpandedPaths(new Set(getCachedExpanded(workspaceId2)));
@@ -132811,18 +132992,18 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132811
132992
  setOperationError(null);
132812
132993
  }
132813
132994
  }, [workspaceId2]);
132814
- (0, import_react36.useEffect)(() => {
132995
+ (0, import_react35.useEffect)(() => {
132815
132996
  if (selectedFile) {
132816
132997
  setTreeSelection({ path: selectedFile, kind: "file" });
132817
132998
  }
132818
132999
  }, [selectedFile]);
132819
- const handleSelectRow = (0, import_react36.useCallback)((path, kind) => {
133000
+ const handleSelectRow = (0, import_react35.useCallback)((path, kind) => {
132820
133001
  setTreeSelection({ path, kind });
132821
133002
  }, []);
132822
- const clearTreeSelection = (0, import_react36.useCallback)(() => {
133003
+ const clearTreeSelection = (0, import_react35.useCallback)(() => {
132823
133004
  setTreeSelection(null);
132824
133005
  }, []);
132825
- const fetchDir = (0, import_react36.useCallback)(
133006
+ const fetchDir = (0, import_react35.useCallback)(
132826
133007
  async (dirPath, opts) => {
132827
133008
  if (!adapter.listWorkspaceFiles) return;
132828
133009
  const cache4 = getCachedContents(workspaceId2);
@@ -132846,10 +133027,10 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132846
133027
  },
132847
133028
  [adapter, workspaceId2]
132848
133029
  );
132849
- (0, import_react36.useEffect)(() => {
133030
+ (0, import_react35.useEffect)(() => {
132850
133031
  fetchDir("");
132851
133032
  }, [fetchDir]);
132852
- (0, import_react36.useEffect)(() => {
133033
+ (0, import_react35.useEffect)(() => {
132853
133034
  if (!adapter.subscribeFileChanges) return;
132854
133035
  const unsubscribe = adapter.subscribeFileChanges(workspaceId2, (changedPath) => {
132855
133036
  const cache4 = getCachedContents(workspaceId2);
@@ -132858,8 +133039,8 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132858
133039
  });
132859
133040
  return unsubscribe;
132860
133041
  }, [adapter, workspaceId2, fetchDir]);
132861
- const prevSelectedRef = (0, import_react36.useRef)(void 0);
132862
- (0, import_react36.useEffect)(() => {
133042
+ const prevSelectedRef = (0, import_react35.useRef)(void 0);
133043
+ (0, import_react35.useEffect)(() => {
132863
133044
  if (!selectedFile || selectedFile === prevSelectedRef.current) {
132864
133045
  prevSelectedRef.current = selectedFile;
132865
133046
  return;
@@ -132886,7 +133067,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132886
133067
  fetchDir(dir);
132887
133068
  }
132888
133069
  }, [selectedFile, workspaceId2, fetchDir]);
132889
- (0, import_react36.useEffect)(() => {
133070
+ (0, import_react35.useEffect)(() => {
132890
133071
  if (selectedFile && selectedRef.current) {
132891
133072
  const timer = setTimeout(() => {
132892
133073
  selectedRef.current?.scrollIntoView({ block: "nearest" });
@@ -132894,7 +133075,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132894
133075
  return () => clearTimeout(timer);
132895
133076
  }
132896
133077
  }, [selectedFile, dirContents]);
132897
- const toggleExpand = (0, import_react36.useCallback)(
133078
+ const toggleExpand = (0, import_react35.useCallback)(
132898
133079
  (dirPath) => {
132899
133080
  setExpandedPaths((prev) => {
132900
133081
  const next = new Set(prev);
@@ -132910,7 +133091,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132910
133091
  },
132911
133092
  [workspaceId2, fetchDir]
132912
133093
  );
132913
- const ensureDirExpanded = (0, import_react36.useCallback)(
133094
+ const ensureDirExpanded = (0, import_react35.useCallback)(
132914
133095
  async (dirPath) => {
132915
133096
  const cached2 = getCachedExpanded(workspaceId2);
132916
133097
  if (!cached2.has(dirPath)) {
@@ -132922,17 +133103,17 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132922
133103
  },
132923
133104
  [workspaceId2, fetchDir]
132924
133105
  );
132925
- const requestNewEntry = (0, import_react36.useCallback)(
133106
+ const requestNewEntry = (0, import_react35.useCallback)(
132926
133107
  (parentPath, kind) => {
132927
133108
  void ensureDirExpanded(parentPath);
132928
133109
  setNewEntry({ parentPath, kind });
132929
133110
  },
132930
133111
  [ensureDirExpanded]
132931
133112
  );
132932
- const cancelNewEntry = (0, import_react36.useCallback)(() => {
133113
+ const cancelNewEntry = (0, import_react35.useCallback)(() => {
132933
133114
  setNewEntry(null);
132934
133115
  }, []);
132935
- const submitNewEntry = (0, import_react36.useCallback)(
133116
+ const submitNewEntry = (0, import_react35.useCallback)(
132936
133117
  async (name3) => {
132937
133118
  if (!newEntry) return;
132938
133119
  const fullPath = newEntry.parentPath ? `${newEntry.parentPath}/${name3}` : name3;
@@ -132965,16 +133146,16 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
132965
133146
  [adapter, newEntry, fetchDir, onOpenFile, workspaceId2]
132966
133147
  );
132967
133148
  const canDelete = Boolean(adapter.deleteWorkspacePath);
132968
- const requestDelete = (0, import_react36.useCallback)((path, kind) => {
133149
+ const requestDelete = (0, import_react35.useCallback)((path, kind) => {
132969
133150
  setDeleteError(null);
132970
133151
  setPendingDelete({ path, kind });
132971
133152
  }, []);
132972
- const cancelDelete = (0, import_react36.useCallback)(() => {
133153
+ const cancelDelete = (0, import_react35.useCallback)(() => {
132973
133154
  if (deleteSubmitting) return;
132974
133155
  setPendingDelete(null);
132975
133156
  setDeleteError(null);
132976
133157
  }, [deleteSubmitting]);
132977
- const confirmDelete = (0, import_react36.useCallback)(async () => {
133158
+ const confirmDelete = (0, import_react35.useCallback)(async () => {
132978
133159
  if (!pendingDelete || !adapter.deleteWorkspacePath) return;
132979
133160
  setDeleteSubmitting(true);
132980
133161
  setDeleteError(null);
@@ -133020,7 +133201,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133020
133201
  }
133021
133202
  }, [adapter, pendingDelete, fetchDir, workspaceId2, onPathDeleted]);
133022
133203
  const canRename = Boolean(adapter.renameWorkspacePath);
133023
- const remapCachesAfterMove = (0, import_react36.useCallback)(
133204
+ const remapCachesAfterMove = (0, import_react35.useCallback)(
133024
133205
  (from3, to) => {
133025
133206
  const cache4 = getCachedContents(workspaceId2);
133026
133207
  const remapped = /* @__PURE__ */ new Map();
@@ -133045,13 +133226,13 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133045
133226
  },
133046
133227
  [workspaceId2]
133047
133228
  );
133048
- const requestRename = (0, import_react36.useCallback)((path) => {
133229
+ const requestRename = (0, import_react35.useCallback)((path) => {
133049
133230
  setRenamingPath(path);
133050
133231
  }, []);
133051
- const cancelRename = (0, import_react36.useCallback)(() => {
133232
+ const cancelRename = (0, import_react35.useCallback)(() => {
133052
133233
  setRenamingPath(null);
133053
133234
  }, []);
133054
- const submitRename = (0, import_react36.useCallback)(
133235
+ const submitRename = (0, import_react35.useCallback)(
133055
133236
  async (newName) => {
133056
133237
  if (renamingPath == null || !adapter.renameWorkspacePath) return;
133057
133238
  const oldPath = renamingPath;
@@ -133066,7 +133247,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133066
133247
  },
133067
133248
  [adapter, renamingPath, fetchDir, onPathRenamed, remapCachesAfterMove, workspaceId2]
133068
133249
  );
133069
- const resolveDefaultTarget = (0, import_react36.useCallback)(() => {
133250
+ const resolveDefaultTarget = (0, import_react35.useCallback)(() => {
133070
133251
  if (treeSelection?.kind === "directory") return treeSelection.path;
133071
133252
  if (treeSelection?.kind === "file") {
133072
133253
  const idx = treeSelection.path.lastIndexOf("/");
@@ -133079,13 +133260,13 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133079
133260
  const canPaste = Boolean(
133080
133261
  clipboard && (clipboard.op === "copy" && adapter.copyWorkspacePath || clipboard.op === "cut" && adapter.renameWorkspacePath)
133081
133262
  );
133082
- const cutPath = (0, import_react36.useCallback)((path, kind) => {
133263
+ const cutPath = (0, import_react35.useCallback)((path, kind) => {
133083
133264
  setClipboard({ path, kind, op: "cut" });
133084
133265
  }, []);
133085
- const copyPath = (0, import_react36.useCallback)((path, kind) => {
133266
+ const copyPath = (0, import_react35.useCallback)((path, kind) => {
133086
133267
  setClipboard({ path, kind, op: "copy" });
133087
133268
  }, []);
133088
- const uniqueCopyName = (0, import_react36.useCallback)(
133269
+ const uniqueCopyName = (0, import_react35.useCallback)(
133089
133270
  (baseName, destFolder, kind) => {
133090
133271
  const siblings = new Set(
133091
133272
  (getCachedContents(workspaceId2).get(destFolder) ?? []).map((e) => e.name)
@@ -133103,7 +133284,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133103
133284
  },
133104
133285
  [workspaceId2]
133105
133286
  );
133106
- const canTransferInto = (0, import_react36.useCallback)(
133287
+ const canTransferInto = (0, import_react35.useCallback)(
133107
133288
  (source, destFolder, op) => {
133108
133289
  if (source.kind === "directory" && (destFolder === source.path || destFolder.startsWith(`${source.path}/`))) {
133109
133290
  return false;
@@ -133113,7 +133294,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133113
133294
  },
133114
133295
  [canCopyOp, canCutCopy]
133115
133296
  );
133116
- const transferInto = (0, import_react36.useCallback)(
133297
+ const transferInto = (0, import_react35.useCallback)(
133117
133298
  async (source, destFolder, op) => {
133118
133299
  if (!canTransferInto(source, destFolder, op)) return false;
133119
133300
  const baseName = baseNameOf(source.path);
@@ -133150,7 +133331,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133150
133331
  workspaceId2
133151
133332
  ]
133152
133333
  );
133153
- const runOperation = (0, import_react36.useCallback)(async (op) => {
133334
+ const runOperation = (0, import_react35.useCallback)(async (op) => {
133154
133335
  setOperationError(null);
133155
133336
  try {
133156
133337
  await op();
@@ -133158,7 +133339,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133158
133339
  setOperationError(err instanceof Error ? err.message : String(err));
133159
133340
  }
133160
133341
  }, []);
133161
- const pasteInto = (0, import_react36.useCallback)(
133342
+ const pasteInto = (0, import_react35.useCallback)(
133162
133343
  (destFolder) => runOperation(async () => {
133163
133344
  if (!clipboard) return;
133164
133345
  const moved = await transferInto(clipboard, destFolder, clipboard.op);
@@ -133166,22 +133347,22 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133166
133347
  }),
133167
133348
  [clipboard, runOperation, transferInto]
133168
133349
  );
133169
- const dragSourceRef = (0, import_react36.useRef)(null);
133170
- const [dropTarget, setDropTarget] = (0, import_react36.useState)(null);
133171
- const expandTimerRef = (0, import_react36.useRef)(
133350
+ const dragSourceRef = (0, import_react35.useRef)(null);
133351
+ const [dropTarget, setDropTarget] = (0, import_react35.useState)(null);
133352
+ const expandTimerRef = (0, import_react35.useRef)(
133172
133353
  null
133173
133354
  );
133174
- const clearExpandTimer = (0, import_react36.useCallback)(() => {
133355
+ const clearExpandTimer = (0, import_react35.useCallback)(() => {
133175
133356
  if (expandTimerRef.current) clearTimeout(expandTimerRef.current.timer);
133176
133357
  expandTimerRef.current = null;
133177
133358
  }, []);
133178
- (0, import_react36.useEffect)(() => clearExpandTimer, [clearExpandTimer]);
133179
- const endDrag = (0, import_react36.useCallback)(() => {
133359
+ (0, import_react35.useEffect)(() => clearExpandTimer, [clearExpandTimer]);
133360
+ const endDrag = (0, import_react35.useCallback)(() => {
133180
133361
  dragSourceRef.current = null;
133181
133362
  setDropTarget(null);
133182
133363
  clearExpandTimer();
133183
133364
  }, [clearExpandTimer]);
133184
- const dnd = (0, import_react36.useMemo)(
133365
+ const dnd = (0, import_react35.useMemo)(
133185
133366
  () => ({
133186
133367
  dropTarget,
133187
133368
  onDragStart(path, kind, e) {
@@ -133238,7 +133419,7 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133238
133419
  workspaceId2
133239
133420
  ]
133240
133421
  );
133241
- const refreshTree = (0, import_react36.useCallback)(async () => {
133422
+ const refreshTree = (0, import_react35.useCallback)(async () => {
133242
133423
  const cache4 = getCachedContents(workspaceId2);
133243
133424
  const expanded = getCachedExpanded(workspaceId2);
133244
133425
  for (const key2 of Array.from(cache4.keys())) {
@@ -133247,17 +133428,17 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133247
133428
  setDirContents(new Map(cache4));
133248
133429
  await Promise.all(Array.from(expanded, (dir) => fetchDir(dir, { force: true })));
133249
133430
  }, [fetchDir, workspaceId2]);
133250
- const collapseAll = (0, import_react36.useCallback)(() => {
133431
+ const collapseAll = (0, import_react35.useCallback)(() => {
133251
133432
  const root = /* @__PURE__ */ new Set([""]);
133252
133433
  expandedStateCache.set(workspaceId2, root);
133253
133434
  setExpandedPaths(new Set(root));
133254
133435
  }, [workspaceId2]);
133255
133436
  const revealInFinder = capabilities.revealInFinder;
133256
- const onRevealInFinder = (0, import_react36.useMemo)(
133437
+ const onRevealInFinder = (0, import_react35.useMemo)(
133257
133438
  () => revealInFinder && workspacePath ? (path) => void revealInFinder(joinWorkspacePath(workspacePath, path)) : void 0,
133258
133439
  [revealInFinder, workspacePath]
133259
133440
  );
133260
- (0, import_react36.useImperativeHandle)(
133441
+ (0, import_react35.useImperativeHandle)(
133261
133442
  handleRef,
133262
133443
  () => ({
133263
133444
  startNewFile(parentPath) {
@@ -133530,17 +133711,17 @@ var FileBrowser = (0, import_react36.forwardRef)(function FileBrowser2({
133530
133711
  });
133531
133712
 
133532
133713
  // src/dashboard/components/FileViewer.tsx
133533
- var import_react40 = __toESM(require_react(), 1);
133714
+ var import_react39 = __toESM(require_react(), 1);
133534
133715
 
133535
133716
  // src/dashboard/lib/markdown-preview-width.ts
133536
- var import_react37 = __toESM(require_react(), 1);
133717
+ var import_react36 = __toESM(require_react(), 1);
133537
133718
 
133538
133719
  // src/dashboard/components/ImagePreview.tsx
133539
- var import_react38 = __toESM(require_react(), 1);
133720
+ var import_react37 = __toESM(require_react(), 1);
133540
133721
  var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
133541
133722
 
133542
133723
  // src/dashboard/components/LanguagePickerDialog.tsx
133543
- var import_react39 = __toESM(require_react(), 1);
133724
+ var import_react38 = __toESM(require_react(), 1);
133544
133725
  var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
133545
133726
 
133546
133727
  // src/dashboard/components/PdfPreview.tsx
@@ -133550,7 +133731,7 @@ var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
133550
133731
  var import_jsx_runtime78 = __toESM(require_jsx_runtime(), 1);
133551
133732
 
133552
133733
  // src/dashboard/components/QuickOpenDialog.tsx
133553
- var import_react41 = __toESM(require_react(), 1);
133734
+ var import_react40 = __toESM(require_react(), 1);
133554
133735
 
133555
133736
  // src/dashboard/lib/file-location.ts
133556
133737
  function formatFileLocation(filePath, line2, options2) {
@@ -133565,7 +133746,7 @@ var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
133565
133746
 
133566
133747
  // src/dashboard/components/SearchBar.tsx
133567
133748
  var import_lucide_react8 = __toESM(require_lucide_react(), 1);
133568
- var import_react42 = __toESM(require_react(), 1);
133749
+ var import_react41 = __toESM(require_react(), 1);
133569
133750
  var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
133570
133751
  var DEFAULT_VISIBLE_OPTIONS = ["caseSensitive", "wholeWord", "regex"];
133571
133752
  function ToggleButton({
@@ -133585,7 +133766,7 @@ function ToggleButton({
133585
133766
  }
133586
133767
  );
133587
133768
  }
133588
- var SearchBar = (0, import_react42.forwardRef)(function SearchBar2({
133769
+ var SearchBar = (0, import_react41.forwardRef)(function SearchBar2({
133589
133770
  query,
133590
133771
  onQueryChange,
133591
133772
  options: options2,
@@ -133602,18 +133783,18 @@ var SearchBar = (0, import_react42.forwardRef)(function SearchBar2({
133602
133783
  const showCase = visibleOptions.includes("caseSensitive");
133603
133784
  const showWholeWord = visibleOptions.includes("wholeWord");
133604
133785
  const showRegex = visibleOptions.includes("regex");
133605
- const inputRef = (0, import_react42.useRef)(null);
133606
- (0, import_react42.useImperativeHandle)(ref, () => ({
133786
+ const inputRef = (0, import_react41.useRef)(null);
133787
+ (0, import_react41.useImperativeHandle)(ref, () => ({
133607
133788
  focus: () => inputRef.current?.focus(),
133608
133789
  select: () => inputRef.current?.select()
133609
133790
  }));
133610
- const toggleCase = (0, import_react42.useCallback)(() => {
133791
+ const toggleCase = (0, import_react41.useCallback)(() => {
133611
133792
  onOptionsChange({ ...options2, caseSensitive: !options2.caseSensitive });
133612
133793
  }, [options2, onOptionsChange]);
133613
- const toggleWholeWord = (0, import_react42.useCallback)(() => {
133794
+ const toggleWholeWord = (0, import_react41.useCallback)(() => {
133614
133795
  onOptionsChange({ ...options2, wholeWord: !options2.wholeWord });
133615
133796
  }, [options2, onOptionsChange]);
133616
- const toggleRegex = (0, import_react42.useCallback)(() => {
133797
+ const toggleRegex = (0, import_react41.useCallback)(() => {
133617
133798
  onOptionsChange({ ...options2, regex: !options2.regex });
133618
133799
  }, [options2, onOptionsChange]);
133619
133800
  const floating = variant === "floating";
@@ -133716,27 +133897,27 @@ var SearchBar = (0, import_react42.forwardRef)(function SearchBar2({
133716
133897
  });
133717
133898
 
133718
133899
  // src/dashboard/components/SearchFilesDialog.tsx
133719
- var import_react43 = __toESM(require_react(), 1);
133900
+ var import_react42 = __toESM(require_react(), 1);
133720
133901
  var import_jsx_runtime81 = __toESM(require_jsx_runtime(), 1);
133721
133902
 
133722
133903
  // src/dashboard/components/WorkspacePickerDialog.tsx
133723
- var import_react44 = __toESM(require_react(), 1);
133904
+ var import_react43 = __toESM(require_react(), 1);
133724
133905
  var import_jsx_runtime82 = __toESM(require_jsx_runtime(), 1);
133725
133906
 
133726
133907
  // src/dashboard/components/WorkspaceTabNav.tsx
133727
133908
  var import_jsx_runtime83 = __toESM(require_jsx_runtime(), 1);
133728
133909
 
133729
133910
  // src/dashboard/hooks/use-diff-target.ts
133730
- var import_react45 = __toESM(require_react(), 1);
133911
+ var import_react44 = __toESM(require_react(), 1);
133731
133912
 
133732
133913
  // src/dashboard/hooks/use-editor-history.ts
133733
- var import_react46 = __toESM(require_react(), 1);
133914
+ var import_react45 = __toESM(require_react(), 1);
133734
133915
 
133735
133916
  // src/dashboard/hooks/use-search.ts
133736
- var import_react47 = __toESM(require_react(), 1);
133917
+ var import_react46 = __toESM(require_react(), 1);
133737
133918
 
133738
133919
  // src/dashboard/hooks/use-workspace-path.ts
133739
- var import_react48 = __toESM(require_react(), 1);
133920
+ var import_react47 = __toESM(require_react(), 1);
133740
133921
 
133741
133922
  // ../../node_modules/.pnpm/marked@15.0.12/node_modules/marked/lib/marked.esm.js
133742
133923
  function _getDefaults() {
@@ -135940,13 +136121,13 @@ var startFailures = 0;
135940
136121
  var nextId = 1;
135941
136122
  var pending = /* @__PURE__ */ new Map();
135942
136123
  function execOnThisThread({ command, args, options: options2 }) {
135943
- return new Promise((resolve12) => {
136124
+ return new Promise((resolve13) => {
135944
136125
  try {
135945
136126
  execFile4(command, args, { ...options2, encoding: "utf8" }, (err, stdout, stderr) => {
135946
- resolve12({ stdout, stderr, error: err ? err.message : null });
136127
+ resolve13({ stdout, stderr, error: err ? err.message : null });
135947
136128
  });
135948
136129
  } catch (err) {
135949
- resolve12({ stdout: "", stderr: "", error: err instanceof Error ? err.message : String(err) });
136130
+ resolve13({ stdout: "", stderr: "", error: err instanceof Error ? err.message : String(err) });
135950
136131
  }
135951
136132
  });
135952
136133
  }
@@ -135984,11 +136165,11 @@ function getWorker() {
135984
136165
  workerUnavailable = true;
135985
136166
  log6.warn("exec-file worker won't start, spawning on the main thread");
135986
136167
  }
135987
- for (const { request, resolve: resolve12 } of orphaned) void execOnThisThread(request).then(resolve12);
136168
+ for (const { request, resolve: resolve13 } of orphaned) void execOnThisThread(request).then(resolve13);
135988
136169
  return;
135989
136170
  }
135990
- for (const { resolve: resolve12 } of orphaned) {
135991
- resolve12({ stdout: "", stderr: "", error: `exec-file worker exited (code ${code})` });
136171
+ for (const { resolve: resolve13 } of orphaned) {
136172
+ resolve13({ stdout: "", stderr: "", error: `exec-file worker exited (code ${code})` });
135992
136173
  }
135993
136174
  });
135994
136175
  worker = created;
@@ -136003,8 +136184,8 @@ function execFileOffThread(command, args, options2) {
136003
136184
  };
136004
136185
  const target = getWorker();
136005
136186
  if (!target) return execOnThisThread(request);
136006
- return new Promise((resolve12) => {
136007
- pending.set(request.id, { request, resolve: resolve12 });
136187
+ return new Promise((resolve13) => {
136188
+ pending.set(request.id, { request, resolve: resolve13 });
136008
136189
  if (pending.size === 1) target.ref();
136009
136190
  target.postMessage(request);
136010
136191
  });
@@ -141601,7 +141782,7 @@ var PluginHost = class {
141601
141782
  warn: (message, ...args) => pluginLog.warn(message, ...args),
141602
141783
  error: (message, ...args) => pluginLog.error(message, ...args)
141603
141784
  },
141604
- exec: (bin, args, options2) => new Promise((resolve12, reject) => {
141785
+ exec: (bin, args, options2) => new Promise((resolve13, reject) => {
141605
141786
  const env = { ...process.env, ...options2.env };
141606
141787
  env.PATH = prependBinDirs(process.env.PATH);
141607
141788
  execFile5(
@@ -141613,7 +141794,7 @@ var PluginHost = class {
141613
141794
  reject(new Error(stderr.trim() || err.message));
141614
141795
  return;
141615
141796
  }
141616
- resolve12({ stdout, stderr });
141797
+ resolve13({ stdout, stderr });
141617
141798
  }
141618
141799
  );
141619
141800
  }),
@@ -142197,8 +142378,8 @@ async function prepareScriptRun(script, label) {
142197
142378
  let poll = null;
142198
142379
  let disposed = false;
142199
142380
  let resolveExited;
142200
- const exited = new Promise((resolve12) => {
142201
- resolveExited = resolve12;
142381
+ const exited = new Promise((resolve13) => {
142382
+ resolveExited = resolve13;
142202
142383
  });
142203
142384
  const check2 = () => {
142204
142385
  if (disposed) return;
@@ -142236,7 +142417,7 @@ async function prepareScriptRun(script, label) {
142236
142417
  return { command, exited, dispose };
142237
142418
  }
142238
142419
  function runScriptHidden(script, cwd, timeoutMs) {
142239
- return new Promise((resolve12, reject) => {
142420
+ return new Promise((resolve13, reject) => {
142240
142421
  const { PORT: _port, ...parentEnv } = process.env;
142241
142422
  const child = spawn2(process.env.ComSpec || "cmd.exe", ["/d", "/s", "/c", script], {
142242
142423
  cwd,
@@ -142246,7 +142427,7 @@ function runScriptHidden(script, cwd, timeoutMs) {
142246
142427
  });
142247
142428
  const timer = timeoutMs === void 0 ? void 0 : setTimeout(() => {
142248
142429
  child.kill();
142249
- resolve12(null);
142430
+ resolve13(null);
142250
142431
  }, timeoutMs);
142251
142432
  child.on("error", (err) => {
142252
142433
  clearTimeout(timer);
@@ -142254,7 +142435,7 @@ function runScriptHidden(script, cwd, timeoutMs) {
142254
142435
  });
142255
142436
  child.on("exit", (code) => {
142256
142437
  clearTimeout(timer);
142257
- resolve12(code ?? 1);
142438
+ resolve13(code ?? 1);
142258
142439
  });
142259
142440
  });
142260
142441
  }
@@ -142553,13 +142734,13 @@ var DaemonClient = class _DaemonClient {
142553
142734
  request(t4, params) {
142554
142735
  if (this.closed) return Promise.reject(new Error("Terminal daemon connection closed"));
142555
142736
  const id2 = this.nextId++;
142556
- return new Promise((resolve12, reject) => {
142737
+ return new Promise((resolve13, reject) => {
142557
142738
  const timer = setTimeout(() => {
142558
142739
  this.pending.delete(id2);
142559
142740
  reject(new Error(`Terminal daemon did not answer ${t4} within ${REQUEST_TIMEOUT_MS} ms`));
142560
142741
  }, REQUEST_TIMEOUT_MS);
142561
142742
  this.pending.set(id2, {
142562
- resolve: resolve12,
142743
+ resolve: resolve13,
142563
142744
  reject,
142564
142745
  timer
142565
142746
  });
@@ -142621,7 +142802,7 @@ async function retireDaemon(paths, buildId) {
142621
142802
  return false;
142622
142803
  } catch (err) {
142623
142804
  if (!(err instanceof DaemonRejectedError) || err.reply.t !== "mismatch") throw err;
142624
- const closed = new Promise((resolve12) => socket.once("close", () => resolve12()));
142805
+ const closed = new Promise((resolve13) => socket.once("close", () => resolve13()));
142625
142806
  writeFrame(socket, { t: "shutdown" });
142626
142807
  await closed;
142627
142808
  return true;
@@ -142657,7 +142838,7 @@ function openSocket(path) {
142657
142838
  } catch (err) {
142658
142839
  return Promise.reject(err);
142659
142840
  }
142660
- return new Promise((resolve12, reject) => {
142841
+ return new Promise((resolve13, reject) => {
142661
142842
  const socket = connect({ path });
142662
142843
  const timer = setTimeout(() => {
142663
142844
  socket.destroy();
@@ -142666,7 +142847,7 @@ function openSocket(path) {
142666
142847
  socket.once("connect", () => {
142667
142848
  clearTimeout(timer);
142668
142849
  socket.removeAllListeners("error");
142669
- resolve12(socket);
142850
+ resolve13(socket);
142670
142851
  });
142671
142852
  socket.once("error", (err) => {
142672
142853
  clearTimeout(timer);
@@ -142680,7 +142861,7 @@ function openSocket(path) {
142680
142861
  });
142681
142862
  }
142682
142863
  function handshake(socket, frames, hello) {
142683
- return new Promise((resolve12, reject) => {
142864
+ return new Promise((resolve13, reject) => {
142684
142865
  const timer = setTimeout(() => {
142685
142866
  socket.destroy();
142686
142867
  reject(new Error("Terminal daemon did not answer hello"));
@@ -142697,7 +142878,7 @@ function handshake(socket, frames, hello) {
142697
142878
  clearTimeout(timer);
142698
142879
  socket.off("close", onClose);
142699
142880
  const reply = frame;
142700
- if (reply.t === "ready") resolve12(reply);
142881
+ if (reply.t === "ready") resolve13(reply);
142701
142882
  else reject(new DaemonRejectedError(reply));
142702
142883
  });
142703
142884
  writeFrame(socket, hello);
@@ -142744,7 +142925,7 @@ async function launchDaemon(options2) {
142744
142925
  })();
142745
142926
  child.on("error", () => {
142746
142927
  });
142747
- return new Promise((resolve12, reject) => {
142928
+ return new Promise((resolve13, reject) => {
142748
142929
  let settled = false;
142749
142930
  const finish = (outcome) => {
142750
142931
  if (settled) return;
@@ -142762,7 +142943,7 @@ async function launchDaemon(options2) {
142762
142943
  Daemon log:
142763
142944
  ${tail}`) : outcome);
142764
142945
  } else {
142765
- resolve12(outcome);
142946
+ resolve13(outcome);
142766
142947
  }
142767
142948
  };
142768
142949
  const onMessage = (message) => {
@@ -143310,7 +143491,7 @@ function readPidRecord(path) {
143310
143491
  async function waitForExit(pid, timeoutMs) {
143311
143492
  const deadline = Date.now() + timeoutMs;
143312
143493
  while (isProcessAlive(pid) && Date.now() < deadline) {
143313
- await new Promise((resolve12) => setTimeout(resolve12, RESTART_POLL_INTERVAL_MS));
143494
+ await new Promise((resolve13) => setTimeout(resolve13, RESTART_POLL_INTERVAL_MS));
143314
143495
  }
143315
143496
  }
143316
143497
  function isProcessAlive(pid) {
@@ -143328,7 +143509,7 @@ async function connectWithRetry(paths, buildId) {
143328
143509
  } catch (err) {
143329
143510
  const retriable = err instanceof DaemonRejectedError && err.reply.t === "rejected" && attempt < CONNECT_RETRIES;
143330
143511
  if (!retriable) throw err;
143331
- await new Promise((resolve12) => setTimeout(resolve12, CONNECT_RETRY_DELAY_MS));
143512
+ await new Promise((resolve13) => setTimeout(resolve13, CONNECT_RETRY_DELAY_MS));
143332
143513
  }
143333
143514
  }
143334
143515
  }
@@ -144107,13 +144288,13 @@ var TerminalPool = class {
144107
144288
  let deathWatch;
144108
144289
  let drainCap;
144109
144290
  try {
144110
- await new Promise((resolve12) => {
144111
- session.headless.write("", resolve12);
144291
+ await new Promise((resolve13) => {
144292
+ session.headless.write("", resolve13);
144112
144293
  deathWatch = setInterval(() => {
144113
- if (this.terminals.get(terminalId) !== session) resolve12();
144294
+ if (this.terminals.get(terminalId) !== session) resolve13();
144114
144295
  }, 50);
144115
144296
  deathWatch.unref();
144116
- drainCap = setTimeout(resolve12, 1e3);
144297
+ drainCap = setTimeout(resolve13, 1e3);
144117
144298
  drainCap.unref();
144118
144299
  });
144119
144300
  if (this.terminals.get(terminalId) !== session) return null;
@@ -144996,7 +145177,7 @@ function formatFileList(files) {
144996
145177
 
144997
145178
  // src/server/infra/lsp/lsp-manager.ts
144998
145179
  import { spawn as spawn3 } from "node:child_process";
144999
- import { dirname as dirname5, join as join21, resolve as resolve3 } from "node:path";
145180
+ import { dirname as dirname5, join as join21, resolve as resolve4 } from "node:path";
145000
145181
  import { fileURLToPath as fileURLToPath2 } from "node:url";
145001
145182
  var workspaceQueries = new WorkspaceQueries();
145002
145183
  var __dirname2 = dirname5(fileURLToPath2(import.meta.url));
@@ -145023,8 +145204,8 @@ async function getOrSpawnServer(workspaceId2, lang) {
145023
145204
  }
145024
145205
  const resolvedPath = await shellPath();
145025
145206
  const cwd = workspace.worktreePath;
145026
- const appBin = resolve3(__dirname2, "../../../../node_modules/.bin");
145027
- const bundledBin = resolve3(__dirname2, "node_modules/.bin");
145207
+ const appBin = resolve4(__dirname2, "../../../../node_modules/.bin");
145208
+ const bundledBin = resolve4(__dirname2, "node_modules/.bin");
145028
145209
  const workspaceBin = join21(cwd, "node_modules/.bin");
145029
145210
  const pathSep = process.platform === "win32" ? ";" : ":";
145030
145211
  const combinedPath = [bundledBin, appBin, workspaceBin, resolvedPath].join(pathSep);
@@ -145071,8 +145252,8 @@ async function getOrSpawnServer(workspaceId2, lang) {
145071
145252
  child.stderr?.on("data", (chunk) => {
145072
145253
  log17.debug("LSP stderr [%s]: %s", serverId, chunk.toString().trimEnd());
145073
145254
  });
145074
- await new Promise((resolve12, reject) => {
145075
- child.once("spawn", resolve12);
145255
+ await new Promise((resolve13, reject) => {
145256
+ child.once("spawn", resolve13);
145076
145257
  child.once("error", (err) => reject(err));
145077
145258
  });
145078
145259
  return session;
@@ -145105,10 +145286,10 @@ import {
145105
145286
  globSync,
145106
145287
  mkdirSync as mkdirSync4,
145107
145288
  readFileSync as readFileSync7,
145108
- realpathSync as realpathSync2,
145289
+ realpathSync as realpathSync3,
145109
145290
  statSync as statSync9
145110
145291
  } from "node:fs";
145111
- import { dirname as dirname6, isAbsolute, join as join22, relative, resolve as resolve4, sep as sep3 } from "node:path";
145292
+ import { dirname as dirname6, isAbsolute, join as join22, relative, resolve as resolve5, sep as sep3 } from "node:path";
145112
145293
  import { promisify } from "node:util";
145113
145294
  var log18 = createLogger("workspace-files");
145114
145295
  var execFileAsync = promisify(execFile6);
@@ -145134,7 +145315,7 @@ async function copyWorkspaceFiles(projectPath, worktreePath) {
145134
145315
  const copied = [];
145135
145316
  let canonicalProjectRoot;
145136
145317
  try {
145137
- canonicalProjectRoot = realpathSync2(projectPath);
145318
+ canonicalProjectRoot = realpathSync3(projectPath);
145138
145319
  } catch (err) {
145139
145320
  log18.warn({ err, projectPath }, "failed to resolve project root \u2014 skipping workspace file copy");
145140
145321
  return copied;
@@ -145150,7 +145331,7 @@ async function copyWorkspaceFiles(projectPath, worktreePath) {
145150
145331
  continue;
145151
145332
  }
145152
145333
  try {
145153
- const canonicalSource = realpathSync2(absSource);
145334
+ const canonicalSource = realpathSync3(absSource);
145154
145335
  const insideRoot = canonicalSource === canonicalProjectRoot || canonicalSource.startsWith(canonicalProjectRoot + sep3);
145155
145336
  if (!insideRoot) {
145156
145337
  log18.warn(
@@ -145211,7 +145392,7 @@ function resolveFromConfig(projectPath, missing) {
145211
145392
  );
145212
145393
  break;
145213
145394
  }
145214
- const abs = resolve4(projectPath, m3);
145395
+ const abs = resolve5(projectPath, m3);
145215
145396
  try {
145216
145397
  if (statSync9(abs).isFile()) {
145217
145398
  out.push(abs);
@@ -145220,7 +145401,7 @@ function resolveFromConfig(projectPath, missing) {
145220
145401
  }
145221
145402
  }
145222
145403
  } else {
145223
- const abs = resolve4(projectPath, entry);
145404
+ const abs = resolve5(projectPath, entry);
145224
145405
  try {
145225
145406
  if (statSync9(abs).isFile()) {
145226
145407
  out.push(abs);
@@ -145260,7 +145441,7 @@ async function resolveFromWorktreeInclude(projectPath) {
145260
145441
  const out = [];
145261
145442
  for (const rel of matchingWorktreeInclude) {
145262
145443
  if (!standardSet.has(rel)) continue;
145263
- out.push(resolve4(projectPath, rel));
145444
+ out.push(resolve5(projectPath, rel));
145264
145445
  }
145265
145446
  return out;
145266
145447
  }
@@ -145475,6 +145656,25 @@ function submitTask(options2) {
145475
145656
  });
145476
145657
  return toTaskInfo(task);
145477
145658
  }
145659
+ function submitOrQueueTask(options2) {
145660
+ const { workspaceId: workspaceId2, chatId } = options2;
145661
+ if (!workspaceService.resolve(workspaceId2)) {
145662
+ throw new WorkspaceNotFoundError(workspaceId2);
145663
+ }
145664
+ const running = tasks2.get(chatId)?.status === "running";
145665
+ if (!running && !hasQueuedMessages(chatId)) {
145666
+ return { queued: false, task: submitTask(options2) };
145667
+ }
145668
+ const queued = pushQueuedMessage(chatId, {
145669
+ text: options2.prompt,
145670
+ files: options2.attachments,
145671
+ mode: options2.mode,
145672
+ model: options2.model,
145673
+ codingAgentId: options2.codingAgentId
145674
+ });
145675
+ if (!running) drainQueue(workspaceId2, chatId);
145676
+ return { queued: true, queuedMessageId: queued.id };
145677
+ }
145478
145678
  async function runTask(task) {
145479
145679
  const { chatId } = task;
145480
145680
  chatService.updateStatus(chatId, "running");
@@ -145545,9 +145745,7 @@ async function runTask(task) {
145545
145745
  });
145546
145746
  }
145547
145747
  });
145548
- const previousCost = agentSessionService.getSessionState(chatId, {
145549
- resolveDefaults: false
145550
- }).costUsd;
145748
+ const previousCost = agentSessionService.sessionCostUsd(chatId);
145551
145749
  agentSessionService.record(
145552
145750
  chatId,
145553
145751
  {
@@ -145606,7 +145804,7 @@ function finishTask(task, outcome) {
145606
145804
  task.completedAt = Date.now();
145607
145805
  persistTask(task);
145608
145806
  if (tasks2.get(task.chatId) === task) tasks2.delete(task.chatId);
145609
- if (status === "completed" && drainQueue(task)) return;
145807
+ if (status === "completed" && drainQueue(task.workspaceId, task.chatId)) return;
145610
145808
  chatService.updateStatus(task.chatId, status === "completed" ? "idle" : "error");
145611
145809
  const stopped = outcome === "cancelled" || task.cancelRequested === true;
145612
145810
  const updated = setWorkspaceSourceStatus(task.workspaceId, chatStatusSource(task.chatId), {
@@ -145614,20 +145812,24 @@ function finishTask(task, outcome) {
145614
145812
  });
145615
145813
  emit({ kind: "update", status: updated });
145616
145814
  }
145617
- function drainQueue(task) {
145618
- const queued = shiftQueuedMessage(task.chatId);
145815
+ function drainQueue(workspaceId2, chatId) {
145816
+ const queued = peekQueuedMessage(chatId);
145619
145817
  if (!queued) return false;
145620
145818
  try {
145621
145819
  const attachments = (queued.files ?? []).filter((f2) => f2.path).map((f2) => ({ path: f2.path, mediaType: f2.mediaType, url: f2.url, filename: f2.filename }));
145622
145820
  submitTask({
145623
- workspaceId: task.workspaceId,
145624
- chatId: task.chatId,
145821
+ workspaceId: workspaceId2,
145822
+ chatId,
145625
145823
  prompt: queued.text,
145626
- attachments
145824
+ attachments,
145825
+ mode: queued.mode,
145826
+ model: queued.model,
145827
+ codingAgentId: queued.codingAgentId
145627
145828
  });
145829
+ removeQueuedMessage(chatId, queued.id);
145628
145830
  return true;
145629
145831
  } catch (err) {
145630
- log19.warn({ chatId: task.chatId, err }, "failed to auto-start queued task");
145832
+ log19.warn({ chatId, err }, "failed to auto-start queued task");
145631
145833
  return false;
145632
145834
  }
145633
145835
  }
@@ -145674,6 +145876,9 @@ var TaskService = class {
145674
145876
  submitTask(options2) {
145675
145877
  return submitTask(options2);
145676
145878
  }
145879
+ submitOrQueueTask(options2) {
145880
+ return submitOrQueueTask(options2);
145881
+ }
145677
145882
  abortTask(chatId) {
145678
145883
  return abortTask(chatId);
145679
145884
  }
@@ -148725,9 +148930,9 @@ var TerminalService = class {
148725
148930
  let exited = false;
148726
148931
  let wake = null;
148727
148932
  const notify2 = () => {
148728
- const resolve12 = wake;
148933
+ const resolve13 = wake;
148729
148934
  wake = null;
148730
- resolve12?.();
148935
+ resolve13?.();
148731
148936
  };
148732
148937
  const unsubscribeExit = this.onExit(terminalId, () => {
148733
148938
  exited = true;
@@ -148755,9 +148960,9 @@ var TerminalService = class {
148755
148960
  yield { kind: "exit" };
148756
148961
  return;
148757
148962
  }
148758
- await new Promise((resolve12) => {
148759
- if (exited || queue.length > 0 || signal?.aborted) resolve12();
148760
- else wake = resolve12;
148963
+ await new Promise((resolve13) => {
148964
+ if (exited || queue.length > 0 || signal?.aborted) resolve13();
148965
+ else wake = resolve13;
148761
148966
  });
148762
148967
  }
148763
148968
  } finally {
@@ -148887,12 +149092,12 @@ var WorkspaceScriptService = class {
148887
149092
  try {
148888
149093
  prepared = await prepareScriptRun(command, script);
148889
149094
  const { exited } = prepared;
148890
- const closed = new Promise((resolve12) => {
148891
- unsubscribeExit = terminalService.onExit(terminalId, () => resolve12({ kind: "closed" }));
149095
+ const closed = new Promise((resolve13) => {
149096
+ unsubscribeExit = terminalService.onExit(terminalId, () => resolve13({ kind: "closed" }));
148892
149097
  });
148893
- const timedOut = new Promise((resolve12) => {
149098
+ const timedOut = new Promise((resolve13) => {
148894
149099
  if (timeoutMs !== void 0) {
148895
- timer = setTimeout(() => resolve12({ kind: "timeout" }), timeoutMs);
149100
+ timer = setTimeout(() => resolve13({ kind: "timeout" }), timeoutMs);
148896
149101
  }
148897
149102
  });
148898
149103
  await terminalService.spawn(workspaceId2, terminalId, { command: prepared.command });
@@ -149558,6 +149763,7 @@ var chatService = new ChatService();
149558
149763
  var log31 = createLogger("agent-sessions");
149559
149764
  var IDLE_TIMEOUT_MS = 15 * 6e4;
149560
149765
  var CANCEL_GRACE_MS = 15e3;
149766
+ var MAX_TIMER_MS = 2 ** 31 - 1;
149561
149767
  var PROBE_SETTLE_MS = 1500;
149562
149768
  var events = new ChatEventQueries();
149563
149769
  var settings = new SettingsQueries();
@@ -149636,6 +149842,7 @@ function runtimeFor(chat, def2) {
149636
149842
  turnSeq: 0,
149637
149843
  live: emptyLive(),
149638
149844
  pending: /* @__PURE__ */ new Map(),
149845
+ work: new PendingWork(),
149639
149846
  idleTimer: null,
149640
149847
  claudeCli: null
149641
149848
  };
@@ -149651,35 +149858,59 @@ function stopRuntime(rt) {
149651
149858
  rt.sessionId = null;
149652
149859
  runtimes.delete(rt.chatId);
149653
149860
  }
149654
- function scheduleIdle(rt) {
149861
+ function idleTimeoutMs() {
149862
+ const override = Number(process.env.BAND_AGENT_IDLE_TIMEOUT_MS);
149863
+ return Number.isFinite(override) && override > 0 ? override : IDLE_TIMEOUT_MS;
149864
+ }
149865
+ function scheduleIdle(rt, delayMs = idleTimeoutMs()) {
149655
149866
  if (rt.idleTimer) clearTimeout(rt.idleTimer);
149867
+ const delay2 = Math.min(delayMs, MAX_TIMER_MS);
149656
149868
  rt.idleTimer = setTimeout(() => {
149657
149869
  rt.idleTimer = null;
149658
149870
  if (rt.inTurn || rt.pending.size > 0 || rt.attaching) return;
149871
+ const now = Date.now();
149872
+ const holds = rt.work.outstanding(now);
149873
+ if (holds.length > 0) {
149874
+ const until = Math.max(...holds.map((h) => h.until));
149875
+ log31.info(
149876
+ {
149877
+ chatId: rt.chatId,
149878
+ work: holds.map((h) => ({ reason: h.reason, until: new Date(h.until).toISOString() }))
149879
+ },
149880
+ "idle agent has pending work; not stopping it"
149881
+ );
149882
+ scheduleIdle(rt, until - now + idleTimeoutMs());
149883
+ return;
149884
+ }
149659
149885
  log31.info({ chatId: rt.chatId }, "stopping idle agent");
149660
149886
  rt.process?.close();
149661
149887
  rt.process = null;
149662
149888
  rt.sessionId = null;
149663
149889
  if (runtimes.get(rt.chatId) === rt) runtimes.delete(rt.chatId);
149664
- }, IDLE_TIMEOUT_MS);
149890
+ }, delay2);
149665
149891
  rt.idleTimer.unref?.();
149666
149892
  }
149893
+ function agentActive(rt) {
149894
+ if (!rt.inTurn && !rt.attaching && rt.process) scheduleIdle(rt);
149895
+ }
149667
149896
  function record2(rt, event, turnStart = false) {
149668
149897
  if (!rt.sessionId) {
149669
149898
  broadcastTransient(rt.chatId, event);
149670
149899
  return;
149671
149900
  }
149901
+ const createdAt = Date.now();
149672
149902
  const id2 = events.append({
149673
149903
  chatId: rt.chatId,
149674
149904
  sessionId: rt.sessionId,
149675
149905
  revision: rt.revision,
149676
149906
  event,
149677
- turnStart
149907
+ turnStart,
149908
+ createdAt
149678
149909
  });
149679
- emit2(rt.chatId, { ...event, eventId: id2 });
149910
+ emit2(rt.chatId, { ...event, eventId: id2, createdAt });
149680
149911
  }
149681
149912
  function broadcastTransient(chatId, event) {
149682
- emit2(chatId, { ...event, eventId: transientId-- });
149913
+ emit2(chatId, { ...event, eventId: transientId--, createdAt: Date.now() });
149683
149914
  }
149684
149915
  function remember(def2, patch) {
149685
149916
  const prev = catalog.get(def2.id);
@@ -149747,7 +149978,11 @@ function applyLive(rt, update) {
149747
149978
  if (rt.live.modes) rt.live.modes = { ...rt.live.modes, currentModeId: update.currentModeId };
149748
149979
  break;
149749
149980
  case "usage_update":
149750
- rt.live.usage = { used: update.used, size: update.size, cost: update.cost ?? null };
149981
+ rt.live.usage = {
149982
+ used: update.used,
149983
+ size: update.size,
149984
+ cost: update.cost ?? rt.live.usage?.cost ?? null
149985
+ };
149751
149986
  break;
149752
149987
  case "session_info_update":
149753
149988
  if (update.title !== void 0) {
@@ -149773,6 +150008,10 @@ function routeUpdate(rt, notification) {
149773
150008
  }
149774
150009
  const update = notification.update;
149775
150010
  applyLive(rt, update);
150011
+ if (!rt.attaching) {
150012
+ rt.work.observeUpdate(update, rt.inTurn);
150013
+ agentActive(rt);
150014
+ }
149776
150015
  if (rt.routing === "drop") return;
149777
150016
  if (update.sessionUpdate === "user_message_chunk") {
149778
150017
  if (rt.inTurn) return;
@@ -149805,7 +150044,7 @@ function openRequest(rt, signal, make, onCancel) {
149805
150044
  return requestId;
149806
150045
  }
149807
150046
  function requestPermission(rt, request, signal) {
149808
- return new Promise((resolve12) => {
150047
+ return new Promise((resolve13) => {
149809
150048
  const requestId = openRequest(
149810
150049
  rt,
149811
150050
  signal,
@@ -149813,10 +150052,10 @@ function requestPermission(rt, request, signal) {
149813
150052
  optionIds: request.options.map((o) => o.optionId),
149814
150053
  permission: (optionId) => {
149815
150054
  done(optionId ?? "cancelled");
149816
- resolve12(optionId ? { outcome: "selected", optionId } : { outcome: "cancelled" });
150055
+ resolve13(optionId ? { outcome: "selected", optionId } : { outcome: "cancelled" });
149817
150056
  }
149818
150057
  }),
149819
- () => resolve12({ outcome: "cancelled" })
150058
+ () => resolve13({ outcome: "cancelled" })
149820
150059
  );
149821
150060
  record2(rt, { type: "permission", requestId, request });
149822
150061
  pendingObserver?.(rt.chatId, rt.workspaceId);
@@ -149824,17 +150063,17 @@ function requestPermission(rt, request, signal) {
149824
150063
  }
149825
150064
  function requestElicitation(rt, request, signal) {
149826
150065
  if (request.mode !== "form") return Promise.resolve({ action: "decline" });
149827
- return new Promise((resolve12) => {
150066
+ return new Promise((resolve13) => {
149828
150067
  const requestId = openRequest(
149829
150068
  rt,
149830
150069
  signal,
149831
150070
  (done) => ({
149832
150071
  elicitation: (response) => {
149833
150072
  done(response.action);
149834
- resolve12(response);
150073
+ resolve13(response);
149835
150074
  }
149836
150075
  }),
149837
- () => resolve12({ action: "cancel" })
150076
+ () => resolve13({ action: "cancel" })
149838
150077
  );
149839
150078
  record2(rt, { type: "elicitation", requestId, request });
149840
150079
  pendingObserver?.(rt.chatId, rt.workspaceId);
@@ -149843,6 +150082,11 @@ function requestElicitation(rt, request, signal) {
149843
150082
  function handlersFor(rt, generation) {
149844
150083
  return {
149845
150084
  onUpdate: (n) => routeUpdate(rt, n),
150085
+ onAsyncTask: (n) => {
150086
+ if (n.sessionId !== rt.sessionId || rt.attaching) return;
150087
+ rt.work.observeAsyncTask(n.update);
150088
+ agentActive(rt);
150089
+ },
149846
150090
  onPermission: (req, signal) => requestPermission(rt, req, signal),
149847
150091
  onElicitation: (req, signal) => requestElicitation(rt, req, signal),
149848
150092
  onExit: (code, stderr) => {
@@ -149850,6 +150094,7 @@ function handlersFor(rt, generation) {
149850
150094
  log31.info({ chatId: rt.chatId, code }, "agent exited");
149851
150095
  log31.debug({ chatId: rt.chatId, stderr: stderr.slice(-500) }, "agent stderr");
149852
150096
  for (const p3 of [...rt.pending.values()]) p3.cancel();
150097
+ rt.work.clear();
149853
150098
  rt.process = null;
149854
150099
  rt.starting = null;
149855
150100
  }
@@ -150110,6 +150355,15 @@ var AgentSessionService = class {
150110
150355
  const cost = runtimes.get(chatId)?.live.usage?.cost;
150111
150356
  return cost && cost.currency === "USD" ? cost.amount : void 0;
150112
150357
  }
150358
+ /** The session's cumulative cost in USD so far: the agent's own figure
150359
+ * when it reports one, else Band's estimate from the last finished turn.
150360
+ * The next turn's estimate builds on it. */
150361
+ sessionCostUsd(chatId) {
150362
+ const reported = this.reportedCost(chatId);
150363
+ if (reported !== void 0) return reported;
150364
+ const sessionId = chatService.get(chatId)?.activeSessionId;
150365
+ return sessionId ? sessionCost(sessionId) : null;
150366
+ }
150113
150367
  /** Runs one prompt turn on the attached session. */
150114
150368
  async prompt(chatId, blocks) {
150115
150369
  const rt = runtimes.get(chatId);
@@ -150309,11 +150563,7 @@ var AgentSessionService = class {
150309
150563
  const rt = runtimes.get(chatId);
150310
150564
  const sessionId = chat.activeSessionId;
150311
150565
  if (rt?.process?.alive && rt.sessionId && rt.sessionId === sessionId) {
150312
- return {
150313
- source: "live",
150314
- ...rt.live,
150315
- costUsd: this.reportedCost(chatId) ?? sessionCost(sessionId)
150316
- };
150566
+ return { source: "live", ...rt.live };
150317
150567
  }
150318
150568
  const revision = sessionId ? events.currentRevision(sessionId) : 0;
150319
150569
  if (sessionId && revision > 0) {
@@ -150335,7 +150585,6 @@ var AgentSessionService = class {
150335
150585
  models: base3?.models ?? null,
150336
150586
  commands: commands?.type === "update" && commands.update.sessionUpdate === "available_commands_update" ? commands.update.availableCommands : catalog.get(def2.id)?.commands ?? [],
150337
150587
  usage: usageUpdate,
150338
- costUsd: usageUpdate?.cost?.currency === "USD" ? usageUpdate.cost.amount : sessionCost(sessionId),
150339
150588
  title: info?.type === "update" && info.update.sessionUpdate === "session_info_update" ? info.update.title ?? null : null
150340
150589
  };
150341
150590
  }
@@ -150355,7 +150604,6 @@ var AgentSessionService = class {
150355
150604
  models: models && modelChoice && models.availableModels.some((m3) => m3.modelId === modelChoice) ? { ...models, currentModelId: modelChoice } : models,
150356
150605
  commands: cached2?.commands ?? [],
150357
150606
  usage: null,
150358
- costUsd: null,
150359
150607
  title: null
150360
150608
  };
150361
150609
  }
@@ -150537,13 +150785,13 @@ var AgentSessionService = class {
150537
150785
  }
150538
150786
  }
150539
150787
  };
150788
+ var agentSessionService = new AgentSessionService();
150540
150789
  function sessionCost(sessionId) {
150541
150790
  const revision = events.currentRevision(sessionId);
150542
150791
  if (revision === 0) return null;
150543
150792
  const row = events.latest(sessionId, revision, { kind: "turn-ended" });
150544
150793
  return row?.event.type === "turn-ended" ? row.event.usage?.costUsd ?? null : null;
150545
150794
  }
150546
- var agentSessionService = new AgentSessionService();
150547
150795
 
150548
150796
  // src/shared/chat-events.ts
150549
150797
  var HISTORY_PAGE_SIZE = 20;
@@ -150761,10 +151009,10 @@ async function saveUploadedFilesDetailed(fileParts) {
150761
151009
  // src/api/chat-submit.ts
150762
151010
  var log33 = createLogger("chat-submit");
150763
151011
  function readBody(req) {
150764
- return new Promise((resolve12, reject) => {
151012
+ return new Promise((resolve13, reject) => {
150765
151013
  const chunks = [];
150766
151014
  req.on("data", (chunk) => chunks.push(chunk));
150767
- req.on("end", () => resolve12(Buffer.concat(chunks).toString("utf-8")));
151015
+ req.on("end", () => resolve13(Buffer.concat(chunks).toString("utf-8")));
150768
151016
  req.on("error", reject);
150769
151017
  });
150770
151018
  }
@@ -150809,7 +151057,7 @@ async function handleChatSubmit(req, res, chatId) {
150809
151057
  }));
150810
151058
  }
150811
151059
  try {
150812
- taskService.submitTask({
151060
+ const result = taskService.submitOrQueueTask({
150813
151061
  workspaceId: workspaceId2,
150814
151062
  chatId,
150815
151063
  prompt: text3,
@@ -150819,18 +151067,12 @@ async function handleChatSubmit(req, res, chatId) {
150819
151067
  model,
150820
151068
  codingAgentId
150821
151069
  });
150822
- log33.info({ chatId, workspaceId: workspaceId2 }, "chat-submit: task started");
150823
- sendJson2(res, 200, { ok: true, queued: false });
151070
+ log33.info(
151071
+ { chatId, workspaceId: workspaceId2 },
151072
+ result.queued ? "chat-submit: chat busy, message queued" : "chat-submit: task started"
151073
+ );
151074
+ sendJson2(res, 200, { ok: true, queued: result.queued });
150824
151075
  } catch (err) {
150825
- if (err instanceof TaskConflictError) {
150826
- pushQueuedMessage(chatId, {
150827
- text: text3,
150828
- ...attachments.length > 0 && { files: attachments }
150829
- });
150830
- log33.info({ chatId, workspaceId: workspaceId2 }, "chat-submit: task busy, message queued");
150831
- sendJson2(res, 200, { ok: true, queued: true });
150832
- return;
150833
- }
150834
151076
  if (err instanceof WorkspaceNotFoundError) {
150835
151077
  sendJson2(res, 404, { error: err.message });
150836
151078
  return;
@@ -154394,7 +154636,7 @@ var Protocol = class {
154394
154636
  return;
154395
154637
  }
154396
154638
  const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3;
154397
- await new Promise((resolve12) => setTimeout(resolve12, pollInterval));
154639
+ await new Promise((resolve13) => setTimeout(resolve13, pollInterval));
154398
154640
  options2?.signal?.throwIfAborted();
154399
154641
  }
154400
154642
  } catch (error40) {
@@ -154411,7 +154653,7 @@ var Protocol = class {
154411
154653
  */
154412
154654
  request(request, resultSchema, options2) {
154413
154655
  const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options2 ?? {};
154414
- return new Promise((resolve12, reject) => {
154656
+ return new Promise((resolve13, reject) => {
154415
154657
  const earlyReject = (error40) => {
154416
154658
  reject(error40);
154417
154659
  };
@@ -154489,7 +154731,7 @@ var Protocol = class {
154489
154731
  if (!parseResult.success) {
154490
154732
  reject(parseResult.error);
154491
154733
  } else {
154492
- resolve12(parseResult.data);
154734
+ resolve13(parseResult.data);
154493
154735
  }
154494
154736
  } catch (error40) {
154495
154737
  reject(error40);
@@ -154750,12 +154992,12 @@ var Protocol = class {
154750
154992
  }
154751
154993
  } catch {
154752
154994
  }
154753
- return new Promise((resolve12, reject) => {
154995
+ return new Promise((resolve13, reject) => {
154754
154996
  if (signal.aborted) {
154755
154997
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
154756
154998
  return;
154757
154999
  }
154758
- const timeoutId = setTimeout(resolve12, interval2);
155000
+ const timeoutId = setTimeout(resolve13, interval2);
154759
155001
  signal.addEventListener("abort", () => {
154760
155002
  clearTimeout(timeoutId);
154761
155003
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
@@ -155772,7 +156014,7 @@ var McpServer = class {
155772
156014
  /**
155773
156015
  * Validates tool input arguments against the tool's input schema.
155774
156016
  */
155775
- async validateToolInput(tool, args, toolName) {
156017
+ async validateToolInput(tool, args, toolName2) {
155776
156018
  if (!tool.inputSchema) {
155777
156019
  return void 0;
155778
156020
  }
@@ -155782,14 +156024,14 @@ var McpServer = class {
155782
156024
  if (!parseResult.success) {
155783
156025
  const error40 = "error" in parseResult ? parseResult.error : "Unknown error";
155784
156026
  const errorMessage = getParseErrorMessage(error40);
155785
- throw new McpError(ErrorCode.InvalidParams, `Input validation error: Invalid arguments for tool ${toolName}: ${errorMessage}`);
156027
+ throw new McpError(ErrorCode.InvalidParams, `Input validation error: Invalid arguments for tool ${toolName2}: ${errorMessage}`);
155786
156028
  }
155787
156029
  return parseResult.data;
155788
156030
  }
155789
156031
  /**
155790
156032
  * Validates tool output against the tool's output schema.
155791
156033
  */
155792
- async validateToolOutput(tool, result, toolName) {
156034
+ async validateToolOutput(tool, result, toolName2) {
155793
156035
  if (!tool.outputSchema) {
155794
156036
  return;
155795
156037
  }
@@ -155800,14 +156042,14 @@ var McpServer = class {
155800
156042
  return;
155801
156043
  }
155802
156044
  if (!result.structuredContent) {
155803
- throw new McpError(ErrorCode.InvalidParams, `Output validation error: Tool ${toolName} has an output schema but no structured content was provided`);
156045
+ throw new McpError(ErrorCode.InvalidParams, `Output validation error: Tool ${toolName2} has an output schema but no structured content was provided`);
155804
156046
  }
155805
156047
  const outputObj = normalizeObjectSchema(tool.outputSchema);
155806
156048
  const parseResult = await safeParseAsync3(outputObj, result.structuredContent);
155807
156049
  if (!parseResult.success) {
155808
156050
  const error40 = "error" in parseResult ? parseResult.error : "Unknown error";
155809
156051
  const errorMessage = getParseErrorMessage(error40);
155810
- throw new McpError(ErrorCode.InvalidParams, `Output validation error: Invalid structured content for tool ${toolName}: ${errorMessage}`);
156052
+ throw new McpError(ErrorCode.InvalidParams, `Output validation error: Invalid structured content for tool ${toolName2}: ${errorMessage}`);
155811
156053
  }
155812
156054
  }
155813
156055
  /**
@@ -155855,7 +156097,7 @@ var McpServer = class {
155855
156097
  let task = createTaskResult.task;
155856
156098
  const pollInterval = task.pollInterval ?? 5e3;
155857
156099
  while (task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled") {
155858
- await new Promise((resolve12) => setTimeout(resolve12, pollInterval));
156100
+ await new Promise((resolve13) => setTimeout(resolve13, pollInterval));
155859
156101
  const updatedTask = await extra.taskStore.getTask(taskId);
155860
156102
  if (!updatedTask) {
155861
156103
  throw new McpError(ErrorCode.InternalError, `Task ${taskId} not found during polling`);
@@ -156894,7 +157136,7 @@ var responseViaResponseObject = async (res, outgoing, options2 = {}) => {
156894
157136
  });
156895
157137
  if (!chunk) {
156896
157138
  if (i === 1) {
156897
- await new Promise((resolve12) => setTimeout(resolve12));
157139
+ await new Promise((resolve13) => setTimeout(resolve13));
156898
157140
  maxReadCount = 3;
156899
157141
  continue;
156900
157142
  }
@@ -157394,9 +157636,9 @@ data:
157394
157636
  const initRequest = messages.find((m3) => isInitializeRequest(m3));
157395
157637
  const clientProtocolVersion = initRequest ? initRequest.params.protocolVersion : req.headers.get("mcp-protocol-version") ?? DEFAULT_NEGOTIATED_PROTOCOL_VERSION;
157396
157638
  if (this._enableJsonResponse) {
157397
- return new Promise((resolve12) => {
157639
+ return new Promise((resolve13) => {
157398
157640
  this._streamMapping.set(streamId, {
157399
- resolveJson: resolve12,
157641
+ resolveJson: resolve13,
157400
157642
  cleanup: () => {
157401
157643
  this._streamMapping.delete(streamId);
157402
157644
  }
@@ -157829,8 +158071,8 @@ async function ensureCdpTargetId(bandTabId) {
157829
158071
  };
157830
158072
  let rejectFn = () => {
157831
158073
  };
157832
- const promise2 = new Promise((resolve12, reject) => {
157833
- resolveFn = resolve12;
158074
+ const promise2 = new Promise((resolve13, reject) => {
158075
+ resolveFn = resolve13;
157834
158076
  rejectFn = reject;
157835
158077
  });
157836
158078
  const timeoutId = setTimeout(() => {
@@ -158052,14 +158294,14 @@ var browserHostRouter = t3.router({
158052
158294
  }),
158053
158295
  ensureView: publicProcedure.subscription(async function* (opts) {
158054
158296
  const queue = [];
158055
- let resolve12 = null;
158297
+ let resolve13 = null;
158056
158298
  const unsubscribe = browserHostService.onEnsureView((event) => {
158057
158299
  queue.push(event);
158058
- resolve12?.();
158300
+ resolve13?.();
158059
158301
  });
158060
158302
  opts.signal?.addEventListener("abort", () => {
158061
158303
  unsubscribe();
158062
- resolve12?.();
158304
+ resolve13?.();
158063
158305
  });
158064
158306
  try {
158065
158307
  while (!opts.signal?.aborted) {
@@ -158067,9 +158309,9 @@ var browserHostRouter = t3.router({
158067
158309
  yield queue.shift();
158068
158310
  }
158069
158311
  await new Promise((r3) => {
158070
- resolve12 = r3;
158312
+ resolve13 = r3;
158071
158313
  });
158072
- resolve12 = null;
158314
+ resolve13 = null;
158073
158315
  }
158074
158316
  } finally {
158075
158317
  unsubscribe();
@@ -158592,23 +158834,25 @@ var chatsRouter = t3.router({
158592
158834
  if (!chat) {
158593
158835
  chat = chatService.create(input.workspaceId, { id: input.chatId, name: "Chat" });
158594
158836
  }
158595
- try {
158596
- const task = taskService.submitTask({
158597
- workspaceId: chat.workspaceId,
158598
- chatId: chat.id,
158599
- prompt: input.message,
158600
- sessionId: input.sessionId
158601
- });
158602
- return { taskId: task.id, sessionId: task.sessionId };
158603
- } catch (err) {
158604
- if (err instanceof TaskConflictError) {
158605
- throw new TRPCError({
158606
- code: "CONFLICT",
158607
- message: "Task already running for this chat pane"
158608
- });
158609
- }
158610
- throw err;
158837
+ const result = taskService.submitOrQueueTask({
158838
+ workspaceId: chat.workspaceId,
158839
+ chatId: chat.id,
158840
+ prompt: input.message,
158841
+ sessionId: input.sessionId
158842
+ });
158843
+ if (result.queued) {
158844
+ return {
158845
+ queued: true,
158846
+ queuedMessageId: result.queuedMessageId,
158847
+ taskId: null,
158848
+ sessionId: null
158849
+ };
158611
158850
  }
158851
+ return {
158852
+ queued: false,
158853
+ taskId: result.task.id,
158854
+ sessionId: result.task.sessionId
158855
+ };
158612
158856
  }),
158613
158857
  stop: publicProcedure.input(external_exports2.object({ chatId: external_exports2.string() })).mutation(({ input }) => {
158614
158858
  taskService.abortTask(input.chatId);
@@ -158657,13 +158901,13 @@ import {
158657
158901
  lstatSync as lstatSync3,
158658
158902
  mkdirSync as mkdirSync6,
158659
158903
  readFileSync as readFileSync8,
158660
- realpathSync as realpathSync3,
158904
+ realpathSync as realpathSync4,
158661
158905
  symlinkSync,
158662
158906
  unlinkSync as unlinkSync4,
158663
158907
  writeFileSync as writeFileSync3
158664
158908
  } from "node:fs";
158665
158909
  import { homedir as homedir8, platform as platform2 } from "node:os";
158666
- import { basename as basename2, dirname as dirname7, join as join27, resolve as resolve5 } from "node:path";
158910
+ import { basename as basename2, dirname as dirname7, join as join27, resolve as resolve6 } from "node:path";
158667
158911
  function windowsBinDir() {
158668
158912
  const localAppData = process.env.LOCALAPPDATA || join27(homedir8(), "AppData", "Local");
158669
158913
  return join27(localAppData, "band", "bin");
@@ -158674,11 +158918,11 @@ function findCliBinaryAt(opts) {
158674
158918
  const exe = platform2() === "win32" ? "band.exe" : "band";
158675
158919
  const appsStrategies = [
158676
158920
  // cwd = apps/web/ (Vite dev and production server)
158677
- resolve5(cwd, ".."),
158921
+ resolve6(cwd, ".."),
158678
158922
  // cwd = project root (fallback)
158679
- resolve5(cwd, "apps"),
158923
+ resolve6(cwd, "apps"),
158680
158924
  // From this source file in dev (apps/web/src/server/services/ → apps/)
158681
- resolve5(dirname11, "..", "..", "..", ".."),
158925
+ resolve6(dirname11, "..", "..", "..", ".."),
158682
158926
  // From bundled `dist/` file (<Resources>/web/dist/ → <Resources>/) only
158683
158927
  // — in dev mode this resolves to `apps/web/src/`, which has no
158684
158928
  // `cli/target/<profile>/band` and is harmless; the four-level walk
@@ -158686,7 +158930,7 @@ function findCliBinaryAt(opts) {
158686
158930
  // layout under <Resources>/cli/ would still resolve. Today's Electron
158687
158931
  // bundle ships the binary under `binaries/` (handled by Strategy B),
158688
158932
  // so this strategy never hits in production either.
158689
- resolve5(dirname11, "..", "..", "..")
158933
+ resolve6(dirname11, "..", "..", "..")
158690
158934
  ];
158691
158935
  for (const appsDir of appsStrategies) {
158692
158936
  for (const profile of ["release", "debug"]) {
@@ -158700,10 +158944,10 @@ function findCliBinaryAt(opts) {
158700
158944
  }
158701
158945
  const electronCandidates = [
158702
158946
  // From cwd (<Resources>/web) → <Resources>/binaries/band
158703
- resolve5(cwd, "..", "binaries", exe),
158947
+ resolve6(cwd, "..", "binaries", exe),
158704
158948
  // From the bundled dist file (<Resources>/web/dist/start-server.mjs)
158705
158949
  // → <Resources>/binaries/band
158706
- resolve5(dirname11, "..", "..", "binaries", exe)
158950
+ resolve6(dirname11, "..", "..", "binaries", exe)
158707
158951
  ];
158708
158952
  for (const p3 of electronCandidates) {
158709
158953
  try {
@@ -158743,7 +158987,7 @@ async function checkCli() {
158743
158987
  }
158744
158988
  let target;
158745
158989
  try {
158746
- target = realpathSync3(SYMLINK_PATH);
158990
+ target = realpathSync4(SYMLINK_PATH);
158747
158991
  } catch {
158748
158992
  return "NotInstalled";
158749
158993
  }
@@ -158790,9 +159034,9 @@ function noBinaryError(env = process.env) {
158790
159034
  );
158791
159035
  }
158792
159036
  function runReg(args) {
158793
- return new Promise((resolve12) => {
159037
+ return new Promise((resolve13) => {
158794
159038
  execFile8("reg", args, { windowsHide: true }, (err, stdout) => {
158795
- resolve12(err ? "" : stdout ?? "");
159039
+ resolve13(err ? "" : stdout ?? "");
158796
159040
  });
158797
159041
  });
158798
159042
  }
@@ -158984,7 +159228,7 @@ init_dist38();
158984
159228
 
158985
159229
  // src/server/services/editor-service.ts
158986
159230
  import { realpath as realpath2, stat as stat4 } from "node:fs/promises";
158987
- import { isAbsolute as isAbsolute4, join as join29, resolve as resolve6, sep as sep4 } from "node:path";
159231
+ import { isAbsolute as isAbsolute4, join as join29, resolve as resolve7, sep as sep4 } from "node:path";
158988
159232
 
158989
159233
  // src/server/services/file-watcher.ts
158990
159234
  import { watch as fsWatch } from "node:fs";
@@ -159079,7 +159323,7 @@ function subscribeToFileChanges(workspaceId2, listener) {
159079
159323
  }
159080
159324
 
159081
159325
  // src/server/services/formatter.ts
159082
- import { existsSync as existsSync12, realpathSync as realpathSync4 } from "node:fs";
159326
+ import { existsSync as existsSync12, realpathSync as realpathSync5 } from "node:fs";
159083
159327
  import { basename as basename3, dirname as dirname8, isAbsolute as isAbsolute3, join as join28, resolve as resolvePath3 } from "node:path";
159084
159328
  import prettier from "prettier";
159085
159329
  var log37 = createLogger("formatter");
@@ -159156,17 +159400,17 @@ async function formatFile(worktreePath, filePath, content2, options2 = {}) {
159156
159400
  function isInsideWorktree(absFile, worktreePath) {
159157
159401
  let realFile;
159158
159402
  try {
159159
- realFile = realpathSync4(absFile);
159403
+ realFile = realpathSync5(absFile);
159160
159404
  } catch {
159161
159405
  try {
159162
- realFile = join28(realpathSync4(dirname8(absFile)), basename3(absFile));
159406
+ realFile = join28(realpathSync5(dirname8(absFile)), basename3(absFile));
159163
159407
  } catch {
159164
159408
  realFile = absFile;
159165
159409
  }
159166
159410
  }
159167
159411
  let realWorktree;
159168
159412
  try {
159169
- realWorktree = realpathSync4(worktreePath);
159413
+ realWorktree = realpathSync5(worktreePath);
159170
159414
  } catch {
159171
159415
  realWorktree = worktreePath;
159172
159416
  }
@@ -159293,7 +159537,7 @@ var EditorService = class {
159293
159537
  * segment-aware containment check against the canonicalized worktree root.
159294
159538
  */
159295
159539
  async resolveTarget(root, filePath) {
159296
- const absoluteTarget = isAbsolute4(filePath) ? resolve6(filePath) : resolve6(root, filePath);
159540
+ const absoluteTarget = isAbsolute4(filePath) ? resolve7(filePath) : resolve7(root, filePath);
159297
159541
  let canonicalRoot = root;
159298
159542
  try {
159299
159543
  canonicalRoot = await realpath2(root);
@@ -159750,7 +159994,7 @@ async function duBytes(path) {
159750
159994
  if (process.platform === "win32") {
159751
159995
  return duBytesNodeWalk(path);
159752
159996
  }
159753
- const stdout = await new Promise((resolve12, reject) => {
159997
+ const stdout = await new Promise((resolve13, reject) => {
159754
159998
  execFile9(
159755
159999
  "du",
159756
160000
  ["-sk", path],
@@ -159760,7 +160004,7 @@ async function duBytes(path) {
159760
160004
  reject(err);
159761
160005
  return;
159762
160006
  }
159763
- resolve12(out);
160007
+ resolve13(out);
159764
160008
  }
159765
160009
  );
159766
160010
  });
@@ -159775,7 +160019,7 @@ async function duBytes(path) {
159775
160019
  // src/server/infra/process/install.ts
159776
160020
  import { execFile as execFile10 } from "node:child_process";
159777
160021
  async function brewInstall(pkg, resolvedPath) {
159778
- await new Promise((resolve12, reject) => {
160022
+ await new Promise((resolve13, reject) => {
159779
160023
  execFile10(
159780
160024
  "brew",
159781
160025
  ["install", pkg],
@@ -159785,7 +160029,7 @@ async function brewInstall(pkg, resolvedPath) {
159785
160029
  reject(new Error(stderr || err.message));
159786
160030
  return;
159787
160031
  }
159788
- resolve12();
160032
+ resolve13();
159789
160033
  }
159790
160034
  );
159791
160035
  });
@@ -159796,10 +160040,10 @@ var DU_GLOBAL_CONCURRENCY = 8;
159796
160040
  var duInFlight = 0;
159797
160041
  var duWaiting = [];
159798
160042
  function acquireDuSlot() {
159799
- return new Promise((resolve12) => {
160043
+ return new Promise((resolve13) => {
159800
160044
  const grant = () => {
159801
160045
  duInFlight++;
159802
- resolve12(() => {
160046
+ resolve13(() => {
159803
160047
  duInFlight--;
159804
160048
  const next = duWaiting.shift();
159805
160049
  if (next) next();
@@ -160307,7 +160551,7 @@ var prereqsRouter = t3.router({
160307
160551
  // src/server/services/project-service.ts
160308
160552
  init_dist38();
160309
160553
  import { existsSync as existsSync13 } from "node:fs";
160310
- import { basename as basename4, join as join33, resolve as resolve7 } from "node:path";
160554
+ import { basename as basename4, join as join33, resolve as resolve8 } from "node:path";
160311
160555
 
160312
160556
  // src/server/services/project-avatar-service.ts
160313
160557
  import { mkdir as mkdir4, readFile as readFile5, rename as rename2, writeFile as writeFile4 } from "node:fs/promises";
@@ -160606,7 +160850,7 @@ var ProjectService = class {
160606
160850
  * `git init` checkbox. Read-only — never touches state.
160607
160851
  */
160608
160852
  checkPath(path) {
160609
- const resolvedPath = resolve7(path);
160853
+ const resolvedPath = resolve8(path);
160610
160854
  const isGitRepo = existsSync13(join33(resolvedPath, ".git"));
160611
160855
  return { isGitRepo };
160612
160856
  }
@@ -160616,7 +160860,7 @@ var ProjectService = class {
160616
160860
  * features at the same time as registering the project.
160617
160861
  */
160618
160862
  async gitInit(path) {
160619
- const resolvedPath = resolve7(path);
160863
+ const resolvedPath = resolve8(path);
160620
160864
  await this.git.init(resolvedPath);
160621
160865
  }
160622
160866
  /**
@@ -160642,7 +160886,7 @@ var ProjectService = class {
160642
160886
  );
160643
160887
  }
160644
160888
  }
160645
- const resolvedPath = resolve7(path);
160889
+ const resolvedPath = resolve8(path);
160646
160890
  const kind = existsSync13(join33(resolvedPath, ".git")) ? "git" : "plain";
160647
160891
  let defaultBranch = "main";
160648
160892
  let worktrees2 = [];
@@ -160822,8 +161066,8 @@ var projectsRouter = t3.router({
160822
161066
  });
160823
161067
 
160824
161068
  // src/server/api/queue/router.ts
160825
- import { realpathSync as realpathSync5 } from "node:fs";
160826
- import { join as join34, resolve as resolve8, sep as sep5 } from "node:path";
161069
+ import { realpathSync as realpathSync6 } from "node:fs";
161070
+ import { join as join34, resolve as resolve9, sep as sep5 } from "node:path";
160827
161071
  var log40 = createLogger("trpc.queue");
160828
161072
  var queuedFileSchema = external_exports2.object({
160829
161073
  mediaType: external_exports2.string(),
@@ -160833,14 +161077,14 @@ var queuedFileSchema = external_exports2.object({
160833
161077
  });
160834
161078
  function isPathWithinUploadDir(p3) {
160835
161079
  const uploadDir = join34(bandHome(), "uploads");
160836
- const normalized2 = resolve8(p3);
161080
+ const normalized2 = resolve9(p3);
160837
161081
  if (normalized2 !== uploadDir && !normalized2.startsWith(uploadDir + sep5)) {
160838
161082
  return false;
160839
161083
  }
160840
161084
  try {
160841
- const canonicalUploadDir = realpathSync5(uploadDir);
160842
- const canonicalPath = realpathSync5(p3);
160843
- return canonicalPath === canonicalUploadDir || canonicalPath.startsWith(canonicalUploadDir + sep5);
161085
+ const canonicalUploadDir = realpathSync6(uploadDir);
161086
+ const canonicalPath2 = realpathSync6(p3);
161087
+ return canonicalPath2 === canonicalUploadDir || canonicalPath2.startsWith(canonicalUploadDir + sep5);
160844
161088
  } catch {
160845
161089
  return true;
160846
161090
  }
@@ -161015,15 +161259,15 @@ var queueRouter = t3.router({
161015
161259
  stream: publicProcedure.input(external_exports2.object({ workspaceId: external_exports2.string(), chatId: external_exports2.string().optional() })).subscription(async function* (opts) {
161016
161260
  const chatId = opts.input.chatId ?? chatService.getOrCreateDefault(opts.input.workspaceId).id;
161017
161261
  const queue = [];
161018
- let resolve12 = null;
161262
+ let resolve13 = null;
161019
161263
  const unsubscribe = subscribeQueue((id2, messages) => {
161020
161264
  if (id2 !== chatId) return;
161021
161265
  queue.push({ messages });
161022
- resolve12?.();
161266
+ resolve13?.();
161023
161267
  });
161024
161268
  opts.signal?.addEventListener("abort", () => {
161025
161269
  unsubscribe();
161026
- resolve12?.();
161270
+ resolve13?.();
161027
161271
  });
161028
161272
  yield { messages: toWireQueuedMessages(getQueuedMessages(chatId)) };
161029
161273
  queue.length = 0;
@@ -161034,9 +161278,9 @@ var queueRouter = t3.router({
161034
161278
  yield { messages: toWireQueuedMessages(update.messages) };
161035
161279
  }
161036
161280
  await new Promise((r3) => {
161037
- resolve12 = r3;
161281
+ resolve13 = r3;
161038
161282
  });
161039
- resolve12 = null;
161283
+ resolve13 = null;
161040
161284
  }
161041
161285
  } finally {
161042
161286
  unsubscribe();
@@ -161090,7 +161334,7 @@ var USAGE_SCAN_INTERVAL_MS = 5 * 60 * 1e3;
161090
161334
  var MAX_SESSIONS_PER_TICK = 100;
161091
161335
  var EPOCH_SENTINEL = 0;
161092
161336
  function yieldToEventLoop2() {
161093
- return new Promise((resolve12) => setImmediate(resolve12));
161337
+ return new Promise((resolve13) => setImmediate(resolve13));
161094
161338
  }
161095
161339
  var UsageScannerService = class {
161096
161340
  usageEvents;
@@ -161697,14 +161941,14 @@ var statusesRouter = t3.router({
161697
161941
  var statusRouter = t3.router({
161698
161942
  stream: publicProcedure.subscription(async function* (opts) {
161699
161943
  const queue = [];
161700
- let resolve12 = null;
161944
+ let resolve13 = null;
161701
161945
  const unsubscribe = watcherService.subscribe((event) => {
161702
161946
  queue.push(event);
161703
- resolve12?.();
161947
+ resolve13?.();
161704
161948
  });
161705
161949
  opts.signal?.addEventListener("abort", () => {
161706
161950
  unsubscribe();
161707
- resolve12?.();
161951
+ resolve13?.();
161708
161952
  });
161709
161953
  try {
161710
161954
  while (!opts.signal?.aborted) {
@@ -161712,9 +161956,9 @@ var statusRouter = t3.router({
161712
161956
  yield queue.shift();
161713
161957
  }
161714
161958
  await new Promise((r3) => {
161715
- resolve12 = r3;
161959
+ resolve13 = r3;
161716
161960
  });
161717
- resolve12 = null;
161961
+ resolve13 = null;
161718
161962
  }
161719
161963
  } finally {
161720
161964
  unsubscribe();
@@ -161761,7 +162005,7 @@ var TunnelClient = class _TunnelClient {
161761
162005
  const nullDevice = process.platform === "win32" ? "NUL" : "/dev/null";
161762
162006
  const args = ["tunnel", "--config", nullDevice, "--url", `http://localhost:${options2.port}`];
161763
162007
  log44.debug("spawning cloudflared %s", args.join(" "));
161764
- return new Promise((resolve12, reject) => {
162008
+ return new Promise((resolve13, reject) => {
161765
162009
  const child = spawn4("cloudflared", args, {
161766
162010
  env: { ...process.env, PATH: resolvedPath },
161767
162011
  stdio: ["ignore", "pipe", "pipe"]
@@ -161783,7 +162027,7 @@ var TunnelClient = class _TunnelClient {
161783
162027
  emit({ kind: "tunnel-url", url: this.tunnelUrl });
161784
162028
  if (!settled) {
161785
162029
  settled = true;
161786
- resolve12();
162030
+ resolve13();
161787
162031
  }
161788
162032
  }
161789
162033
  }
@@ -161815,7 +162059,7 @@ var TunnelClient = class _TunnelClient {
161815
162059
  new Error(`cloudflared exited with code ${code}: ${stderrChunks.join("").trim()}`)
161816
162060
  );
161817
162061
  } else {
161818
- resolve12();
162062
+ resolve13();
161819
162063
  }
161820
162064
  } else if (wasRunning && code !== 0) {
161821
162065
  emit({
@@ -161828,7 +162072,7 @@ var TunnelClient = class _TunnelClient {
161828
162072
  if (!settled) {
161829
162073
  log44.debug("30s timeout reached, resolving without URL");
161830
162074
  settled = true;
161831
- resolve12();
162075
+ resolve13();
161832
162076
  }
161833
162077
  }, 3e4);
161834
162078
  });
@@ -162113,7 +162357,7 @@ var tasksRouter = t3.router({
162113
162357
  }));
162114
162358
  }
162115
162359
  try {
162116
- const task = taskService.submitTask({
162360
+ const result = taskService.submitOrQueueTask({
162117
162361
  workspaceId: input.workspaceId,
162118
162362
  chatId,
162119
162363
  prompt: input.prompt,
@@ -162123,7 +162367,19 @@ var tasksRouter = t3.router({
162123
162367
  model: input.model,
162124
162368
  codingAgentId: input.codingAgentId
162125
162369
  });
162370
+ if (result.queued) {
162371
+ return {
162372
+ queued: true,
162373
+ id: null,
162374
+ queuedMessageId: result.queuedMessageId,
162375
+ workspaceId: input.workspaceId,
162376
+ chatId,
162377
+ sessionId: null
162378
+ };
162379
+ }
162380
+ const { task } = result;
162126
162381
  return {
162382
+ queued: false,
162127
162383
  id: task.id,
162128
162384
  workspaceId: task.workspaceId,
162129
162385
  chatId: task.chatId,
@@ -162332,7 +162588,7 @@ init_dist38();
162332
162588
  // src/server/services/diff-service.ts
162333
162589
  import { existsSync as existsSync14 } from "node:fs";
162334
162590
  import { readFile as readFile6, rm as rm3, stat as stat6 } from "node:fs/promises";
162335
- import { join as join35, resolve as resolve9, sep as sep6 } from "node:path";
162591
+ import { join as join35, resolve as resolve10, sep as sep6 } from "node:path";
162336
162592
  var log48 = createLogger("diff-service");
162337
162593
  var EMPTY_TREE_ARGS = ["hash-object", "-t", "tree", "/dev/null"];
162338
162594
  var DEFAULT_BRANCH_LIMIT = 50;
@@ -162429,7 +162685,7 @@ function parseFileStatuses(nameStatusOutput) {
162429
162685
  return fileStatuses;
162430
162686
  }
162431
162687
  function assertWorktreeRelative(cwd, filePath) {
162432
- const target = resolve9(join35(cwd, filePath));
162688
+ const target = resolve10(join35(cwd, filePath));
162433
162689
  if (target !== cwd && !target.startsWith(cwd + sep6)) {
162434
162690
  throw new Error("Invalid path");
162435
162691
  }
@@ -162961,7 +163217,7 @@ var diffService = new DiffService();
162961
163217
  // src/server/services/files-service.ts
162962
163218
  import { existsSync as existsSync15 } from "node:fs";
162963
163219
  import { cp, mkdir as mkdir5, readdir as readdir4, readFile as readFile7, rename as rename3, rm as rm4, stat as stat7, writeFile as writeFile5 } from "node:fs/promises";
162964
- import { dirname as dirname10, extname as extname3, join as join36, resolve as resolve10, sep as sep7 } from "node:path";
163220
+ import { dirname as dirname10, extname as extname3, join as join36, resolve as resolve11, sep as sep7 } from "node:path";
162965
163221
  var MAX_FILE_SIZE2 = 1024 * 1024;
162966
163222
  var LANG_MAP2 = {
162967
163223
  ".js": "javascript",
@@ -163009,7 +163265,7 @@ var FilesService = class {
163009
163265
  throw new WorkspaceNotFoundError(workspaceId2);
163010
163266
  }
163011
163267
  const root = workspace.worktree.path;
163012
- const target = resolve10(join36(root, relative2));
163268
+ const target = resolve11(join36(root, relative2));
163013
163269
  const insideRoot = target === root || target.startsWith(root + sep7);
163014
163270
  if (!insideRoot) {
163015
163271
  throw new Error("Invalid path");
@@ -163463,8 +163719,8 @@ function createIterator(options2) {
163463
163719
  }
163464
163720
  if (error40) throw error40;
163465
163721
  if (done) return { value: void 0, done: true };
163466
- await new Promise((resolve12) => {
163467
- notify2 = resolve12;
163722
+ await new Promise((resolve13) => {
163723
+ notify2 = resolve13;
163468
163724
  });
163469
163725
  }
163470
163726
  },
@@ -163497,7 +163753,7 @@ function listFiles2(cwd) {
163497
163753
  "-g",
163498
163754
  "!**/.DS_Store"
163499
163755
  ];
163500
- return new Promise((resolve12, reject) => {
163756
+ return new Promise((resolve13, reject) => {
163501
163757
  execFile11(
163502
163758
  rgPath,
163503
163759
  args,
@@ -163508,7 +163764,7 @@ function listFiles2(cwd) {
163508
163764
  return;
163509
163765
  }
163510
163766
  const files = stdout.split("\n").filter(Boolean);
163511
- resolve12(files);
163767
+ resolve13(files);
163512
163768
  }
163513
163769
  );
163514
163770
  });
@@ -164356,7 +164612,7 @@ function basicMatch(query) {
164356
164612
  }
164357
164613
  var isNode2 = typeof __require !== "undefined" && typeof window === "undefined";
164358
164614
  function asyncMatcher(token, len, iter2, onFinish) {
164359
- return new Promise((resolve12, reject) => {
164615
+ return new Promise((resolve13, reject) => {
164360
164616
  const INCREMENT = 1e3;
164361
164617
  let i = 0, end = Math.min(INCREMENT, len);
164362
164618
  const step = () => {
@@ -164369,7 +164625,7 @@ function asyncMatcher(token, len, iter2, onFinish) {
164369
164625
  end = Math.min(end + INCREMENT, len);
164370
164626
  isNode2 ? setImmediate(step) : setTimeout(step);
164371
164627
  } else {
164372
- resolve12(onFinish());
164628
+ resolve13(onFinish());
164373
164629
  }
164374
164630
  };
164375
164631
  step();
@@ -164637,7 +164893,7 @@ var workspaceRouter = t3.router({
164637
164893
  }
164638
164894
  const signal = opts.signal;
164639
164895
  const queue = [];
164640
- let resolve12 = null;
164896
+ let resolve13 = null;
164641
164897
  let watcherClosed = false;
164642
164898
  const unsubscribe = editorService.subscribeToFileChanges(opts.input.workspaceId, (path) => {
164643
164899
  if (path === null) {
@@ -164645,9 +164901,9 @@ var workspaceRouter = t3.router({
164645
164901
  } else {
164646
164902
  queue.push({ path });
164647
164903
  }
164648
- resolve12?.();
164904
+ resolve13?.();
164649
164905
  });
164650
- const onAbort = () => resolve12?.();
164906
+ const onAbort = () => resolve13?.();
164651
164907
  signal.addEventListener("abort", onAbort);
164652
164908
  try {
164653
164909
  while (!signal.aborted && !watcherClosed) {
@@ -164656,10 +164912,10 @@ var workspaceRouter = t3.router({
164656
164912
  }
164657
164913
  if (signal.aborted || watcherClosed) break;
164658
164914
  await new Promise((r3) => {
164659
- resolve12 = r3;
164915
+ resolve13 = r3;
164660
164916
  if (signal.aborted || watcherClosed) r3();
164661
164917
  });
164662
- resolve12 = null;
164918
+ resolve13 = null;
164663
164919
  }
164664
164920
  } finally {
164665
164921
  signal.removeEventListener("abort", onAbort);
@@ -164958,10 +165214,10 @@ function discoverProcedures() {
164958
165214
  for (const [path, procedure] of Object.entries(procRecord)) {
164959
165215
  const type = procedure._def.type;
164960
165216
  if (type === "subscription") continue;
164961
- const toolName = `band_${path.replace(/\./g, "_")}`;
165217
+ const toolName2 = `band_${path.replace(/\./g, "_")}`;
164962
165218
  const inputs = procedure._def.inputs;
164963
165219
  const inputSchema = inputs.length > 0 ? inputs[0] : void 0;
164964
- procedures.push({ path, toolName, type, inputSchema });
165220
+ procedures.push({ path, toolName: toolName2, type, inputSchema });
164965
165221
  }
164966
165222
  return procedures;
164967
165223
  }
@@ -165167,9 +165423,9 @@ function createInbox(ws) {
165167
165423
  if (handler) {
165168
165424
  handler(message);
165169
165425
  } else if (waiter) {
165170
- const resolve12 = waiter;
165426
+ const resolve13 = waiter;
165171
165427
  waiter = null;
165172
- resolve12(message);
165428
+ resolve13(message);
165173
165429
  } else {
165174
165430
  queue.push(message);
165175
165431
  }
@@ -165187,8 +165443,8 @@ function createInbox(ws) {
165187
165443
  const queued = queue.shift();
165188
165444
  if (queued !== void 0) return Promise.resolve(queued);
165189
165445
  if (closed) return Promise.resolve(null);
165190
- return new Promise((resolve12) => {
165191
- waiter = resolve12;
165446
+ return new Promise((resolve13) => {
165447
+ waiter = resolve13;
165192
165448
  });
165193
165449
  },
165194
165450
  listen(next) {
@@ -165511,7 +165767,7 @@ var CdpUnreachableError = class extends Error {
165511
165767
  async function captureSnapshot(bandTabId) {
165512
165768
  const cdpTargetId = await ensureCdpTargetId(bandTabId);
165513
165769
  const wsUrl = `ws://${DESKTOP_CDP_HOST}:${DESKTOP_CDP_PORT}/devtools/page/${encodeURIComponent(cdpTargetId)}`;
165514
- return await new Promise((resolve12, reject) => {
165770
+ return await new Promise((resolve13, reject) => {
165515
165771
  const ws = new wrapper_default(wsUrl);
165516
165772
  let nextId2 = 1;
165517
165773
  let settled = false;
@@ -165523,7 +165779,7 @@ async function captureSnapshot(bandTabId) {
165523
165779
  } catch {
165524
165780
  }
165525
165781
  if (err) reject(err);
165526
- else if (data2) resolve12(data2);
165782
+ else if (data2) resolve13(data2);
165527
165783
  else reject(new Error("captureSnapshot: no data and no error"));
165528
165784
  };
165529
165785
  const timeout = setTimeout(() => {
@@ -165786,14 +166042,14 @@ function createTerminalBackend(serverRoot, bandHome2) {
165786
166042
  async function listenWithFallback(server, startPort, attempts = 20) {
165787
166043
  for (let port = startPort; port < startPort + attempts; port++) {
165788
166044
  try {
165789
- await new Promise((resolve12, reject) => {
166045
+ await new Promise((resolve13, reject) => {
165790
166046
  const onError = (err) => {
165791
166047
  server.removeListener("listening", onListening);
165792
166048
  reject(err);
165793
166049
  };
165794
166050
  const onListening = () => {
165795
166051
  server.removeListener("error", onError);
165796
- resolve12();
166052
+ resolve13();
165797
166053
  };
165798
166054
  server.once("error", onError);
165799
166055
  server.once("listening", onListening);
@@ -165842,7 +166098,7 @@ async function findBandBinary() {
165842
166098
  return findCliBinary();
165843
166099
  }
165844
166100
  async function runBandSkillsInstall(bandPath, home) {
165845
- return new Promise((resolve12, reject) => {
166101
+ return new Promise((resolve13, reject) => {
165846
166102
  execFile12(
165847
166103
  bandPath,
165848
166104
  ["--output", "json", "skills", "install", "--home", home],
@@ -165853,7 +166109,7 @@ async function runBandSkillsInstall(bandPath, home) {
165853
166109
  reject(new Error(detail ? `${err.message}: ${detail}` : err.message));
165854
166110
  return;
165855
166111
  }
165856
- resolve12(stdout.toString());
166112
+ resolve13(stdout.toString());
165857
166113
  }
165858
166114
  );
165859
166115
  });
@@ -166214,7 +166470,7 @@ function serveWorkspaceFile(res, workspaceId2, rawPath) {
166214
166470
  return;
166215
166471
  }
166216
166472
  const root = workspace.worktree.path;
166217
- const target = resolve11(join39(root, rawPath));
166473
+ const target = resolve12(join39(root, rawPath));
166218
166474
  if (!target.startsWith(root + sep8) && target !== root) {
166219
166475
  res.writeHead(400);
166220
166476
  res.end("Bad request");
@@ -166250,7 +166506,7 @@ async function nodeRequestToWeb(req) {
166250
166506
  let body;
166251
166507
  if (req.method !== "GET" && req.method !== "HEAD") {
166252
166508
  const MAX_REQUEST_BODY_BYTES = 100 * 1024 * 1024;
166253
- body = await new Promise((resolve12, reject) => {
166509
+ body = await new Promise((resolve13, reject) => {
166254
166510
  const chunks = [];
166255
166511
  let bytesSoFar = 0;
166256
166512
  req.on("data", (chunk) => {
@@ -166262,7 +166518,7 @@ async function nodeRequestToWeb(req) {
166262
166518
  }
166263
166519
  chunks.push(chunk);
166264
166520
  });
166265
- req.on("end", () => resolve12(Buffer.concat(chunks)));
166521
+ req.on("end", () => resolve13(Buffer.concat(chunks)));
166266
166522
  req.on("error", reject);
166267
166523
  });
166268
166524
  }
@@ -166296,10 +166552,10 @@ function pipeWebResponseToNodeRes(response, res) {
166296
166552
  break;
166297
166553
  }
166298
166554
  if (!res.write(value)) {
166299
- await new Promise((resolve12, reject) => {
166555
+ await new Promise((resolve13, reject) => {
166300
166556
  const onDrain = () => {
166301
166557
  res.removeListener("error", onError);
166302
- resolve12();
166558
+ resolve13();
166303
166559
  };
166304
166560
  const onError = (err) => {
166305
166561
  res.removeListener("drain", onDrain);
@@ -166649,8 +166905,8 @@ async function main() {
166649
166905
  });
166650
166906
  });
166651
166907
  let phaseBStarted;
166652
- const phaseBSettlePromise = new Promise((resolve12) => {
166653
- phaseBStarted = resolve12;
166908
+ const phaseBSettlePromise = new Promise((resolve13) => {
166909
+ phaseBStarted = resolve13;
166654
166910
  });
166655
166911
  let boundPort;
166656
166912
  try {
@@ -166723,7 +166979,7 @@ Failed to bind any port in ${initialPort}..${initialPort + 19}:
166723
166979
  killAllServers();
166724
166980
  await Promise.race([
166725
166981
  phaseBSettlePromise,
166726
- new Promise((resolve12) => setTimeout(resolve12, 5e3).unref())
166982
+ new Promise((resolve13) => setTimeout(resolve13, 5e3).unref())
166727
166983
  ]);
166728
166984
  await tunnelService.stop().catch(() => {
166729
166985
  });