@band-app/server 0.22.0 → 0.23.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 (161) hide show
  1. package/dist/client/assets/DockviewBrowserContainer-c5TBCFK6.js +5 -0
  2. package/dist/client/assets/DockviewTerminalContainer-De1DHQ5S.js +2 -0
  3. package/dist/client/assets/{TerminalPanel-C4ZPrnFP.js → TerminalPanel-DR6CDpEJ.js} +3 -3
  4. package/dist/client/assets/{_basePickBy-iyhrrxG-.js → _basePickBy-DjS8T81h.js} +1 -1
  5. package/dist/client/assets/{_baseUniq-B1WwbMDv.js → _baseUniq-BoA3Q22r.js} +1 -1
  6. package/dist/client/assets/{arc-DjqQ6qnK.js → arc-DzFH-F6i.js} +1 -1
  7. package/dist/client/assets/{architectureDiagram-VXUJARFQ-C03XQiLa.js → architectureDiagram-VXUJARFQ-DpWdRDqh.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-VD42YOAC-Zzrf5xcb.js → blockDiagram-VD42YOAC-In-FvNuA.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-YG6GDRKO-BYA4DXcg.js → c4Diagram-YG6GDRKO-uWim35od.js} +1 -1
  10. package/dist/client/assets/channel-BwZLW4yW.js +1 -0
  11. package/dist/client/assets/{chunk-4BX2VUAB-CPD6ENUL.js → chunk-4BX2VUAB-uNqF21Qn.js} +1 -1
  12. package/dist/client/assets/{chunk-55IACEB6-CrLS-6CW.js → chunk-55IACEB6-BEB0DppO.js} +1 -1
  13. package/dist/client/assets/{chunk-B4BG7PRW-CgpQP0mz.js → chunk-B4BG7PRW-Csf_UWBG.js} +1 -1
  14. package/dist/client/assets/{chunk-DI55MBZ5-IOlh3km5.js → chunk-DI55MBZ5-ehQAiitH.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-DFsVS8Jr.js → chunk-FMBD7UC4-Ddw3wom4.js} +1 -1
  16. package/dist/client/assets/{chunk-QN33PNHL-CmVDL9Gh.js → chunk-QN33PNHL-ICAdKyID.js} +1 -1
  17. package/dist/client/assets/{chunk-QZHKN3VN-B_Cnx6JN.js → chunk-QZHKN3VN-CWKRx0Nc.js} +1 -1
  18. package/dist/client/assets/{chunk-TZMSLE5B-DQbyM2Dh.js → chunk-TZMSLE5B-DEAJFNe9.js} +1 -1
  19. package/dist/client/assets/classDiagram-2ON5EDUG-CVjdMCqG.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CVjdMCqG.js +1 -0
  21. package/dist/client/assets/clone-Dj_6A90e.js +1 -0
  22. package/dist/client/assets/{cose-bilkent-S5V4N54A-CTHDgB6u.js → cose-bilkent-S5V4N54A-CbS4okPK.js} +1 -1
  23. package/dist/client/assets/{dagre-6UL2VRFP-UZkfCyUE.js → dagre-6UL2VRFP-BsLKz8AK.js} +1 -1
  24. package/dist/client/assets/{diagram-PSM6KHXK-DAlkSZ2c.js → diagram-PSM6KHXK-M6PnJuei.js} +1 -1
  25. package/dist/client/assets/{diagram-QEK2KX5R-CazlpGGg.js → diagram-QEK2KX5R-B__5YbI4.js} +1 -1
  26. package/dist/client/assets/{diagram-S2PKOQOG-COwMJUec.js → diagram-S2PKOQOG-DKHL_M-B.js} +1 -1
  27. package/dist/client/assets/{erDiagram-Q2GNP2WA-CXZvqia8.js → erDiagram-Q2GNP2WA-BfFW0JbE.js} +1 -1
  28. package/dist/client/assets/{flowDiagram-NV44I4VS-DA3lEpzG.js → flowDiagram-NV44I4VS-DjhRrkWq.js} +1 -1
  29. package/dist/client/assets/{ganttDiagram-JELNMOA3-BWRgS4MP.js → ganttDiagram-JELNMOA3-COYeUCef.js} +1 -1
  30. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-7FizCSrq.js → gitGraphDiagram-V2S2FVAM-BxnB-BVL.js} +1 -1
  31. package/dist/client/assets/{graph-4L_GoTFH.js → graph-B6AmaXta.js} +1 -1
  32. package/dist/client/assets/{highlighted-body-B3W2YXNL-ydRS8Ic9.js → highlighted-body-B3W2YXNL-wXSbO2Nz.js} +1 -1
  33. package/dist/client/assets/{index-CPC-pCRk.js → index-B-xrNHzx.js} +1 -1
  34. package/dist/client/assets/{index-Bs4eGT35.js → index-BR4JJgox.js} +1 -1
  35. package/dist/client/assets/{index-BgKMJy37.js → index-B_tLkjtQ.js} +1 -1
  36. package/dist/client/assets/{index-B8VQmYG-.js → index-Bu4tJzS5.js} +1 -1
  37. package/dist/client/assets/{index-DTonRA2E.js → index-C5FWnSNO.js} +1 -1
  38. package/dist/client/assets/{index-Csd34_1g.js → index-C9my7XIp.js} +1 -1
  39. package/dist/client/assets/{index-D2ogHyak.js → index-CFh_QYgy.js} +1 -1
  40. package/dist/client/assets/{index-DJqbRWRD.js → index-CXAmq9J9.js} +1 -1
  41. package/dist/client/assets/{index--PCwWsYS.js → index-DKFuGU2w.js} +1 -1
  42. package/dist/client/assets/{index-Cp1FqGEW.js → index-DOipD6Mc.js} +1 -1
  43. package/dist/client/assets/{index-C6FACjGj.js → index-DPAcHZUY.js} +1 -1
  44. package/dist/client/assets/{index-BaTM0g6E.js → index-DQcyjj1n.js} +1 -1
  45. package/dist/client/assets/{index-SJ6t3qme.js → index-DjFJyRsb.js} +1 -1
  46. package/dist/client/assets/{index-Cl0dKOpc.js → index-YemckZzk.js} +1 -1
  47. package/dist/client/assets/{index-p4yr3DW9.js → index-baLsgCNJ.js} +1 -1
  48. package/dist/client/assets/{index-Bq6PEMRy.js → index-dPGgxYg7.js} +1 -1
  49. package/dist/client/assets/{index-qf4lR_zM.js → index-e6iwsWag.js} +1 -1
  50. package/dist/client/assets/{index-DScY4DVi.js → index-oWFAyhhb.js} +1 -1
  51. package/dist/client/assets/{infoDiagram-HS3SLOUP-CB9FyKi7.js → infoDiagram-HS3SLOUP-8jgZTWHc.js} +1 -1
  52. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-C_bPulxt.js → journeyDiagram-XKPGCS4Q-C7UnOrYP.js} +1 -1
  53. package/dist/client/assets/{kanban-definition-3W4ZIXB7-CGLwqWR-.js → kanban-definition-3W4ZIXB7-BfAJ2XMs.js} +1 -1
  54. package/dist/client/assets/{layout-XjqfGmSW.js → layout-BFiS4INQ.js} +1 -1
  55. package/dist/client/assets/{main-FwGkrDro.js → main-SDku1HcN.js} +80 -80
  56. package/dist/client/assets/main-tmFPjHOC.css +1 -0
  57. package/dist/client/assets/{mindmap-definition-VGOIOE7T-DRNRxvpy.js → mindmap-definition-VGOIOE7T-CHJqgPgK.js} +1 -1
  58. package/dist/client/assets/{pieDiagram-ADFJNKIX-Co4AML3R.js → pieDiagram-ADFJNKIX-v1PBCyig.js} +1 -1
  59. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-DjuSOXov.js → quadrantDiagram-AYHSOK5B-BmSciYlO.js} +1 -1
  60. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-Cl5py0JI.js → requirementDiagram-UZGBJVZJ-Cpc8-ItX.js} +1 -1
  61. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BNJImcEG.js → sankeyDiagram-TZEHDZUN-BimDWo8J.js} +1 -1
  62. package/dist/client/assets/{sequenceDiagram-WL72ISMW-Bd3PTcpW.js → sequenceDiagram-WL72ISMW-CL72CIvP.js} +1 -1
  63. package/dist/client/assets/{square-terminal-CiX1sbUO.js → square-terminal-DAh77hNm.js} +1 -1
  64. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DXdFd6-L.js → stateDiagram-FKZM4ZOC-DPD5YOcB.js} +1 -1
  65. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAf0jK91.js +1 -0
  66. package/dist/client/assets/{timeline-definition-IT6M3QCI-8CA5Ftj2.js → timeline-definition-IT6M3QCI-UujIEPPc.js} +1 -1
  67. package/dist/client/assets/{treemap-GDKQZRPO-GQ5N0K_o.js → treemap-GDKQZRPO-CnxwYqSA.js} +1 -1
  68. package/dist/client/assets/{workspace._workspaceId-D0sPlrId.js → workspace._workspaceId--WY7ydFH.js} +1 -1
  69. package/dist/client/assets/{workspace._workspaceId-C_iuy4p6.js → workspace._workspaceId-jpBhz8sr.js} +2 -2
  70. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DzcmFrfB.js → xychartDiagram-PRI3JC2R-QNPzTKdU.js} +1 -1
  71. package/dist/openapi.json +158 -0
  72. package/dist/server/assets/{DockviewBrowserContainer-DvltiWxV.js → DockviewBrowserContainer-B8W-NI5l.js} +16 -3
  73. package/dist/server/assets/{DockviewTerminalContainer-YGo8Zbx1.js → DockviewTerminalContainer-D6ZTAITZ.js} +29 -6
  74. package/dist/server/assets/{TerminalPanel-Bd0_i38P.js → TerminalPanel-D1qOucYL.js} +3 -2
  75. package/dist/server/assets/{_basePickBy-BBas4T8q.js → _basePickBy-DCBLSYIo.js} +2 -2
  76. package/dist/server/assets/{_baseUniq-Bb-AXRqu.js → _baseUniq-D6dm-LAQ.js} +1 -1
  77. package/dist/server/assets/_tanstack-start-manifest_v-BffwvUC-.js +4 -0
  78. package/dist/server/assets/{arc-CNbGanI8.js → arc-BAoORaWl.js} +1 -1
  79. package/dist/server/assets/{architecture-7HQA4BMR-BBpvCcgY.js → architecture-7HQA4BMR-bh4pvUjy.js} +6 -6
  80. package/dist/server/assets/{architectureDiagram-VXUJARFQ-CSgRy1oF.js → architectureDiagram-VXUJARFQ-B6S0AQBn.js} +6 -6
  81. package/dist/server/assets/{blockDiagram-VD42YOAC-BZ551zIx.js → blockDiagram-VD42YOAC-DLnnO4-n.js} +6 -6
  82. package/dist/server/assets/{c4Diagram-YG6GDRKO-BpFPiRxu.js → c4Diagram-YG6GDRKO-CqN2DKBx.js} +2 -2
  83. package/dist/server/assets/{channel-BakvXn0q.js → channel-f3Ahc3R0.js} +1 -1
  84. package/dist/server/assets/{chunk-4BX2VUAB-iq_ixzMT.js → chunk-4BX2VUAB-CuDavVBE.js} +1 -1
  85. package/dist/server/assets/{chunk-55IACEB6-BTsLLiUt.js → chunk-55IACEB6-D_qe5s0S.js} +1 -1
  86. package/dist/server/assets/{chunk-B4BG7PRW-rFWSSos9.js → chunk-B4BG7PRW-C0ML39A6.js} +4 -4
  87. package/dist/server/assets/{chunk-DI55MBZ5-C6HYpEOk.js → chunk-DI55MBZ5-DGj3ha0C.js} +3 -3
  88. package/dist/server/assets/{chunk-FMBD7UC4-CWm7G-kI.js → chunk-FMBD7UC4-D-f7FIcf.js} +1 -1
  89. package/dist/server/assets/{chunk-QN33PNHL-C-sH07qa.js → chunk-QN33PNHL-DSo_m7vF.js} +1 -1
  90. package/dist/server/assets/{chunk-QZHKN3VN-DBYpRTmd.js → chunk-QZHKN3VN-gT8icS8l.js} +1 -1
  91. package/dist/server/assets/{chunk-TZMSLE5B-D374mW8S.js → chunk-TZMSLE5B-CoUTe4U3.js} +1 -1
  92. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-DV-SD-4W.js → classDiagram-2ON5EDUG-CbQuH3ni.js} +5 -5
  93. package/dist/server/assets/{classDiagram-2ON5EDUG-DV-SD-4W.js → classDiagram-v2-WZHVMYZB-CbQuH3ni.js} +5 -5
  94. package/dist/server/assets/{clone-DVtsQqal.js → clone-DhkQMQiL.js} +1 -1
  95. package/dist/server/assets/{cose-bilkent-S5V4N54A-XbCluv3z.js → cose-bilkent-S5V4N54A-Q7Nl8Zqm.js} +1 -1
  96. package/dist/server/assets/{dagre-6UL2VRFP-CuR4BisU.js → dagre-6UL2VRFP-RuiqkM_u.js} +6 -6
  97. package/dist/server/assets/{diagram-PSM6KHXK-CV_nySOq.js → diagram-PSM6KHXK-mvCbaKci.js} +7 -7
  98. package/dist/server/assets/{diagram-QEK2KX5R-Noar7MQT.js → diagram-QEK2KX5R-B30M6IEM.js} +6 -6
  99. package/dist/server/assets/{diagram-S2PKOQOG-B2BacNFz.js → diagram-S2PKOQOG-BapZgpGh.js} +6 -6
  100. package/dist/server/assets/{erDiagram-Q2GNP2WA-B5Os4Fa-.js → erDiagram-Q2GNP2WA-LKD5sOpF.js} +4 -4
  101. package/dist/server/assets/{flowDiagram-NV44I4VS-DjQR68un.js → flowDiagram-NV44I4VS-Cg70kWHZ.js} +5 -5
  102. package/dist/server/assets/{ganttDiagram-JELNMOA3-B5uPZ6pu.js → ganttDiagram-JELNMOA3-CpgS7Gbo.js} +1 -1
  103. package/dist/server/assets/{gitGraph-G5XIXVHT-6ZMiJWQT.js → gitGraph-G5XIXVHT-BX-0wA2S.js} +6 -6
  104. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-DDF08l5z.js → gitGraphDiagram-V2S2FVAM-BNe2zRpL.js} +7 -7
  105. package/dist/server/assets/{graph-bRh_VJvO.js → graph-BohWfDeQ.js} +2 -2
  106. package/dist/server/assets/{highlighted-body-B3W2YXNL-BI_Gmrii.js → highlighted-body-B3W2YXNL-DpfzVM5P.js} +1 -1
  107. package/dist/server/assets/{index-y2Y1JSaD.js → index-B6FFge5B.js} +2 -2
  108. package/dist/server/assets/{index-CWdeYFNF.js → index-BMCwJ6BW.js} +2 -2
  109. package/dist/server/assets/{index-6TVwGkMb.js → index-C4lG0OWB.js} +2 -2
  110. package/dist/server/assets/{index-CTIw5jsP.js → index-CE_oTIBT.js} +2 -2
  111. package/dist/server/assets/{index-BKTDd3Bk.js → index-CTCq_dqo.js} +4 -4
  112. package/dist/server/assets/{index-DpTDX5JD.js → index-CUej4Ihg.js} +2 -2
  113. package/dist/server/assets/{index-5xKUZpsF.js → index-CWhqy8Ta.js} +2 -2
  114. package/dist/server/assets/{index-D2pPyR7I.js → index-CnNg602B.js} +2 -2
  115. package/dist/server/assets/{index-K_Bo1J5h.js → index-Cvf2IVNx.js} +5 -5
  116. package/dist/server/assets/{index-auM21h5r.js → index-Cvmi6T35.js} +1 -1
  117. package/dist/server/assets/{index-RnzJqolD.js → index-Cyz3st2N.js} +2 -2
  118. package/dist/server/assets/{index-Bdft7sx8.js → index-Cznd5qP8.js} +5 -5
  119. package/dist/server/assets/{index-VS9oMvxO.js → index-DF9DvOkv.js} +2 -2
  120. package/dist/server/assets/{index-CUQ92e7X.js → index-DoAhyHsE.js} +3 -3
  121. package/dist/server/assets/{index-C-y9iHQ0.js → index-DsRToCeg.js} +1 -1
  122. package/dist/server/assets/{index-DDZbXJFy.js → index-W2MLsk-k.js} +2 -2
  123. package/dist/server/assets/{index-Dyd5DTki.js → index-y6X09Ksj.js} +2 -2
  124. package/dist/server/assets/{index-BlZ00-BN.js → index-z7NiBua9.js} +3 -3
  125. package/dist/server/assets/{info-VBDWY6EO-JLouBLo5.js → info-VBDWY6EO-BQ8N2eDS.js} +6 -6
  126. package/dist/server/assets/{infoDiagram-HS3SLOUP-zmvy_WJR.js → infoDiagram-HS3SLOUP-I1ZLYjFY.js} +5 -5
  127. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-DyzviNdt.js → journeyDiagram-XKPGCS4Q-lFTyhPiV.js} +4 -4
  128. package/dist/server/assets/{kanban-definition-3W4ZIXB7-DOBL7QMj.js → kanban-definition-3W4ZIXB7-BEr5w27W.js} +2 -2
  129. package/dist/server/assets/{layout-B_Ylwhz8.js → layout-2KXyirN2.js} +4 -4
  130. package/dist/server/assets/{mermaid-3ZIDBTTL-D1krx3WU.js → mermaid-3ZIDBTTL-BfFd_m4-.js} +1 -1
  131. package/dist/server/assets/{mermaid-parser.core-B3d8rAVm.js → mermaid-parser.core-SoqLW9t8.js} +11 -11
  132. package/dist/server/assets/{mindmap-definition-VGOIOE7T-Kacyqp9Z.js → mindmap-definition-VGOIOE7T-D9ZbRdf_.js} +3 -3
  133. package/dist/server/assets/{packet-DYOGHKS2-Bl6AuzeP.js → packet-DYOGHKS2-B2EvMQj5.js} +6 -6
  134. package/dist/server/assets/{pie-VRWISCQL-DTulKqSB.js → pie-VRWISCQL-YRbpkB5e.js} +6 -6
  135. package/dist/server/assets/{pieDiagram-ADFJNKIX-EBslGQgI.js → pieDiagram-ADFJNKIX-Bat_eWvt.js} +7 -7
  136. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-BKSWYe6P.js → quadrantDiagram-AYHSOK5B-CtqGnRnF.js} +1 -1
  137. package/dist/server/assets/{radar-ZZBFDIW7-C5ulLYDn.js → radar-ZZBFDIW7-DvOi2qX_.js} +6 -6
  138. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-B7nRcnKx.js → requirementDiagram-UZGBJVZJ-CtysqbZ4.js} +3 -3
  139. package/dist/server/assets/{router-hdCv0b-L.js → router-ChvYGLZB.js} +171 -108
  140. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-Dq6Q_X6w.js → sankeyDiagram-TZEHDZUN-BTLsDOUO.js} +1 -1
  141. package/dist/server/assets/{sequenceDiagram-WL72ISMW-CDfofz-s.js → sequenceDiagram-WL72ISMW-CK0kbINT.js} +3 -3
  142. package/dist/server/assets/{square-terminal-D7R89vxW.js → square-terminal-BLO1pEjb.js} +1 -1
  143. package/dist/server/assets/{stateDiagram-FKZM4ZOC-BQdH_sw5.js → stateDiagram-FKZM4ZOC-D5FS7RFa.js} +8 -8
  144. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-BTwyLH9n.js → stateDiagram-v2-4FDKWEC3-DoCLlTuy.js} +4 -4
  145. package/dist/server/assets/{timeline-definition-IT6M3QCI-BLfNWXx-.js → timeline-definition-IT6M3QCI-jFqO_Cet.js} +2 -2
  146. package/dist/server/assets/{treemap-GDKQZRPO-DYGhrk03.js → treemap-GDKQZRPO-CuHJYOCT.js} +6 -6
  147. package/dist/server/assets/{workspace._workspaceId-BrMajMrS.js → workspace._workspaceId-B0M_Sxj3.js} +1 -1
  148. package/dist/server/assets/{workspace._workspaceId-C9ijioXa.js → workspace._workspaceId-CGq293LY.js} +3 -3
  149. package/dist/server/assets/{xychartDiagram-PRI3JC2R-CTiLODEl.js → xychartDiagram-PRI3JC2R-DPvU_7PC.js} +1 -1
  150. package/dist/server/server.js +2 -2
  151. package/dist/start-server.mjs +388 -247
  152. package/package.json +4 -4
  153. package/dist/client/assets/DockviewBrowserContainer-AeGrBvbe.js +0 -5
  154. package/dist/client/assets/DockviewTerminalContainer-CEcmk81d.js +0 -2
  155. package/dist/client/assets/channel-ByfqtAS4.js +0 -1
  156. package/dist/client/assets/classDiagram-2ON5EDUG-CmzSv5tz.js +0 -1
  157. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CmzSv5tz.js +0 -1
  158. package/dist/client/assets/clone-D6Np9jJP.js +0 -1
  159. package/dist/client/assets/main-CBlP-xQr.css +0 -1
  160. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-kbB9WbNB.js +0 -1
  161. package/dist/server/assets/_tanstack-start-manifest_v-DJ7xH6AI.js +0 -4
@@ -6501,11 +6501,11 @@ var require_tools = __commonJS({
6501
6501
  }
6502
6502
  }
6503
6503
  }
6504
- function buildFormatters(level, bindings, log46) {
6504
+ function buildFormatters(level, bindings, log47) {
6505
6505
  return {
6506
6506
  level,
6507
6507
  bindings,
6508
- log: log46
6508
+ log: log47
6509
6509
  };
6510
6510
  }
6511
6511
  function normalizeDestFileDescriptor(destination) {
@@ -6888,11 +6888,11 @@ var require_proto = __commonJS({
6888
6888
  }
6889
6889
  } else instance[serializersSym] = serializers;
6890
6890
  if (options2.hasOwnProperty("formatters")) {
6891
- const { level, bindings: chindings, log: log46 } = options2.formatters;
6891
+ const { level, bindings: chindings, log: log47 } = options2.formatters;
6892
6892
  instance[formattersSym] = buildFormatters(
6893
6893
  level || formatters.level,
6894
6894
  chindings || resetChildingsFormatter,
6895
- log46 || formatters.log
6895
+ log47 || formatters.log
6896
6896
  );
6897
6897
  } else {
6898
6898
  instance[formattersSym] = buildFormatters(
@@ -87212,11 +87212,11 @@ var require_core = __commonJS({
87212
87212
  Ajv2.ValidationError = validation_error_1.default;
87213
87213
  Ajv2.MissingRefError = ref_error_1.default;
87214
87214
  exports.default = Ajv2;
87215
- function checkOptions(checkOpts, options2, msg, log46 = "error") {
87215
+ function checkOptions(checkOpts, options2, msg, log47 = "error") {
87216
87216
  for (const key in checkOpts) {
87217
87217
  const opt = key;
87218
87218
  if (opt in options2)
87219
- this.logger[log46](`${msg}: option ${key}. ${checkOpts[opt]}`);
87219
+ this.logger[log47](`${msg}: option ${key}. ${checkOpts[opt]}`);
87220
87220
  }
87221
87221
  }
87222
87222
  function getSchEnv(keyRef) {
@@ -102529,16 +102529,89 @@ function listenerCount() {
102529
102529
  // src/server/infra/setup/setup-runner.ts
102530
102530
  import { spawn as spawn5 } from "node:child_process";
102531
102531
 
102532
+ // src/server/infra/process/path.ts
102533
+ import { execFile as execFile3 } from "node:child_process";
102534
+ import { existsSync as existsSync4 } from "node:fs";
102535
+ import { delimiter } from "node:path";
102536
+ function defaultShell() {
102537
+ if (process.env.SHELL) return process.env.SHELL;
102538
+ if (process.platform === "win32") return process.env.ComSpec || "cmd.exe";
102539
+ for (const candidate of ["/bin/zsh", "/bin/bash", "/bin/sh"]) {
102540
+ if (existsSync4(candidate)) return candidate;
102541
+ }
102542
+ return "/bin/sh";
102543
+ }
102544
+ var cachedBinDirs = null;
102545
+ function extraBinDirs() {
102546
+ if (cachedBinDirs) return cachedBinDirs;
102547
+ if (process.platform === "darwin") {
102548
+ cachedBinDirs = ["/opt/homebrew/bin", "/usr/local/bin"];
102549
+ } else if (process.platform === "linux") {
102550
+ const dirs = [];
102551
+ const linuxbrew = "/home/linuxbrew/.linuxbrew/bin";
102552
+ if (existsSync4(linuxbrew)) dirs.push(linuxbrew);
102553
+ dirs.push("/usr/local/bin");
102554
+ cachedBinDirs = dirs;
102555
+ } else {
102556
+ cachedBinDirs = [];
102557
+ }
102558
+ return cachedBinDirs;
102559
+ }
102560
+ function prependBinDirs(path3) {
102561
+ return [...extraBinDirs(), ...path3 ? [path3] : []].join(delimiter);
102562
+ }
102563
+ var cachedShellPath = null;
102564
+ async function shellPath() {
102565
+ if (cachedShellPath) return cachedShellPath;
102566
+ const shell = defaultShell();
102567
+ try {
102568
+ const result = await new Promise((resolve12, reject) => {
102569
+ execFile3(shell, ["-li", "-c", "echo $PATH"], { timeout: 5e3 }, (err, stdout) => {
102570
+ if (err) {
102571
+ reject(err);
102572
+ return;
102573
+ }
102574
+ resolve12(stdout.trim());
102575
+ });
102576
+ });
102577
+ if (result) {
102578
+ cachedShellPath = result;
102579
+ return result;
102580
+ }
102581
+ } catch {
102582
+ }
102583
+ const fallback = prependBinDirs(process.env.PATH);
102584
+ cachedShellPath = fallback;
102585
+ return fallback;
102586
+ }
102587
+ async function whichBinary(name3) {
102588
+ const resolvedPath = await shellPath();
102589
+ try {
102590
+ const result = await new Promise((resolve12, reject) => {
102591
+ execFile3("which", [name3], { env: { ...process.env, PATH: resolvedPath } }, (err, stdout) => {
102592
+ if (err) {
102593
+ reject(err);
102594
+ return;
102595
+ }
102596
+ resolve12(stdout.trim());
102597
+ });
102598
+ });
102599
+ return result || null;
102600
+ } catch {
102601
+ return null;
102602
+ }
102603
+ }
102604
+
102532
102605
  // src/server/infra/setup/project-config.ts
102533
102606
  init_src();
102534
102607
  init_zod();
102535
- import { existsSync as existsSync4, readFileSync as readFileSync6 } from "node:fs";
102608
+ import { existsSync as existsSync5, readFileSync as readFileSync6 } from "node:fs";
102536
102609
  import { join as join14 } from "node:path";
102537
102610
  var log10 = createLogger("project-config");
102538
102611
  function loadProjectConfig(worktreePath, projectPath) {
102539
102612
  for (const base2 of [worktreePath, projectPath]) {
102540
102613
  const configPath = join14(base2, ".band", "config.json");
102541
- if (existsSync4(configPath)) {
102614
+ if (existsSync5(configPath)) {
102542
102615
  try {
102543
102616
  return JSON.parse(readFileSync6(configPath, "utf-8"));
102544
102617
  } catch {
@@ -102550,7 +102623,7 @@ function loadProjectConfig(worktreePath, projectPath) {
102550
102623
  var CopyFilesSchema = external_exports.array(external_exports.string()).optional();
102551
102624
  function getCopyFiles(projectPath) {
102552
102625
  const configPath = join14(projectPath, ".band", "config.json");
102553
- if (!existsSync4(configPath)) return null;
102626
+ if (!existsSync5(configPath)) return null;
102554
102627
  let raw;
102555
102628
  try {
102556
102629
  raw = JSON.parse(readFileSync6(configPath, "utf-8"));
@@ -102589,7 +102662,7 @@ function runSetup(workspaceId, worktreePath, projectPath, onComplete) {
102589
102662
  cwd: worktreePath,
102590
102663
  env: {
102591
102664
  ...parentEnv,
102592
- PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH}`
102665
+ PATH: prependBinDirs(process.env.PATH)
102593
102666
  },
102594
102667
  stdio: ["ignore", "pipe", "pipe"]
102595
102668
  });
@@ -114637,7 +114710,7 @@ var WorkspaceCard = (0, import_react21.memo)(function WorkspaceCard2({
114637
114710
  openWorkspace(workspaceId);
114638
114711
  }
114639
114712
  };
114640
- const className = `@container group flex flex-row items-center justify-between pl-3 pr-2 py-1 min-h-9 min-w-0 overflow-hidden cursor-pointer select-none touch-manipulation transition-colors hover:bg-accent/50 [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:py-2 ${isActive ? "border-l-2 border-l-primary" : ""} ${isFocused ? "ring-2 ring-inset ring-ring" : ""} ${href ? "no-underline text-inherit" : ""}`;
114713
+ const className = `@container group flex flex-row items-center justify-between rounded-md pl-3 pr-2 py-1 min-h-9 min-w-0 overflow-hidden cursor-pointer select-none touch-manipulation transition-colors hover:bg-accent/50 [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:py-2 ${isActive ? "bg-primary/15 hover:bg-primary/15" : isFocused ? "bg-accent" : ""} ${href ? "no-underline text-inherit" : ""}`;
114641
114714
  const containerProps = {
114642
114715
  ref: cardRef,
114643
114716
  className,
@@ -118540,7 +118613,7 @@ var cmdClickLinkPlugin = ViewPlugin.fromClass(
118540
118613
 
118541
118614
  // src/server/infra/git/git-client.ts
118542
118615
  init_src();
118543
- import { execFile as execFile3 } from "node:child_process";
118616
+ import { execFile as execFile4 } from "node:child_process";
118544
118617
  import { readFile, stat as stat3 } from "node:fs/promises";
118545
118618
  import { join as join15 } from "node:path";
118546
118619
  var log11 = createLogger("git");
@@ -118599,15 +118672,13 @@ async function resolveDetachedBranch(worktreePath) {
118599
118672
  }
118600
118673
  function gitCmd() {
118601
118674
  const env = { ...process.env };
118602
- if (env.PATH) {
118603
- env.PATH = `/opt/homebrew/bin:/usr/local/bin:${env.PATH}`;
118604
- }
118675
+ env.PATH = prependBinDirs(env.PATH);
118605
118676
  return { command: "git", env };
118606
118677
  }
118607
118678
  function execGit(args, cwd) {
118608
118679
  const { command, env } = gitCmd();
118609
118680
  return new Promise((resolve12, reject) => {
118610
- execFile3(command, args, { cwd, env, maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => {
118681
+ execFile4(command, args, { cwd, env, maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => {
118611
118682
  if (err) {
118612
118683
  reject(new Error(stderr || err.message));
118613
118684
  return;
@@ -118618,11 +118689,9 @@ function execGit(args, cwd) {
118618
118689
  }
118619
118690
  function execGh(args, cwd) {
118620
118691
  const env = { ...process.env };
118621
- if (env.PATH) {
118622
- env.PATH = `/opt/homebrew/bin:/usr/local/bin:${env.PATH}`;
118623
- }
118692
+ env.PATH = prependBinDirs(env.PATH);
118624
118693
  return new Promise((resolve12, reject) => {
118625
- execFile3("gh", args, { cwd, env, maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => {
118694
+ execFile4("gh", args, { cwd, env, maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => {
118626
118695
  if (err) {
118627
118696
  reject(new Error(stderr || err.message));
118628
118697
  return;
@@ -118857,11 +118926,11 @@ function parseBatchedCIResponse(data, aliases, defaultBranches) {
118857
118926
  }
118858
118927
 
118859
118928
  // src/server/infra/db/queries/projects.ts
118860
- import { existsSync as existsSync5 } from "node:fs";
118929
+ import { existsSync as existsSync6 } from "node:fs";
118861
118930
  import { join as join16 } from "node:path";
118862
118931
  function reconcileKindForProject(project) {
118863
- if (!existsSync5(project.path)) return false;
118864
- const detectedKind = existsSync5(join16(project.path, ".git")) ? "git" : "plain";
118932
+ if (!existsSync6(project.path)) return false;
118933
+ const detectedKind = existsSync6(join16(project.path, ".git")) ? "git" : "plain";
118865
118934
  if (detectedKind === project.kind) return false;
118866
118935
  project.kind = detectedKind;
118867
118936
  if (detectedKind === "plain") {
@@ -120412,7 +120481,7 @@ init_src();
120412
120481
  init_zod();
120413
120482
  import { execFile as execFile6 } from "node:child_process";
120414
120483
  import { randomUUID as randomUUID3 } from "node:crypto";
120415
- import { existsSync as existsSync8, mkdirSync as mkdirSync5, unlinkSync as unlinkSync3 } from "node:fs";
120484
+ import { existsSync as existsSync9, mkdirSync as mkdirSync5, unlinkSync as unlinkSync3 } from "node:fs";
120416
120485
  import { rm } from "node:fs/promises";
120417
120486
  import { join as join20 } from "node:path";
120418
120487
  import { promisify as promisify2 } from "node:util";
@@ -120683,52 +120752,6 @@ init_src();
120683
120752
  import { spawn as spawn6 } from "node:child_process";
120684
120753
  import { dirname as dirname2, join as join17, resolve as resolve3 } from "node:path";
120685
120754
  import { fileURLToPath } from "node:url";
120686
-
120687
- // src/server/infra/process/path.ts
120688
- import { execFile as execFile4 } from "node:child_process";
120689
- var cachedShellPath = null;
120690
- async function shellPath() {
120691
- if (cachedShellPath) return cachedShellPath;
120692
- const shell = process.env.SHELL || "/bin/zsh";
120693
- try {
120694
- const result = await new Promise((resolve12, reject) => {
120695
- execFile4(shell, ["-li", "-c", "echo $PATH"], { timeout: 5e3 }, (err, stdout) => {
120696
- if (err) {
120697
- reject(err);
120698
- return;
120699
- }
120700
- resolve12(stdout.trim());
120701
- });
120702
- });
120703
- if (result) {
120704
- cachedShellPath = result;
120705
- return result;
120706
- }
120707
- } catch {
120708
- }
120709
- const fallback = `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH || ""}`;
120710
- cachedShellPath = fallback;
120711
- return fallback;
120712
- }
120713
- async function whichBinary(name3) {
120714
- const resolvedPath = await shellPath();
120715
- try {
120716
- const result = await new Promise((resolve12, reject) => {
120717
- execFile4("which", [name3], { env: { ...process.env, PATH: resolvedPath } }, (err, stdout) => {
120718
- if (err) {
120719
- reject(err);
120720
- return;
120721
- }
120722
- resolve12(stdout.trim());
120723
- });
120724
- });
120725
- return result || null;
120726
- } catch {
120727
- return null;
120728
- }
120729
- }
120730
-
120731
- // src/server/infra/lsp/lsp-manager.ts
120732
120755
  var workspaceQueries = new WorkspaceQueries();
120733
120756
  var __dirname2 = dirname2(fileURLToPath(import.meta.url));
120734
120757
  var log16 = createLogger("lsp");
@@ -120828,7 +120851,7 @@ init_src();
120828
120851
  import { execFile as execFile5 } from "node:child_process";
120829
120852
  import {
120830
120853
  copyFileSync as copyFileSync2,
120831
- existsSync as existsSync6,
120854
+ existsSync as existsSync7,
120832
120855
  globSync,
120833
120856
  mkdirSync as mkdirSync4,
120834
120857
  readFileSync as readFileSync7,
@@ -120961,7 +120984,7 @@ function resolveFromConfig(projectPath, missing) {
120961
120984
  }
120962
120985
  async function resolveFromWorktreeInclude(projectPath) {
120963
120986
  const includePath = join18(projectPath, ".worktreeinclude");
120964
- if (!existsSync6(includePath)) return [];
120987
+ if (!existsSync7(includePath)) return [];
120965
120988
  const includeContent = readFileSync7(includePath, "utf-8");
120966
120989
  const hasPatterns = includeContent.split(/\r?\n/).some((line2) => {
120967
120990
  const trimmed = line2.trim();
@@ -122559,6 +122582,92 @@ var CronjobService = class {
122559
122582
  };
122560
122583
  var cronjobService = new CronjobService();
122561
122584
 
122585
+ // src/server/services/panel-focus-service.ts
122586
+ init_src();
122587
+ var log21 = createLogger("panel-focus-service");
122588
+ var PANEL_FOCUS_TYPE = "panel_focus";
122589
+ function focusRowId(workspaceId) {
122590
+ return `${PANEL_FOCUS_TYPE}:${workspaceId}`;
122591
+ }
122592
+ var PanelFocusService = class {
122593
+ /** workspaceId → last-focused panel ids. */
122594
+ focus = /* @__PURE__ */ new Map();
122595
+ /**
122596
+ * Workspaces whose focus row has been loaded from the DB into `focus`.
122597
+ * Separate from the map's own key presence because a workspace can have a
122598
+ * loaded-but-empty record (row absent) — we still don't want to re-hit the
122599
+ * DB on every read.
122600
+ */
122601
+ hydrated = /* @__PURE__ */ new Set();
122602
+ /** Workspaces that already have a `panel_states` row (drives insert vs update). */
122603
+ persisted = /* @__PURE__ */ new Set();
122604
+ /**
122605
+ * Load a workspace's focus row from the DB on first access. Cheap and
122606
+ * idempotent — subsequent calls short-circuit on the `hydrated` set.
122607
+ */
122608
+ ensureHydrated(workspaceId) {
122609
+ if (this.hydrated.has(workspaceId)) return;
122610
+ this.hydrated.add(workspaceId);
122611
+ const rows = listPanelStatesForWorkspace(workspaceId, PANEL_FOCUS_TYPE);
122612
+ const row = rows[0];
122613
+ if (!row) return;
122614
+ this.persisted.add(workspaceId);
122615
+ try {
122616
+ const parsed = JSON.parse(row.state);
122617
+ this.focus.set(workspaceId, {
122618
+ chat: parsed.chat,
122619
+ terminal: parsed.terminal,
122620
+ browser: parsed.browser
122621
+ });
122622
+ } catch (err) {
122623
+ log21.warn({ workspaceId, err }, "failed to parse persisted panel focus; ignoring");
122624
+ }
122625
+ }
122626
+ /** Get the last-focused panel ids for a workspace. */
122627
+ get(workspaceId) {
122628
+ this.ensureHydrated(workspaceId);
122629
+ return { ...this.focus.get(workspaceId) ?? {} };
122630
+ }
122631
+ /**
122632
+ * Record that `panelId` is the last-focused panel of `panelType` in
122633
+ * `workspaceId`. Write-through: updates the in-memory map and upserts the
122634
+ * backing `panel_states` row.
122635
+ */
122636
+ set(workspaceId, panelType, panelId) {
122637
+ this.ensureHydrated(workspaceId);
122638
+ const current2 = this.focus.get(workspaceId) ?? {};
122639
+ if (current2[panelType] === panelId) return;
122640
+ const next = { ...current2, [panelType]: panelId };
122641
+ this.focus.set(workspaceId, next);
122642
+ const now = Date.now();
122643
+ const state = JSON.stringify(next);
122644
+ if (this.persisted.has(workspaceId)) {
122645
+ updatePanelState(focusRowId(workspaceId), { state, updatedAt: now });
122646
+ } else {
122647
+ insertPanelState({
122648
+ id: focusRowId(workspaceId),
122649
+ workspaceId,
122650
+ panelType: PANEL_FOCUS_TYPE,
122651
+ state,
122652
+ createdAt: now,
122653
+ updatedAt: now
122654
+ });
122655
+ this.persisted.add(workspaceId);
122656
+ }
122657
+ }
122658
+ /**
122659
+ * Drop all focus tracking for a workspace. Called from the workspace delete
122660
+ * path so the row doesn't outlive the workspace.
122661
+ */
122662
+ remove(workspaceId) {
122663
+ this.focus.delete(workspaceId);
122664
+ this.hydrated.delete(workspaceId);
122665
+ this.persisted.delete(workspaceId);
122666
+ deletePanelState(focusRowId(workspaceId));
122667
+ }
122668
+ };
122669
+ var panelFocusService = new PanelFocusService();
122670
+
122562
122671
  // src/server/services/terminal-service.ts
122563
122672
  init_src();
122564
122673
  init_zod();
@@ -122566,10 +122675,10 @@ init_zod();
122566
122675
  // src/server/infra/terminals/terminal-pool.ts
122567
122676
  init_src();
122568
122677
  import { randomUUID as randomUUID2 } from "node:crypto";
122569
- import { existsSync as existsSync7, unlinkSync as unlinkSync2, writeFileSync as writeFileSync2 } from "node:fs";
122678
+ import { existsSync as existsSync8, unlinkSync as unlinkSync2, writeFileSync as writeFileSync2 } from "node:fs";
122570
122679
  import { tmpdir } from "node:os";
122571
122680
  import { join as join19, sep as sep3 } from "node:path";
122572
- var log21 = createLogger("terminal-pool");
122681
+ var log22 = createLogger("terminal-pool");
122573
122682
  var MAX_SCROLLBACK_SIZE = 1e5;
122574
122683
  var TerminalPool = class {
122575
122684
  /** terminalId -> session */
@@ -122586,7 +122695,7 @@ var TerminalPool = class {
122586
122695
  * stays oblivious to the workspace registry.
122587
122696
  */
122588
122697
  async spawn(workspaceId, terminalId, workspaceRoot, options2) {
122589
- const shell = process.env.SHELL || "/bin/zsh";
122698
+ const shell = defaultShell();
122590
122699
  const resolvedPath = await shellPath();
122591
122700
  const env = {};
122592
122701
  for (const [key, value] of Object.entries(process.env)) {
@@ -122607,24 +122716,24 @@ var TerminalPool = class {
122607
122716
  if (options2?.cwd) {
122608
122717
  const resolved = join19(workspaceRoot, options2.cwd);
122609
122718
  if (resolved !== workspaceRoot && !resolved.startsWith(workspaceRoot + sep3)) {
122610
- log21.warn(
122719
+ log22.warn(
122611
122720
  "Ignoring cwd %s \u2014 resolves outside workspace root %s",
122612
122721
  options2.cwd,
122613
122722
  workspaceRoot
122614
122723
  );
122615
- } else if (existsSync7(resolved)) {
122724
+ } else if (existsSync8(resolved)) {
122616
122725
  cwd = resolved;
122617
122726
  } else {
122618
- log21.warn("Ignoring cwd %s \u2014 directory does not exist", options2.cwd);
122727
+ log22.warn("Ignoring cwd %s \u2014 directory does not exist", options2.cwd);
122619
122728
  }
122620
122729
  }
122621
- if (!existsSync7(cwd)) {
122730
+ if (!existsSync8(cwd)) {
122622
122731
  throw new Error(`Workspace directory does not exist: ${cwd}`);
122623
122732
  }
122624
- if (!existsSync7(shell)) {
122733
+ if (!existsSync8(shell)) {
122625
122734
  throw new Error(`Shell not found: ${shell}`);
122626
122735
  }
122627
- log21.debug(
122736
+ log22.debug(
122628
122737
  "Spawning shell %s in %s for terminal %s (PATH=%s)",
122629
122738
  shell,
122630
122739
  cwd,
@@ -122643,7 +122752,7 @@ var TerminalPool = class {
122643
122752
  });
122644
122753
  } catch (err) {
122645
122754
  const msg = err instanceof Error ? err.message : String(err);
122646
- log21.error("pty.spawn failed: %s (shell=%s, cwd=%s)", msg, shell, cwd);
122755
+ log22.error("pty.spawn failed: %s (shell=%s, cwd=%s)", msg, shell, cwd);
122647
122756
  throw err;
122648
122757
  }
122649
122758
  const session = { pty: ptyProcess, scrollback: "", workspaceId };
@@ -122673,7 +122782,7 @@ var TerminalPool = class {
122673
122782
  }
122674
122783
  });
122675
122784
  ptyProcess.onExit(() => {
122676
- log21.debug("Terminal exited: %s (workspace %s)", terminalId, workspaceId);
122785
+ log22.debug("Terminal exited: %s (workspace %s)", terminalId, workspaceId);
122677
122786
  this.terminals.delete(terminalId);
122678
122787
  this.outputListeners.delete(terminalId);
122679
122788
  const set = this.workspaceTerminals.get(workspaceId);
@@ -122728,7 +122837,7 @@ var TerminalPool = class {
122728
122837
  `, { encoding: "utf-8", mode: 384, flag: "wx" });
122729
122838
  session.autoRunFile = cmdFile;
122730
122839
  } catch (err) {
122731
- log21.warn(
122840
+ log22.warn(
122732
122841
  "autoRunCommand: temp-file staging failed (%s); writing command directly",
122733
122842
  err instanceof Error ? err.message : String(err)
122734
122843
  );
@@ -122746,7 +122855,7 @@ var TerminalPool = class {
122746
122855
  try {
122747
122856
  pty.write(sourceLine);
122748
122857
  } catch (err) {
122749
- log21.warn("autoRunCommand: failed to inject command line (%s)", err);
122858
+ log22.warn("autoRunCommand: failed to inject command line (%s)", err);
122750
122859
  }
122751
122860
  };
122752
122861
  let dataDisposed = false;
@@ -122925,7 +123034,7 @@ function removeTerminalFromLayout(workspaceId, terminalId) {
122925
123034
  }
122926
123035
 
122927
123036
  // src/server/services/terminal-service.ts
122928
- var log22 = createLogger("terminal-service");
123037
+ var log23 = createLogger("terminal-service");
122929
123038
  var TerminalPaneConfigSchema = external_exports.object({
122930
123039
  name: external_exports.string().optional(),
122931
123040
  command: external_exports.string().optional(),
@@ -123083,7 +123192,7 @@ var TerminalService = class {
123083
123192
  if (!terminalBlock) return null;
123084
123193
  const result = WorkspaceTerminalConfigSchema.safeParse(terminalBlock);
123085
123194
  if (!result.success) {
123086
- log22.warn(
123195
+ log23.warn(
123087
123196
  "Invalid workspace.terminal config: %s",
123088
123197
  result.error.issues.map((i2) => `${i2.path.join(".")}: ${i2.message}`).join("; ")
123089
123198
  );
@@ -123096,7 +123205,7 @@ var terminalService = new TerminalService();
123096
123205
 
123097
123206
  // src/server/services/workspace-service.ts
123098
123207
  var execFileAsync2 = promisify2(execFile6);
123099
- var log23 = createLogger("workspace-service");
123208
+ var log24 = createLogger("workspace-service");
123100
123209
  var workspaceVia = external_exports.enum(["chat", "terminal"]);
123101
123210
  var workspaceCreateInput = external_exports.object({
123102
123211
  project: external_exports.string(),
@@ -123280,10 +123389,10 @@ var WorkspaceService = class {
123280
123389
  try {
123281
123390
  const copied = await copyWorkspaceFiles(project.path, worktreePath);
123282
123391
  if (copied.length > 0) {
123283
- log23.info({ workspaceId, count: copied.length }, "copied workspace files into new worktree");
123392
+ log24.info({ workspaceId, count: copied.length }, "copied workspace files into new worktree");
123284
123393
  }
123285
123394
  } catch (err) {
123286
- log23.warn({ err, workspaceId }, "copyWorkspaceFiles raised \u2014 continuing");
123395
+ log24.warn({ err, workspaceId }, "copyWorkspaceFiles raised \u2014 continuing");
123287
123396
  }
123288
123397
  const defaultChat = chatService.getOrCreateDefault(workspaceId);
123289
123398
  let via = input.via ?? "chat";
@@ -123296,7 +123405,7 @@ var WorkspaceService = class {
123296
123405
  adapter.abort?.();
123297
123406
  if (!invocation || invocation.unsupported) {
123298
123407
  const reason = invocation?.reason ?? "adapter does not expose cliInvocation";
123299
- log23.warn(
123408
+ log24.warn(
123300
123409
  { workspaceId, agentId: input.codingAgentId, reason },
123301
123410
  "via=terminal requested but adapter does not support it; falling back to chat"
123302
123411
  );
@@ -123306,7 +123415,7 @@ var WorkspaceService = class {
123306
123415
  terminalId = randomUUID3();
123307
123416
  }
123308
123417
  } catch (err) {
123309
- log23.warn(
123418
+ log24.warn(
123310
123419
  {
123311
123420
  err: err instanceof Error ? err.message : String(err),
123312
123421
  workspaceId,
@@ -123324,7 +123433,7 @@ var WorkspaceService = class {
123324
123433
  }).then(() => {
123325
123434
  emit({ kind: "terminal-created", workspaceId, terminalId });
123326
123435
  }).catch((err) => {
123327
- log23.error(
123436
+ log24.error(
123328
123437
  {
123329
123438
  err: err instanceof Error ? err.message : String(err),
123330
123439
  workspaceId,
@@ -123395,7 +123504,7 @@ var WorkspaceService = class {
123395
123504
  const terminalId = randomUUID3();
123396
123505
  await terminalService.spawn(chat.workspaceId, terminalId, { command });
123397
123506
  emit({ kind: "terminal-created", workspaceId: chat.workspaceId, terminalId });
123398
- log23.info(
123507
+ log24.info(
123399
123508
  { chatId, workspaceId: chat.workspaceId, terminalId },
123400
123509
  "continue chat session in terminal"
123401
123510
  );
@@ -123461,31 +123570,32 @@ var WorkspaceService = class {
123461
123570
  browserService.removeAllForWorkspace(workspaceId);
123462
123571
  terminalService.killWorkspace(workspaceId);
123463
123572
  terminalService.deleteLayout(workspaceId);
123573
+ panelFocusService.remove(workspaceId);
123464
123574
  killWorkspaceServers(workspaceId);
123465
123575
  cronjobService.removeForKey(workspaceId);
123466
123576
  try {
123467
123577
  const deletedTasks = new TaskQueries().deleteWorkspaceTasks(workspaceId);
123468
123578
  if (deletedTasks > 0) {
123469
- log23.info({ workspaceId, count: deletedTasks }, "deleted workspace tasks on removal");
123579
+ log24.info({ workspaceId, count: deletedTasks }, "deleted workspace tasks on removal");
123470
123580
  }
123471
123581
  } catch (err) {
123472
- log23.error({ workspaceId, err }, "failed to delete workspace tasks on removal");
123582
+ log24.error({ workspaceId, err }, "failed to delete workspace tasks on removal");
123473
123583
  }
123474
123584
  try {
123475
123585
  const deletedEvents = this.usageEventQueries.deleteWorkspaceEvents(workspaceId);
123476
123586
  if (deletedEvents > 0) {
123477
- log23.info(
123587
+ log24.info(
123478
123588
  { workspaceId, count: deletedEvents },
123479
123589
  "deleted workspace usage events on removal"
123480
123590
  );
123481
123591
  }
123482
123592
  } catch (err) {
123483
- log23.error({ workspaceId, err }, "failed to delete workspace usage events on removal");
123593
+ log24.error({ workspaceId, err }, "failed to delete workspace usage events on removal");
123484
123594
  }
123485
123595
  try {
123486
123596
  this.usageScanStateQueries.deleteWorkspace(workspaceId);
123487
123597
  } catch (err) {
123488
- log23.error({ workspaceId, err }, "failed to delete workspace usage scan state on removal");
123598
+ log24.error({ workspaceId, err }, "failed to delete workspace usage scan state on removal");
123489
123599
  }
123490
123600
  emit({ kind: "remove", workspaceId });
123491
123601
  const projPath = project.path;
@@ -123498,13 +123608,13 @@ var WorkspaceService = class {
123498
123608
  cwd: worktreePath,
123499
123609
  env: {
123500
123610
  ...process.env,
123501
- PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH}`
123611
+ PATH: prependBinDirs(process.env.PATH)
123502
123612
  },
123503
123613
  encoding: "utf-8",
123504
123614
  timeout: 6e4
123505
123615
  });
123506
123616
  } catch (err) {
123507
- log23.warn({ err, workspaceId }, "teardown script failed");
123617
+ log24.warn({ err, workspaceId }, "teardown script failed");
123508
123618
  }
123509
123619
  }
123510
123620
  try {
@@ -123517,7 +123627,7 @@ var WorkspaceService = class {
123517
123627
  try {
123518
123628
  await rm(worktreePath, { recursive: true, force: true });
123519
123629
  } catch (err) {
123520
- log23.warn({ err, workspaceId, worktreePath }, "manual worktree rm failed");
123630
+ log24.warn({ err, workspaceId, worktreePath }, "manual worktree rm failed");
123521
123631
  }
123522
123632
  try {
123523
123633
  await execFileAsync2(command, ["worktree", "prune"], {
@@ -123526,7 +123636,7 @@ var WorkspaceService = class {
123526
123636
  encoding: "utf-8"
123527
123637
  });
123528
123638
  } catch (err) {
123529
- log23.warn({ err, workspaceId }, "git worktree prune failed");
123639
+ log24.warn({ err, workspaceId }, "git worktree prune failed");
123530
123640
  }
123531
123641
  }
123532
123642
  if (branchToDelete) {
@@ -123540,7 +123650,7 @@ var WorkspaceService = class {
123540
123650
  }
123541
123651
  }
123542
123652
  })().catch((err) => {
123543
- log23.error({ err, workspaceId }, "background workspace cleanup failed");
123653
+ log24.error({ err, workspaceId }, "background workspace cleanup failed");
123544
123654
  });
123545
123655
  });
123546
123656
  return { ok: true };
@@ -123833,7 +123943,7 @@ var WorkspaceService = class {
123833
123943
  */
123834
123944
  async runScript(input) {
123835
123945
  const scriptPath = join20(input.path, ".band", input.scriptType);
123836
- if (!existsSync8(scriptPath)) {
123946
+ if (!existsSync9(scriptPath)) {
123837
123947
  throw new Error(`Script "${input.scriptType}" not found`);
123838
123948
  }
123839
123949
  try {
@@ -123847,7 +123957,7 @@ var WorkspaceService = class {
123847
123957
  var workspaceService = new WorkspaceService();
123848
123958
 
123849
123959
  // src/server/services/task-service.ts
123850
- var log24 = createLogger("task-service");
123960
+ var log25 = createLogger("task-service");
123851
123961
  var taskQueries = new TaskQueries();
123852
123962
  function listFiles(dir) {
123853
123963
  try {
@@ -123940,7 +124050,7 @@ function persistTask(task) {
123940
124050
  chatId: task.chatId
123941
124051
  });
123942
124052
  } catch (err) {
123943
- log24.warn({ err, taskId: task.taskRecordId }, "failed to persist task");
124053
+ log25.warn({ err, taskId: task.taskRecordId }, "failed to persist task");
123944
124054
  }
123945
124055
  }
123946
124056
  function broadcast(chatId, chunk) {
@@ -123964,7 +124074,7 @@ function broadcast(chatId, chunk) {
123964
124074
  }
123965
124075
  const subs = listeners2.get(chatId);
123966
124076
  if (!subs || subs.size === 0) {
123967
- log24.warn({ chatId, chunkType: chunk.type }, "broadcast: no listeners");
124077
+ log25.warn({ chatId, chunkType: chunk.type }, "broadcast: no listeners");
123968
124078
  return;
123969
124079
  }
123970
124080
  for (const listener of subs) {
@@ -124028,7 +124138,7 @@ function submitTask(options2) {
124028
124138
  });
124029
124139
  }
124030
124140
  runTask(chatId, task).catch((err) => {
124031
- log24.error({ chatId, err }, "task execution failed");
124141
+ log25.error({ chatId, err }, "task execution failed");
124032
124142
  if (task.status === "running") {
124033
124143
  task.status = "failed";
124034
124144
  task.completedAt = Date.now();
@@ -124070,7 +124180,7 @@ function abortTask(chatId) {
124070
124180
  chatService.updateStatus(chatId, "idle");
124071
124181
  const updated = upsertWorkspaceStatus(task.workspaceId, { status: "waiting" });
124072
124182
  emit({ kind: "update", status: updated });
124073
- log24.info({ chatId }, "task aborted by user");
124183
+ log25.info({ chatId }, "task aborted by user");
124074
124184
  return true;
124075
124185
  }
124076
124186
  function cancelTask(taskId) {
@@ -124095,7 +124205,7 @@ function cancelTask(taskId) {
124095
124205
  chatService.updateStatus(chatId, "idle");
124096
124206
  const updated = upsertWorkspaceStatus(task.workspaceId, { status: "waiting" });
124097
124207
  emit({ kind: "update", status: updated });
124098
- log24.info({ chatId, taskId }, "task cancelled (was running in-memory)");
124208
+ log25.info({ chatId, taskId }, "task cancelled (was running in-memory)");
124099
124209
  return { cancelled: true, workspaceId: task.workspaceId };
124100
124210
  }
124101
124211
  }
@@ -124103,7 +124213,7 @@ function cancelTask(taskId) {
124103
124213
  if (record2) {
124104
124214
  const updated = upsertWorkspaceStatus(record2.workspaceId, { status: "waiting" });
124105
124215
  emit({ kind: "update", status: updated });
124106
- log24.info({ taskId, workspaceId: record2.workspaceId }, "orphaned task cancelled");
124216
+ log25.info({ taskId, workspaceId: record2.workspaceId }, "orphaned task cancelled");
124107
124217
  return { cancelled: true, workspaceId: record2.workspaceId };
124108
124218
  }
124109
124219
  return { cancelled: false };
@@ -124123,7 +124233,7 @@ async function runTask(chatId, task) {
124123
124233
  const taskAgentId = task.codingAgentId;
124124
124234
  const resolvedAgentId = taskAgentId ?? chatSession?.agent;
124125
124235
  const needsReplace = taskAgentId && taskAgentId !== chatSession?.agent;
124126
- log24.info(
124236
+ log25.info(
124127
124237
  { chatId, taskAgentId, chatAgent: chatSession?.agent, resolvedAgentId, needsReplace },
124128
124238
  "resolving agent for task"
124129
124239
  );
@@ -124170,7 +124280,7 @@ async function runTask(chatId, task) {
124170
124280
  [File sharing: to send a file to the user, write or copy it to ${sharedDir}/ and it will appear as a downloadable file card in the chat.]`;
124171
124281
  const effectivePrompt = task.sessionId ? task.agentPrompt : task.agentPrompt + fileSharingHint;
124172
124282
  for await (const event of agent.runSession(effectivePrompt, task.sessionId, sessionOptions)) {
124173
- log24.info({ chatId, eventType: event.type }, "task event");
124283
+ log25.info({ chatId, eventType: event.type }, "task event");
124174
124284
  switch (event.type) {
124175
124285
  case "session-start": {
124176
124286
  task.sessionId = event.sessionId;
@@ -124370,7 +124480,7 @@ async function runTask(chatId, task) {
124370
124480
  break;
124371
124481
  }
124372
124482
  case "session-id-resolved": {
124373
- log24.info(
124483
+ log25.info(
124374
124484
  { chatId, previous: event.previousSessionId, resolved: event.resolvedSessionId },
124375
124485
  "session ID resolved"
124376
124486
  );
@@ -124473,7 +124583,7 @@ ${queued.text}`;
124473
124583
  });
124474
124584
  autoStarted = true;
124475
124585
  } catch (err) {
124476
- log24.warn({ chatId, err }, "failed to auto-start queued task");
124586
+ log25.warn({ chatId, err }, "failed to auto-start queued task");
124477
124587
  }
124478
124588
  }
124479
124589
  }
@@ -124648,7 +124758,7 @@ var taskService = new TaskService();
124648
124758
  var HISTORY_PAGE_SIZE = 50;
124649
124759
 
124650
124760
  // src/api/chat-events.ts
124651
- var log25 = createLogger("chat-events");
124761
+ var log26 = createLogger("chat-events");
124652
124762
  var COLD_REPLAY_LIMIT = HISTORY_PAGE_SIZE;
124653
124763
  async function handleChatEvents(req, res, chatId) {
124654
124764
  const url = new URL(req.url, `http://${req.headers.host}`);
@@ -124729,7 +124839,7 @@ async function handleChatEvents(req, res, chatId) {
124729
124839
  chatWorkspaceId: chat?.workspaceId ?? explicitWorkspaceId,
124730
124840
  agentTypeHint: chat?.agent
124731
124841
  }).catch((err) => {
124732
- log25.warn({ chatId, err }, "replay phase failed; continuing to live tail");
124842
+ log26.warn({ chatId, err }, "replay phase failed; continuing to live tail");
124733
124843
  });
124734
124844
  try {
124735
124845
  while (!res.destroyed && !writer.closed) {
@@ -124809,7 +124919,7 @@ async function replayPast(opts) {
124809
124919
  }
124810
124920
  }
124811
124921
  } catch (err) {
124812
- log25.warn({ chatId, sessionId, err }, "JSONL backfill failed; falling through to buffer");
124922
+ log26.warn({ chatId, sessionId, err }, "JSONL backfill failed; falling through to buffer");
124813
124923
  }
124814
124924
  }
124815
124925
  if (!jsonlEmittedAny && buf) {
@@ -124856,7 +124966,7 @@ async function replayPast(opts) {
124856
124966
  }
124857
124967
  }
124858
124968
  } catch (err) {
124859
- log25.warn({ chatId, sessionId, err }, "JSONL backfill failed; falling through to buffer");
124969
+ log26.warn({ chatId, sessionId, err }, "JSONL backfill failed; falling through to buffer");
124860
124970
  }
124861
124971
  }
124862
124972
  if (buf) {
@@ -124964,7 +125074,7 @@ function chunkToChatEvent(chunk, _sessionId) {
124964
125074
 
124965
125075
  // src/api/chat-history.ts
124966
125076
  init_src();
124967
- var log26 = createLogger("chat-history");
125077
+ var log27 = createLogger("chat-history");
124968
125078
  var DEFAULT_PAGE_LIMIT = HISTORY_PAGE_SIZE;
124969
125079
  var MAX_PAGE_LIMIT = 200;
124970
125080
  var MAX_CHAT_ID_LENGTH = 200;
@@ -125027,7 +125137,7 @@ async function handleChatHistory(req, res, chatId) {
125027
125137
  oldestOffset: result.firstOffset
125028
125138
  });
125029
125139
  } catch (err) {
125030
- log26.warn(
125140
+ log27.warn(
125031
125141
  { chatId: chatId.slice(0, 8), err: err instanceof Error ? err.message : String(err) },
125032
125142
  "chat-history: failed to read older page"
125033
125143
  );
@@ -125067,7 +125177,7 @@ async function saveUploadedFilesDetailed(fileParts) {
125067
125177
  }
125068
125178
 
125069
125179
  // src/api/chat-submit.ts
125070
- var log27 = createLogger("chat-submit");
125180
+ var log28 = createLogger("chat-submit");
125071
125181
  function readBody(req) {
125072
125182
  return new Promise((resolve12, reject) => {
125073
125183
  const chunks = [];
@@ -125104,7 +125214,7 @@ async function handleChatSubmit(req, res, chatId) {
125104
125214
  if (files && files.length > 0) {
125105
125215
  savedFiles = await saveUploadedFilesDetailed(files);
125106
125216
  if (savedFiles.length !== files.length) {
125107
- log27.warn(
125217
+ log28.warn(
125108
125218
  { chatId, submitted: files.length, saved: savedFiles.length },
125109
125219
  "chat-submit: some file uploads were dropped (malformed data URL?)"
125110
125220
  );
@@ -125134,7 +125244,7 @@ ${text3}`;
125134
125244
  model,
125135
125245
  codingAgentId
125136
125246
  });
125137
- log27.info({ chatId, workspaceId }, "chat-submit: task started");
125247
+ log28.info({ chatId, workspaceId }, "chat-submit: task started");
125138
125248
  sendJson2(res, 200, { ok: true, queued: false });
125139
125249
  } catch (err) {
125140
125250
  if (err instanceof TaskConflictError) {
@@ -125149,7 +125259,7 @@ ${text3}`;
125149
125259
  }))
125150
125260
  }
125151
125261
  });
125152
- log27.info({ chatId, workspaceId }, "chat-submit: task busy, message queued");
125262
+ log28.info({ chatId, workspaceId }, "chat-submit: task busy, message queued");
125153
125263
  sendJson2(res, 200, { ok: true, queued: true });
125154
125264
  return;
125155
125265
  }
@@ -125157,7 +125267,7 @@ ${text3}`;
125157
125267
  sendJson2(res, 404, { error: err.message });
125158
125268
  return;
125159
125269
  }
125160
- log27.error({ chatId, err }, "chat-submit: unexpected error");
125270
+ log28.error({ chatId, err }, "chat-submit: unexpected error");
125161
125271
  sendJson2(res, 500, { error: "Internal server error" });
125162
125272
  }
125163
125273
  }
@@ -136563,7 +136673,7 @@ import { extname as extname2, isAbsolute as isAbsolute2 } from "node:path";
136563
136673
 
136564
136674
  // src/server/infra/browser-host/host-state.ts
136565
136675
  init_src();
136566
- var log28 = createLogger("browser-host");
136676
+ var log29 = createLogger("browser-host");
136567
136677
  var DESKTOP_CDP_HOST = "127.0.0.1";
136568
136678
  var DESKTOP_CDP_PORT = 9223;
136569
136679
  var globalAny = globalThis;
@@ -136614,7 +136724,7 @@ async function ensureCdpTargetId(bandTabId) {
136614
136724
  reject: rejectFn,
136615
136725
  timeoutId
136616
136726
  });
136617
- log28.info(
136727
+ log29.info(
136618
136728
  "ensureCdpTargetId emitting ensureView for %s (url=%s, listeners=%d)",
136619
136729
  bandTabId,
136620
136730
  tab.url,
@@ -136628,13 +136738,13 @@ async function ensureCdpTargetId(bandTabId) {
136628
136738
  url: tab.url
136629
136739
  });
136630
136740
  } catch (err) {
136631
- log28.warn("ensureView listener threw: %s", err instanceof Error ? err.message : err);
136741
+ log29.warn("ensureView listener threw: %s", err instanceof Error ? err.message : err);
136632
136742
  }
136633
136743
  }
136634
136744
  return promise;
136635
136745
  }
136636
136746
  function resolveTargetReady(bandTabId, cdpTargetId) {
136637
- log28.info("resolveTargetReady %s \u2192 %s", bandTabId, cdpTargetId);
136747
+ log29.info("resolveTargetReady %s \u2192 %s", bandTabId, cdpTargetId);
136638
136748
  targetIdByBandTabId.set(bandTabId, cdpTargetId);
136639
136749
  const pending2 = pendingEnsures.get(bandTabId);
136640
136750
  if (pending2) {
@@ -136644,7 +136754,7 @@ function resolveTargetReady(bandTabId, cdpTargetId) {
136644
136754
  }
136645
136755
  }
136646
136756
  function markTargetDestroyed(bandTabId) {
136647
- log28.info("markTargetDestroyed %s", bandTabId);
136757
+ log29.info("markTargetDestroyed %s", bandTabId);
136648
136758
  targetIdByBandTabId.delete(bandTabId);
136649
136759
  const pending2 = pendingEnsures.get(bandTabId);
136650
136760
  if (pending2) {
@@ -136655,10 +136765,10 @@ function markTargetDestroyed(bandTabId) {
136655
136765
  }
136656
136766
  function onEnsureView(listener) {
136657
136767
  ensureListeners.add(listener);
136658
- log28.info("onEnsureView subscriber added (total=%d)", ensureListeners.size);
136768
+ log29.info("onEnsureView subscriber added (total=%d)", ensureListeners.size);
136659
136769
  return () => {
136660
136770
  ensureListeners.delete(listener);
136661
- log28.info("onEnsureView subscriber removed (total=%d)", ensureListeners.size);
136771
+ log29.info("onEnsureView subscriber removed (total=%d)", ensureListeners.size);
136662
136772
  if (ensureListeners.size === 0) {
136663
136773
  for (const [bandTabId, pending2] of pendingEnsures) {
136664
136774
  clearTimeout(pending2.timeoutId);
@@ -136698,7 +136808,7 @@ var t2 = initTRPC.context().create();
136698
136808
  var publicProcedure = t2.procedure;
136699
136809
 
136700
136810
  // src/server/api/browser-host/router.ts
136701
- var log29 = createLogger("trpc.browser-host");
136811
+ var log30 = createLogger("trpc.browser-host");
136702
136812
  var MAX_FILE_SIZE = 1024 * 1024;
136703
136813
  var LANG_MAP = {
136704
136814
  ".js": "javascript",
@@ -136821,7 +136931,7 @@ var browserHostRouter = t2.router({
136821
136931
  // can confirm in the server log that the bridge component actually
136822
136932
  // executed. Drop once the experiment is stable.
136823
136933
  ping: publicProcedure.input(external_exports.object({ where: external_exports.string() })).mutation(({ input }) => {
136824
- log29.info("browserHost.ping from %s", input.where);
136934
+ log30.info("browserHost.ping from %s", input.where);
136825
136935
  return { ok: true };
136826
136936
  }),
136827
136937
  ensureView: publicProcedure.subscription(async function* (opts) {
@@ -136941,7 +137051,7 @@ var chatRouter = t2.router({
136941
137051
  // src/server/api/chats/router.ts
136942
137052
  init_src();
136943
137053
  init_zod();
136944
- var log30 = createLogger("chats-router");
137054
+ var log31 = createLogger("chats-router");
136945
137055
  var chatLayoutRouter = t2.router({
136946
137056
  get: publicProcedure.input(external_exports.object({ workspaceId: external_exports.string() })).query(({ input }) => {
136947
137057
  return { tree: chatService.getLayout(input.workspaceId) };
@@ -137086,7 +137196,7 @@ var chatsRouter = t2.router({
137086
137196
  summary = info?.summary;
137087
137197
  lastModified = info?.lastModified;
137088
137198
  } catch (err) {
137089
- log30.warn(
137199
+ log31.warn(
137090
137200
  { chatId: input.chatId, sessionId: input.sessionId, err },
137091
137201
  "setActiveSession: getSessionInfo failed"
137092
137202
  );
@@ -137391,7 +137501,7 @@ function throwAsTRPCError(err) {
137391
137501
  init_zod();
137392
137502
 
137393
137503
  // src/server/services/editor-service.ts
137394
- import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync8 } from "node:fs";
137504
+ import { existsSync as existsSync11, realpathSync as realpathSync5, statSync as statSync8 } from "node:fs";
137395
137505
  import { isAbsolute as isAbsolute4, join as join25, resolve as resolve6, sep as sep4 } from "node:path";
137396
137506
 
137397
137507
  // src/server/services/file-watcher.ts
@@ -137488,10 +137598,10 @@ function subscribeToFileChanges(workspaceId, listener) {
137488
137598
 
137489
137599
  // src/server/services/formatter.ts
137490
137600
  init_src();
137491
- import { existsSync as existsSync9, realpathSync as realpathSync4 } from "node:fs";
137601
+ import { existsSync as existsSync10, realpathSync as realpathSync4 } from "node:fs";
137492
137602
  import { basename, dirname as dirname5, isAbsolute as isAbsolute3, join as join24, resolve as resolvePath } from "node:path";
137493
137603
  import prettier from "prettier";
137494
- var log31 = createLogger("formatter");
137604
+ var log32 = createLogger("formatter");
137495
137605
  var FormatterError = class extends Error {
137496
137606
  code;
137497
137607
  detail;
@@ -137515,7 +137625,7 @@ async function formatFile(worktreePath, filePath, content2, options2 = {}) {
137515
137625
  const ignorePath = resolvePath(worktreePath, ".prettierignore");
137516
137626
  const info = await prettier.getFileInfo(absFile, {
137517
137627
  resolveConfig: true,
137518
- ignorePath: existsSync9(ignorePath) ? ignorePath : void 0
137628
+ ignorePath: existsSync10(ignorePath) ? ignorePath : void 0
137519
137629
  });
137520
137630
  if (info.ignored) {
137521
137631
  return {
@@ -137546,7 +137656,7 @@ async function formatFile(worktreePath, filePath, content2, options2 = {}) {
137546
137656
  }
137547
137657
  const changed = formatted !== content2;
137548
137658
  if (changed) {
137549
- log31.info(
137659
+ log32.info(
137550
137660
  "Formatted %s with parser=%s (%d bytes in)",
137551
137661
  absFile,
137552
137662
  info.inferredParser,
@@ -137699,7 +137809,7 @@ var EditorOpenError = class extends Error {
137699
137809
  }
137700
137810
  };
137701
137811
  function canonicalizeMaybeMissing(p6) {
137702
- if (existsSync10(p6)) {
137812
+ if (existsSync11(p6)) {
137703
137813
  try {
137704
137814
  return realpathSync5(p6);
137705
137815
  } catch {
@@ -137709,7 +137819,7 @@ function canonicalizeMaybeMissing(p6) {
137709
137819
  const parts = p6.split(sep4);
137710
137820
  for (let i2 = parts.length - 1; i2 > 0; i2--) {
137711
137821
  const prefix = parts.slice(0, i2).join(sep4) || sep4;
137712
- if (existsSync10(prefix)) {
137822
+ if (existsSync11(prefix)) {
137713
137823
  try {
137714
137824
  const canonicalPrefix = realpathSync5(prefix);
137715
137825
  return join25(canonicalPrefix, ...parts.slice(i2));
@@ -138101,8 +138211,19 @@ var SystemService = class {
138101
138211
  * `$PATH` (typically via `shellPath()`) so `brew` itself is locatable
138102
138212
  * even when the Node process inherited a stripped-down PATH from
138103
138213
  * launchd / Electron.
138214
+ *
138215
+ * Homebrew is macOS-only here: a stock Linux host has no `brew`, so
138216
+ * shelling out to it would fail with an opaque ENOENT. Guard on
138217
+ * `darwin` and surface a distro-appropriate hint on every other
138218
+ * platform — the message bubbles up to the dashboard's install flow as
138219
+ * a normal error instead of a crash.
138104
138220
  */
138105
138221
  async installCloudflared(resolvedPath) {
138222
+ if (process.platform !== "darwin") {
138223
+ throw new Error(
138224
+ "Automatic cloudflared install is only supported on macOS (via Homebrew). On Linux, install it with your package manager (e.g. `sudo apt install cloudflared` or `sudo dnf install cloudflared`) or download it from https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/ and re-open the tunnel."
138225
+ );
138226
+ }
138106
138227
  await brewInstall("cloudflared", resolvedPath);
138107
138228
  }
138108
138229
  /**
@@ -138241,7 +138362,7 @@ init_zod();
138241
138362
 
138242
138363
  // src/server/services/model-refresh-service.ts
138243
138364
  init_src();
138244
- var log32 = createLogger("model-refresh");
138365
+ var log33 = createLogger("model-refresh");
138245
138366
  var ModelRefreshService = class {
138246
138367
  constructor(queries = new SettingsQueries()) {
138247
138368
  this.queries = queries;
@@ -138294,7 +138415,7 @@ var ModelRefreshService = class {
138294
138415
  const models = await agent.listModels();
138295
138416
  return models.map(toCachedModel);
138296
138417
  } catch (err) {
138297
- log32.warn({ agentId, err }, "failed to load adapter defaults; returning empty list");
138418
+ log33.warn({ agentId, err }, "failed to load adapter defaults; returning empty list");
138298
138419
  return [];
138299
138420
  }
138300
138421
  }
@@ -138331,7 +138452,7 @@ var ModelRefreshService = class {
138331
138452
  }
138332
138453
  } catch (err) {
138333
138454
  error2 = classifyRefreshError(err);
138334
- log32.warn({ agentId, err }, "failed to refresh models; keeping prior cache");
138455
+ log33.warn({ agentId, err }, "failed to refresh models; keeping prior cache");
138335
138456
  }
138336
138457
  if (fresh) {
138337
138458
  const cachedFresh = fresh.map(toCachedModel);
@@ -138459,7 +138580,7 @@ var ModelRefreshService = class {
138459
138580
  const agents = this.queries.load().codingAgents ?? [];
138460
138581
  const idx = agents.findIndex((a6) => a6.id === agentId);
138461
138582
  if (idx === -1) {
138462
- log32.warn({ agentId }, "refresh result for unknown agent; not persisting");
138583
+ log33.warn({ agentId }, "refresh result for unknown agent; not persisting");
138463
138584
  return false;
138464
138585
  }
138465
138586
  const next = agents.map(
@@ -138537,6 +138658,25 @@ var modesRouter = t2.router({
138537
138658
  })
138538
138659
  });
138539
138660
 
138661
+ // src/server/api/panel-focus/router.ts
138662
+ init_zod();
138663
+ var focusPanelType = external_exports.enum(["chat", "terminal", "browser"]);
138664
+ var panelFocusRouter = t2.router({
138665
+ get: publicProcedure.input(external_exports.object({ workspaceId: external_exports.string() })).query(({ input }) => {
138666
+ return panelFocusService.get(input.workspaceId);
138667
+ }),
138668
+ set: publicProcedure.input(
138669
+ external_exports.object({
138670
+ workspaceId: external_exports.string(),
138671
+ panelType: focusPanelType,
138672
+ panelId: external_exports.string()
138673
+ })
138674
+ ).mutation(({ input }) => {
138675
+ panelFocusService.set(input.workspaceId, input.panelType, input.panelId);
138676
+ return { ok: true };
138677
+ })
138678
+ });
138679
+
138540
138680
  // src/server/api/prereqs/router.ts
138541
138681
  var prereqsRouter = t2.router({
138542
138682
  check: publicProcedure.query(async () => {
@@ -138553,7 +138693,7 @@ var prereqsRouter = t2.router({
138553
138693
  init_zod();
138554
138694
 
138555
138695
  // src/server/services/project-service.ts
138556
- import { existsSync as existsSync11 } from "node:fs";
138696
+ import { existsSync as existsSync12 } from "node:fs";
138557
138697
  import { basename as basename2, join as join27, resolve as resolve7 } from "node:path";
138558
138698
  var ProjectService = class {
138559
138699
  constructor(queries = new ProjectQueries(), git = new GitClient(), settings = settingsService, statusQueries = new WorkspaceStatusQueries()) {
@@ -138630,7 +138770,7 @@ var ProjectService = class {
138630
138770
  */
138631
138771
  checkPath(path3) {
138632
138772
  const resolvedPath = resolve7(path3);
138633
- const isGitRepo = existsSync11(join27(resolvedPath, ".git"));
138773
+ const isGitRepo = existsSync12(join27(resolvedPath, ".git"));
138634
138774
  return { isGitRepo };
138635
138775
  }
138636
138776
  /**
@@ -138666,7 +138806,7 @@ var ProjectService = class {
138666
138806
  }
138667
138807
  }
138668
138808
  const resolvedPath = resolve7(path3);
138669
- const kind = existsSync11(join27(resolvedPath, ".git")) ? "git" : "plain";
138809
+ const kind = existsSync12(join27(resolvedPath, ".git")) ? "git" : "plain";
138670
138810
  let defaultBranch = "main";
138671
138811
  let worktrees2 = [];
138672
138812
  if (kind === "git") {
@@ -138724,7 +138864,7 @@ var ProjectService = class {
138724
138864
  message: `Project "${name3}" is already a git project`
138725
138865
  });
138726
138866
  }
138727
- if (!existsSync11(project.path)) {
138867
+ if (!existsSync12(project.path)) {
138728
138868
  throw new TRPCError({
138729
138869
  code: "NOT_FOUND",
138730
138870
  message: `Project path "${project.path}" no longer exists. Remove the project and re-add it.`
@@ -138842,7 +138982,7 @@ init_src();
138842
138982
  init_zod();
138843
138983
  import { realpathSync as realpathSync6 } from "node:fs";
138844
138984
  import { join as join28, resolve as resolve8, sep as sep5 } from "node:path";
138845
- var log33 = createLogger("trpc.queue");
138985
+ var log34 = createLogger("trpc.queue");
138846
138986
  var queuedFileSchema = external_exports.object({
138847
138987
  mediaType: external_exports.string(),
138848
138988
  url: external_exports.string(),
@@ -138874,7 +139014,7 @@ async function resolveQueuedFiles(chatId, files) {
138874
139014
  const derivedPath = file.path ?? (uploadsUrlMatch ? join28(bandHome(), "uploads", uploadsUrlMatch[1]) : void 0);
138875
139015
  if (derivedPath) {
138876
139016
  if (!isPathWithinUploadDir(derivedPath)) {
138877
- log33.warn(
139017
+ log34.warn(
138878
139018
  { chatId, path: derivedPath, filename: file.filename },
138879
139019
  "queue: dropping file with path outside uploads directory"
138880
139020
  );
@@ -138899,7 +139039,7 @@ async function resolveQueuedFiles(chatId, files) {
138899
139039
  });
138900
139040
  continue;
138901
139041
  }
138902
- log33.warn(
139042
+ log34.warn(
138903
139043
  { chatId, url: file.url, filename: file.filename },
138904
139044
  "queue: dropping file with no path and non-data URL \u2014 cannot recover disk path"
138905
139045
  );
@@ -138907,7 +139047,7 @@ async function resolveQueuedFiles(chatId, files) {
138907
139047
  if (needsSave.length > 0) {
138908
139048
  const saved = await saveUploadedFilesDetailed(needsSave);
138909
139049
  if (saved.length !== needsSave.length) {
138910
- log33.error(
139050
+ log34.error(
138911
139051
  { chatId, expected: needsSave.length, got: saved.length },
138912
139052
  "queue: saveUploadedFilesDetailed returned unexpected count \u2014 dropping data-URL files (cannot map 1:1)"
138913
139053
  );
@@ -138940,7 +139080,7 @@ var queueRouter = t2.router({
138940
139080
  try {
138941
139081
  files = await resolveQueuedFiles(chatId, input.files);
138942
139082
  } catch (err) {
138943
- log33.error(
139083
+ log34.error(
138944
139084
  { chatId, err: err instanceof Error ? err.message : err },
138945
139085
  "queue.push: failed to persist file uploads; enqueuing text only"
138946
139086
  );
@@ -138976,7 +139116,7 @@ var queueRouter = t2.router({
138976
139116
  files: await resolveQueuedFiles(chatId, m11.files)
138977
139117
  };
138978
139118
  } catch (err) {
138979
- log33.error(
139119
+ log34.error(
138980
139120
  { chatId, messageId: m11.id, err: err instanceof Error ? err.message : err },
138981
139121
  "queue: failed to resolve files for queued message; dropping its files"
138982
139122
  );
@@ -139101,7 +139241,7 @@ function aggregateTurnsByHourAndModel(snap, provider) {
139101
139241
  }
139102
139242
  return Array.from(buckets2.values());
139103
139243
  }
139104
- var log34 = createLogger("usage-scanner");
139244
+ var log35 = createLogger("usage-scanner");
139105
139245
  var SCHEDULER_KEY2 = Symbol.for("band.usage-scanner");
139106
139246
  var g14 = globalThis;
139107
139247
  if (!g14[SCHEDULER_KEY2]) {
@@ -139163,14 +139303,14 @@ var UsageScannerService = class {
139163
139303
  try {
139164
139304
  totalRows += await this.scanPair(ws, a6);
139165
139305
  } catch (err) {
139166
- log34.warn(
139306
+ log35.warn(
139167
139307
  { err, workspaceId: ws.workspaceId, agentType: a6.agentType },
139168
139308
  "usage scanner pair failed"
139169
139309
  );
139170
139310
  }
139171
139311
  }
139172
139312
  }
139173
- log34.debug(
139313
+ log35.debug(
139174
139314
  { durationMs: this.now() - started, workspaces: workspaces.length, rowsWritten: totalRows },
139175
139315
  "usage scanner tick complete"
139176
139316
  );
@@ -139215,7 +139355,7 @@ var UsageScannerService = class {
139215
139355
  try {
139216
139356
  agent = await this.createWorkspaceAgent(ws.worktreePath, a6.agentId);
139217
139357
  } catch (err) {
139218
- log34.debug({ err, agentId: a6.agentId }, "failed to instantiate agent for scan");
139358
+ log35.debug({ err, agentId: a6.agentId }, "failed to instantiate agent for scan");
139219
139359
  return 0;
139220
139360
  }
139221
139361
  if (!agent.listSessions || !agent.getSessionUsage) return 0;
@@ -139224,7 +139364,7 @@ var UsageScannerService = class {
139224
139364
  try {
139225
139365
  sessions = await agent.listSessions(ws.worktreePath);
139226
139366
  } catch (err) {
139227
- log34.debug(
139367
+ log35.debug(
139228
139368
  { err, agentId: a6.agentId, worktreePath: ws.worktreePath },
139229
139369
  "listSessions failed during usage scan"
139230
139370
  );
@@ -139240,7 +139380,7 @@ var UsageScannerService = class {
139240
139380
  try {
139241
139381
  snap = await agent.getSessionUsage(s6.sessionId, ws.worktreePath);
139242
139382
  } catch (err) {
139243
- log34.debug(
139383
+ log35.debug(
139244
139384
  { err, sessionId: s6.sessionId, agentType: a6.agentType },
139245
139385
  "getSessionUsage failed"
139246
139386
  );
@@ -139278,7 +139418,7 @@ var UsageScannerService = class {
139278
139418
  this.scanState.set(ws.workspaceId, a6.agentType, maxObserved);
139279
139419
  }
139280
139420
  if (changed.length > slice.length) {
139281
- log34.debug(
139421
+ log35.debug(
139282
139422
  {
139283
139423
  workspaceId: ws.workspaceId,
139284
139424
  agentType: a6.agentType,
@@ -139333,11 +139473,11 @@ function startUsageScanner(options2 = {}) {
139333
139473
  const intervalMs = options2.intervalMs ?? USAGE_SCAN_INTERVAL_MS;
139334
139474
  const svc = getUsageScannerService();
139335
139475
  svc.tick().catch((err) => {
139336
- log34.warn({ err }, "initial usage scanner tick failed");
139476
+ log35.warn({ err }, "initial usage scanner tick failed");
139337
139477
  });
139338
139478
  const timer = setInterval(() => {
139339
139479
  svc.tick().catch((err) => {
139340
- log34.warn({ err }, "scheduled usage scanner tick failed");
139480
+ log35.warn({ err }, "scheduled usage scanner tick failed");
139341
139481
  });
139342
139482
  }, intervalMs);
139343
139483
  timer.unref();
@@ -139459,7 +139599,7 @@ init_zod();
139459
139599
 
139460
139600
  // src/server/services/session-service.ts
139461
139601
  init_src();
139462
- var log35 = createLogger("session-service");
139602
+ var log36 = createLogger("session-service");
139463
139603
  var SessionService = class {
139464
139604
  /**
139465
139605
  * List past sessions for a workspace's chat pane.
@@ -139479,7 +139619,7 @@ var SessionService = class {
139479
139619
  if (!agent.supportedFeatures.sessionListing || !agent.listSessions) {
139480
139620
  return { sessions: [], supported: false };
139481
139621
  }
139482
- log35.debug({ chatId, workspaceId: input.workspaceId }, "listing past sessions for chat");
139622
+ log36.debug({ chatId, workspaceId: input.workspaceId }, "listing past sessions for chat");
139483
139623
  const allSessions = await agent.listSessions(workspace.worktree.path);
139484
139624
  return { sessions: allSessions, supported: true };
139485
139625
  }
@@ -139635,7 +139775,7 @@ function getToken() {
139635
139775
  }
139636
139776
 
139637
139777
  // src/server/infra/tunnels/tunnel-client.ts
139638
- var log36 = createLogger("tunnel");
139778
+ var log37 = createLogger("tunnel");
139639
139779
  var TunnelClient = class _TunnelClient {
139640
139780
  tunnelProcess = null;
139641
139781
  tunnelUrl = null;
@@ -139659,7 +139799,7 @@ var TunnelClient = class _TunnelClient {
139659
139799
  }
139660
139800
  spawnTunnel(options2, resolvedPath) {
139661
139801
  const args = ["tunnel", "--config", "/dev/null", "--url", `http://localhost:${options2.port}`];
139662
- log36.debug("spawning cloudflared %s", args.join(" "));
139802
+ log37.debug("spawning cloudflared %s", args.join(" "));
139663
139803
  return new Promise((resolve12, reject) => {
139664
139804
  const child = spawn7("cloudflared", args, {
139665
139805
  env: { ...process.env, PATH: resolvedPath },
@@ -139673,12 +139813,12 @@ var TunnelClient = class _TunnelClient {
139673
139813
  for (const line2 of text3.split("\n")) {
139674
139814
  const trimmed = line2.trim();
139675
139815
  if (!trimmed) continue;
139676
- log36.debug("output: %s", trimmed);
139816
+ log37.debug("output: %s", trimmed);
139677
139817
  const url = _TunnelClient.extractUrl(trimmed);
139678
139818
  if (url) {
139679
139819
  const token = getToken();
139680
139820
  this.tunnelUrl = _TunnelClient.appendToken(url, token);
139681
- log36.debug("detected URL: %s", this.tunnelUrl);
139821
+ log37.debug("detected URL: %s", this.tunnelUrl);
139682
139822
  emit({ kind: "tunnel-url", url: this.tunnelUrl });
139683
139823
  if (!settled) {
139684
139824
  settled = true;
@@ -139693,7 +139833,7 @@ var TunnelClient = class _TunnelClient {
139693
139833
  handleOutput(data);
139694
139834
  });
139695
139835
  child.on("error", (err) => {
139696
- log36.debug("process error: %s", err.message);
139836
+ log37.debug("process error: %s", err.message);
139697
139837
  this.tunnelProcess = null;
139698
139838
  this.tunnelUrl = null;
139699
139839
  emit({ kind: "tunnel-error", error: err.message });
@@ -139703,7 +139843,7 @@ var TunnelClient = class _TunnelClient {
139703
139843
  }
139704
139844
  });
139705
139845
  child.on("exit", (code) => {
139706
- log36.debug("process exited with code: %d", code ?? -1);
139846
+ log37.debug("process exited with code: %d", code ?? -1);
139707
139847
  const wasRunning = this.tunnelProcess !== null && settled;
139708
139848
  this.tunnelProcess = null;
139709
139849
  this.tunnelUrl = null;
@@ -139725,7 +139865,7 @@ var TunnelClient = class _TunnelClient {
139725
139865
  });
139726
139866
  setTimeout(() => {
139727
139867
  if (!settled) {
139728
- log36.debug("30s timeout reached, resolving without URL");
139868
+ log37.debug("30s timeout reached, resolving without URL");
139729
139869
  settled = true;
139730
139870
  resolve12();
139731
139871
  }
@@ -139734,12 +139874,12 @@ var TunnelClient = class _TunnelClient {
139734
139874
  }
139735
139875
  async start(options2) {
139736
139876
  if (this.startInProgress) {
139737
- log36.debug("start: start already in progress, waiting...");
139877
+ log37.debug("start: start already in progress, waiting...");
139738
139878
  await this.startInProgress;
139739
139879
  return;
139740
139880
  }
139741
139881
  if (this.tunnelProcess) {
139742
- log36.debug("start: already running, re-emitting URL");
139882
+ log37.debug("start: already running, re-emitting URL");
139743
139883
  if (this.tunnelUrl) {
139744
139884
  emit({ kind: "tunnel-url", url: this.tunnelUrl });
139745
139885
  }
@@ -139804,7 +139944,7 @@ var TunnelService = class {
139804
139944
  var tunnelService = new TunnelService();
139805
139945
 
139806
139946
  // src/server/api/system/router.ts
139807
- var log37 = createLogger("trpc.system");
139947
+ var log38 = createLogger("trpc.system");
139808
139948
  var systemRouter = t2.router({
139809
139949
  /**
139810
139950
  * Combined liveness probe — webserver is always true if this query
@@ -139812,15 +139952,15 @@ var systemRouter = t2.router({
139812
139952
  * an interval to drive the bottom-bar status pill.
139813
139953
  */
139814
139954
  health: publicProcedure.query(() => {
139815
- log37.debug("services.health called");
139955
+ log38.debug("services.health called");
139816
139956
  const tunnel = tunnelService.getStatus();
139817
- log37.debug({ tunnel }, "services.health: tunnel status");
139957
+ log38.debug({ tunnel }, "services.health: tunnel status");
139818
139958
  const result = {
139819
139959
  webserver: true,
139820
139960
  tunnel: tunnel.running,
139821
139961
  tunnel_url: tunnel.url
139822
139962
  };
139823
- log37.debug({ result }, "services.health result");
139963
+ log38.debug({ result }, "services.health result");
139824
139964
  return result;
139825
139965
  }),
139826
139966
  // Activity level controls how often the branch-status poller fires.
@@ -139938,7 +140078,7 @@ var systemRouter = t2.router({
139938
140078
  // src/server/api/tasks/router.ts
139939
140079
  init_src();
139940
140080
  init_zod();
139941
- var log38 = createLogger("tasks-router");
140081
+ var log39 = createLogger("tasks-router");
139942
140082
  var tasksRouter = t2.router({
139943
140083
  list: publicProcedure.input(
139944
140084
  external_exports.object({
@@ -140001,7 +140141,7 @@ var tasksRouter = t2.router({
140001
140141
  if (input.files && input.files.length > 0) {
140002
140142
  const savedFiles = await saveUploadedFilesDetailed(input.files);
140003
140143
  if (savedFiles.length !== input.files.length) {
140004
- log38.warn(
140144
+ log39.warn(
140005
140145
  { chatId, submitted: input.files.length, saved: savedFiles.length },
140006
140146
  "tasks.submit: some file uploads were dropped (malformed data URL?)"
140007
140147
  );
@@ -140223,25 +140363,25 @@ var terminalsRouters = {
140223
140363
  // src/server/api/tunnel/router.ts
140224
140364
  init_src();
140225
140365
  init_zod();
140226
- var log39 = createLogger("trpc.tunnel");
140366
+ var log40 = createLogger("trpc.tunnel");
140227
140367
  var tunnelRouter = t2.router({
140228
140368
  status: publicProcedure.query(() => {
140229
140369
  return tunnelService.getStatus();
140230
140370
  }),
140231
140371
  start: publicProcedure.input(external_exports.object({}).optional()).mutation(async () => {
140232
- log39.debug("tunnel.start called");
140372
+ log40.debug("tunnel.start called");
140233
140373
  try {
140234
140374
  await tunnelService.start();
140235
140375
  } catch (err) {
140236
- log39.debug({ err }, "tunnel.start: startTunnel failed");
140376
+ log40.debug({ err }, "tunnel.start: startTunnel failed");
140237
140377
  return { ok: true, url: null };
140238
140378
  }
140239
140379
  const status = tunnelService.getStatus();
140240
- log39.debug({ status }, "tunnel.start: after startTunnel");
140380
+ log40.debug({ status }, "tunnel.start: after startTunnel");
140241
140381
  if (status.url) {
140242
140382
  return { ok: true, url: status.url };
140243
140383
  }
140244
- log39.debug("tunnel.start: no URL available");
140384
+ log40.debug("tunnel.start: no URL available");
140245
140385
  return { ok: true, url: null };
140246
140386
  }),
140247
140387
  stop: publicProcedure.mutation(async () => {
@@ -140255,10 +140395,10 @@ init_zod();
140255
140395
 
140256
140396
  // src/server/services/diff-service.ts
140257
140397
  init_src();
140258
- import { existsSync as existsSync12 } from "node:fs";
140398
+ import { existsSync as existsSync13 } from "node:fs";
140259
140399
  import { readFile as readFile2, rm as rm2 } from "node:fs/promises";
140260
140400
  import { join as join29, resolve as resolve9, sep as sep6 } from "node:path";
140261
- var log40 = createLogger("diff-service");
140401
+ var log41 = createLogger("diff-service");
140262
140402
  var EMPTY_TREE_ARGS = ["hash-object", "-t", "tree", "/dev/null"];
140263
140403
  var EMPTY_TREE_SHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
140264
140404
  async function resolveDiffContext(cwd, defaultBranch, diffMode, compareBranchInput) {
@@ -140363,7 +140503,7 @@ var DiffService = class {
140363
140503
  );
140364
140504
  branches = output.trim().split("\n").map((b10) => b10.trim()).filter(Boolean);
140365
140505
  } catch (err) {
140366
- log40.error(
140506
+ log41.error(
140367
140507
  `listBranches: for-each-ref failed for ${cwd}: ${err instanceof Error ? err.message : err}`
140368
140508
  );
140369
140509
  }
@@ -140462,7 +140602,7 @@ var DiffService = class {
140462
140602
  async getDiffSummary(workspaceId, options2) {
140463
140603
  const workspace = this.workspaces.resolve(workspaceId);
140464
140604
  if (!workspace) throw new WorkspaceNotFoundError(workspaceId);
140465
- const hasGit = existsSync12(join29(workspace.worktree.path, ".git"));
140605
+ const hasGit = existsSync13(join29(workspace.worktree.path, ".git"));
140466
140606
  if (workspace.project.kind === "plain" || !hasGit) {
140467
140607
  const defaultBranch2 = workspace.project.defaultBranch;
140468
140608
  return {
@@ -140594,7 +140734,7 @@ var DiffService = class {
140594
140734
  var diffService = new DiffService();
140595
140735
 
140596
140736
  // src/server/services/files-service.ts
140597
- import { existsSync as existsSync13 } from "node:fs";
140737
+ import { existsSync as existsSync14 } from "node:fs";
140598
140738
  import { cp, mkdir as mkdir2, readdir as readdir2, readFile as readFile3, rename, rm as rm3, stat as stat4, writeFile as writeFile2 } from "node:fs/promises";
140599
140739
  import { dirname as dirname7, extname as extname3, join as join30, resolve as resolve10, sep as sep7 } from "node:path";
140600
140740
  var MAX_FILE_SIZE2 = 1024 * 1024;
@@ -140713,11 +140853,11 @@ var FilesService = class {
140713
140853
  async createFile(workspaceId, path3, content2 = "") {
140714
140854
  const { root, target } = this.resolveInside(workspaceId, path3, { allowRoot: false });
140715
140855
  this.assertNotGitInternals(root, target, "create");
140716
- if (existsSync13(target)) {
140856
+ if (existsSync14(target)) {
140717
140857
  throw new Error("A file or directory already exists at this path");
140718
140858
  }
140719
140859
  const parent = dirname7(target);
140720
- if (!existsSync13(parent)) {
140860
+ if (!existsSync14(parent)) {
140721
140861
  throw new Error("Parent directory does not exist");
140722
140862
  }
140723
140863
  const parentStat = await stat4(parent);
@@ -140730,11 +140870,11 @@ var FilesService = class {
140730
140870
  async createDirectory(workspaceId, path3) {
140731
140871
  const { root, target } = this.resolveInside(workspaceId, path3, { allowRoot: false });
140732
140872
  this.assertNotGitInternals(root, target, "create");
140733
- if (existsSync13(target)) {
140873
+ if (existsSync14(target)) {
140734
140874
  throw new Error("A file or directory already exists at this path");
140735
140875
  }
140736
140876
  const parent = dirname7(target);
140737
- if (!existsSync13(parent)) {
140877
+ if (!existsSync14(parent)) {
140738
140878
  throw new Error("Parent directory does not exist");
140739
140879
  }
140740
140880
  const parentStat = await stat4(parent);
@@ -140775,11 +140915,11 @@ var FilesService = class {
140775
140915
  } catch {
140776
140916
  throw new Error("Source path does not exist");
140777
140917
  }
140778
- if (existsSync13(toTarget)) {
140918
+ if (existsSync14(toTarget)) {
140779
140919
  throw new Error("A file or directory already exists at the destination");
140780
140920
  }
140781
140921
  const toParent = dirname7(toTarget);
140782
- if (!existsSync13(toParent)) {
140922
+ if (!existsSync14(toParent)) {
140783
140923
  throw new Error("Destination parent directory does not exist");
140784
140924
  }
140785
140925
  const toParentStat = await stat4(toParent);
@@ -140811,11 +140951,11 @@ var FilesService = class {
140811
140951
  if (entryStat.isDirectory() && toTarget.startsWith(fromTarget + sep7)) {
140812
140952
  throw new Error("Cannot copy a directory into itself");
140813
140953
  }
140814
- if (existsSync13(toTarget)) {
140954
+ if (existsSync14(toTarget)) {
140815
140955
  throw new Error("A file or directory already exists at the destination");
140816
140956
  }
140817
140957
  const toParent = dirname7(toTarget);
140818
- if (!existsSync13(toParent)) {
140958
+ if (!existsSync14(toParent)) {
140819
140959
  throw new Error("Destination parent directory does not exist");
140820
140960
  }
140821
140961
  const toParentStat = await stat4(toParent);
@@ -142344,6 +142484,7 @@ var appRouter = t2.router({
142344
142484
  chat: chatRouter,
142345
142485
  browsers: browsersRouter,
142346
142486
  browserLayout: browserLayoutRouter,
142487
+ panelFocus: panelFocusRouter,
142347
142488
  tasks: tasksRouter,
142348
142489
  sessions: sessionsRouter,
142349
142490
  ...terminalsRouters,
@@ -142479,7 +142620,7 @@ function getScalarHtml(specUrl) {
142479
142620
 
142480
142621
  // src/server/api/terminals/ws.ts
142481
142622
  init_src();
142482
- var log41 = createLogger("terminal-ws");
142623
+ var log42 = createLogger("terminal-ws");
142483
142624
  var MAX_CLOSE_REASON_BYTES = 123;
142484
142625
  var HEARTBEAT_INTERVAL_MS2 = 3e4;
142485
142626
  function clampCloseReason(reason) {
@@ -142551,7 +142692,7 @@ async function handleTerminalConnection(ws, req) {
142551
142692
  session = await terminalService.spawn(workspaceId, terminalId, spawnOpts);
142552
142693
  } catch (err) {
142553
142694
  const msg = err instanceof Error ? err.message : String(err);
142554
- log41.error("Failed to spawn terminal %s for workspace %s: %s", terminalId, workspaceId, msg);
142695
+ log42.error("Failed to spawn terminal %s for workspace %s: %s", terminalId, workspaceId, msg);
142555
142696
  safeClose(ws, 4001, msg);
142556
142697
  return;
142557
142698
  }
@@ -142565,7 +142706,7 @@ async function handleTerminalConnection(ws, req) {
142565
142706
  });
142566
142707
  }
142567
142708
  function attachSession(ws, terminalId, workspaceId, session, isNew) {
142568
- log41.debug(
142709
+ log42.debug(
142569
142710
  "Terminal %s: %s (workspace %s)",
142570
142711
  isNew ? "connected" : "reconnected",
142571
142712
  terminalId,
@@ -142594,7 +142735,7 @@ function attachSession(ws, terminalId, workspaceId, session, isNew) {
142594
142735
  }, 3e3);
142595
142736
  const exitDisposable = session.pty.onExit(({ exitCode }) => {
142596
142737
  clearInterval(processInterval);
142597
- log41.debug("PTY exited with code %d for terminal %s", exitCode, terminalId);
142738
+ log42.debug("PTY exited with code %d for terminal %s", exitCode, terminalId);
142598
142739
  if (ws.readyState === ws.OPEN) {
142599
142740
  ws.close(1e3, "Terminal exited");
142600
142741
  }
@@ -142622,7 +142763,7 @@ function attachSession(ws, terminalId, workspaceId, session, isNew) {
142622
142763
  clearInterval(pingInterval);
142623
142764
  dataDisposable.dispose();
142624
142765
  exitDisposable.dispose();
142625
- log41.debug("Terminal disconnected: %s (PTY kept alive)", terminalId);
142766
+ log42.debug("Terminal disconnected: %s (PTY kept alive)", terminalId);
142626
142767
  });
142627
142768
  }
142628
142769
  function handleMessage(ws, terminalId, session, message) {
@@ -142658,7 +142799,7 @@ function stripTerminalQueries(data) {
142658
142799
 
142659
142800
  // src/server/infra/browser-host/cdp-proxy.ts
142660
142801
  init_src();
142661
- var log42 = createLogger("cdp-proxy");
142802
+ var log43 = createLogger("cdp-proxy");
142662
142803
  async function handleCdpConnection(ws, req) {
142663
142804
  const url = new URL(req.url ?? "", `http://${req.headers.host}`);
142664
142805
  const bandTabId = url.searchParams.get("bandTabId");
@@ -142681,17 +142822,17 @@ async function handleCdpConnection(ws, req) {
142681
142822
  cdpTargetId = await ensureCdpTargetId(bandTabId);
142682
142823
  } catch (err) {
142683
142824
  const message = err instanceof Error ? err.message : String(err);
142684
- log42.debug("ensureCdpTargetId failed for %s: %s", bandTabId, message);
142825
+ log43.debug("ensureCdpTargetId failed for %s: %s", bandTabId, message);
142685
142826
  if (ws.readyState === ws.OPEN) {
142686
142827
  ws.close(4001, message.slice(0, 123));
142687
142828
  }
142688
142829
  return;
142689
142830
  }
142690
142831
  const upstreamUrl = `ws://${DESKTOP_CDP_HOST}:${DESKTOP_CDP_PORT}/devtools/page/${encodeURIComponent(cdpTargetId)}`;
142691
- log42.info("CDP proxy connecting bandTabId=%s upstream=%s", bandTabId, upstreamUrl);
142832
+ log43.info("CDP proxy connecting bandTabId=%s upstream=%s", bandTabId, upstreamUrl);
142692
142833
  upstream = new wrapper_default(upstreamUrl);
142693
142834
  upstream.on("open", () => {
142694
- log42.info("CDP upstream open bandTabId=%s pending=%d", bandTabId, pending2.length);
142835
+ log43.info("CDP upstream open bandTabId=%s pending=%d", bandTabId, pending2.length);
142695
142836
  for (const msg of pending2) {
142696
142837
  upstream?.send(msg);
142697
142838
  }
@@ -142703,20 +142844,20 @@ async function handleCdpConnection(ws, req) {
142703
142844
  }
142704
142845
  });
142705
142846
  upstream.on("error", (err) => {
142706
- log42.warn("CDP upstream error bandTabId=%s: %s", bandTabId, err.message);
142847
+ log43.warn("CDP upstream error bandTabId=%s: %s", bandTabId, err.message);
142707
142848
  markTargetDestroyed(bandTabId);
142708
142849
  if (ws.readyState === ws.OPEN) {
142709
142850
  ws.close(4001, `Desktop CDP error: ${err.message}`.slice(0, 123));
142710
142851
  }
142711
142852
  });
142712
142853
  upstream.on("close", (code) => {
142713
- log42.info("CDP upstream closed bandTabId=%s code=%d", bandTabId, code);
142854
+ log43.info("CDP upstream closed bandTabId=%s code=%d", bandTabId, code);
142714
142855
  if (ws.readyState === ws.OPEN) {
142715
142856
  ws.close(1e3, "Upstream closed");
142716
142857
  }
142717
142858
  });
142718
142859
  ws.on("close", () => {
142719
- log42.debug("CDP client closed bandTabId=%s", bandTabId);
142860
+ log43.debug("CDP client closed bandTabId=%s", bandTabId);
142720
142861
  if (upstream && (upstream.readyState === wrapper_default.OPEN || upstream.readyState === wrapper_default.CONNECTING)) {
142721
142862
  try {
142722
142863
  upstream.close();
@@ -142725,7 +142866,7 @@ async function handleCdpConnection(ws, req) {
142725
142866
  }
142726
142867
  });
142727
142868
  ws.on("error", (err) => {
142728
- log42.debug("CDP client error bandTabId=%s: %s", bandTabId, err.message);
142869
+ log43.debug("CDP client error bandTabId=%s: %s", bandTabId, err.message);
142729
142870
  try {
142730
142871
  upstream?.close();
142731
142872
  } catch {
@@ -142735,7 +142876,7 @@ async function handleCdpConnection(ws, req) {
142735
142876
 
142736
142877
  // src/server/infra/browser-host/cdp-targets.ts
142737
142878
  init_src();
142738
- var log43 = createLogger("cdp-targets");
142879
+ var log44 = createLogger("cdp-targets");
142739
142880
  var CdpUnreachableError = class extends Error {
142740
142881
  constructor(message) {
142741
142882
  super(message);
@@ -142791,7 +142932,7 @@ async function captureSnapshot(bandTabId) {
142791
142932
  });
142792
142933
  ws.on("error", (err) => {
142793
142934
  clearTimeout(timeout);
142794
- log43.debug("captureSnapshot ws error for tab %s: %s", bandTabId, err.message);
142935
+ log44.debug("captureSnapshot ws error for tab %s: %s", bandTabId, err.message);
142795
142936
  markTargetDestroyed(bandTabId);
142796
142937
  settle(new CdpUnreachableError(err.message));
142797
142938
  });
@@ -142811,7 +142952,7 @@ function runMigrations() {
142811
142952
 
142812
142953
  // src/server/infra/lsp/lsp-proxy.ts
142813
142954
  init_src();
142814
- var log44 = createLogger("lsp-proxy");
142955
+ var log45 = createLogger("lsp-proxy");
142815
142956
  function frameMessage(json2) {
142816
142957
  const body = Buffer.from(json2, "utf-8");
142817
142958
  const header = `Content-Length: ${body.byteLength}\r
@@ -142829,7 +142970,7 @@ function createFrameParser(onMessage) {
142829
142970
  const headerStr = buffer.subarray(0, separatorIdx).toString("ascii");
142830
142971
  const match = headerStr.match(/Content-Length:\s*(\d+)/i);
142831
142972
  if (!match) {
142832
- log44.warn("Malformed LSP header: %s", headerStr);
142973
+ log45.warn("Malformed LSP header: %s", headerStr);
142833
142974
  buffer = buffer.subarray(separatorIdx + 4);
142834
142975
  continue;
142835
142976
  }
@@ -142862,7 +143003,7 @@ async function handleLspConnection(ws, req) {
142862
143003
  session = await getOrSpawnServer(workspaceId, lang);
142863
143004
  } catch (err) {
142864
143005
  const message = err instanceof Error ? err.message : String(err);
142865
- log44.error(
143006
+ log45.error(
142866
143007
  "Failed to spawn %s language server for workspace %s: %s",
142867
143008
  lang,
142868
143009
  workspaceId,
@@ -142876,12 +143017,12 @@ async function handleLspConnection(ws, req) {
142876
143017
  ws.close(4002, "Language server stdio not available");
142877
143018
  return;
142878
143019
  }
142879
- log44.debug("LSP client connected: %s/%s", workspaceId, lang);
143020
+ log45.debug("LSP client connected: %s/%s", workspaceId, lang);
142880
143021
  const pendingRequests = /* @__PURE__ */ new Map();
142881
143022
  const retriedIds = /* @__PURE__ */ new Set();
142882
143023
  const RETRY_DELAY_MS = 2e3;
142883
143024
  const parseFrame = createFrameParser((json2) => {
142884
- log44.debug(
143025
+ log45.debug(
142885
143026
  "LSP stdout [%s/%s]: %s",
142886
143027
  workspaceId,
142887
143028
  lang,
@@ -142893,7 +143034,7 @@ async function handleLspConnection(ws, req) {
142893
143034
  const originalRequest = pendingRequests.get(msg.id);
142894
143035
  retriedIds.add(msg.id);
142895
143036
  pendingRequests.delete(msg.id);
142896
- log44.debug(
143037
+ log45.debug(
142897
143038
  "LSP retrying request %d after 'No Project' error [%s/%s]",
142898
143039
  msg.id,
142899
143040
  workspaceId,
@@ -142915,14 +143056,14 @@ async function handleLspConnection(ws, req) {
142915
143056
  const onStdoutData = (chunk) => parseFrame(chunk);
142916
143057
  lspProcess.stdout.on("data", onStdoutData);
142917
143058
  const onExit = (code) => {
142918
- log44.debug("LSP server exited (code %s), closing WebSocket", String(code));
143059
+ log45.debug("LSP server exited (code %s), closing WebSocket", String(code));
142919
143060
  if (ws.readyState === ws.OPEN) {
142920
143061
  ws.close(1e3, "Language server exited");
142921
143062
  }
142922
143063
  };
142923
143064
  lspProcess.on("exit", onExit);
142924
143065
  function forwardToStdin(json2) {
142925
- log44.debug(
143066
+ log45.debug(
142926
143067
  "LSP stdin [%s/%s]: %s",
142927
143068
  workspaceId,
142928
143069
  lang,
@@ -142949,7 +143090,7 @@ async function handleLspConnection(ws, req) {
142949
143090
  ws.on("close", () => {
142950
143091
  lspProcess.stdout?.off("data", onStdoutData);
142951
143092
  lspProcess.off("exit", onExit);
142952
- log44.debug("LSP client disconnected: %s/%s (server kept alive)", workspaceId, lang);
143093
+ log45.debug("LSP client disconnected: %s/%s (server kept alive)", workspaceId, lang);
142953
143094
  });
142954
143095
  }
142955
143096
 
@@ -143097,7 +143238,7 @@ async function installSkills(opts = {}) {
143097
143238
  }
143098
143239
 
143099
143240
  // src/server/services/setup-service.ts
143100
- var log45 = createLogger("setup");
143241
+ var log46 = createLogger("setup");
143101
143242
  var AGENT_CHECKS = [
143102
143243
  { id: "claude-code", type: "claude-code", label: "Claude Code", binary: "claude" },
143103
143244
  { id: "codex", type: "codex", label: "Codex", binary: "codex" },
@@ -143114,7 +143255,7 @@ async function runFirstTimeSetup() {
143114
143255
  ]);
143115
143256
  for (const r6 of results) {
143116
143257
  if (r6.status === "rejected") {
143117
- log45.warn(
143258
+ log46.warn(
143118
143259
  "Setup step failed: %s",
143119
143260
  r6.reason instanceof Error ? r6.reason.message : String(r6.reason)
143120
143261
  );
@@ -143128,7 +143269,7 @@ async function refreshAgentModelsInBackground() {
143128
143269
  const ok2 = results.filter((r6) => !r6.error).length;
143129
143270
  const failed = results.length - ok2;
143130
143271
  if (results.length > 0) {
143131
- log45.info(
143272
+ log46.info(
143132
143273
  "Background model refresh: %d/%d agents updated (%d failed)",
143133
143274
  ok2,
143134
143275
  results.length,
@@ -143136,7 +143277,7 @@ async function refreshAgentModelsInBackground() {
143136
143277
  );
143137
143278
  }
143138
143279
  } catch (err) {
143139
- log45.warn(
143280
+ log46.warn(
143140
143281
  "Background model refresh failed: %s",
143141
143282
  err instanceof Error ? err.message : String(err)
143142
143283
  );
@@ -143150,7 +143291,7 @@ async function ensureProjectStateInSync() {
143150
143291
  try {
143151
143292
  await syncService.syncWorktrees();
143152
143293
  } catch (err) {
143153
- log45.warn(
143294
+ log46.warn(
143154
143295
  "Failed to sync project state at boot: %s",
143155
143296
  err instanceof Error ? err.message : String(err)
143156
143297
  );
@@ -143161,22 +143302,22 @@ async function ensureCliInstalled() {
143161
143302
  try {
143162
143303
  cliStatus = await checkCli();
143163
143304
  } catch (err) {
143164
- log45.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
143305
+ log46.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
143165
143306
  return;
143166
143307
  }
143167
143308
  if (cliStatus === "Installed") {
143168
143309
  return;
143169
143310
  }
143170
143311
  if (cliStatus !== "NotInstalled") {
143171
- log45.warn("CLI not auto-installed (status: %s)", cliStatus);
143312
+ log46.warn("CLI not auto-installed (status: %s)", cliStatus);
143172
143313
  return;
143173
143314
  }
143174
- log45.info("Installing band CLI...");
143315
+ log46.info("Installing band CLI...");
143175
143316
  try {
143176
143317
  await installCli();
143177
- log45.info("CLI installed to /usr/local/bin/band");
143318
+ log46.info("CLI installed to /usr/local/bin/band");
143178
143319
  } catch (err) {
143179
- log45.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
143320
+ log46.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
143180
143321
  }
143181
143322
  }
143182
143323
  async function ensureDefaultCodingAgents() {
@@ -143185,17 +143326,17 @@ async function ensureDefaultCodingAgents() {
143185
143326
  if (Array.isArray(existing) && existing.length > 0) {
143186
143327
  return;
143187
143328
  }
143188
- log45.info("Detecting installed coding agents...");
143329
+ log46.info("Detecting installed coding agents...");
143189
143330
  const detected = [];
143190
143331
  for (const check2 of AGENT_CHECKS) {
143191
143332
  const path3 = await systemService.whichBinary(check2.binary);
143192
143333
  if (path3) {
143193
- log45.info("Detected coding agent: %s (%s)", check2.id, path3);
143334
+ log46.info("Detected coding agent: %s (%s)", check2.id, path3);
143194
143335
  detected.push({ id: check2.id, type: check2.type, label: check2.label });
143195
143336
  }
143196
143337
  }
143197
143338
  if (detected.length === 0) {
143198
- log45.info("No coding agent CLIs detected on PATH");
143339
+ log46.info("No coding agent CLIs detected on PATH");
143199
143340
  return;
143200
143341
  }
143201
143342
  const current2 = loadSettings();
@@ -143204,7 +143345,7 @@ async function ensureDefaultCodingAgents() {
143204
143345
  current2.defaultCodingAgent = detected[0].id;
143205
143346
  }
143206
143347
  saveSettings(current2);
143207
- log45.info("Enabled %d coding agent(s); default = %s", detected.length, current2.defaultCodingAgent);
143348
+ log46.info("Enabled %d coding agent(s); default = %s", detected.length, current2.defaultCodingAgent);
143208
143349
  }
143209
143350
  function ensureNotificationDefaults() {
143210
143351
  const settings = loadSettings();
@@ -143216,7 +143357,7 @@ function ensureNotificationDefaults() {
143216
143357
  ...settings,
143217
143358
  notifications: { ...notifications, soundOnNeedsAttention: true }
143218
143359
  });
143219
- log45.info("Set default notifications.soundOnNeedsAttention = true");
143360
+ log46.info("Set default notifications.soundOnNeedsAttention = true");
143220
143361
  }
143221
143362
  async function ensureClaudeHooks() {
143222
143363
  try {
@@ -143225,9 +143366,9 @@ async function ensureClaudeHooks() {
143225
143366
  return;
143226
143367
  }
143227
143368
  await installHooks();
143228
- log45.info("Installed Claude Code hooks");
143369
+ log46.info("Installed Claude Code hooks");
143229
143370
  } catch (err) {
143230
- log45.warn(
143371
+ log46.warn(
143231
143372
  "Failed to install Claude Code hooks: %s",
143232
143373
  err instanceof Error ? err.message : String(err)
143233
143374
  );
@@ -143235,11 +143376,11 @@ async function ensureClaudeHooks() {
143235
143376
  }
143236
143377
  async function ensureSkillsInstalled() {
143237
143378
  try {
143238
- const result = await installSkills({ log: log45 });
143379
+ const result = await installSkills({ log: log46 });
143239
143380
  const wrote = result.written.length + result.updated.length;
143240
143381
  const linkChange = result.linked.length;
143241
143382
  if (wrote > 0 || linkChange > 0 || result.conflicts.length > 0) {
143242
- log45.info(
143383
+ log46.info(
143243
143384
  "Synced CLI skills (shared: %d written, %d updated, %d unchanged; symlinks: %d created, %d already-linked, %d conflicts, %d skipped)",
143244
143385
  result.written.length,
143245
143386
  result.updated.length,
@@ -143251,7 +143392,7 @@ async function ensureSkillsInstalled() {
143251
143392
  );
143252
143393
  }
143253
143394
  } catch (err) {
143254
- log45.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
143395
+ log46.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
143255
143396
  }
143256
143397
  }
143257
143398
  var SetupService = class {