@band-app/server 0.30.1 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/client/assets/{TerminalPanel-CYc7wmeE.js → TerminalPanel-DdoEObnF.js} +1 -1
  2. package/dist/client/assets/{_basePickBy-DSFTNllf.js → _basePickBy-B3BFyLWC.js} +1 -1
  3. package/dist/client/assets/{_baseUniq-DnkIfali.js → _baseUniq-BZZjCl_a.js} +1 -1
  4. package/dist/client/assets/{arc-yqr-IZtS.js → arc-CHfgBvn_.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DgI9TKhb.js → architectureDiagram-VXUJARFQ-DQA19xNg.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-BGOVIb7o.js → blockDiagram-VD42YOAC-F8PTxmQ_.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-iztuATa5.js → c4Diagram-YG6GDRKO-BJUm36SI.js} +1 -1
  8. package/dist/client/assets/channel-RulspXoY.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-CcUWoJOh.js → chunk-4BX2VUAB-C1wjI1w7.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-CLZYywVn.js → chunk-55IACEB6-CGfcCH6v.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-DjGod5fi.js → chunk-B4BG7PRW-DmVN_q5R.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-rvGroe_f.js → chunk-DI55MBZ5-Cp0-lUyt.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-DaPnkf6C.js → chunk-FMBD7UC4-BE3Cu6Ut.js} +1 -1
  14. package/dist/client/assets/{chunk-QN33PNHL-0f_dQb97.js → chunk-QN33PNHL-CPVRy0ja.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-V5my3DmE.js → chunk-QZHKN3VN-C7Y7bhq5.js} +1 -1
  16. package/dist/client/assets/{chunk-TZMSLE5B-BtkkmYb5.js → chunk-TZMSLE5B-Bi_vlgox.js} +1 -1
  17. package/dist/client/assets/classDiagram-2ON5EDUG-Db0XAgV5.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Db0XAgV5.js +1 -0
  19. package/dist/client/assets/clone-OMk_JTVX.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-Cmx6KOyO.js → cose-bilkent-S5V4N54A-CoCMLv_6.js} +1 -1
  21. package/dist/client/assets/{dagre-6UL2VRFP-Bka4HPUz.js → dagre-6UL2VRFP-EnAkiIUe.js} +1 -1
  22. package/dist/client/assets/{diagram-PSM6KHXK-CD7rmMsc.js → diagram-PSM6KHXK-C2Y89USX.js} +1 -1
  23. package/dist/client/assets/{diagram-QEK2KX5R-oiADiv14.js → diagram-QEK2KX5R-B-lmAMSj.js} +1 -1
  24. package/dist/client/assets/{diagram-S2PKOQOG-B4Uae-nx.js → diagram-S2PKOQOG-D3nbDuM4.js} +1 -1
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-BvFMCk4I.js → erDiagram-Q2GNP2WA-PNRr4PfI.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-BTNbN1IS.js → flowDiagram-NV44I4VS-DMJLrOve.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-oGw7ex14.js → ganttDiagram-JELNMOA3-B8xTGdhz.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-ANBYCIGh.js → gitGraphDiagram-V2S2FVAM-1W-3cgTi.js} +1 -1
  29. package/dist/client/assets/{graph-CcgcxFwc.js → graph-DtlkBWdT.js} +1 -1
  30. package/dist/client/assets/{highlighted-body-B3W2YXNL-CB6TXvrA.js → highlighted-body-B3W2YXNL-By10eQ93.js} +1 -1
  31. package/dist/client/assets/{index-jADn9moZ.js → index-3OKF_8Is.js} +1 -1
  32. package/dist/client/assets/{index-DbMvNJEz.js → index-Bgy7cu0a.js} +1 -1
  33. package/dist/client/assets/{index-CCYZ9TFO.js → index-BzNAZ5FA.js} +1 -1
  34. package/dist/client/assets/{index-DGfblNX8.js → index-Bzw80mva.js} +1 -1
  35. package/dist/client/assets/{index-AmFSOCK4.js → index-C0hp-RSv.js} +1 -1
  36. package/dist/client/assets/{index-B6XNXoaL.js → index-CEIbmBrz.js} +1 -1
  37. package/dist/client/assets/{index-BAmJ0GKU.js → index-D0-MMrtE.js} +1 -1
  38. package/dist/client/assets/{index-D3oXjM3u.js → index-D1tzUCeW.js} +1 -1
  39. package/dist/client/assets/{index-UPQzA7yb.js → index-DS648c4_.js} +1 -1
  40. package/dist/client/assets/{index-DwfeHYo6.js → index-DV4-ZPTy.js} +1 -1
  41. package/dist/client/assets/{index-CNK9CFgH.js → index-DkJyKKg0.js} +1 -1
  42. package/dist/client/assets/{index-CX6RhqKm.js → index-Do8FqasK.js} +1 -1
  43. package/dist/client/assets/{index-CCvSBgbq.js → index-DtgD3j-s.js} +1 -1
  44. package/dist/client/assets/{index-DbPjX4ZE.js → index-DwIIxwyA.js} +1 -1
  45. package/dist/client/assets/{index-oktth6Eb.js → index-DzmcYgsK.js} +1 -1
  46. package/dist/client/assets/{index-DcH_gVmD.js → index-UlnCpzJG.js} +1 -1
  47. package/dist/client/assets/{index-DW6uLGze.js → index-bqUQQY5s.js} +1 -1
  48. package/dist/client/assets/{index-DfpgVgGw.js → index-os2U5ZBq.js} +1 -1
  49. package/dist/client/assets/{infoDiagram-HS3SLOUP-D90X75Z3.js → infoDiagram-HS3SLOUP-DekD9pOv.js} +1 -1
  50. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BgChwq0x.js → journeyDiagram-XKPGCS4Q-Fzs0FbeM.js} +1 -1
  51. package/dist/client/assets/{kanban-definition-3W4ZIXB7-Di1Xrs0h.js → kanban-definition-3W4ZIXB7-6B7ehAZt.js} +1 -1
  52. package/dist/client/assets/{layout-BvXbPDLJ.js → layout-CcUD7gHw.js} +1 -1
  53. package/dist/client/assets/{main-DUGGQWmn.js → main-B-TE9tSM.js} +219 -223
  54. package/dist/client/assets/main-mRE1Fhv7.css +1 -0
  55. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CiiV7X0E.js → mindmap-definition-VGOIOE7T-CfY1kt2W.js} +1 -1
  56. package/dist/client/assets/{pieDiagram-ADFJNKIX-C5XzwLyG.js → pieDiagram-ADFJNKIX-C-ZZw4jN.js} +1 -1
  57. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-BwkGtnp5.js → quadrantDiagram-AYHSOK5B-Cn4pxyBH.js} +1 -1
  58. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-BzEtQL4i.js → requirementDiagram-UZGBJVZJ-B0UYN1Sq.js} +1 -1
  59. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BkqqCKr3.js → sankeyDiagram-TZEHDZUN-DegmNHvK.js} +1 -1
  60. package/dist/client/assets/{sequenceDiagram-WL72ISMW-D_gZ_Lt0.js → sequenceDiagram-WL72ISMW-B8BlHF2c.js} +1 -1
  61. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DEDS5Lv4.js → stateDiagram-FKZM4ZOC-3FR63a_N.js} +1 -1
  62. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BrxlUWYt.js +1 -0
  63. package/dist/client/assets/{timeline-definition-IT6M3QCI-DalCe-B5.js → timeline-definition-IT6M3QCI-F2yYpGjm.js} +1 -1
  64. package/dist/client/assets/{treemap-GDKQZRPO-CtoL0e4U.js → treemap-GDKQZRPO-Br0ExAYs.js} +1 -1
  65. package/dist/client/assets/workspace._workspaceId-C0VOYb-1.js +1 -0
  66. package/dist/client/assets/{workspace._workspaceId-CouwLO7q.js → workspace._workspaceId-DxBPbkq5.js} +1 -1
  67. package/dist/client/assets/{xychartDiagram-PRI3JC2R-C3bXo21u.js → xychartDiagram-PRI3JC2R-CnbekSuG.js} +1 -1
  68. package/dist/openapi.json +37 -0
  69. package/dist/server/assets/{TerminalPanel-Br6bnerp.js → TerminalPanel-CThgG3BY.js} +27 -24
  70. package/dist/server/assets/{_basePickBy-BbVdfJJx.js → _basePickBy-DMEcDwoD.js} +2 -2
  71. package/dist/server/assets/{_baseUniq-DZlTc9mr.js → _baseUniq-C6YEem8Y.js} +1 -1
  72. package/dist/server/assets/_tanstack-start-manifest_v-D-Rf7MMa.js +4 -0
  73. package/dist/server/assets/{arc-CI6FZKZK.js → arc-CcEw1rIf.js} +1 -1
  74. package/dist/server/assets/{architecture-7HQA4BMR-C5ydTPUl.js → architecture-7HQA4BMR-BXvzNToj.js} +6 -6
  75. package/dist/server/assets/{architectureDiagram-VXUJARFQ-5uniqAHc.js → architectureDiagram-VXUJARFQ-BliQCKdG.js} +6 -6
  76. package/dist/server/assets/{blockDiagram-VD42YOAC-ZfA3oZiS.js → blockDiagram-VD42YOAC-CjmYP_Tq.js} +6 -6
  77. package/dist/server/assets/{c4Diagram-YG6GDRKO-CIA5eVV6.js → c4Diagram-YG6GDRKO-BfRolLuL.js} +2 -2
  78. package/dist/server/assets/{channel-Cx4VskGi.js → channel-CmYmU2fF.js} +1 -1
  79. package/dist/server/assets/{chunk-4BX2VUAB-Ded1GGo-.js → chunk-4BX2VUAB-DnWdxOy5.js} +1 -1
  80. package/dist/server/assets/{chunk-55IACEB6-BwrewJPk.js → chunk-55IACEB6-BTmbTQIk.js} +1 -1
  81. package/dist/server/assets/{chunk-B4BG7PRW-6-52BPtW.js → chunk-B4BG7PRW-Dd8U8eRH.js} +4 -4
  82. package/dist/server/assets/{chunk-DI55MBZ5-DFS2_qc9.js → chunk-DI55MBZ5-DOSx8ES_.js} +3 -3
  83. package/dist/server/assets/{chunk-FMBD7UC4-CHuRNLFJ.js → chunk-FMBD7UC4-DoS4CUAI.js} +1 -1
  84. package/dist/server/assets/{chunk-QN33PNHL-BvqSEFKx.js → chunk-QN33PNHL-81e5hpqA.js} +1 -1
  85. package/dist/server/assets/{chunk-QZHKN3VN-BrGUOJtT.js → chunk-QZHKN3VN-Cruwx7ml.js} +1 -1
  86. package/dist/server/assets/{chunk-TZMSLE5B-CM-vVEKG.js → chunk-TZMSLE5B-CVdCnVV1.js} +1 -1
  87. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-vj4N4uTP.js → classDiagram-2ON5EDUG-CI4dbXAN.js} +5 -5
  88. package/dist/server/assets/{classDiagram-2ON5EDUG-vj4N4uTP.js → classDiagram-v2-WZHVMYZB-CI4dbXAN.js} +5 -5
  89. package/dist/server/assets/{clone-FpW231EY.js → clone-DCf3XlPY.js} +1 -1
  90. package/dist/server/assets/{cose-bilkent-S5V4N54A-KcHAEwzJ.js → cose-bilkent-S5V4N54A-MuUXxVtC.js} +1 -1
  91. package/dist/server/assets/{dagre-6UL2VRFP-CQWT1qH1.js → dagre-6UL2VRFP-C7ckn20c.js} +6 -6
  92. package/dist/server/assets/{diagram-PSM6KHXK-C522aWwF.js → diagram-PSM6KHXK-CMxqFNNc.js} +7 -7
  93. package/dist/server/assets/{diagram-QEK2KX5R-AmngkeIE.js → diagram-QEK2KX5R-DGn7Wc3l.js} +6 -6
  94. package/dist/server/assets/{diagram-S2PKOQOG-BM39hxHa.js → diagram-S2PKOQOG-DCkkbBLl.js} +6 -6
  95. package/dist/server/assets/{erDiagram-Q2GNP2WA-BKMMfe3p.js → erDiagram-Q2GNP2WA-CKPFaAp2.js} +4 -4
  96. package/dist/server/assets/{flowDiagram-NV44I4VS-BfixH-Db.js → flowDiagram-NV44I4VS-DFf8L08F.js} +5 -5
  97. package/dist/server/assets/{ganttDiagram-JELNMOA3-DFMW13wi.js → ganttDiagram-JELNMOA3-1-t_r6jX.js} +1 -1
  98. package/dist/server/assets/{gitGraph-G5XIXVHT-DCO9Wzl8.js → gitGraph-G5XIXVHT-CXVQFRFs.js} +6 -6
  99. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-CojxDa8_.js → gitGraphDiagram-V2S2FVAM-DVqN7ZP0.js} +7 -7
  100. package/dist/server/assets/{graph-DX0Ld9Ij.js → graph-Dot7YH89.js} +2 -2
  101. package/dist/server/assets/{highlighted-body-B3W2YXNL-BRJTScpo.js → highlighted-body-B3W2YXNL-8cjZuRJ2.js} +1 -1
  102. package/dist/server/assets/{index-BJtDnGxq.js → index-AmUVRRsa.js} +2 -2
  103. package/dist/server/assets/{index-BPhNydFp.js → index-B2x1DfYc.js} +2 -2
  104. package/dist/server/assets/{index-7EU1eTTa.js → index-BDgBWXBD.js} +2 -2
  105. package/dist/server/assets/{index-BFGzZbup.js → index-Ba8AA28e.js} +2 -2
  106. package/dist/server/assets/{index-Cwe7nbJw.js → index-BcZgkaNS.js} +2 -2
  107. package/dist/server/assets/{index-y8Aubw3W.js → index-Bi1NreVG.js} +5 -5
  108. package/dist/server/assets/{index-CGahi9V_.js → index-Bt0zkb77.js} +4 -4
  109. package/dist/server/assets/{index-C9NLW19U.js → index-C1hQNNzU.js} +2 -2
  110. package/dist/server/assets/{index-DCgp2ft7.js → index-CImaqmmh.js} +1 -1
  111. package/dist/server/assets/{index-B70OKozW.js → index-CXGBWoOB.js} +5 -5
  112. package/dist/server/assets/{index-BD2aoqcU.js → index-CxlXrP3m.js} +1 -1
  113. package/dist/server/assets/{index-BqzKD5E_.js → index-CyFAdMlV.js} +2 -2
  114. package/dist/server/assets/{index-DsUEML0Q.js → index-D3AFKy3U.js} +3 -3
  115. package/dist/server/assets/{index-1fKvU2GD.js → index-D6Vm7E_i.js} +2 -2
  116. package/dist/server/assets/{index-BJCGggpH.js → index-DoE2xDo2.js} +2 -2
  117. package/dist/server/assets/{index-B0xGaLrl.js → index-GgrvHhHi.js} +3 -3
  118. package/dist/server/assets/{index-Cd5puaI6.js → index-nzUHfYBx.js} +2 -2
  119. package/dist/server/assets/{index-C0OatepH.js → index-p6O_x_qN.js} +2 -2
  120. package/dist/server/assets/{info-VBDWY6EO-BUsqumC5.js → info-VBDWY6EO-BXRDzzOP.js} +6 -6
  121. package/dist/server/assets/{infoDiagram-HS3SLOUP--nKUIx4y.js → infoDiagram-HS3SLOUP-D2jQYgOa.js} +5 -5
  122. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-KjVGeKmm.js → journeyDiagram-XKPGCS4Q-bf_S8co7.js} +4 -4
  123. package/dist/server/assets/{kanban-definition-3W4ZIXB7-aISJLxn5.js → kanban-definition-3W4ZIXB7-eje5lYLG.js} +2 -2
  124. package/dist/server/assets/{layout-CzeG7EPR.js → layout-D3AhBFqI.js} +4 -4
  125. package/dist/server/assets/{mermaid-3ZIDBTTL-BTOUM0ev.js → mermaid-3ZIDBTTL-C-00O3F0.js} +1 -1
  126. package/dist/server/assets/{mermaid-parser.core-BoGFLsBJ.js → mermaid-parser.core-CyX4B1l5.js} +11 -11
  127. package/dist/server/assets/{mindmap-definition-VGOIOE7T--AIwUu6M.js → mindmap-definition-VGOIOE7T-D51F_plo.js} +3 -3
  128. package/dist/server/assets/{packet-DYOGHKS2-BTGkKC22.js → packet-DYOGHKS2-CCJkkNTh.js} +6 -6
  129. package/dist/server/assets/{pie-VRWISCQL-BjDIbOyB.js → pie-VRWISCQL-7Tei6lnA.js} +6 -6
  130. package/dist/server/assets/{pieDiagram-ADFJNKIX-VNMmF9Za.js → pieDiagram-ADFJNKIX-BclaT-41.js} +7 -7
  131. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-re6uOzo4.js → quadrantDiagram-AYHSOK5B-CnerVMbZ.js} +1 -1
  132. package/dist/server/assets/{radar-ZZBFDIW7-bi1qVKOM.js → radar-ZZBFDIW7-QLmbgAT7.js} +6 -6
  133. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-BImsyUnt.js → requirementDiagram-UZGBJVZJ-a2FIYlfE.js} +3 -3
  134. package/dist/server/assets/{router-B7-XKvBR.js → router-DDnNUwTm.js} +25053 -24889
  135. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-BdxA5ccl.js → sankeyDiagram-TZEHDZUN-B3I-S6CG.js} +1 -1
  136. package/dist/server/assets/{sequenceDiagram-WL72ISMW-De8W2AXi.js → sequenceDiagram-WL72ISMW-kgJrgJ9r.js} +3 -3
  137. package/dist/server/assets/{stateDiagram-FKZM4ZOC-CslmqvhX.js → stateDiagram-FKZM4ZOC-C6UTf0ag.js} +8 -8
  138. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-BXVdfPdk.js → stateDiagram-v2-4FDKWEC3-Dj0SlbA4.js} +4 -4
  139. package/dist/server/assets/{timeline-definition-IT6M3QCI-BrEcv0X7.js → timeline-definition-IT6M3QCI-DGPtqtJD.js} +2 -2
  140. package/dist/server/assets/{treemap-GDKQZRPO-IZvjxjwq.js → treemap-GDKQZRPO-B-wn0rT7.js} +6 -6
  141. package/dist/server/assets/{workspace._workspaceId-DMfwrjZz.js → workspace._workspaceId-CG5NG8aZ.js} +1 -1
  142. package/dist/server/assets/{workspace._workspaceId-DSom1njg.js → workspace._workspaceId-Dd-upXb6.js} +2 -2
  143. package/dist/server/assets/{xychartDiagram-PRI3JC2R-B99wGKft.js → xychartDiagram-PRI3JC2R-BTb4nc1D.js} +1 -1
  144. package/dist/server/server.js +2 -2
  145. package/dist/start-server.mjs +651 -366
  146. package/package.json +6 -4
  147. package/dist/client/assets/channel-BkKcGPNX.js +0 -1
  148. package/dist/client/assets/classDiagram-2ON5EDUG-31IVI--d.js +0 -1
  149. package/dist/client/assets/classDiagram-v2-WZHVMYZB-31IVI--d.js +0 -1
  150. package/dist/client/assets/clone-TmgJgLyY.js +0 -1
  151. package/dist/client/assets/main-CkQFvJn7.css +0 -1
  152. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-2jb1quoy.js +0 -1
  153. package/dist/client/assets/workspace._workspaceId-Tn_ATtTD.js +0 -1
  154. package/dist/server/assets/_tanstack-start-manifest_v-DKMimfmd.js +0 -4
@@ -4907,7 +4907,7 @@ var require_sonic_boom = __commonJS({
4907
4907
  if (!(this instanceof SonicBoom)) {
4908
4908
  return new SonicBoom(opts);
4909
4909
  }
4910
- let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir: mkdir4, retryEAGAIN, fsync, contentMode, mode } = opts || {};
4910
+ let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir: mkdir5, retryEAGAIN, fsync, contentMode, mode } = opts || {};
4911
4911
  fd = fd || dest;
4912
4912
  this._len = 0;
4913
4913
  this.fd = -1;
@@ -4932,7 +4932,7 @@ var require_sonic_boom = __commonJS({
4932
4932
  this.append = append || false;
4933
4933
  this.mode = mode;
4934
4934
  this.retryEAGAIN = retryEAGAIN || (() => true);
4935
- this.mkdir = mkdir4 || false;
4935
+ this.mkdir = mkdir5 || false;
4936
4936
  let fsWriteSync;
4937
4937
  let fsWrite;
4938
4938
  if (contentMode === kContentModeBuffer) {
@@ -5648,7 +5648,7 @@ var require_thread_stream = __commonJS({
5648
5648
  var { version: version2 } = require_package();
5649
5649
  var { EventEmitter } = __require("events");
5650
5650
  var { Worker } = __require("worker_threads");
5651
- var { join: join36 } = __require("path");
5651
+ var { join: join37 } = __require("path");
5652
5652
  var { pathToFileURL } = __require("url");
5653
5653
  var { wait } = require_wait();
5654
5654
  var {
@@ -5684,7 +5684,7 @@ var require_thread_stream = __commonJS({
5684
5684
  function createWorker(stream, opts) {
5685
5685
  const { filename, workerData } = opts;
5686
5686
  const bundlerOverrides = "__bundlerPathsOverrides" in globalThis ? globalThis.__bundlerPathsOverrides : {};
5687
- const toExecute = bundlerOverrides["thread-stream-worker"] || join36(__dirname, "lib", "worker.js");
5687
+ const toExecute = bundlerOverrides["thread-stream-worker"] || join37(__dirname, "lib", "worker.js");
5688
5688
  const worker = new Worker(toExecute, {
5689
5689
  ...opts.workerOpts,
5690
5690
  trackUnmanagedFds: false,
@@ -6070,7 +6070,7 @@ var require_transport = __commonJS({
6070
6070
  "use strict";
6071
6071
  var { createRequire: createRequire2 } = __require("module");
6072
6072
  var getCallers = require_caller();
6073
- var { join: join36, isAbsolute: isAbsolute5, sep: sep9 } = __require("node:path");
6073
+ var { join: join37, isAbsolute: isAbsolute5, sep: sep9 } = __require("node:path");
6074
6074
  var sleep2 = require_atomic_sleep();
6075
6075
  var onExit = require_on_exit_leak_free();
6076
6076
  var ThreadStream = require_thread_stream();
@@ -6133,7 +6133,7 @@ var require_transport = __commonJS({
6133
6133
  throw new Error("only one of target or targets can be specified");
6134
6134
  }
6135
6135
  if (targets) {
6136
- target = bundlerOverrides["pino-worker"] || join36(__dirname, "worker.js");
6136
+ target = bundlerOverrides["pino-worker"] || join37(__dirname, "worker.js");
6137
6137
  options2.targets = targets.filter((dest) => dest.target).map((dest) => {
6138
6138
  return {
6139
6139
  ...dest,
@@ -6151,7 +6151,7 @@ var require_transport = __commonJS({
6151
6151
  });
6152
6152
  });
6153
6153
  } else if (pipeline) {
6154
- target = bundlerOverrides["pino-worker"] || join36(__dirname, "worker.js");
6154
+ target = bundlerOverrides["pino-worker"] || join37(__dirname, "worker.js");
6155
6155
  options2.pipelines = [pipeline.map((dest) => {
6156
6156
  return {
6157
6157
  ...dest,
@@ -6173,7 +6173,7 @@ var require_transport = __commonJS({
6173
6173
  return origin;
6174
6174
  }
6175
6175
  if (origin === "pino/file") {
6176
- return join36(__dirname, "..", "file.js");
6176
+ return join37(__dirname, "..", "file.js");
6177
6177
  }
6178
6178
  let fixTarget2;
6179
6179
  for (const filePath of callers) {
@@ -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(
@@ -7162,7 +7162,7 @@ var require_safe_stable_stringify = __commonJS({
7162
7162
  return circularValue;
7163
7163
  }
7164
7164
  let res = "";
7165
- let join36 = ",";
7165
+ let join37 = ",";
7166
7166
  const originalIndentation = indentation;
7167
7167
  if (Array.isArray(value)) {
7168
7168
  if (value.length === 0) {
@@ -7176,7 +7176,7 @@ var require_safe_stable_stringify = __commonJS({
7176
7176
  indentation += spacer;
7177
7177
  res += `
7178
7178
  ${indentation}`;
7179
- join36 = `,
7179
+ join37 = `,
7180
7180
  ${indentation}`;
7181
7181
  }
7182
7182
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -7184,13 +7184,13 @@ ${indentation}`;
7184
7184
  for (; i < maximumValuesToStringify - 1; i++) {
7185
7185
  const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
7186
7186
  res += tmp2 !== void 0 ? tmp2 : "null";
7187
- res += join36;
7187
+ res += join37;
7188
7188
  }
7189
7189
  const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
7190
7190
  res += tmp !== void 0 ? tmp : "null";
7191
7191
  if (value.length - 1 > maximumBreadth) {
7192
7192
  const removedKeys = value.length - maximumBreadth - 1;
7193
- res += `${join36}"... ${getItemCount(removedKeys)} not stringified"`;
7193
+ res += `${join37}"... ${getItemCount(removedKeys)} not stringified"`;
7194
7194
  }
7195
7195
  if (spacer !== "") {
7196
7196
  res += `
@@ -7211,7 +7211,7 @@ ${originalIndentation}`;
7211
7211
  let separator = "";
7212
7212
  if (spacer !== "") {
7213
7213
  indentation += spacer;
7214
- join36 = `,
7214
+ join37 = `,
7215
7215
  ${indentation}`;
7216
7216
  whitespace = " ";
7217
7217
  }
@@ -7225,13 +7225,13 @@ ${indentation}`;
7225
7225
  const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
7226
7226
  if (tmp !== void 0) {
7227
7227
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
7228
- separator = join36;
7228
+ separator = join37;
7229
7229
  }
7230
7230
  }
7231
7231
  if (keyLength > maximumBreadth) {
7232
7232
  const removedKeys = keyLength - maximumBreadth;
7233
7233
  res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
7234
- separator = join36;
7234
+ separator = join37;
7235
7235
  }
7236
7236
  if (spacer !== "" && separator.length > 1) {
7237
7237
  res = `
@@ -7272,7 +7272,7 @@ ${originalIndentation}`;
7272
7272
  }
7273
7273
  const originalIndentation = indentation;
7274
7274
  let res = "";
7275
- let join36 = ",";
7275
+ let join37 = ",";
7276
7276
  if (Array.isArray(value)) {
7277
7277
  if (value.length === 0) {
7278
7278
  return "[]";
@@ -7285,7 +7285,7 @@ ${originalIndentation}`;
7285
7285
  indentation += spacer;
7286
7286
  res += `
7287
7287
  ${indentation}`;
7288
- join36 = `,
7288
+ join37 = `,
7289
7289
  ${indentation}`;
7290
7290
  }
7291
7291
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -7293,13 +7293,13 @@ ${indentation}`;
7293
7293
  for (; i < maximumValuesToStringify - 1; i++) {
7294
7294
  const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
7295
7295
  res += tmp2 !== void 0 ? tmp2 : "null";
7296
- res += join36;
7296
+ res += join37;
7297
7297
  }
7298
7298
  const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
7299
7299
  res += tmp !== void 0 ? tmp : "null";
7300
7300
  if (value.length - 1 > maximumBreadth) {
7301
7301
  const removedKeys = value.length - maximumBreadth - 1;
7302
- res += `${join36}"... ${getItemCount(removedKeys)} not stringified"`;
7302
+ res += `${join37}"... ${getItemCount(removedKeys)} not stringified"`;
7303
7303
  }
7304
7304
  if (spacer !== "") {
7305
7305
  res += `
@@ -7312,7 +7312,7 @@ ${originalIndentation}`;
7312
7312
  let whitespace = "";
7313
7313
  if (spacer !== "") {
7314
7314
  indentation += spacer;
7315
- join36 = `,
7315
+ join37 = `,
7316
7316
  ${indentation}`;
7317
7317
  whitespace = " ";
7318
7318
  }
@@ -7321,7 +7321,7 @@ ${indentation}`;
7321
7321
  const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
7322
7322
  if (tmp !== void 0) {
7323
7323
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
7324
- separator = join36;
7324
+ separator = join37;
7325
7325
  }
7326
7326
  }
7327
7327
  if (spacer !== "" && separator.length > 1) {
@@ -7379,20 +7379,20 @@ ${originalIndentation}`;
7379
7379
  indentation += spacer;
7380
7380
  let res2 = `
7381
7381
  ${indentation}`;
7382
- const join37 = `,
7382
+ const join38 = `,
7383
7383
  ${indentation}`;
7384
7384
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
7385
7385
  let i = 0;
7386
7386
  for (; i < maximumValuesToStringify - 1; i++) {
7387
7387
  const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
7388
7388
  res2 += tmp2 !== void 0 ? tmp2 : "null";
7389
- res2 += join37;
7389
+ res2 += join38;
7390
7390
  }
7391
7391
  const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
7392
7392
  res2 += tmp !== void 0 ? tmp : "null";
7393
7393
  if (value.length - 1 > maximumBreadth) {
7394
7394
  const removedKeys = value.length - maximumBreadth - 1;
7395
- res2 += `${join37}"... ${getItemCount(removedKeys)} not stringified"`;
7395
+ res2 += `${join38}"... ${getItemCount(removedKeys)} not stringified"`;
7396
7396
  }
7397
7397
  res2 += `
7398
7398
  ${originalIndentation}`;
@@ -7408,16 +7408,16 @@ ${originalIndentation}`;
7408
7408
  return '"[Object]"';
7409
7409
  }
7410
7410
  indentation += spacer;
7411
- const join36 = `,
7411
+ const join37 = `,
7412
7412
  ${indentation}`;
7413
7413
  let res = "";
7414
7414
  let separator = "";
7415
7415
  let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
7416
7416
  if (isTypedArrayWithEntries(value)) {
7417
- res += stringifyTypedArray(value, join36, maximumBreadth);
7417
+ res += stringifyTypedArray(value, join37, maximumBreadth);
7418
7418
  keys = keys.slice(value.length);
7419
7419
  maximumPropertiesToStringify -= value.length;
7420
- separator = join36;
7420
+ separator = join37;
7421
7421
  }
7422
7422
  if (deterministic) {
7423
7423
  keys = sort(keys, comparator);
@@ -7428,13 +7428,13 @@ ${indentation}`;
7428
7428
  const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
7429
7429
  if (tmp !== void 0) {
7430
7430
  res += `${separator}${strEscape(key2)}: ${tmp}`;
7431
- separator = join36;
7431
+ separator = join37;
7432
7432
  }
7433
7433
  }
7434
7434
  if (keyLength > maximumBreadth) {
7435
7435
  const removedKeys = keyLength - maximumBreadth;
7436
7436
  res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
7437
- separator = join36;
7437
+ separator = join37;
7438
7438
  }
7439
7439
  if (separator !== "") {
7440
7440
  res = `
@@ -65903,8 +65903,8 @@ var require_core = __commonJS({
65903
65903
  return this;
65904
65904
  }
65905
65905
  case "object": {
65906
- const cacheKey2 = schemaKeyRef;
65907
- this._cache.delete(cacheKey2);
65906
+ const cacheKey3 = schemaKeyRef;
65907
+ this._cache.delete(cacheKey3);
65908
65908
  let id = schemaKeyRef[this.opts.schemaId];
65909
65909
  if (id) {
65910
65910
  id = (0, resolve_1.normalizeId)(id);
@@ -66069,11 +66069,11 @@ var require_core = __commonJS({
66069
66069
  Ajv2.ValidationError = validation_error_1.default;
66070
66070
  Ajv2.MissingRefError = ref_error_1.default;
66071
66071
  exports.default = Ajv2;
66072
- function checkOptions(checkOpts, options2, msg, log46 = "error") {
66072
+ function checkOptions(checkOpts, options2, msg, log47 = "error") {
66073
66073
  for (const key in checkOpts) {
66074
66074
  const opt = key;
66075
66075
  if (opt in options2)
66076
- this.logger[log46](`${msg}: option ${key}. ${checkOpts[opt]}`);
66076
+ this.logger[log47](`${msg}: option ${key}. ${checkOpts[opt]}`);
66077
66077
  }
66078
66078
  }
66079
66079
  function getSchEnv(keyRef) {
@@ -68557,7 +68557,7 @@ var require_dist5 = __commonJS({
68557
68557
  // start-server.ts
68558
68558
  import { appendFileSync, createReadStream as createReadStream3, mkdirSync as mkdirSync8, readFileSync as readFileSync8, statSync as statSync10 } from "node:fs";
68559
68559
  import { createServer } from "node:http";
68560
- import { basename as basename5, join as join35, resolve as resolve11, sep as sep8 } from "node:path";
68560
+ import { basename as basename5, join as join36, resolve as resolve11, sep as sep8 } from "node:path";
68561
68561
 
68562
68562
  // ../../node_modules/.pnpm/@trpc+server@11.12.0_typescript@5.9.3/node_modules/@trpc/server/dist/codes-DagpWZLc.mjs
68563
68563
  function mergeWithoutOverrides(obj1, ...objs) {
@@ -68681,8 +68681,8 @@ var freezeIfAvailable = (obj) => {
68681
68681
  };
68682
68682
  function createInnerProxy(callback, path, memo3) {
68683
68683
  var _memo$cacheKey;
68684
- const cacheKey2 = path.join(".");
68685
- (_memo$cacheKey = memo3[cacheKey2]) !== null && _memo$cacheKey !== void 0 || (memo3[cacheKey2] = new Proxy(noop, {
68684
+ const cacheKey3 = path.join(".");
68685
+ (_memo$cacheKey = memo3[cacheKey3]) !== null && _memo$cacheKey !== void 0 || (memo3[cacheKey3] = new Proxy(noop, {
68686
68686
  get(_obj, key) {
68687
68687
  if (typeof key !== "string" || key === "then") return void 0;
68688
68688
  return createInnerProxy(callback, [...path, key], memo3);
@@ -68706,7 +68706,7 @@ function createInnerProxy(callback, path, memo3) {
68706
68706
  return callback(opts);
68707
68707
  }
68708
68708
  }));
68709
- return memo3[cacheKey2];
68709
+ return memo3[cacheKey3];
68710
68710
  }
68711
68711
  var createRecursiveProxy = (callback) => createInnerProxy(callback, [], emptyObject());
68712
68712
  var JSONRPC2_TO_HTTP_CODE = {
@@ -89183,7 +89183,7 @@ function sql(strings, ...params) {
89183
89183
  return new SQL([new StringChunk(str)]);
89184
89184
  }
89185
89185
  _sql.raw = raw;
89186
- function join36(chunks, separator) {
89186
+ function join37(chunks, separator) {
89187
89187
  const result = [];
89188
89188
  for (const [i, chunk] of chunks.entries()) {
89189
89189
  if (i > 0 && separator !== void 0) result.push(separator);
@@ -89191,7 +89191,7 @@ function sql(strings, ...params) {
89191
89191
  }
89192
89192
  return new SQL(result);
89193
89193
  }
89194
- _sql.join = join36;
89194
+ _sql.join = join37;
89195
89195
  function identifier(value) {
89196
89196
  return new Name(value);
89197
89197
  }
@@ -93698,7 +93698,7 @@ var SQLiteSelectQueryBuilderBase = class extends TypedQueryBuilder {
93698
93698
  const baseTableName = this.tableName;
93699
93699
  const tableName = getTableLikeName(table);
93700
93700
  for (const item of extractUsedTable(table)) this.usedTables.add(item);
93701
- if (typeof tableName === "string" && this.config.joins?.some((join36) => join36.alias === tableName)) throw new Error(`Alias "${tableName}" is already used in this query`);
93701
+ if (typeof tableName === "string" && this.config.joins?.some((join37) => join37.alias === tableName)) throw new Error(`Alias "${tableName}" is already used in this query`);
93702
93702
  if (!this.isPartialSelect) {
93703
93703
  if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") this.config.fields = { [baseTableName]: this.config.fields };
93704
93704
  if (typeof tableName === "string" && !is(table, SQL)) {
@@ -94906,7 +94906,7 @@ var SQLiteDialect = class {
94906
94906
  if (!joins2) return;
94907
94907
  const withEntries = Object.entries(joins2).filter(([_2, v2]) => v2);
94908
94908
  if (!withEntries.length) return;
94909
- return sql.join(withEntries.map(([k4, join36]) => {
94909
+ return sql.join(withEntries.map(([k4, join37]) => {
94910
94910
  const relation = tableConfig.relations[k4];
94911
94911
  const isSingle2 = is(relation, One);
94912
94912
  const targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`);
@@ -94917,7 +94917,7 @@ var SQLiteDialect = class {
94917
94917
  table: targetTable,
94918
94918
  mode: isSingle2 ? "first" : "many",
94919
94919
  schema,
94920
- queryConfig: join36,
94920
+ queryConfig: join37,
94921
94921
  tableConfig: schema[relation.targetTableName],
94922
94922
  relationWhere: filter,
94923
94923
  isNested: true,
@@ -94931,7 +94931,7 @@ var SQLiteDialect = class {
94931
94931
  key: k4,
94932
94932
  selection: innerQuery.selection,
94933
94933
  isArray: !isSingle2,
94934
- isOptional: (relation.optional ?? false) || join36 !== true && !!join36.where
94934
+ isOptional: (relation.optional ?? false) || join37 !== true && !!join37.where
94935
94935
  });
94936
94936
  const jsonColumns = sql.join(innerQuery.selection.map((s2) => {
94937
94937
  return sql`${sql.raw(this.escapeString(s2.key))}, ${s2.selection ? sql`${jsonb2}(${sql.identifier(s2.key)})` : sql.identifier(s2.key)}`;
@@ -95400,7 +95400,7 @@ var SQLiteUpdateBase = class extends QueryPromise {
95400
95400
  createJoin(joinType) {
95401
95401
  return ((table, on) => {
95402
95402
  const tableName = getTableLikeName(table);
95403
- if (typeof tableName === "string" && this.config.joins.some((join36) => join36.alias === tableName)) throw new Error(`Alias "${tableName}" is already used in this query`);
95403
+ if (typeof tableName === "string" && this.config.joins.some((join37) => join37.alias === tableName)) throw new Error(`Alias "${tableName}" is already used in this query`);
95404
95404
  if (typeof on === "function") {
95405
95405
  const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : void 0 : void 0;
95406
95406
  on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({
@@ -101200,6 +101200,7 @@ var settingsUpdateInput = external_exports2.object({
101200
101200
  useWebGLTerminalRenderer: external_exports2.boolean().optional(),
101201
101201
  webBrowserCdpEnabled: external_exports2.boolean().optional(),
101202
101202
  theme: external_exports2.enum(["system", "light", "dark"]).optional(),
101203
+ translucentSidebar: external_exports2.boolean().optional(),
101203
101204
  // Retention window for the Reports `usage_events` table
101204
101205
  // (issue #425). Bounded to [1, 3650] days so a stray UI value
101205
101206
  // can't accidentally configure a 100-year window (which would
@@ -110583,10 +110584,10 @@ function DialogOverlay2({
110583
110584
  );
110584
110585
  }
110585
110586
  var DIALOG_CONTENT_VARIANTS = {
110586
- default: "ease-out fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
110587
+ default: "ease-out fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
110587
110588
  "bottom-sheet": [
110588
110589
  // Shared
110589
- "ease-out fixed z-50 flex flex-col bg-background shadow-lg duration-200 outline-none",
110590
+ "ease-out fixed z-50 flex flex-col border-border bg-background shadow-lg duration-200 outline-none",
110590
110591
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
110591
110592
  // Mobile (< lg): bottom drawer
110592
110593
  "inset-x-0 bottom-0 w-full max-w-none rounded-t-2xl border border-b-0 p-6",
@@ -110598,7 +110599,7 @@ var DIALOG_CONTENT_VARIANTS = {
110598
110599
  ].join(" "),
110599
110600
  "command-palette": [
110600
110601
  // Shared
110601
- "fixed z-50 flex flex-col bg-background shadow-lg outline-none",
110602
+ "fixed z-50 flex flex-col border-border bg-background shadow-lg outline-none",
110602
110603
  // Mobile-only open/close animation: the drawer slide is touch-initiated.
110603
110604
  // Desktop (lg+) gets NO open/close animation — this is a keyboard-summoned
110604
110605
  // surface hit dozens of times a day; it must appear instantly.
@@ -113837,29 +113838,26 @@ var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1);
113837
113838
  // src/dashboard/components/DashboardShell.tsx
113838
113839
  var import_react28 = __toESM(require_react(), 1);
113839
113840
 
113840
- // src/dashboard/hooks/use-app-update.ts
113841
- var import_react15 = __toESM(require_react(), 1);
113842
-
113843
113841
  // src/dashboard/hooks/use-cli-setup.ts
113844
- var import_react16 = __toESM(require_react(), 1);
113842
+ var import_react15 = __toESM(require_react(), 1);
113845
113843
 
113846
113844
  // src/dashboard/hooks/use-collapse-state.ts
113847
- var import_react17 = __toESM(require_react(), 1);
113845
+ var import_react16 = __toESM(require_react(), 1);
113848
113846
 
113849
113847
  // src/dashboard/hooks/use-hooks-setup.ts
113850
- var import_react18 = __toESM(require_react(), 1);
113848
+ var import_react17 = __toESM(require_react(), 1);
113851
113849
 
113852
113850
  // src/dashboard/hooks/use-label-filter.ts
113853
- var import_react19 = __toESM(require_react(), 1);
113851
+ var import_react18 = __toESM(require_react(), 1);
113854
113852
 
113855
113853
  // src/dashboard/hooks/use-label-last-workspace.ts
113856
- var import_react20 = __toESM(require_react(), 1);
113854
+ var import_react19 = __toESM(require_react(), 1);
113857
113855
 
113858
113856
  // src/dashboard/hooks/use-projects.ts
113859
113857
  var EMPTY_PROJECTS = Object.freeze([]);
113860
113858
 
113861
113859
  // src/dashboard/hooks/use-status.ts
113862
- var import_react21 = __toESM(require_react(), 1);
113860
+ var import_react20 = __toESM(require_react(), 1);
113863
113861
 
113864
113862
  // src/dashboard/components/ProjectList.tsx
113865
113863
  var import_core8 = __toESM(require_dist3(), 1);
@@ -113868,13 +113866,13 @@ var import_utilities = __toESM(require_dist(), 1);
113868
113866
  var import_react25 = __toESM(require_react(), 1);
113869
113867
 
113870
113868
  // src/dashboard/hooks/use-pinned-workspaces.ts
113871
- var import_react22 = __toESM(require_react(), 1);
113869
+ var import_react21 = __toESM(require_react(), 1);
113872
113870
 
113873
113871
  // src/dashboard/components/DeleteWorkspaceDialog.tsx
113874
113872
  var import_jsx_runtime54 = __toESM(require_jsx_runtime(), 1);
113875
113873
 
113876
113874
  // src/dashboard/components/NewWorkspaceForm.tsx
113877
- var import_react23 = __toESM(require_react(), 1);
113875
+ var import_react22 = __toESM(require_react(), 1);
113878
113876
 
113879
113877
  // src/lib/branch-name.ts
113880
113878
  function slugifyBranchName(input) {
@@ -113884,15 +113882,19 @@ function slugifyBranchName(input) {
113884
113882
  // src/dashboard/components/NewWorkspaceForm.tsx
113885
113883
  var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1);
113886
113884
 
113887
- // src/dashboard/components/PromoteToGitDialog.tsx
113885
+ // src/dashboard/components/ProjectAvatar.tsx
113886
+ var import_react23 = __toESM(require_react(), 1);
113888
113887
  var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1);
113889
113888
 
113889
+ // src/dashboard/components/PromoteToGitDialog.tsx
113890
+ var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1);
113891
+
113890
113892
  // src/dashboard/components/WorkspaceCard.tsx
113891
113893
  var import_lucide_react5 = __toESM(require_lucide_react(), 1);
113892
113894
  var import_react24 = __toESM(require_react(), 1);
113893
113895
 
113894
113896
  // src/dashboard/components/GitStatusIndicator.tsx
113895
- var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1);
113897
+ var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1);
113896
113898
  function GitStatusIndicator({ git }) {
113897
113899
  const parts = [];
113898
113900
  if (git.conflict) {
@@ -113924,27 +113926,27 @@ function GitStatusIndicator({ git }) {
113924
113926
  });
113925
113927
  }
113926
113928
  if (parts.length === 0) return null;
113927
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Tooltip2, { children: [
113928
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "inline-flex items-center gap-0.5 font-mono text-[11px] leading-none shrink-0 pr-0.5", children: parts.map((p3) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: p3.color, children: p3.text }, p3.text)) }) }),
113929
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(TooltipContent2, { children: parts.map((p3) => p3.tooltip).join(", ") })
113929
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Tooltip2, { children: [
113930
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "inline-flex items-center gap-0.5 font-mono text-[11px] leading-none shrink-0 pr-0.5", children: parts.map((p3) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: p3.color, children: p3.text }, p3.text)) }) }),
113931
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(TooltipContent2, { children: parts.map((p3) => p3.tooltip).join(", ") })
113930
113932
  ] });
113931
113933
  }
113932
113934
 
113933
113935
  // src/dashboard/components/SetupStatusIndicator.tsx
113934
113936
  var import_lucide_react4 = __toESM(require_lucide_react(), 1);
113935
- var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1);
113937
+ var import_jsx_runtime59 = __toESM(require_jsx_runtime(), 1);
113936
113938
  function SetupStatusIndicator({ setup }) {
113937
113939
  if (!setup) return null;
113938
113940
  if (setup.state === "running") {
113939
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Tooltip2, { children: [
113940
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react4.Loader, { className: "size-3.5 shrink-0 text-blue-600 dark:text-blue-400 animate-spin" }) }),
113941
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(TooltipContent2, { side: "top", children: "Setting up workspace..." })
113941
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Tooltip2, { children: [
113942
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react4.Loader, { className: "size-3.5 shrink-0 text-blue-600 dark:text-blue-400 animate-spin" }) }),
113943
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TooltipContent2, { side: "top", children: "Setting up workspace..." })
113942
113944
  ] });
113943
113945
  }
113944
113946
  if (setup.state === "failed") {
113945
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Tooltip2, { children: [
113946
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react4.CircleAlert, { className: "size-3.5 shrink-0 text-red-600 dark:text-red-400" }) }),
113947
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(TooltipContent2, { side: "top", children: [
113947
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Tooltip2, { children: [
113948
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react4.CircleAlert, { className: "size-3.5 shrink-0 text-red-600 dark:text-red-400" }) }),
113949
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(TooltipContent2, { side: "top", children: [
113948
113950
  "Setup failed",
113949
113951
  setup.error ? `: ${setup.error}` : ""
113950
113952
  ] })
@@ -113954,7 +113956,7 @@ function SetupStatusIndicator({ setup }) {
113954
113956
  }
113955
113957
 
113956
113958
  // src/dashboard/components/WorkspaceLabel.tsx
113957
- var import_jsx_runtime59 = __toESM(require_jsx_runtime(), 1);
113959
+ var import_jsx_runtime60 = __toESM(require_jsx_runtime(), 1);
113958
113960
  function WorkspaceLabel({
113959
113961
  name: name3,
113960
113962
  projectName,
@@ -113964,14 +113966,14 @@ function WorkspaceLabel({
113964
113966
  const nameClass = tone === "switcher" ? `text-foreground ${isActive ? "font-semibold" : "font-medium"}` : isActive ? "font-bold text-foreground" : "font-medium text-foreground/75";
113965
113967
  const projectClass = tone === "switcher" ? "text-foreground/70" : isActive ? "text-foreground/80" : "text-foreground/60";
113966
113968
  const isSidebar = tone === "sidebar";
113967
- return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "flex flex-col min-w-0 leading-tight", children: [
113968
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: cn(isSidebar ? "text-[13px]" : "text-sm", "truncate", nameClass), children: name3 }),
113969
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: cn(isSidebar ? "text-[11px]" : "text-xs", "truncate", projectClass), children: projectName })
113969
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "flex flex-col min-w-0 leading-tight", children: [
113970
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { className: cn(isSidebar ? "text-[13px]" : "text-sm", "truncate", nameClass), children: name3 }),
113971
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { className: cn(isSidebar ? "text-[11px]" : "text-xs", "truncate", projectClass), children: projectName })
113970
113972
  ] });
113971
113973
  }
113972
113974
 
113973
113975
  // src/dashboard/components/WorkspaceCard.tsx
113974
- var import_jsx_runtime60 = __toESM(require_jsx_runtime(), 1);
113976
+ var import_jsx_runtime61 = __toESM(require_jsx_runtime(), 1);
113975
113977
  var RECENT_ACTIVATION_WINDOW_MS = 300;
113976
113978
  var recentlyActivatedWorkspaceId = null;
113977
113979
  var recentlyActivatedTimer = null;
@@ -114081,21 +114083,21 @@ var WorkspaceCard = (0, import_react24.memo)(function WorkspaceCard2({
114081
114083
  });
114082
114084
  }
114083
114085
  };
114084
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenu2, { children: [
114085
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ContextMenuTrigger2, { asChild: true, disabled: isDeleting, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { ...containerProps, children: [
114086
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(Tooltip2, { delayDuration: 800, children: [
114087
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "flex items-center gap-2 min-w-0 overflow-hidden", children: [
114086
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenu2, { children: [
114087
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ContextMenuTrigger2, { asChild: true, disabled: isDeleting, children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { ...containerProps, children: [
114088
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(Tooltip2, { delayDuration: 800, children: [
114089
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { className: "flex items-center gap-2 min-w-0 overflow-hidden", children: [
114088
114090
  isRoot ? (
114089
114091
  // On the root card the house is AgentStatusIndicator's idle
114090
114092
  // fallback (the slot other cards use for the branch glyph),
114091
114093
  // so an active agent's status dot replaces the house rather
114092
114094
  // than sitting beside it.
114093
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
114095
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
114094
114096
  AgentStatusIndicator,
114095
114097
  {
114096
114098
  agent: status?.agent,
114097
114099
  isActive,
114098
- fallback: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
114100
+ fallback: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
114099
114101
  import_lucide_react5.Home,
114100
114102
  {
114101
114103
  "data-testid": "workspace-card__home-icon",
@@ -114104,14 +114106,14 @@ var WorkspaceCard = (0, import_react24.memo)(function WorkspaceCard2({
114104
114106
  )
114105
114107
  }
114106
114108
  )
114107
- ) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(AgentStatusIndicator, { agent: status?.agent, isActive }),
114109
+ ) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(AgentStatusIndicator, { agent: status?.agent, isActive }),
114108
114110
  showProjectName ? (
114109
114111
  // Pinned section: stack the branch name over the project name
114110
114112
  // as a compact two-line block so a mixed list of pinned cards
114111
114113
  // stays scannable without a long, mid-truncated
114112
114114
  // `project/branch` string on one line. Shared with the ⌘K
114113
114115
  // workspace picker via `WorkspaceLabel`.
114114
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
114116
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
114115
114117
  WorkspaceLabel,
114116
114118
  {
114117
114119
  name: worktree.name,
@@ -114119,7 +114121,7 @@ var WorkspaceCard = (0, import_react24.memo)(function WorkspaceCard2({
114119
114121
  isActive
114120
114122
  }
114121
114123
  )
114122
- ) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
114124
+ ) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
114123
114125
  "span",
114124
114126
  {
114125
114127
  className: `text-[13px] truncate ${isActive ? "font-bold text-foreground" : "font-medium text-foreground/75"}`,
@@ -114127,64 +114129,64 @@ var WorkspaceCard = (0, import_react24.memo)(function WorkspaceCard2({
114127
114129
  }
114128
114130
  )
114129
114131
  ] }) }),
114130
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(TooltipContent2, { side: "right", children: `${projectName}/${worktree.name}` })
114132
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(TooltipContent2, { side: "right", children: `${projectName}/${worktree.name}` })
114131
114133
  ] }),
114132
- isDeleting && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
114134
+ isDeleting && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
114133
114135
  "span",
114134
114136
  {
114135
114137
  "data-testid": "workspace-card__deleting",
114136
114138
  className: "flex items-center gap-1 shrink-0 ml-auto pl-2 text-xs text-muted-foreground",
114137
114139
  children: [
114138
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.Loader, { className: "size-3.5 animate-spin" }),
114140
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.Loader, { className: "size-3.5 animate-spin" }),
114139
114141
  "Deleting\u2026"
114140
114142
  ]
114141
114143
  }
114142
114144
  ),
114143
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
114145
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
114144
114146
  "div",
114145
114147
  {
114146
114148
  className: `${isDeleting ? "hidden" : "hidden @[10rem]:flex group-hover:flex"} items-center gap-2 shrink-0 ml-auto pl-2`,
114147
114149
  children: [
114148
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(SetupStatusIndicator, { setup: setupStatus }),
114149
- !isPlain && branchStatus && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(GitStatusIndicator, { git: branchStatus.git }),
114150
- !isPlain && branchStatus && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(CIStatusIndicator, { ci: branchStatus.ci })
114150
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(SetupStatusIndicator, { setup: setupStatus }),
114151
+ !isPlain && branchStatus && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(GitStatusIndicator, { git: branchStatus.git }),
114152
+ !isPlain && branchStatus && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(CIStatusIndicator, { ci: branchStatus.ci })
114151
114153
  ]
114152
114154
  }
114153
114155
  )
114154
114156
  ] }) }),
114155
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuContent2, { children: [
114156
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ContextMenuLabel2, { children: "Workspace" }),
114157
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => onTogglePinned(projectName, worktree.name, isPinned), children: [
114158
- isPinned ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.PinOff, {}) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.Pin, {}),
114157
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuContent2, { children: [
114158
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ContextMenuLabel2, { children: "Workspace" }),
114159
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => onTogglePinned(projectName, worktree.name, isPinned), children: [
114160
+ isPinned ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.PinOff, {}) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.Pin, {}),
114159
114161
  isPinned ? "Unpin workspace" : "Pin workspace"
114160
114162
  ] }),
114161
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(ContextMenuSeparator2, {}),
114162
- capabilities.copyPath && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => navigator.clipboard.writeText(worktree.path), children: [
114163
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.Clipboard, {}),
114163
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ContextMenuSeparator2, {}),
114164
+ capabilities.copyPath && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => navigator.clipboard.writeText(worktree.path), children: [
114165
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.Clipboard, {}),
114164
114166
  "Copy path"
114165
114167
  ] }),
114166
- capabilities.revealInFinder && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => capabilities.revealInFinder(worktree.path), children: [
114167
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.FolderOpen, {}),
114168
+ capabilities.revealInFinder && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => capabilities.revealInFinder(worktree.path), children: [
114169
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.FolderOpen, {}),
114168
114170
  "Open in Finder"
114169
114171
  ] }),
114170
- worktree.hasSetup && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => runScript(worktree.path, "setup"), children: [
114171
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.Play, {}),
114172
+ worktree.hasSetup && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => runScript(worktree.path, "setup"), children: [
114173
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.Play, {}),
114172
114174
  "Run setup"
114173
114175
  ] }),
114174
- worktree.hasTeardown && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => runScript(worktree.path, "teardown"), children: [
114175
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.Square, {}),
114176
+ worktree.hasTeardown && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => runScript(worktree.path, "teardown"), children: [
114177
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.Square, {}),
114176
114178
  "Run teardown"
114177
114179
  ] }),
114178
- !isPlain && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => gitPull(projectName, worktree.name), children: [
114179
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.ArrowDownToLine, {}),
114180
+ !isPlain && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => gitPull(projectName, worktree.name), children: [
114181
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.ArrowDownToLine, {}),
114180
114182
  "Git pull"
114181
114183
  ] }),
114182
- !isPlain && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { onClick: () => gitPush(projectName, worktree.name), children: [
114183
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.ArrowUpFromLine, {}),
114184
+ !isPlain && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { onClick: () => gitPush(projectName, worktree.name), children: [
114185
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.ArrowUpFromLine, {}),
114184
114186
  "Git push"
114185
114187
  ] }),
114186
- !isPlain && worktree.name !== defaultBranch && /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ContextMenuItem2, { variant: "destructive", onClick: handleDelete, children: [
114187
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_lucide_react5.Trash2, {}),
114188
+ !isPlain && worktree.name !== defaultBranch && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ContextMenuItem2, { variant: "destructive", onClick: handleDelete, children: [
114189
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_lucide_react5.Trash2, {}),
114188
114190
  "Delete workspace"
114189
114191
  ] })
114190
114192
  ] })
@@ -114192,7 +114194,7 @@ var WorkspaceCard = (0, import_react24.memo)(function WorkspaceCard2({
114192
114194
  });
114193
114195
 
114194
114196
  // src/dashboard/components/ProjectList.tsx
114195
- var import_jsx_runtime61 = __toESM(require_jsx_runtime(), 1);
114197
+ var import_jsx_runtime62 = __toESM(require_jsx_runtime(), 1);
114196
114198
 
114197
114199
  // src/dashboard/components/SettingsPage.tsx
114198
114200
  var import_react27 = __toESM(require_react(), 1);
@@ -114201,16 +114203,16 @@ var import_react27 = __toESM(require_react(), 1);
114201
114203
  var import_react26 = __toESM(require_react(), 1);
114202
114204
 
114203
114205
  // src/dashboard/components/settings/SettingsRow.tsx
114204
- var import_jsx_runtime62 = __toESM(require_jsx_runtime(), 1);
114206
+ var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
114205
114207
 
114206
114208
  // src/dashboard/components/settings/SettingsSection.tsx
114207
- var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
114209
+ var import_jsx_runtime64 = __toESM(require_jsx_runtime(), 1);
114208
114210
 
114209
114211
  // src/dashboard/components/SettingsPage.tsx
114210
- var import_jsx_runtime64 = __toESM(require_jsx_runtime(), 1);
114212
+ var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
114211
114213
 
114212
114214
  // src/dashboard/components/DashboardShell.tsx
114213
- var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
114215
+ var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
114214
114216
  var isElectron = typeof window !== "undefined" && "__BAND_DESKTOP__" in window;
114215
114217
 
114216
114218
  // src/dashboard/components/DiffFileContent.tsx
@@ -114270,7 +114272,7 @@ var SUPPORTED_LANGUAGES = [
114270
114272
  var LANGUAGE_LABEL_BY_ID = new Map(SUPPORTED_LANGUAGES.map((l) => [l.id, l.label]));
114271
114273
 
114272
114274
  // src/dashboard/components/DiffFileContent.tsx
114273
- var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
114275
+ var import_jsx_runtime67 = __toESM(require_jsx_runtime(), 1);
114274
114276
  var diffTheme = EditorView.theme({
114275
114277
  ".cm-insertedLine": { backgroundColor: "rgba(34, 197, 94, 0.1)" },
114276
114278
  ".cm-deletedLine": { backgroundColor: "rgba(239, 68, 68, 0.1)" },
@@ -114321,12 +114323,12 @@ var diffTheme = EditorView.theme({
114321
114323
 
114322
114324
  // src/dashboard/components/DiffOverviewRuler.tsx
114323
114325
  var import_react30 = __toESM(require_react(), 1);
114324
- var import_jsx_runtime67 = __toESM(require_jsx_runtime(), 1);
114326
+ var import_jsx_runtime68 = __toESM(require_jsx_runtime(), 1);
114325
114327
 
114326
114328
  // src/dashboard/components/FileBrowser.tsx
114327
114329
  var import_lucide_react6 = __toESM(require_lucide_react(), 1);
114328
114330
  var import_react31 = __toESM(require_react(), 1);
114329
- var import_jsx_runtime68 = __toESM(require_jsx_runtime(), 1);
114331
+ var import_jsx_runtime69 = __toESM(require_jsx_runtime(), 1);
114330
114332
  var DRAG_MIME = "application/x-band-tree-entry";
114331
114333
  var DRAG_EXPAND_DELAY_MS = 600;
114332
114334
  function parentOf(path) {
@@ -114424,21 +114426,21 @@ function EntryNameInput({
114424
114426
  }
114425
114427
  };
114426
114428
  const Icon = kind === "directory" ? import_lucide_react6.Folder : import_lucide_react6.File;
114427
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex w-full flex-col", style: { paddingLeft: `${depth * indent + basePad}px` }, children: [
114428
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114429
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex w-full flex-col", style: { paddingLeft: `${depth * indent + basePad}px` }, children: [
114430
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114429
114431
  "div",
114430
114432
  {
114431
114433
  className: `flex items-center ${compact ? "h-[28px] gap-1 pr-3 text-[13px]" : "h-[32px] gap-1.5 pr-4 text-[15px]"}`,
114432
114434
  style: { height },
114433
114435
  children: [
114434
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "size-3.5 shrink-0" }),
114435
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114436
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "size-3.5 shrink-0" }),
114437
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114436
114438
  Icon,
114437
114439
  {
114438
114440
  className: kind === "directory" ? "size-4 shrink-0 text-blue-600 dark:text-blue-400" : "size-4 shrink-0 text-muted-foreground"
114439
114441
  }
114440
114442
  ),
114441
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114443
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114442
114444
  "input",
114443
114445
  {
114444
114446
  ref: inputRef,
@@ -114476,7 +114478,7 @@ function EntryNameInput({
114476
114478
  ]
114477
114479
  }
114478
114480
  ),
114479
- error40 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114481
+ error40 && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114480
114482
  "div",
114481
114483
  {
114482
114484
  className: "pointer-events-none text-xs text-destructive",
@@ -114549,7 +114551,7 @@ function TreeNode2({
114549
114551
  onOpenFilePinned(entryPath);
114550
114552
  }
114551
114553
  };
114552
- const button = /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114554
+ const button = /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114553
114555
  "button",
114554
114556
  {
114555
114557
  ref: isSelected ? selectedRef : void 0,
@@ -114569,15 +114571,15 @@ function TreeNode2({
114569
114571
  className: `flex w-full items-center text-left select-none hover:bg-accent/50 [-webkit-touch-callout:none] ${compact ? "h-[28px] gap-1 pr-3 text-[13px]" : "h-[32px] gap-1.5 pr-4 text-[15px]"} ${isSelected ? "bg-blue-500/30 text-foreground outline outline-1 -outline-offset-1 outline-blue-400/60 hover:bg-blue-500/30 dark:bg-blue-500/40 dark:outline-blue-400/70 dark:hover:bg-blue-500/40" : ""} ${isCut ? "opacity-50" : ""} ${isDropTarget ? "bg-blue-500/20 outline outline-1 -outline-offset-1 outline-blue-400/60" : ""}`,
114570
114572
  style: { paddingLeft: `${depth * indent + basePad}px` },
114571
114573
  children: [
114572
- isDir ? isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.ChevronDown, { className: "size-3.5 shrink-0 text-muted-foreground/70" }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.ChevronRight, { className: "size-3.5 shrink-0 text-muted-foreground/70" }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "size-3.5 shrink-0" }),
114574
+ isDir ? isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.ChevronDown, { className: "size-3.5 shrink-0 text-muted-foreground/70" }) : /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.ChevronRight, { className: "size-3.5 shrink-0 text-muted-foreground/70" }) : /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "size-3.5 shrink-0" }),
114573
114575
  isDir ? (() => {
114574
114576
  const FolderIcon = getFolderIcon(entry.name, isExpanded);
114575
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(FolderIcon, { className: "size-4 shrink-0" });
114577
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(FolderIcon, { className: "size-4 shrink-0" });
114576
114578
  })() : (() => {
114577
114579
  const FileIcon = getFileIcon(entry.name);
114578
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(FileIcon, { className: "size-4 shrink-0" });
114580
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(FileIcon, { className: "size-4 shrink-0" });
114579
114581
  })(),
114580
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "min-w-0 flex-1 truncate", children: entry.name })
114582
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "min-w-0 flex-1 truncate", children: entry.name })
114581
114583
  ]
114582
114584
  }
114583
114585
  );
@@ -114600,7 +114602,7 @@ function TreeNode2({
114600
114602
  // a padding div with `depth={0}` would double-apply `basePad`, shifting
114601
114603
  // the input ~4px to the right and giving it visibly less horizontal
114602
114604
  // room than the rest of the tree.
114603
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114605
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114604
114606
  EntryNameInput,
114605
114607
  {
114606
114608
  kind: isDir ? "directory" : "file",
@@ -114614,130 +114616,130 @@ function TreeNode2({
114614
114616
  },
114615
114617
  `rename-${entryPath}`
114616
114618
  )
114617
- ) : /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114619
+ ) : /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114618
114620
  ContextMenu2,
114619
114621
  {
114620
114622
  onOpenChange: (open3) => {
114621
114623
  if (open3) onSelectRow(entryPath, isDir ? "directory" : "file");
114622
114624
  },
114623
114625
  children: [
114624
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuTrigger2, { asChild: true, children: button }),
114625
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(ContextMenuContent2, { onCloseAutoFocus: menu.flush, children: [
114626
- isDir && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
114627
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114626
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuTrigger2, { asChild: true, children: button }),
114627
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(ContextMenuContent2, { onCloseAutoFocus: menu.flush, children: [
114628
+ isDir && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
114629
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114628
114630
  ContextMenuItem2,
114629
114631
  {
114630
114632
  "data-testid": "file-tree__new-file",
114631
114633
  onSelect: () => menu.queue(() => onRequestNewEntry(entryPath, "file")),
114632
114634
  children: [
114633
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.File, { className: "size-4" }),
114635
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.File, { className: "size-4" }),
114634
114636
  "New File"
114635
114637
  ]
114636
114638
  }
114637
114639
  ),
114638
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114640
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114639
114641
  ContextMenuItem2,
114640
114642
  {
114641
114643
  "data-testid": "file-tree__new-folder",
114642
114644
  onSelect: () => menu.queue(() => onRequestNewEntry(entryPath, "directory")),
114643
114645
  children: [
114644
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.FolderPlus, { className: "size-4" }),
114646
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.FolderPlus, { className: "size-4" }),
114645
114647
  "New Folder"
114646
114648
  ]
114647
114649
  }
114648
114650
  ),
114649
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuSeparator2, {})
114651
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuSeparator2, {})
114650
114652
  ] }),
114651
- onRevealInFinder && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
114652
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114653
+ onRevealInFinder && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
114654
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114653
114655
  ContextMenuItem2,
114654
114656
  {
114655
114657
  "data-testid": "file-tree__reveal-in-finder",
114656
114658
  onSelect: () => menu.queue(() => onRevealInFinder(entryPath)),
114657
114659
  children: [
114658
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.FolderOpen, { className: "size-4" }),
114660
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.FolderOpen, { className: "size-4" }),
114659
114661
  "Reveal in Finder"
114660
114662
  ]
114661
114663
  }
114662
114664
  ),
114663
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuSeparator2, {})
114665
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuSeparator2, {})
114664
114666
  ] }),
114665
- canCut && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114667
+ canCut && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114666
114668
  ContextMenuItem2,
114667
114669
  {
114668
114670
  "data-testid": "file-tree__cut",
114669
114671
  onSelect: () => menu.queue(() => onCut(entryPath, isDir ? "directory" : "file")),
114670
114672
  children: [
114671
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.Scissors, { className: "size-4" }),
114673
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.Scissors, { className: "size-4" }),
114672
114674
  "Cut"
114673
114675
  ]
114674
114676
  }
114675
114677
  ),
114676
- canCopy && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114678
+ canCopy && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114677
114679
  ContextMenuItem2,
114678
114680
  {
114679
114681
  "data-testid": "file-tree__copy",
114680
114682
  onSelect: () => menu.queue(() => onCopy(entryPath, isDir ? "directory" : "file")),
114681
114683
  children: [
114682
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.Copy, { className: "size-4" }),
114684
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.Copy, { className: "size-4" }),
114683
114685
  "Copy"
114684
114686
  ]
114685
114687
  }
114686
114688
  ),
114687
- canPaste && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114689
+ canPaste && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114688
114690
  ContextMenuItem2,
114689
114691
  {
114690
114692
  "data-testid": "file-tree__paste",
114691
114693
  onSelect: () => menu.queue(() => void onPaste(dropFolder)),
114692
114694
  children: [
114693
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.ClipboardPaste, { className: "size-4" }),
114695
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.ClipboardPaste, { className: "size-4" }),
114694
114696
  "Paste"
114695
114697
  ]
114696
114698
  }
114697
114699
  ),
114698
- (canCut || canCopy || canPaste) && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuSeparator2, {}),
114699
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114700
+ (canCut || canCopy || canPaste) && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuSeparator2, {}),
114701
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114700
114702
  ContextMenuItem2,
114701
114703
  {
114702
114704
  "data-testid": "file-tree__copy-relative-path",
114703
114705
  onSelect: () => menu.queue(() => void writeClipboardText(entryPath)),
114704
114706
  children: [
114705
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.ClipboardCopy, { className: "size-4" }),
114707
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.ClipboardCopy, { className: "size-4" }),
114706
114708
  "Copy relative path"
114707
114709
  ]
114708
114710
  }
114709
114711
  ),
114710
- workspacePath && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114712
+ workspacePath && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114711
114713
  ContextMenuItem2,
114712
114714
  {
114713
114715
  "data-testid": "file-tree__copy-absolute-path",
114714
114716
  onSelect: () => menu.queue(() => void writeClipboardText(joinWorkspacePath(workspacePath, entryPath))),
114715
114717
  children: [
114716
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.ClipboardCopy, { className: "size-4" }),
114718
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.ClipboardCopy, { className: "size-4" }),
114717
114719
  "Copy absolute path"
114718
114720
  ]
114719
114721
  }
114720
114722
  ),
114721
- (canRename || canDelete) && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuSeparator2, {}),
114722
- canRename && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114723
+ (canRename || canDelete) && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuSeparator2, {}),
114724
+ canRename && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114723
114725
  ContextMenuItem2,
114724
114726
  {
114725
114727
  "data-testid": "file-tree__rename",
114726
114728
  onSelect: () => menu.queue(() => onRequestRename(entryPath)),
114727
114729
  children: [
114728
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.Pencil, { className: "size-4" }),
114730
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.Pencil, { className: "size-4" }),
114729
114731
  "Rename"
114730
114732
  ]
114731
114733
  }
114732
114734
  ),
114733
- canDelete && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
114735
+ canDelete && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
114734
114736
  ContextMenuItem2,
114735
114737
  {
114736
114738
  variant: "destructive",
114737
114739
  "data-testid": "file-tree__delete",
114738
114740
  onSelect: () => menu.queue(() => onRequestDelete(entryPath, isDir ? "directory" : "file")),
114739
114741
  children: [
114740
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.Trash2, { className: "size-4" }),
114742
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.Trash2, { className: "size-4" }),
114741
114743
  "Delete"
114742
114744
  ]
114743
114745
  }
@@ -114747,13 +114749,13 @@ function TreeNode2({
114747
114749
  }
114748
114750
  );
114749
114751
  const showInlineInput = newEntry?.parentPath === entryPath;
114750
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
114752
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
114751
114753
  row,
114752
114754
  isExpanded && (() => {
114753
114755
  const splitIdx = children?.findIndex((c) => c.type === "file") ?? -1;
114754
114756
  const folderChildren = splitIdx === -1 ? children ?? [] : (children ?? []).slice(0, splitIdx);
114755
114757
  const fileChildren = splitIdx === -1 ? [] : (children ?? []).slice(splitIdx);
114756
- const renderChild = (child) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114758
+ const renderChild = (child) => /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114757
114759
  TreeNode2,
114758
114760
  {
114759
114761
  entry: child,
@@ -114793,7 +114795,7 @@ function TreeNode2({
114793
114795
  },
114794
114796
  child.name
114795
114797
  );
114796
- const newEntryInput = showInlineInput ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114798
+ const newEntryInput = showInlineInput ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114797
114799
  EntryNameInput,
114798
114800
  {
114799
114801
  kind: newEntry.kind,
@@ -114805,9 +114807,9 @@ function TreeNode2({
114805
114807
  },
114806
114808
  `new-${newEntry.kind}-${entryPath}`
114807
114809
  ) : null;
114808
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
114810
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
114809
114811
  showInlineInput && newEntry.kind === "directory" && newEntryInput,
114810
- isLoading && !children?.length && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114812
+ isLoading && !children?.length && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114811
114813
  "div",
114812
114814
  {
114813
114815
  className: `flex items-center text-muted-foreground/70 ${compact ? "text-[13px]" : "text-[15px]"}`,
@@ -114818,7 +114820,7 @@ function TreeNode2({
114818
114820
  children: "Loading\u2026"
114819
114821
  }
114820
114822
  ),
114821
- !isLoading && !showInlineInput && children && children.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
114823
+ !isLoading && !showInlineInput && children && children.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
114822
114824
  "div",
114823
114825
  {
114824
114826
  className: `flex items-center italic text-muted-foreground/50 ${compact ? "text-[13px]" : "text-[15px]"}`,
@@ -115343,7 +115345,7 @@ var FileBrowser = (0, import_react31.forwardRef)(function FileBrowser2({
115343
115345
  );
115344
115346
  const rootMenu = useDeferredMenuAction();
115345
115347
  if (!adapter.listWorkspaceFiles) {
115346
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "File browsing not supported" });
115348
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "File browsing not supported" });
115347
115349
  }
115348
115350
  const rootEntries = dirContents.get("") ?? [];
115349
115351
  const rootLoading = loadingPaths.has("");
@@ -115392,37 +115394,37 @@ var FileBrowser = (0, import_react31.forwardRef)(function FileBrowser2({
115392
115394
  void pasteInto(resolveDefaultTarget());
115393
115395
  }
115394
115396
  };
115395
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex h-full flex-col overflow-hidden", onKeyDown: handleKeyDown, children: [
115396
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
115397
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex h-full flex-col overflow-hidden", onKeyDown: handleKeyDown, children: [
115398
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
115397
115399
  ContextMenu2,
115398
115400
  {
115399
115401
  onOpenChange: (open3) => {
115400
115402
  if (open3) clearTreeSelection();
115401
115403
  },
115402
115404
  children: [
115403
- operationError && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
115405
+ operationError && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
115404
115406
  "div",
115405
115407
  {
115406
115408
  role: "alert",
115407
115409
  "data-testid": "file-tree__error",
115408
115410
  className: "mx-2 mt-1 flex shrink-0 items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-2 py-1.5 text-xs text-destructive",
115409
115411
  children: [
115410
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.AlertTriangle, { className: "mt-0.5 size-3.5 shrink-0" }),
115411
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "min-w-0 flex-1 break-words", children: operationError }),
115412
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
115412
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.AlertTriangle, { className: "mt-0.5 size-3.5 shrink-0" }),
115413
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "min-w-0 flex-1 break-words", children: operationError }),
115414
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
115413
115415
  "button",
115414
115416
  {
115415
115417
  type: "button",
115416
115418
  "aria-label": "Dismiss",
115417
115419
  onClick: () => setOperationError(null),
115418
115420
  className: "shrink-0 rounded-sm hover:bg-destructive/20",
115419
- children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.X, { className: "size-3.5" })
115421
+ children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.X, { className: "size-3.5" })
115420
115422
  }
115421
115423
  )
115422
115424
  ]
115423
115425
  }
115424
115426
  ),
115425
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
115427
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuTrigger2, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
115426
115428
  "div",
115427
115429
  {
115428
115430
  "data-testid": "file-tree__root",
@@ -115441,7 +115443,7 @@ var FileBrowser = (0, import_react31.forwardRef)(function FileBrowser2({
115441
115443
  const rootSplitIdx = rootEntries.findIndex((e) => e.type === "file");
115442
115444
  const rootFolders = rootSplitIdx === -1 ? rootEntries : rootEntries.slice(0, rootSplitIdx);
115443
115445
  const rootFiles = rootSplitIdx === -1 ? [] : rootEntries.slice(rootSplitIdx);
115444
- const renderRow = (entry) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
115446
+ const renderRow = (entry) => /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
115445
115447
  TreeNode2,
115446
115448
  {
115447
115449
  entry,
@@ -115481,7 +115483,7 @@ var FileBrowser = (0, import_react31.forwardRef)(function FileBrowser2({
115481
115483
  },
115482
115484
  entry.name
115483
115485
  );
115484
- const rootInput = showRootInput ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
115486
+ const rootInput = showRootInput ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
115485
115487
  EntryNameInput,
115486
115488
  {
115487
115489
  kind: newEntry.kind,
@@ -115493,51 +115495,51 @@ var FileBrowser = (0, import_react31.forwardRef)(function FileBrowser2({
115493
115495
  },
115494
115496
  `new-${newEntry.kind}-root`
115495
115497
  ) : null;
115496
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
115498
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
115497
115499
  showRootInput && newEntry.kind === "directory" && rootInput,
115498
- rootLoading && rootEntries.length === 0 && !showRootInput && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "Loading\u2026" }),
115499
- !rootLoading && rootEntries.length === 0 && !showRootInput && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "Empty directory" }),
115500
+ rootLoading && rootEntries.length === 0 && !showRootInput && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "Loading\u2026" }),
115501
+ !rootLoading && rootEntries.length === 0 && !showRootInput && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "Empty directory" }),
115500
115502
  rootFolders.map(renderRow),
115501
115503
  showRootInput && newEntry.kind === "file" && rootInput,
115502
115504
  rootFiles.map(renderRow)
115503
115505
  ] });
115504
115506
  })(),
115505
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "min-h-[40px] flex-1" })
115507
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "min-h-[40px] flex-1" })
115506
115508
  ]
115507
115509
  }
115508
115510
  ) }),
115509
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(ContextMenuContent2, { onCloseAutoFocus: rootMenu.flush, children: [
115510
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
115511
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(ContextMenuContent2, { onCloseAutoFocus: rootMenu.flush, children: [
115512
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
115511
115513
  ContextMenuItem2,
115512
115514
  {
115513
115515
  "data-testid": "file-tree__new-file",
115514
115516
  onSelect: () => rootMenu.queue(() => requestNewEntry("", "file")),
115515
115517
  children: [
115516
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.File, { className: "size-4" }),
115518
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.File, { className: "size-4" }),
115517
115519
  "New File"
115518
115520
  ]
115519
115521
  }
115520
115522
  ),
115521
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
115523
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
115522
115524
  ContextMenuItem2,
115523
115525
  {
115524
115526
  "data-testid": "file-tree__new-folder",
115525
115527
  onSelect: () => rootMenu.queue(() => requestNewEntry("", "directory")),
115526
115528
  children: [
115527
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.FolderPlus, { className: "size-4" }),
115529
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.FolderPlus, { className: "size-4" }),
115528
115530
  "New Folder"
115529
115531
  ]
115530
115532
  }
115531
115533
  ),
115532
- canPaste && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
115533
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(ContextMenuSeparator2, {}),
115534
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
115534
+ canPaste && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
115535
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ContextMenuSeparator2, {}),
115536
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
115535
115537
  ContextMenuItem2,
115536
115538
  {
115537
115539
  "data-testid": "file-tree__paste",
115538
115540
  onSelect: () => rootMenu.queue(() => void pasteInto("")),
115539
115541
  children: [
115540
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.ClipboardPaste, { className: "size-4" }),
115542
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.ClipboardPaste, { className: "size-4" }),
115541
115543
  "Paste"
115542
115544
  ]
115543
115545
  }
@@ -115547,42 +115549,42 @@ var FileBrowser = (0, import_react31.forwardRef)(function FileBrowser2({
115547
115549
  ]
115548
115550
  }
115549
115551
  ),
115550
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
115552
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
115551
115553
  Dialog2,
115552
115554
  {
115553
115555
  open: pendingDelete !== null,
115554
115556
  onOpenChange: (open3) => {
115555
115557
  if (!open3) cancelDelete();
115556
115558
  },
115557
- children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(DialogContent2, { className: "sm:max-w-[425px]", onClick: (e) => e.stopPropagation(), children: [
115558
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(DialogHeader, { children: [
115559
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(DialogTitle2, { children: [
115559
+ children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogContent2, { className: "sm:max-w-[425px]", onClick: (e) => e.stopPropagation(), children: [
115560
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogHeader, { children: [
115561
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogTitle2, { children: [
115560
115562
  "Delete ",
115561
115563
  pendingDelete?.kind === "directory" ? "folder" : "file"
115562
115564
  ] }),
115563
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(DialogDescription2, { children: [
115565
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogDescription2, { children: [
115564
115566
  "Are you sure you want to delete ",
115565
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("strong", { children: pendingDelete?.path }),
115567
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("strong", { children: pendingDelete?.path }),
115566
115568
  "?"
115567
115569
  ] })
115568
115570
  ] }),
115569
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex flex-col gap-2 text-sm", children: [
115570
- pendingDelete?.kind === "directory" && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-start gap-2 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3", children: [
115571
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.AlertTriangle, { className: "size-4 shrink-0 text-yellow-500 mt-0.5" }),
115572
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: "The folder and all of its contents will be deleted from disk. This cannot be undone." })
115571
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex flex-col gap-2 text-sm", children: [
115572
+ pendingDelete?.kind === "directory" && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-start gap-2 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3", children: [
115573
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.AlertTriangle, { className: "size-4 shrink-0 text-yellow-500 mt-0.5" }),
115574
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: "The folder and all of its contents will be deleted from disk. This cannot be undone." })
115573
115575
  ] }),
115574
- pendingDelete?.kind === "file" && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-start gap-2 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3", children: [
115575
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.AlertTriangle, { className: "size-4 shrink-0 text-yellow-500 mt-0.5" }),
115576
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: "The file will be deleted from disk. This cannot be undone." })
115576
+ pendingDelete?.kind === "file" && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-start gap-2 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3", children: [
115577
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.AlertTriangle, { className: "size-4 shrink-0 text-yellow-500 mt-0.5" }),
115578
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: "The file will be deleted from disk. This cannot be undone." })
115577
115579
  ] }),
115578
- deleteError && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 p-3 text-destructive", children: [
115579
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react6.AlertTriangle, { className: "size-4 shrink-0 mt-0.5" }),
115580
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: deleteError })
115580
+ deleteError && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 p-3 text-destructive", children: [
115581
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react6.AlertTriangle, { className: "size-4 shrink-0 mt-0.5" }),
115582
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: deleteError })
115581
115583
  ] })
115582
115584
  ] }),
115583
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(DialogFooter, { children: [
115584
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Button, { variant: "ghost", onClick: cancelDelete, disabled: deleteSubmitting, children: "Cancel" }),
115585
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
115585
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogFooter, { children: [
115586
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Button, { variant: "ghost", onClick: cancelDelete, disabled: deleteSubmitting, children: "Cancel" }),
115587
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
115586
115588
  Button,
115587
115589
  {
115588
115590
  variant: "destructive",
@@ -115604,17 +115606,17 @@ var import_react34 = __toESM(require_react(), 1);
115604
115606
 
115605
115607
  // src/dashboard/components/ImagePreview.tsx
115606
115608
  var import_react32 = __toESM(require_react(), 1);
115607
- var import_jsx_runtime69 = __toESM(require_jsx_runtime(), 1);
115609
+ var import_jsx_runtime70 = __toESM(require_jsx_runtime(), 1);
115608
115610
 
115609
115611
  // src/dashboard/components/LanguagePickerDialog.tsx
115610
115612
  var import_react33 = __toESM(require_react(), 1);
115611
- var import_jsx_runtime70 = __toESM(require_jsx_runtime(), 1);
115613
+ var import_jsx_runtime71 = __toESM(require_jsx_runtime(), 1);
115612
115614
 
115613
115615
  // src/dashboard/components/PdfPreview.tsx
115614
- var import_jsx_runtime71 = __toESM(require_jsx_runtime(), 1);
115616
+ var import_jsx_runtime72 = __toESM(require_jsx_runtime(), 1);
115615
115617
 
115616
115618
  // src/dashboard/components/FileViewer.tsx
115617
- var import_jsx_runtime72 = __toESM(require_jsx_runtime(), 1);
115619
+ var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
115618
115620
 
115619
115621
  // src/dashboard/components/QuickOpenDialog.tsx
115620
115622
  var import_react35 = __toESM(require_react(), 1);
@@ -115628,12 +115630,12 @@ function formatFileLocation(filePath, line2, options2) {
115628
115630
  }
115629
115631
 
115630
115632
  // src/dashboard/components/QuickOpenDialog.tsx
115631
- var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
115633
+ var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
115632
115634
 
115633
115635
  // src/dashboard/components/SearchBar.tsx
115634
115636
  var import_lucide_react7 = __toESM(require_lucide_react(), 1);
115635
115637
  var import_react36 = __toESM(require_react(), 1);
115636
- var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
115638
+ var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
115637
115639
  var DEFAULT_VISIBLE_OPTIONS = ["caseSensitive", "wholeWord", "regex"];
115638
115640
  function ToggleButton({
115639
115641
  active,
@@ -115641,7 +115643,7 @@ function ToggleButton({
115641
115643
  title,
115642
115644
  children
115643
115645
  }) {
115644
- return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
115646
+ return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
115645
115647
  "button",
115646
115648
  {
115647
115649
  type: "button",
@@ -115663,6 +115665,7 @@ var SearchBar = (0, import_react36.forwardRef)(function SearchBar2({
115663
115665
  onPrevious,
115664
115666
  onClose,
115665
115667
  visibleOptions = DEFAULT_VISIBLE_OPTIONS,
115668
+ variant = "bar",
115666
115669
  className
115667
115670
  }, ref) {
115668
115671
  const showCase = visibleOptions.includes("caseSensitive");
@@ -115682,21 +115685,30 @@ var SearchBar = (0, import_react36.forwardRef)(function SearchBar2({
115682
115685
  const toggleRegex = (0, import_react36.useCallback)(() => {
115683
115686
  onOptionsChange({ ...options2, regex: !options2.regex });
115684
115687
  }, [options2, onOptionsChange]);
115685
- return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(
115688
+ const floating = variant === "floating";
115689
+ const hasMatches = !!matchInfo && matchInfo.total > 0;
115690
+ const noResults = !!query && !!matchInfo && !hasMatches;
115691
+ return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(
115686
115692
  "div",
115687
115693
  {
115694
+ "data-testid": floating ? "find-widget" : void 0,
115688
115695
  className: cn(
115689
- "flex shrink-0 items-center gap-1.5 border-b border-border bg-muted/30 px-3 py-1.5",
115696
+ floating ? "absolute top-1.5 right-4 z-20 flex w-80 max-w-[calc(100%-1.5rem)] items-center gap-0.5 rounded-md border border-border bg-popover py-1 pr-1 pl-2 text-popover-foreground shadow-md" : "flex shrink-0 items-center gap-1.5 border-b border-border bg-muted/30 px-3 py-1.5",
115690
115697
  className
115691
115698
  ),
115692
115699
  children: [
115693
- /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
115694
- /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
115700
+ !floating && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
115701
+ /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
115695
115702
  "input",
115696
115703
  {
115697
115704
  ref: inputRef,
115698
- className: "min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground",
115705
+ className: cn(
115706
+ "min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground",
115707
+ floating ? "text-[13px]" : "text-sm"
115708
+ ),
115699
115709
  placeholder: placeholder2,
115710
+ "aria-label": placeholder2,
115711
+ "aria-invalid": noResults || void 0,
115700
115712
  value: query,
115701
115713
  onChange: (e) => onQueryChange(e.target.value),
115702
115714
  onKeyDown: (e) => {
@@ -115712,40 +115724,55 @@ var SearchBar = (0, import_react36.forwardRef)(function SearchBar2({
115712
115724
  }
115713
115725
  }
115714
115726
  ),
115715
- showCase && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(ToggleButton, { active: options2.caseSensitive, onClick: toggleCase, title: "Match Case", children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.CaseSensitive, { className: "size-4" }) }),
115716
- showWholeWord && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(ToggleButton, { active: options2.wholeWord, onClick: toggleWholeWord, title: "Match Whole Word", children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.WholeWord, { className: "size-4" }) }),
115717
- showRegex && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(ToggleButton, { active: options2.regex, onClick: toggleRegex, title: "Use Regular Expression", children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.Regex, { className: "size-4" }) }),
115718
- matchInfo && query && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: matchInfo.total > 0 ? `${matchInfo.current} of ${matchInfo.total}` : "No results" }),
115719
- onPrevious && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
115727
+ showCase && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ToggleButton, { active: options2.caseSensitive, onClick: toggleCase, title: "Match Case", children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.CaseSensitive, { className: "size-4" }) }),
115728
+ showWholeWord && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ToggleButton, { active: options2.wholeWord, onClick: toggleWholeWord, title: "Match Whole Word", children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.WholeWord, { className: "size-4" }) }),
115729
+ showRegex && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ToggleButton, { active: options2.regex, onClick: toggleRegex, title: "Use Regular Expression", children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.Regex, { className: "size-4" }) }),
115730
+ floating ? (
115731
+ // Always shown, like VS Code: `0/0` before a query, `3/12` while
115732
+ // matching, "No results" when a query matched nothing.
115733
+ /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
115734
+ "span",
115735
+ {
115736
+ "data-testid": "find-widget__count",
115737
+ className: cn(
115738
+ "shrink-0 px-1 text-xs tabular-nums",
115739
+ noResults ? "text-destructive" : "text-muted-foreground"
115740
+ ),
115741
+ children: noResults ? "No results" : `${hasMatches ? matchInfo.current : 0}/${hasMatches ? matchInfo.total : 0}`
115742
+ }
115743
+ )
115744
+ ) : matchInfo && query && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: matchInfo.total > 0 ? `${matchInfo.current} of ${matchInfo.total}` : "No results" }),
115745
+ onPrevious && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
115720
115746
  "button",
115721
115747
  {
115722
115748
  type: "button",
115723
115749
  onClick: onPrevious,
115724
- disabled: !matchInfo || matchInfo.total === 0,
115750
+ disabled: !hasMatches,
115725
115751
  className: "inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:text-foreground disabled:opacity-30",
115726
115752
  title: "Previous match (Shift+Enter)",
115727
- children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.ChevronUp, { className: "size-3.5" })
115753
+ children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.ChevronUp, { className: "size-3.5" })
115728
115754
  }
115729
115755
  ),
115730
- onNext && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
115756
+ onNext && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
115731
115757
  "button",
115732
115758
  {
115733
115759
  type: "button",
115734
115760
  onClick: onNext,
115735
- disabled: !matchInfo || matchInfo.total === 0,
115761
+ disabled: !hasMatches,
115736
115762
  className: "inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:text-foreground disabled:opacity-30",
115737
115763
  title: "Next match (Enter)",
115738
- children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.ChevronDown, { className: "size-3.5" })
115764
+ children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.ChevronDown, { className: "size-3.5" })
115739
115765
  }
115740
115766
  ),
115741
- onClose && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
115767
+ floating && onClose && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { "aria-hidden": true, className: "mx-0.5 h-4 w-px shrink-0 bg-border" }),
115768
+ onClose && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
115742
115769
  "button",
115743
115770
  {
115744
115771
  type: "button",
115745
115772
  onClick: onClose,
115746
115773
  className: "inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:text-foreground",
115747
115774
  title: "Close (Escape)",
115748
- children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_lucide_react7.X, { className: "size-3.5" })
115775
+ children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react7.X, { className: "size-3.5" })
115749
115776
  }
115750
115777
  )
115751
115778
  ]
@@ -115755,14 +115782,14 @@ var SearchBar = (0, import_react36.forwardRef)(function SearchBar2({
115755
115782
 
115756
115783
  // src/dashboard/components/SearchFilesDialog.tsx
115757
115784
  var import_react37 = __toESM(require_react(), 1);
115758
- var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
115785
+ var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
115759
115786
 
115760
115787
  // src/dashboard/components/WorkspacePickerDialog.tsx
115761
115788
  var import_react38 = __toESM(require_react(), 1);
115762
- var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
115789
+ var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
115763
115790
 
115764
115791
  // src/dashboard/components/WorkspaceTabNav.tsx
115765
- var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
115792
+ var import_jsx_runtime78 = __toESM(require_jsx_runtime(), 1);
115766
115793
 
115767
115794
  // src/dashboard/hooks/use-diff-target.ts
115768
115795
  var import_react39 = __toESM(require_react(), 1);
@@ -118437,6 +118464,16 @@ var ProjectQueries = class {
118437
118464
  const db = getDb();
118438
118465
  db.update(projects).set({ hasOrigin }).where(eq(projects.name, name3)).run();
118439
118466
  }
118467
+ /**
118468
+ * Path and kind of one project, by primary key. For per-request lookups
118469
+ * (e.g. the avatar route) that don't need the worktree tree `loadAll`
118470
+ * assembles.
118471
+ */
118472
+ findLocation(name3) {
118473
+ const db = getDb();
118474
+ const row = db.select({ path: projects.path, kind: projects.kind }).from(projects).where(eq(projects.name, name3)).get();
118475
+ return row ? { path: row.path, kind: row.kind ?? "git" } : void 0;
118476
+ }
118440
118477
  };
118441
118478
 
118442
118479
  // src/server/infra/db/queries/workspace-statuses.ts
@@ -133744,9 +133781,7 @@ async function ensureCdpTargetId(bandTabId) {
133744
133781
  });
133745
133782
  const timeoutId = setTimeout(() => {
133746
133783
  pendingEnsures.delete(bandTabId);
133747
- rejectFn(
133748
- new Error(`Timed out waiting for desktop to create a WebContentsView for ${bandTabId}`)
133749
- );
133784
+ rejectFn(new Error(`Timed out waiting for desktop to create a browser page for ${bandTabId}`));
133750
133785
  }, ENSURE_TIMEOUT_MS);
133751
133786
  pendingEnsures.set(bandTabId, {
133752
133787
  promise: promise2,
@@ -135834,13 +135869,231 @@ var prereqsRouter = t3.router({
135834
135869
 
135835
135870
  // src/server/services/project-service.ts
135836
135871
  import { existsSync as existsSync13 } from "node:fs";
135837
- import { basename as basename4, join as join29, resolve as resolve7 } from "node:path";
135872
+ import { basename as basename4, join as join30, resolve as resolve7 } from "node:path";
135873
+
135874
+ // src/server/services/project-avatar-service.ts
135875
+ import { mkdir as mkdir3, readFile as readFile5, rename, writeFile as writeFile3 } from "node:fs/promises";
135876
+ import { join as join29 } from "node:path";
135877
+
135878
+ // src/server/infra/github/github-client.ts
135879
+ var FETCH_TIMEOUT_MS = 1e4;
135880
+ var MAX_AVATAR_BYTES = 1024 * 1024;
135881
+ var MAX_REDIRECTS = 2;
135882
+ var GITHUB_AVATAR_CDN = "avatars.githubusercontent.com";
135883
+ var ALLOWED_TYPES = /* @__PURE__ */ new Set(["image/png", "image/jpeg", "image/gif", "image/webp"]);
135884
+ var GitHubClient = class {
135885
+ async fetchAvatar(ref) {
135886
+ const signal = AbortSignal.timeout(FETCH_TIMEOUT_MS);
135887
+ try {
135888
+ let url2 = new URL(avatarUrl(ref));
135889
+ const origin = url2.origin;
135890
+ for (let hop = 0; ; hop++) {
135891
+ const res = await fetch(url2, { signal, redirect: "manual" });
135892
+ if (res.status >= 300 && res.status < 400) {
135893
+ await res.body?.cancel();
135894
+ const location = res.headers.get("location");
135895
+ const next = location ? new URL(location, url2) : null;
135896
+ const allowed = next && (next.origin === origin || ref.host === "github.com" && next.protocol === "https:" && next.hostname === GITHUB_AVATAR_CDN);
135897
+ if (!next || !allowed || hop >= MAX_REDIRECTS) {
135898
+ return { kind: "unavailable", reason: `redirect to ${location ?? "(none)"}` };
135899
+ }
135900
+ url2 = next;
135901
+ continue;
135902
+ }
135903
+ return await readAvatar(res);
135904
+ }
135905
+ } catch (err) {
135906
+ return { kind: "unavailable", reason: err instanceof Error ? err.message : String(err) };
135907
+ }
135908
+ }
135909
+ };
135910
+ async function readAvatar(res) {
135911
+ if (res.status === 404) {
135912
+ await res.body?.cancel();
135913
+ return { kind: "missing" };
135914
+ }
135915
+ if (!res.ok) {
135916
+ await res.body?.cancel();
135917
+ return { kind: "unavailable", reason: `HTTP ${res.status}` };
135918
+ }
135919
+ const contentType = res.headers.get("content-type")?.split(";")[0].trim().toLowerCase() ?? "";
135920
+ const declaredLength = Number(res.headers.get("content-length") ?? 0);
135921
+ if (!ALLOWED_TYPES.has(contentType) || declaredLength > MAX_AVATAR_BYTES || !res.body) {
135922
+ await res.body?.cancel();
135923
+ return { kind: "missing" };
135924
+ }
135925
+ const chunks = [];
135926
+ let total = 0;
135927
+ const reader = res.body.getReader();
135928
+ for (; ; ) {
135929
+ const { done, value } = await reader.read();
135930
+ if (done) break;
135931
+ total += value.byteLength;
135932
+ if (total > MAX_AVATAR_BYTES) {
135933
+ await reader.cancel();
135934
+ return { kind: "missing" };
135935
+ }
135936
+ chunks.push(value);
135937
+ }
135938
+ if (total === 0) return { kind: "missing" };
135939
+ return { kind: "image", bytes: Buffer.concat(chunks), contentType };
135940
+ }
135941
+ function avatarUrl(ref) {
135942
+ const base2 = ref.host === "github.com" ? (process.env.BAND_GITHUB_URL || "https://github.com").replace(/\/+$/, "") : `https://${ref.host}`;
135943
+ return `${base2}/${encodeURIComponent(ref.owner)}.png?size=64`;
135944
+ }
135945
+
135946
+ // src/server/infra/github/github-repo-ref.ts
135947
+ var GITHUB_COM_ALIASES = /* @__PURE__ */ new Set(["github.com", "www.github.com", "ssh.github.com"]);
135948
+ var OWNER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$/;
135949
+ function githubRepoRef(info) {
135950
+ if (!info) return null;
135951
+ const host = info.host.toLowerCase();
135952
+ if (!OWNER_PATTERN.test(info.owner)) return null;
135953
+ if (GITHUB_COM_ALIASES.has(host)) {
135954
+ return { host: "github.com", owner: info.owner, repo: info.repo };
135955
+ }
135956
+ if (host.startsWith("github.") || host.endsWith(".ghe.com")) {
135957
+ return { host, owner: info.owner, repo: info.repo };
135958
+ }
135959
+ return null;
135960
+ }
135961
+
135962
+ // src/server/services/project-avatar-service.ts
135963
+ var log32 = createLogger("project-avatars");
135964
+ var CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
135965
+ var FAILURE_BACKOFF_MS = 5 * 60 * 1e3;
135966
+ var REMOTE_TTL_MS = 60 * 1e3;
135967
+ var ProjectAvatarService = class {
135968
+ constructor(queries = new ProjectQueries(), git = new GitClient(), github = new GitHubClient()) {
135969
+ this.queries = queries;
135970
+ this.git = git;
135971
+ this.github = github;
135972
+ }
135973
+ remotes = /* @__PURE__ */ new Map();
135974
+ entries = /* @__PURE__ */ new Map();
135975
+ inflight = /* @__PURE__ */ new Map();
135976
+ /**
135977
+ * Avatar descriptor for `projects.list`. Never touches the network: it
135978
+ * reads the `origin` remote (memoised) and the cache sidecar only.
135979
+ */
135980
+ async describe(project) {
135981
+ if (project.kind !== "git") return null;
135982
+ const ref = await this.repoRef(project.path);
135983
+ if (!ref) return null;
135984
+ const entry = await this.entry(ref);
135985
+ if (entry.meta?.status === "missing" && !this.isStale(entry.meta)) return null;
135986
+ return {
135987
+ src: `/api/project-avatar/${encodeURIComponent(project.name)}`,
135988
+ label: `${ref.owner}/${ref.repo}`
135989
+ };
135990
+ }
135991
+ /**
135992
+ * The avatar bytes for the project named `projectName`, fetching and
135993
+ * caching them on a miss. `null` when the project is unknown, not on
135994
+ * GitHub, has no avatar, or GitHub is unreachable with nothing cached.
135995
+ */
135996
+ async image(projectName) {
135997
+ const project = this.queries.findLocation(projectName);
135998
+ if (!project || project.kind !== "git") return null;
135999
+ const ref = await this.repoRef(project.path);
136000
+ if (!ref) return null;
136001
+ const key = cacheKey2(ref);
136002
+ const entry = await this.entry(ref);
136003
+ if (entry.meta && !this.isStale(entry.meta)) return this.readCached(key, entry.meta);
136004
+ if (Date.now() < entry.retryAfter) return this.readCached(key, entry.meta);
136005
+ let pending = this.inflight.get(key);
136006
+ if (!pending) {
136007
+ pending = this.refresh(ref, entry).finally(() => this.inflight.delete(key));
136008
+ this.inflight.set(key, pending);
136009
+ }
136010
+ return pending;
136011
+ }
136012
+ async refresh(ref, entry) {
136013
+ const key = cacheKey2(ref);
136014
+ try {
136015
+ const result = await this.github.fetchAvatar(ref);
136016
+ if (result.kind === "unavailable") {
136017
+ log32.debug("avatar for %s/%s unavailable: %s", ref.host, ref.owner, result.reason);
136018
+ entry.retryAfter = Date.now() + FAILURE_BACKOFF_MS;
136019
+ return this.readCached(key, entry.meta);
136020
+ }
136021
+ if (result.kind === "missing") {
136022
+ await this.writeMeta(key, entry, { status: "missing", fetchedAt: Date.now() });
136023
+ return null;
136024
+ }
136025
+ await mkdir3(cacheDir(), { recursive: true });
136026
+ const imagePath = join29(cacheDir(), `${key}.img`);
136027
+ await writeFile3(`${imagePath}.tmp`, result.bytes);
136028
+ await rename(`${imagePath}.tmp`, imagePath);
136029
+ await this.writeMeta(key, entry, {
136030
+ status: "ok",
136031
+ contentType: result.contentType,
136032
+ fetchedAt: Date.now()
136033
+ });
136034
+ return { bytes: result.bytes, contentType: result.contentType };
136035
+ } catch (err) {
136036
+ log32.debug("avatar cache write for %s failed: %s", key, err);
136037
+ entry.retryAfter = Date.now() + FAILURE_BACKOFF_MS;
136038
+ return this.readCached(key, entry.meta);
136039
+ }
136040
+ }
136041
+ async readCached(key, meta2) {
136042
+ if (meta2?.status !== "ok" || !meta2.contentType) return null;
136043
+ try {
136044
+ const bytes = await readFile5(join29(cacheDir(), `${key}.img`));
136045
+ return { bytes, contentType: meta2.contentType };
136046
+ } catch {
136047
+ return null;
136048
+ }
136049
+ }
136050
+ async writeMeta(key, entry, meta2) {
136051
+ entry.meta = meta2;
136052
+ entry.retryAfter = 0;
136053
+ await mkdir3(cacheDir(), { recursive: true });
136054
+ await writeFile3(join29(cacheDir(), `${key}.json`), JSON.stringify(meta2));
136055
+ }
136056
+ /** In-memory view of one owner's cache sidecar, loaded from disk once. */
136057
+ async entry(ref) {
136058
+ const key = cacheKey2(ref);
136059
+ let entry = this.entries.get(key);
136060
+ if (entry) return entry;
136061
+ let meta2 = null;
136062
+ try {
136063
+ meta2 = JSON.parse(await readFile5(join29(cacheDir(), `${key}.json`), "utf-8"));
136064
+ } catch {
136065
+ }
136066
+ entry = this.entries.get(key) ?? { meta: meta2, retryAfter: 0 };
136067
+ this.entries.set(key, entry);
136068
+ return entry;
136069
+ }
136070
+ isStale(meta2) {
136071
+ return Date.now() - meta2.fetchedAt > CACHE_TTL_MS;
136072
+ }
136073
+ async repoRef(projectPath) {
136074
+ const cached2 = this.remotes.get(projectPath);
136075
+ if (cached2 && Date.now() - cached2.at < REMOTE_TTL_MS) return cached2.ref;
136076
+ const ref = githubRepoRef(await this.git.getRepoInfo(projectPath));
136077
+ this.remotes.set(projectPath, { ref, at: Date.now() });
136078
+ return ref;
136079
+ }
136080
+ };
136081
+ function cacheDir() {
136082
+ return join29(bandHome(), "cache", "github-avatars");
136083
+ }
136084
+ function cacheKey2(ref) {
136085
+ return `${ref.host.replace(/[^a-z0-9.-]/g, "_")}__${ref.owner.toLowerCase()}`;
136086
+ }
136087
+ var projectAvatarService = new ProjectAvatarService();
136088
+
136089
+ // src/server/services/project-service.ts
135838
136090
  var ProjectService = class {
135839
- constructor(queries = new ProjectQueries(), git = new GitClient(), settings2 = settingsService, statusQueries = new WorkspaceStatusQueries()) {
136091
+ constructor(queries = new ProjectQueries(), git = new GitClient(), settings2 = settingsService, statusQueries = new WorkspaceStatusQueries(), avatars = projectAvatarService) {
135840
136092
  this.queries = queries;
135841
136093
  this.git = git;
135842
136094
  this.settings = settings2;
135843
136095
  this.statusQueries = statusQueries;
136096
+ this.avatars = avatars;
135844
136097
  }
135845
136098
  /**
135846
136099
  * Snapshot of the projects table joined with the dashboard-facing
@@ -135868,6 +136121,7 @@ var ProjectService = class {
135868
136121
  }
135869
136122
  const result = await Promise.all(
135870
136123
  projects2.map(async (project) => {
136124
+ const avatar = this.avatars.describe(project).catch(() => null);
135871
136125
  let worktrees2 = project.worktrees;
135872
136126
  if (project.kind === "git") {
135873
136127
  const trackedByPath = new Map(project.worktrees.map((wt) => [wt.path, wt]));
@@ -135895,6 +136149,7 @@ var ProjectService = class {
135895
136149
  defaultBranch: project.defaultBranch,
135896
136150
  label: project.label,
135897
136151
  kind: project.kind,
136152
+ avatar: await avatar,
135898
136153
  worktrees: worktrees2.map((wt) => {
135899
136154
  const workspaceId = toWorkspaceId(project.name, wt.name);
135900
136155
  const status = statusMap.get(workspaceId);
@@ -135916,7 +136171,7 @@ var ProjectService = class {
135916
136171
  */
135917
136172
  checkPath(path) {
135918
136173
  const resolvedPath = resolve7(path);
135919
- const isGitRepo = existsSync13(join29(resolvedPath, ".git"));
136174
+ const isGitRepo = existsSync13(join30(resolvedPath, ".git"));
135920
136175
  return { isGitRepo };
135921
136176
  }
135922
136177
  /**
@@ -135952,7 +136207,7 @@ var ProjectService = class {
135952
136207
  }
135953
136208
  }
135954
136209
  const resolvedPath = resolve7(path);
135955
- const kind = existsSync13(join29(resolvedPath, ".git")) ? "git" : "plain";
136210
+ const kind = existsSync13(join30(resolvedPath, ".git")) ? "git" : "plain";
135956
136211
  let defaultBranch = "main";
135957
136212
  let worktrees2 = [];
135958
136213
  if (kind === "git") {
@@ -136131,8 +136386,8 @@ var projectsRouter = t3.router({
136131
136386
 
136132
136387
  // src/server/api/queue/router.ts
136133
136388
  import { realpathSync as realpathSync4 } from "node:fs";
136134
- import { join as join30, resolve as resolve8, sep as sep5 } from "node:path";
136135
- var log32 = createLogger("trpc.queue");
136389
+ import { join as join31, resolve as resolve8, sep as sep5 } from "node:path";
136390
+ var log33 = createLogger("trpc.queue");
136136
136391
  var queuedFileSchema = external_exports2.object({
136137
136392
  mediaType: external_exports2.string(),
136138
136393
  url: external_exports2.string(),
@@ -136140,7 +136395,7 @@ var queuedFileSchema = external_exports2.object({
136140
136395
  filename: external_exports2.string().optional()
136141
136396
  });
136142
136397
  function isPathWithinUploadDir(p3) {
136143
- const uploadDir = join30(bandHome(), "uploads");
136398
+ const uploadDir = join31(bandHome(), "uploads");
136144
136399
  const normalized2 = resolve8(p3);
136145
136400
  if (normalized2 !== uploadDir && !normalized2.startsWith(uploadDir + sep5)) {
136146
136401
  return false;
@@ -136161,10 +136416,10 @@ async function resolveQueuedFiles(chatId, files) {
136161
136416
  for (let i = 0; i < files.length; i++) {
136162
136417
  const file2 = files[i];
136163
136418
  const uploadsUrlMatch = file2.url.match(/^\/api\/uploads\/(.+)$/);
136164
- const derivedPath = file2.path ?? (uploadsUrlMatch ? join30(bandHome(), "uploads", uploadsUrlMatch[1]) : void 0);
136419
+ const derivedPath = file2.path ?? (uploadsUrlMatch ? join31(bandHome(), "uploads", uploadsUrlMatch[1]) : void 0);
136165
136420
  if (derivedPath) {
136166
136421
  if (!isPathWithinUploadDir(derivedPath)) {
136167
- log32.warn(
136422
+ log33.warn(
136168
136423
  { chatId, path: derivedPath, filename: file2.filename },
136169
136424
  "queue: dropping file with path outside uploads directory"
136170
136425
  );
@@ -136189,7 +136444,7 @@ async function resolveQueuedFiles(chatId, files) {
136189
136444
  });
136190
136445
  continue;
136191
136446
  }
136192
- log32.warn(
136447
+ log33.warn(
136193
136448
  { chatId, url: file2.url, filename: file2.filename },
136194
136449
  "queue: dropping file with no path and non-data URL \u2014 cannot recover disk path"
136195
136450
  );
@@ -136197,7 +136452,7 @@ async function resolveQueuedFiles(chatId, files) {
136197
136452
  if (needsSave.length > 0) {
136198
136453
  const saved = await saveUploadedFilesDetailed(needsSave);
136199
136454
  if (saved.length !== needsSave.length) {
136200
- log32.error(
136455
+ log33.error(
136201
136456
  { chatId, expected: needsSave.length, got: saved.length },
136202
136457
  "queue: saveUploadedFilesDetailed returned unexpected count \u2014 dropping data-URL files (cannot map 1:1)"
136203
136458
  );
@@ -136230,7 +136485,7 @@ var queueRouter = t3.router({
136230
136485
  try {
136231
136486
  files = await resolveQueuedFiles(chatId, input.files);
136232
136487
  } catch (err) {
136233
- log32.error(
136488
+ log33.error(
136234
136489
  { chatId, err: err instanceof Error ? err.message : err },
136235
136490
  "queue.push: failed to persist file uploads; enqueuing text only"
136236
136491
  );
@@ -136266,7 +136521,7 @@ var queueRouter = t3.router({
136266
136521
  files: await resolveQueuedFiles(chatId, m3.files)
136267
136522
  };
136268
136523
  } catch (err) {
136269
- log32.error(
136524
+ log33.error(
136270
136525
  { chatId, messageId: m3.id, err: err instanceof Error ? err.message : err },
136271
136526
  "queue: failed to resolve files for queued message; dropping its files"
136272
136527
  );
@@ -136387,7 +136642,7 @@ function aggregateTurnsByHourAndModel(snap, provider) {
136387
136642
  }
136388
136643
  return Array.from(buckets2.values());
136389
136644
  }
136390
- var log33 = createLogger("usage-scanner");
136645
+ var log34 = createLogger("usage-scanner");
136391
136646
  var SCHEDULER_KEY2 = Symbol.for("band.usage-scanner");
136392
136647
  var g6 = globalThis;
136393
136648
  if (!g6[SCHEDULER_KEY2]) {
@@ -136449,14 +136704,14 @@ var UsageScannerService = class {
136449
136704
  try {
136450
136705
  totalRows += await this.scanPair(ws, a);
136451
136706
  } catch (err) {
136452
- log33.warn(
136707
+ log34.warn(
136453
136708
  { err, workspaceId: ws.workspaceId, agentType: a.agentType },
136454
136709
  "usage scanner pair failed"
136455
136710
  );
136456
136711
  }
136457
136712
  }
136458
136713
  }
136459
- log33.debug(
136714
+ log34.debug(
136460
136715
  { durationMs: this.now() - started, workspaces: workspaces.length, rowsWritten: totalRows },
136461
136716
  "usage scanner tick complete"
136462
136717
  );
@@ -136501,7 +136756,7 @@ var UsageScannerService = class {
136501
136756
  try {
136502
136757
  reader = this.getUsageReader(a);
136503
136758
  } catch (err) {
136504
- log33.debug({ err, agentId: a.agentId }, "failed to resolve usage reader for scan");
136759
+ log34.debug({ err, agentId: a.agentId }, "failed to resolve usage reader for scan");
136505
136760
  return 0;
136506
136761
  }
136507
136762
  if (!reader) return 0;
@@ -136510,7 +136765,7 @@ var UsageScannerService = class {
136510
136765
  try {
136511
136766
  sessions = await reader.listSessions(ws.worktreePath);
136512
136767
  } catch (err) {
136513
- log33.debug(
136768
+ log34.debug(
136514
136769
  { err, agentId: a.agentId, worktreePath: ws.worktreePath },
136515
136770
  "listSessions failed during usage scan"
136516
136771
  );
@@ -136526,7 +136781,7 @@ var UsageScannerService = class {
136526
136781
  try {
136527
136782
  snap = await reader.getSessionUsage(s2.sessionId, ws.worktreePath);
136528
136783
  } catch (err) {
136529
- log33.debug(
136784
+ log34.debug(
136530
136785
  { err, sessionId: s2.sessionId, agentType: a.agentType },
136531
136786
  "getSessionUsage failed"
136532
136787
  );
@@ -136564,7 +136819,7 @@ var UsageScannerService = class {
136564
136819
  this.scanState.set(ws.workspaceId, a.agentType, maxObserved);
136565
136820
  }
136566
136821
  if (changed.length > slice.length) {
136567
- log33.debug(
136822
+ log34.debug(
136568
136823
  {
136569
136824
  workspaceId: ws.workspaceId,
136570
136825
  agentType: a.agentType,
@@ -136626,11 +136881,11 @@ function startUsageScanner(options2 = {}) {
136626
136881
  const intervalMs = options2.intervalMs ?? USAGE_SCAN_INTERVAL_MS;
136627
136882
  const svc = getUsageScannerService();
136628
136883
  svc.tick().catch((err) => {
136629
- log33.warn({ err }, "initial usage scanner tick failed");
136884
+ log34.warn({ err }, "initial usage scanner tick failed");
136630
136885
  });
136631
136886
  const timer = setInterval(() => {
136632
136887
  svc.tick().catch((err) => {
136633
- log33.warn({ err }, "scheduled usage scanner tick failed");
136888
+ log34.warn({ err }, "scheduled usage scanner tick failed");
136634
136889
  });
136635
136890
  }, intervalMs);
136636
136891
  timer.unref();
@@ -136748,7 +137003,7 @@ var reportsRouter = t3.router({
136748
137003
  });
136749
137004
 
136750
137005
  // src/server/services/session-service.ts
136751
- var log34 = createLogger("session-service");
137006
+ var log35 = createLogger("session-service");
136752
137007
  var SessionService = class {
136753
137008
  /** Lists past sessions for a workspace's chat pane (default chat when
136754
137009
  * `chatId` is undefined). */
@@ -136761,7 +137016,7 @@ var SessionService = class {
136761
137016
  if (!chatService.get(chatId)) {
136762
137017
  chatService.create(input.workspaceId, { id: chatId, name: "Chat" });
136763
137018
  }
136764
- log34.debug({ chatId, workspaceId: input.workspaceId }, "listing past sessions for chat");
137019
+ log35.debug({ chatId, workspaceId: input.workspaceId }, "listing past sessions for chat");
136765
137020
  return agentSessionService.listSessions(chatId);
136766
137021
  }
136767
137022
  };
@@ -136887,7 +137142,7 @@ function getToken() {
136887
137142
  }
136888
137143
 
136889
137144
  // src/server/infra/tunnels/tunnel-client.ts
136890
- var log35 = createLogger("tunnel");
137145
+ var log36 = createLogger("tunnel");
136891
137146
  var TunnelClient = class _TunnelClient {
136892
137147
  tunnelProcess = null;
136893
137148
  tunnelUrl = null;
@@ -136912,7 +137167,7 @@ var TunnelClient = class _TunnelClient {
136912
137167
  spawnTunnel(options2, resolvedPath) {
136913
137168
  const nullDevice = process.platform === "win32" ? "NUL" : "/dev/null";
136914
137169
  const args = ["tunnel", "--config", nullDevice, "--url", `http://localhost:${options2.port}`];
136915
- log35.debug("spawning cloudflared %s", args.join(" "));
137170
+ log36.debug("spawning cloudflared %s", args.join(" "));
136916
137171
  return new Promise((resolve12, reject) => {
136917
137172
  const child = spawn4("cloudflared", args, {
136918
137173
  env: { ...process.env, PATH: resolvedPath },
@@ -136926,12 +137181,12 @@ var TunnelClient = class _TunnelClient {
136926
137181
  for (const line2 of text3.split("\n")) {
136927
137182
  const trimmed = line2.trim();
136928
137183
  if (!trimmed) continue;
136929
- log35.debug("output: %s", trimmed);
137184
+ log36.debug("output: %s", trimmed);
136930
137185
  const url2 = _TunnelClient.extractUrl(trimmed);
136931
137186
  if (url2) {
136932
137187
  const token = getToken();
136933
137188
  this.tunnelUrl = _TunnelClient.appendToken(url2, token);
136934
- log35.debug("detected URL: %s", this.tunnelUrl);
137189
+ log36.debug("detected URL: %s", this.tunnelUrl);
136935
137190
  emit({ kind: "tunnel-url", url: this.tunnelUrl });
136936
137191
  if (!settled) {
136937
137192
  settled = true;
@@ -136946,7 +137201,7 @@ var TunnelClient = class _TunnelClient {
136946
137201
  handleOutput(data);
136947
137202
  });
136948
137203
  child.on("error", (err) => {
136949
- log35.debug("process error: %s", err.message);
137204
+ log36.debug("process error: %s", err.message);
136950
137205
  this.tunnelProcess = null;
136951
137206
  this.tunnelUrl = null;
136952
137207
  emit({ kind: "tunnel-error", error: err.message });
@@ -136956,7 +137211,7 @@ var TunnelClient = class _TunnelClient {
136956
137211
  }
136957
137212
  });
136958
137213
  child.on("exit", (code) => {
136959
- log35.debug("process exited with code: %d", code ?? -1);
137214
+ log36.debug("process exited with code: %d", code ?? -1);
136960
137215
  const wasRunning = this.tunnelProcess !== null && settled;
136961
137216
  this.tunnelProcess = null;
136962
137217
  this.tunnelUrl = null;
@@ -136978,7 +137233,7 @@ var TunnelClient = class _TunnelClient {
136978
137233
  });
136979
137234
  setTimeout(() => {
136980
137235
  if (!settled) {
136981
- log35.debug("30s timeout reached, resolving without URL");
137236
+ log36.debug("30s timeout reached, resolving without URL");
136982
137237
  settled = true;
136983
137238
  resolve12();
136984
137239
  }
@@ -136987,12 +137242,12 @@ var TunnelClient = class _TunnelClient {
136987
137242
  }
136988
137243
  async start(options2) {
136989
137244
  if (this.startInProgress) {
136990
- log35.debug("start: start already in progress, waiting...");
137245
+ log36.debug("start: start already in progress, waiting...");
136991
137246
  await this.startInProgress;
136992
137247
  return;
136993
137248
  }
136994
137249
  if (this.tunnelProcess) {
136995
- log35.debug("start: already running, re-emitting URL");
137250
+ log36.debug("start: already running, re-emitting URL");
136996
137251
  if (this.tunnelUrl) {
136997
137252
  emit({ kind: "tunnel-url", url: this.tunnelUrl });
136998
137253
  }
@@ -137057,7 +137312,7 @@ var TunnelService = class {
137057
137312
  var tunnelService = new TunnelService();
137058
137313
 
137059
137314
  // src/server/api/system/router.ts
137060
- var log36 = createLogger("trpc.system");
137315
+ var log37 = createLogger("trpc.system");
137061
137316
  var systemRouter = t3.router({
137062
137317
  /**
137063
137318
  * Combined liveness probe — webserver is always true if this query
@@ -137065,15 +137320,15 @@ var systemRouter = t3.router({
137065
137320
  * an interval to drive the bottom-bar status pill.
137066
137321
  */
137067
137322
  health: publicProcedure.query(() => {
137068
- log36.debug("services.health called");
137323
+ log37.debug("services.health called");
137069
137324
  const tunnel = tunnelService.getStatus();
137070
- log36.debug({ tunnel }, "services.health: tunnel status");
137325
+ log37.debug({ tunnel }, "services.health: tunnel status");
137071
137326
  const result = {
137072
137327
  webserver: true,
137073
137328
  tunnel: tunnel.running,
137074
137329
  tunnel_url: tunnel.url
137075
137330
  };
137076
- log36.debug({ result }, "services.health result");
137331
+ log37.debug({ result }, "services.health result");
137077
137332
  return result;
137078
137333
  }),
137079
137334
  // Activity level controls how often the branch-status poller fires.
@@ -137189,7 +137444,7 @@ var systemRouter = t3.router({
137189
137444
  });
137190
137445
 
137191
137446
  // src/server/api/tasks/router.ts
137192
- var log37 = createLogger("tasks-router");
137447
+ var log38 = createLogger("tasks-router");
137193
137448
  var tasksRouter = t3.router({
137194
137449
  list: publicProcedure.input(
137195
137450
  external_exports2.object({
@@ -137251,7 +137506,7 @@ var tasksRouter = t3.router({
137251
137506
  if (input.files && input.files.length > 0) {
137252
137507
  const savedFiles = await saveUploadedFilesDetailed(input.files);
137253
137508
  if (savedFiles.length !== input.files.length) {
137254
- log37.warn(
137509
+ log38.warn(
137255
137510
  { chatId, submitted: input.files.length, saved: savedFiles.length },
137256
137511
  "tasks.submit: some file uploads were dropped (malformed data URL?)"
137257
137512
  );
@@ -137446,25 +137701,25 @@ var terminalsRouters = {
137446
137701
  };
137447
137702
 
137448
137703
  // src/server/api/tunnel/router.ts
137449
- var log38 = createLogger("trpc.tunnel");
137704
+ var log39 = createLogger("trpc.tunnel");
137450
137705
  var tunnelRouter = t3.router({
137451
137706
  status: publicProcedure.query(() => {
137452
137707
  return tunnelService.getStatus();
137453
137708
  }),
137454
137709
  start: publicProcedure.input(external_exports2.object({}).optional()).mutation(async () => {
137455
- log38.debug("tunnel.start called");
137710
+ log39.debug("tunnel.start called");
137456
137711
  try {
137457
137712
  await tunnelService.start();
137458
137713
  } catch (err) {
137459
- log38.debug({ err }, "tunnel.start: startTunnel failed");
137714
+ log39.debug({ err }, "tunnel.start: startTunnel failed");
137460
137715
  return { ok: true, url: null };
137461
137716
  }
137462
137717
  const status = tunnelService.getStatus();
137463
- log38.debug({ status }, "tunnel.start: after startTunnel");
137718
+ log39.debug({ status }, "tunnel.start: after startTunnel");
137464
137719
  if (status.url) {
137465
137720
  return { ok: true, url: status.url };
137466
137721
  }
137467
- log38.debug("tunnel.start: no URL available");
137722
+ log39.debug("tunnel.start: no URL available");
137468
137723
  return { ok: true, url: null };
137469
137724
  }),
137470
137725
  stop: publicProcedure.mutation(async () => {
@@ -137475,9 +137730,9 @@ var tunnelRouter = t3.router({
137475
137730
 
137476
137731
  // src/server/services/diff-service.ts
137477
137732
  import { existsSync as existsSync14 } from "node:fs";
137478
- import { readFile as readFile5, rm as rm3 } from "node:fs/promises";
137479
- import { join as join31, resolve as resolve9, sep as sep6 } from "node:path";
137480
- var log39 = createLogger("diff-service");
137733
+ import { readFile as readFile6, rm as rm3 } from "node:fs/promises";
137734
+ import { join as join32, resolve as resolve9, sep as sep6 } from "node:path";
137735
+ var log40 = createLogger("diff-service");
137481
137736
  var EMPTY_TREE_ARGS = ["hash-object", "-t", "tree", "/dev/null"];
137482
137737
  var EMPTY_TREE_SHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
137483
137738
  async function resolveDiffContext(cwd, defaultBranch, diffMode, compareBranchInput) {
@@ -137530,7 +137785,7 @@ function parseFileStatuses(nameStatusOutput) {
137530
137785
  return fileStatuses;
137531
137786
  }
137532
137787
  function assertWorktreeRelative(cwd, filePath) {
137533
- const target = resolve9(join31(cwd, filePath));
137788
+ const target = resolve9(join32(cwd, filePath));
137534
137789
  if (target !== cwd && !target.startsWith(cwd + sep6)) {
137535
137790
  throw new Error("Invalid path");
137536
137791
  }
@@ -137545,7 +137800,7 @@ function assertWorktreeRelative(cwd, filePath) {
137545
137800
  }
137546
137801
  async function readUntrackedFileLines(cwd, file2) {
137547
137802
  try {
137548
- const content2 = await readFile5(join31(cwd, file2), "utf-8");
137803
+ const content2 = await readFile6(join32(cwd, file2), "utf-8");
137549
137804
  const lines = content2.split("\n");
137550
137805
  if (lines.length > 0 && lines[lines.length - 1] === "") {
137551
137806
  lines.pop();
@@ -137582,7 +137837,7 @@ var DiffService = class {
137582
137837
  );
137583
137838
  branches = output.trim().split("\n").map((b2) => b2.trim()).filter(Boolean);
137584
137839
  } catch (err) {
137585
- log39.error(
137840
+ log40.error(
137586
137841
  `listBranches: for-each-ref failed for ${cwd}: ${err instanceof Error ? err.message : err}`
137587
137842
  );
137588
137843
  }
@@ -137681,7 +137936,7 @@ var DiffService = class {
137681
137936
  async getDiffSummary(workspaceId, options2) {
137682
137937
  const workspace = this.workspaces.resolve(workspaceId);
137683
137938
  if (!workspace) throw new WorkspaceNotFoundError(workspaceId);
137684
- const hasGit = existsSync14(join31(workspace.worktree.path, ".git"));
137939
+ const hasGit = existsSync14(join32(workspace.worktree.path, ".git"));
137685
137940
  if (workspace.project.kind === "plain" || !hasGit) {
137686
137941
  const defaultBranch2 = workspace.project.defaultBranch;
137687
137942
  return {
@@ -137747,7 +138002,7 @@ var DiffService = class {
137747
138002
  const isUntracked = untrackedOutput.trim().split("\n").filter(Boolean).length > 0;
137748
138003
  if (isUntracked) {
137749
138004
  try {
137750
- const content2 = await readFile5(targetAbs, "utf-8");
138005
+ const content2 = await readFile6(targetAbs, "utf-8");
137751
138006
  const lines = content2.split("\n");
137752
138007
  if (lines.length > 0 && lines[lines.length - 1] === "") {
137753
138008
  lines.pop();
@@ -137814,8 +138069,8 @@ var diffService = new DiffService();
137814
138069
 
137815
138070
  // src/server/services/files-service.ts
137816
138071
  import { existsSync as existsSync15 } from "node:fs";
137817
- import { cp, mkdir as mkdir3, readdir as readdir4, readFile as readFile6, rename, rm as rm4, stat as stat6, writeFile as writeFile3 } from "node:fs/promises";
137818
- import { dirname as dirname10, extname as extname3, join as join32, resolve as resolve10, sep as sep7 } from "node:path";
138072
+ import { cp, mkdir as mkdir4, readdir as readdir4, readFile as readFile7, rename as rename2, rm as rm4, stat as stat6, writeFile as writeFile4 } from "node:fs/promises";
138073
+ import { dirname as dirname10, extname as extname3, join as join33, resolve as resolve10, sep as sep7 } from "node:path";
137819
138074
  var MAX_FILE_SIZE2 = 1024 * 1024;
137820
138075
  var LANG_MAP2 = {
137821
138076
  ".js": "javascript",
@@ -137863,7 +138118,7 @@ var FilesService = class {
137863
138118
  throw new WorkspaceNotFoundError(workspaceId);
137864
138119
  }
137865
138120
  const root = workspace.worktree.path;
137866
- const target = resolve10(join32(root, relative2));
138121
+ const target = resolve10(join33(root, relative2));
137867
138122
  const insideRoot = target === root || target.startsWith(root + sep7);
137868
138123
  if (!insideRoot) {
137869
138124
  throw new Error("Invalid path");
@@ -137906,7 +138161,7 @@ var FilesService = class {
137906
138161
  if (size4 > MAX_FILE_SIZE2) {
137907
138162
  return { tooLarge: true, size: size4 };
137908
138163
  }
137909
- const buffer = await readFile6(target);
138164
+ const buffer = await readFile7(target);
137910
138165
  const sample = buffer.subarray(0, 8192);
137911
138166
  if (sample.includes(0)) {
137912
138167
  return { binary: true, size: size4 };
@@ -137926,7 +138181,7 @@ var FilesService = class {
137926
138181
  if (fileStat.isDirectory()) {
137927
138182
  throw new Error("Cannot write to a directory");
137928
138183
  }
137929
- await writeFile3(target, content2, "utf-8");
138184
+ await writeFile4(target, content2, "utf-8");
137930
138185
  return { ok: true };
137931
138186
  }
137932
138187
  async createFile(workspaceId, path, content2 = "") {
@@ -137943,7 +138198,7 @@ var FilesService = class {
137943
138198
  if (!parentStat.isDirectory()) {
137944
138199
  throw new Error("Parent is not a directory");
137945
138200
  }
137946
- await writeFile3(target, content2, { encoding: "utf-8", flag: "wx" });
138201
+ await writeFile4(target, content2, { encoding: "utf-8", flag: "wx" });
137947
138202
  return { ok: true };
137948
138203
  }
137949
138204
  async createDirectory(workspaceId, path) {
@@ -137960,7 +138215,7 @@ var FilesService = class {
137960
138215
  if (!parentStat.isDirectory()) {
137961
138216
  throw new Error("Parent is not a directory");
137962
138217
  }
137963
- await mkdir3(target);
138218
+ await mkdir4(target);
137964
138219
  return { ok: true };
137965
138220
  }
137966
138221
  async deletePath(workspaceId, path) {
@@ -138005,7 +138260,7 @@ var FilesService = class {
138005
138260
  if (!toParentStat.isDirectory()) {
138006
138261
  throw new Error("Destination parent is not a directory");
138007
138262
  }
138008
- await rename(fromTarget, toTarget);
138263
+ await rename2(fromTarget, toTarget);
138009
138264
  return {
138010
138265
  ok: true,
138011
138266
  kind: entryStat.isDirectory() ? "directory" : "file"
@@ -139712,7 +139967,7 @@ function getScalarHtml(specUrl) {
139712
139967
  }
139713
139968
 
139714
139969
  // src/server/api/terminals/ws.ts
139715
- var log40 = createLogger("terminal-ws");
139970
+ var log41 = createLogger("terminal-ws");
139716
139971
  var MAX_CLOSE_REASON_BYTES = 123;
139717
139972
  var HEARTBEAT_INTERVAL_MS2 = 3e4;
139718
139973
  function clampCloseReason(reason) {
@@ -139797,7 +140052,7 @@ async function handleTerminalConnection(ws, req) {
139797
140052
  existing = await terminalService.info(terminalId) !== null;
139798
140053
  } catch (err) {
139799
140054
  const msg = err instanceof Error ? err.message : String(err);
139800
- log40.error("Failed to look up terminal %s: %s", terminalId, msg);
140055
+ log41.error("Failed to look up terminal %s: %s", terminalId, msg);
139801
140056
  safeClose(ws, 1011, msg);
139802
140057
  return;
139803
140058
  }
@@ -139840,7 +140095,7 @@ async function handleTerminalConnection(ws, req) {
139840
140095
  await terminalService.spawn(workspaceId, terminalId, spawnOpts);
139841
140096
  } catch (err) {
139842
140097
  const msg = err instanceof Error ? err.message : String(err);
139843
- log40.error("Failed to spawn terminal %s for workspace %s: %s", terminalId, workspaceId, msg);
140098
+ log41.error("Failed to spawn terminal %s for workspace %s: %s", terminalId, workspaceId, msg);
139844
140099
  safeClose(ws, 4001, msg);
139845
140100
  return;
139846
140101
  }
@@ -139848,7 +140103,7 @@ async function handleTerminalConnection(ws, req) {
139848
140103
  attachSession(ws, inbox, terminalId, workspaceId, true, pendingMessage);
139849
140104
  }
139850
140105
  function attachSession(ws, inbox, terminalId, workspaceId, isNew, pendingMessage) {
139851
- log40.debug(
140106
+ log41.debug(
139852
140107
  "Terminal %s: %s (workspace %s)",
139853
140108
  isNew ? "connected" : "reconnected",
139854
140109
  terminalId,
@@ -139867,7 +140122,7 @@ function attachSession(ws, inbox, terminalId, workspaceId, isNew, pendingMessage
139867
140122
  });
139868
140123
  const unsubscribeExit = terminalService.onExit(terminalId, (event) => {
139869
140124
  unsubscribeTitle();
139870
- log40.debug("PTY exited with code %d for terminal %s", event.exitCode, terminalId);
140125
+ log41.debug("PTY exited with code %d for terminal %s", event.exitCode, terminalId);
139871
140126
  if (ws.readyState === ws.OPEN) {
139872
140127
  ws.close(1e3, "Terminal exited");
139873
140128
  }
@@ -139895,7 +140150,7 @@ function attachSession(ws, inbox, terminalId, workspaceId, isNew, pendingMessage
139895
140150
  try {
139896
140151
  attached = await terminalService.attach(terminalId, dims);
139897
140152
  } catch (err) {
139898
- log40.error("Failed to attach terminal %s: %s", terminalId, err);
140153
+ log41.error("Failed to attach terminal %s: %s", terminalId, err);
139899
140154
  safeClose(ws, 1011, "Terminal attach failed");
139900
140155
  return;
139901
140156
  }
@@ -139934,7 +140189,7 @@ function attachSession(ws, inbox, terminalId, workspaceId, isNew, pendingMessage
139934
140189
  const cols = Number.isFinite(parsed.cols) && parsed.cols > 0 ? parsed.cols : void 0;
139935
140190
  const rows = Number.isFinite(parsed.rows) && parsed.rows > 0 ? parsed.rows : void 0;
139936
140191
  void startReplay(cols, rows).catch((err) => {
139937
- log40.error("Failed to replay terminal %s: %s", terminalId, err);
140192
+ log41.error("Failed to replay terminal %s: %s", terminalId, err);
139938
140193
  });
139939
140194
  return;
139940
140195
  }
@@ -139949,7 +140204,7 @@ function attachSession(ws, inbox, terminalId, workspaceId, isNew, pendingMessage
139949
140204
  clearInterval(pingInterval);
139950
140205
  attachment?.detach();
139951
140206
  unsubscribeExit();
139952
- log40.debug("Terminal disconnected: %s (PTY kept alive)", terminalId);
140207
+ log41.debug("Terminal disconnected: %s (PTY kept alive)", terminalId);
139953
140208
  });
139954
140209
  if (pendingMessage) {
139955
140210
  processMessage(pendingMessage);
@@ -139972,7 +140227,7 @@ function handleMessage(ws, terminalId, message) {
139972
140227
  }
139973
140228
  if (parsed.type === "close") {
139974
140229
  void terminalService.kill(terminalId).catch((err) => {
139975
- log40.error("Failed to kill terminal %s: %s", terminalId, err);
140230
+ log41.error("Failed to kill terminal %s: %s", terminalId, err);
139976
140231
  });
139977
140232
  ws.close(1e3, "Terminal closed by client");
139978
140233
  return;
@@ -139987,7 +140242,7 @@ function handleMessage(ws, terminalId, message) {
139987
140242
  }
139988
140243
 
139989
140244
  // src/server/infra/browser-host/cdp-proxy.ts
139990
- var log41 = createLogger("cdp-proxy");
140245
+ var log42 = createLogger("cdp-proxy");
139991
140246
  async function handleCdpConnection(ws, req) {
139992
140247
  const url2 = new URL(req.url ?? "", `http://${req.headers.host}`);
139993
140248
  const bandTabId = url2.searchParams.get("bandTabId");
@@ -140010,17 +140265,17 @@ async function handleCdpConnection(ws, req) {
140010
140265
  cdpTargetId = await ensureCdpTargetId(bandTabId);
140011
140266
  } catch (err) {
140012
140267
  const message = err instanceof Error ? err.message : String(err);
140013
- log41.debug("ensureCdpTargetId failed for %s: %s", bandTabId, message);
140268
+ log42.debug("ensureCdpTargetId failed for %s: %s", bandTabId, message);
140014
140269
  if (ws.readyState === ws.OPEN) {
140015
140270
  ws.close(4001, message.slice(0, 123));
140016
140271
  }
140017
140272
  return;
140018
140273
  }
140019
140274
  const upstreamUrl = `ws://${DESKTOP_CDP_HOST}:${DESKTOP_CDP_PORT}/devtools/page/${encodeURIComponent(cdpTargetId)}`;
140020
- log41.info("CDP proxy connecting bandTabId=%s upstream=%s", bandTabId, upstreamUrl);
140275
+ log42.info("CDP proxy connecting bandTabId=%s upstream=%s", bandTabId, upstreamUrl);
140021
140276
  upstream = new wrapper_default(upstreamUrl);
140022
140277
  upstream.on("open", () => {
140023
- log41.info("CDP upstream open bandTabId=%s pending=%d", bandTabId, pending.length);
140278
+ log42.info("CDP upstream open bandTabId=%s pending=%d", bandTabId, pending.length);
140024
140279
  for (const msg of pending) {
140025
140280
  upstream?.send(msg);
140026
140281
  }
@@ -140032,20 +140287,20 @@ async function handleCdpConnection(ws, req) {
140032
140287
  }
140033
140288
  });
140034
140289
  upstream.on("error", (err) => {
140035
- log41.warn("CDP upstream error bandTabId=%s: %s", bandTabId, err.message);
140290
+ log42.warn("CDP upstream error bandTabId=%s: %s", bandTabId, err.message);
140036
140291
  markTargetDestroyed(bandTabId);
140037
140292
  if (ws.readyState === ws.OPEN) {
140038
140293
  ws.close(4001, `Desktop CDP error: ${err.message}`.slice(0, 123));
140039
140294
  }
140040
140295
  });
140041
140296
  upstream.on("close", (code) => {
140042
- log41.info("CDP upstream closed bandTabId=%s code=%d", bandTabId, code);
140297
+ log42.info("CDP upstream closed bandTabId=%s code=%d", bandTabId, code);
140043
140298
  if (ws.readyState === ws.OPEN) {
140044
140299
  ws.close(1e3, "Upstream closed");
140045
140300
  }
140046
140301
  });
140047
140302
  ws.on("close", () => {
140048
- log41.debug("CDP client closed bandTabId=%s", bandTabId);
140303
+ log42.debug("CDP client closed bandTabId=%s", bandTabId);
140049
140304
  if (upstream && (upstream.readyState === wrapper_default.OPEN || upstream.readyState === wrapper_default.CONNECTING)) {
140050
140305
  try {
140051
140306
  upstream.close();
@@ -140054,7 +140309,7 @@ async function handleCdpConnection(ws, req) {
140054
140309
  }
140055
140310
  });
140056
140311
  ws.on("error", (err) => {
140057
- log41.debug("CDP client error bandTabId=%s: %s", bandTabId, err.message);
140312
+ log42.debug("CDP client error bandTabId=%s: %s", bandTabId, err.message);
140058
140313
  try {
140059
140314
  upstream?.close();
140060
140315
  } catch {
@@ -140063,7 +140318,7 @@ async function handleCdpConnection(ws, req) {
140063
140318
  }
140064
140319
 
140065
140320
  // src/server/infra/browser-host/cdp-targets.ts
140066
- var log42 = createLogger("cdp-targets");
140321
+ var log43 = createLogger("cdp-targets");
140067
140322
  var CdpUnreachableError = class extends Error {
140068
140323
  constructor(message) {
140069
140324
  super(message);
@@ -140119,7 +140374,7 @@ async function captureSnapshot(bandTabId) {
140119
140374
  });
140120
140375
  ws.on("error", (err) => {
140121
140376
  clearTimeout(timeout);
140122
- log42.debug("captureSnapshot ws error for tab %s: %s", bandTabId, err.message);
140377
+ log43.debug("captureSnapshot ws error for tab %s: %s", bandTabId, err.message);
140123
140378
  markTargetDestroyed(bandTabId);
140124
140379
  settle(new CdpUnreachableError(err.message));
140125
140380
  });
@@ -140138,7 +140393,7 @@ function runMigrations() {
140138
140393
  }
140139
140394
 
140140
140395
  // src/server/infra/lsp/lsp-proxy.ts
140141
- var log43 = createLogger("lsp-proxy");
140396
+ var log44 = createLogger("lsp-proxy");
140142
140397
  function frameMessage(json3) {
140143
140398
  const body = Buffer.from(json3, "utf-8");
140144
140399
  const header = `Content-Length: ${body.byteLength}\r
@@ -140156,7 +140411,7 @@ function createFrameParser(onMessage) {
140156
140411
  const headerStr = buffer.subarray(0, separatorIdx).toString("ascii");
140157
140412
  const match = headerStr.match(/Content-Length:\s*(\d+)/i);
140158
140413
  if (!match) {
140159
- log43.warn("Malformed LSP header: %s", headerStr);
140414
+ log44.warn("Malformed LSP header: %s", headerStr);
140160
140415
  buffer = buffer.subarray(separatorIdx + 4);
140161
140416
  continue;
140162
140417
  }
@@ -140189,7 +140444,7 @@ async function handleLspConnection(ws, req) {
140189
140444
  session = await getOrSpawnServer(workspaceId, lang);
140190
140445
  } catch (err) {
140191
140446
  const message = err instanceof Error ? err.message : String(err);
140192
- log43.error(
140447
+ log44.error(
140193
140448
  "Failed to spawn %s language server for workspace %s: %s",
140194
140449
  lang,
140195
140450
  workspaceId,
@@ -140203,12 +140458,12 @@ async function handleLspConnection(ws, req) {
140203
140458
  ws.close(4002, "Language server stdio not available");
140204
140459
  return;
140205
140460
  }
140206
- log43.debug("LSP client connected: %s/%s", workspaceId, lang);
140461
+ log44.debug("LSP client connected: %s/%s", workspaceId, lang);
140207
140462
  const pendingRequests = /* @__PURE__ */ new Map();
140208
140463
  const retriedIds = /* @__PURE__ */ new Set();
140209
140464
  const RETRY_DELAY_MS = 2e3;
140210
140465
  const parseFrame = createFrameParser((json3) => {
140211
- log43.debug(
140466
+ log44.debug(
140212
140467
  "LSP stdout [%s/%s]: %s",
140213
140468
  workspaceId,
140214
140469
  lang,
@@ -140220,7 +140475,7 @@ async function handleLspConnection(ws, req) {
140220
140475
  const originalRequest = pendingRequests.get(msg.id);
140221
140476
  retriedIds.add(msg.id);
140222
140477
  pendingRequests.delete(msg.id);
140223
- log43.debug(
140478
+ log44.debug(
140224
140479
  "LSP retrying request %d after 'No Project' error [%s/%s]",
140225
140480
  msg.id,
140226
140481
  workspaceId,
@@ -140242,14 +140497,14 @@ async function handleLspConnection(ws, req) {
140242
140497
  const onStdoutData = (chunk) => parseFrame(chunk);
140243
140498
  lspProcess.stdout.on("data", onStdoutData);
140244
140499
  const onExit = (code) => {
140245
- log43.debug("LSP server exited (code %s), closing WebSocket", String(code));
140500
+ log44.debug("LSP server exited (code %s), closing WebSocket", String(code));
140246
140501
  if (ws.readyState === ws.OPEN) {
140247
140502
  ws.close(1e3, "Language server exited");
140248
140503
  }
140249
140504
  };
140250
140505
  lspProcess.on("exit", onExit);
140251
140506
  function forwardToStdin(json3) {
140252
- log43.debug(
140507
+ log44.debug(
140253
140508
  "LSP stdin [%s/%s]: %s",
140254
140509
  workspaceId,
140255
140510
  lang,
@@ -140276,23 +140531,23 @@ async function handleLspConnection(ws, req) {
140276
140531
  ws.on("close", () => {
140277
140532
  lspProcess.stdout?.off("data", onStdoutData);
140278
140533
  lspProcess.off("exit", onExit);
140279
- log43.debug("LSP client disconnected: %s/%s (server kept alive)", workspaceId, lang);
140534
+ log44.debug("LSP client disconnected: %s/%s (server kept alive)", workspaceId, lang);
140280
140535
  });
140281
140536
  }
140282
140537
 
140283
140538
  // src/server/infra/terminals/create-backend.ts
140284
140539
  import { existsSync as existsSync16, statSync as statSync8 } from "node:fs";
140285
- import { join as join33 } from "node:path";
140286
- var log44 = createLogger("terminal-backend");
140540
+ import { join as join34 } from "node:path";
140541
+ var log45 = createLogger("terminal-backend");
140287
140542
  function createTerminalBackend(serverRoot, bandHome2) {
140288
140543
  if (process.platform === "win32") return new InProcessTerminalBackend();
140289
140544
  if (process.env.BAND_TERMINAL_DAEMON === "0") return new InProcessTerminalBackend();
140290
140545
  const entry = [
140291
- join33(serverRoot, "terminal-daemon.mjs"),
140292
- join33(serverRoot, "terminal-daemon.ts")
140546
+ join34(serverRoot, "terminal-daemon.mjs"),
140547
+ join34(serverRoot, "terminal-daemon.ts")
140293
140548
  ].find((candidate) => existsSync16(candidate));
140294
140549
  if (!entry) {
140295
- log44.error(
140550
+ log45.error(
140296
140551
  { serverRoot },
140297
140552
  "terminal daemon entry is missing; terminals will not survive a server restart"
140298
140553
  );
@@ -140301,7 +140556,7 @@ function createTerminalBackend(serverRoot, bandHome2) {
140301
140556
  const { size: size4, mtimeMs } = statSync8(entry);
140302
140557
  return new DaemonTerminalBackend({
140303
140558
  entry,
140304
- runDir: join33(bandHome2, "run"),
140559
+ runDir: join34(bandHome2, "run"),
140305
140560
  cwd: bandHome2,
140306
140561
  buildId: `${size4}-${Math.trunc(mtimeMs)}`
140307
140562
  });
@@ -140344,7 +140599,7 @@ async function listenWithFallback(server, startPort, attempts = 20) {
140344
140599
  import { execFile as execFile10 } from "node:child_process";
140345
140600
  import { statSync as statSync9 } from "node:fs";
140346
140601
  import { homedir as homedir8 } from "node:os";
140347
- import { join as join34 } from "node:path";
140602
+ import { join as join35 } from "node:path";
140348
140603
  var BAND_SKILL_NAMES = [
140349
140604
  "band",
140350
140605
  "band-chat",
@@ -140397,7 +140652,7 @@ async function installSkills(opts = {}) {
140397
140652
  const sharedDir = getSharedSkillsDir(home);
140398
140653
  const markAllSkipped = () => {
140399
140654
  for (const name3 of BAND_SKILL_NAMES) {
140400
- result.skipped.push(join34(sharedDir, name3, SKILL_FILE));
140655
+ result.skipped.push(join35(sharedDir, name3, SKILL_FILE));
140401
140656
  }
140402
140657
  };
140403
140658
  const bandPath = await findBandBinary();
@@ -140450,7 +140705,7 @@ async function installSkills(opts = {}) {
140450
140705
  }
140451
140706
 
140452
140707
  // src/server/services/setup-service.ts
140453
- var log45 = createLogger("setup");
140708
+ var log46 = createLogger("setup");
140454
140709
  var AGENT_CHECKS = [
140455
140710
  { id: "claude-code", type: "claude-code", label: "Claude Code", binary: "claude" },
140456
140711
  { id: "codex", type: "codex", label: "Codex", binary: "codex" },
@@ -140467,7 +140722,7 @@ async function runFirstTimeSetup() {
140467
140722
  ]);
140468
140723
  for (const r2 of results) {
140469
140724
  if (r2.status === "rejected") {
140470
- log45.warn(
140725
+ log46.warn(
140471
140726
  "Setup step failed: %s",
140472
140727
  r2.reason instanceof Error ? r2.reason.message : String(r2.reason)
140473
140728
  );
@@ -140481,7 +140736,7 @@ async function refreshAgentModelsInBackground() {
140481
140736
  const ok = results.filter((r2) => !r2.error).length;
140482
140737
  const failed = results.length - ok;
140483
140738
  if (results.length > 0) {
140484
- log45.info(
140739
+ log46.info(
140485
140740
  "Background model refresh: %d/%d agents updated (%d failed)",
140486
140741
  ok,
140487
140742
  results.length,
@@ -140489,7 +140744,7 @@ async function refreshAgentModelsInBackground() {
140489
140744
  );
140490
140745
  }
140491
140746
  } catch (err) {
140492
- log45.warn(
140747
+ log46.warn(
140493
140748
  "Background model refresh failed: %s",
140494
140749
  err instanceof Error ? err.message : String(err)
140495
140750
  );
@@ -140503,7 +140758,7 @@ async function ensureProjectStateInSync() {
140503
140758
  try {
140504
140759
  await syncService.syncWorktrees();
140505
140760
  } catch (err) {
140506
- log45.warn(
140761
+ log46.warn(
140507
140762
  "Failed to sync project state at boot: %s",
140508
140763
  err instanceof Error ? err.message : String(err)
140509
140764
  );
@@ -140514,22 +140769,22 @@ async function ensureCliInstalled() {
140514
140769
  try {
140515
140770
  cliStatus = await checkCli();
140516
140771
  } catch (err) {
140517
- log45.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
140772
+ log46.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
140518
140773
  return;
140519
140774
  }
140520
140775
  if (cliStatus === "Installed") {
140521
140776
  return;
140522
140777
  }
140523
140778
  if (cliStatus !== "NotInstalled") {
140524
- log45.warn("CLI not auto-installed (status: %s)", cliStatus);
140779
+ log46.warn("CLI not auto-installed (status: %s)", cliStatus);
140525
140780
  return;
140526
140781
  }
140527
- log45.info("Installing band CLI...");
140782
+ log46.info("Installing band CLI...");
140528
140783
  try {
140529
140784
  await installCli();
140530
- log45.info("CLI installed to %s", SYMLINK_PATH);
140785
+ log46.info("CLI installed to %s", SYMLINK_PATH);
140531
140786
  } catch (err) {
140532
- log45.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
140787
+ log46.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
140533
140788
  }
140534
140789
  }
140535
140790
  async function ensureDefaultCodingAgents() {
@@ -140538,17 +140793,17 @@ async function ensureDefaultCodingAgents() {
140538
140793
  if (Array.isArray(existing) && existing.length > 0) {
140539
140794
  return;
140540
140795
  }
140541
- log45.info("Detecting installed coding agents...");
140796
+ log46.info("Detecting installed coding agents...");
140542
140797
  const detected = [];
140543
140798
  for (const check2 of AGENT_CHECKS) {
140544
140799
  const path = await systemService.whichBinary(check2.binary);
140545
140800
  if (path) {
140546
- log45.info("Detected coding agent: %s (%s)", check2.id, path);
140801
+ log46.info("Detected coding agent: %s (%s)", check2.id, path);
140547
140802
  detected.push({ id: check2.id, type: check2.type, label: check2.label });
140548
140803
  }
140549
140804
  }
140550
140805
  if (detected.length === 0) {
140551
- log45.info("No coding agent CLIs detected on PATH");
140806
+ log46.info("No coding agent CLIs detected on PATH");
140552
140807
  return;
140553
140808
  }
140554
140809
  const current2 = loadSettings();
@@ -140557,7 +140812,7 @@ async function ensureDefaultCodingAgents() {
140557
140812
  current2.defaultCodingAgent = detected[0].id;
140558
140813
  }
140559
140814
  saveSettings(current2);
140560
- log45.info("Enabled %d coding agent(s); default = %s", detected.length, current2.defaultCodingAgent);
140815
+ log46.info("Enabled %d coding agent(s); default = %s", detected.length, current2.defaultCodingAgent);
140561
140816
  }
140562
140817
  function ensureNotificationDefaults() {
140563
140818
  const settings2 = loadSettings();
@@ -140569,7 +140824,7 @@ function ensureNotificationDefaults() {
140569
140824
  ...settings2,
140570
140825
  notifications: { ...notifications, soundOnNeedsAttention: true }
140571
140826
  });
140572
- log45.info("Set default notifications.soundOnNeedsAttention = true");
140827
+ log46.info("Set default notifications.soundOnNeedsAttention = true");
140573
140828
  }
140574
140829
  async function ensureClaudeHooks() {
140575
140830
  try {
@@ -140578,9 +140833,9 @@ async function ensureClaudeHooks() {
140578
140833
  return;
140579
140834
  }
140580
140835
  await installHooks();
140581
- log45.info("Installed Claude Code hooks");
140836
+ log46.info("Installed Claude Code hooks");
140582
140837
  } catch (err) {
140583
- log45.warn(
140838
+ log46.warn(
140584
140839
  "Failed to install Claude Code hooks: %s",
140585
140840
  err instanceof Error ? err.message : String(err)
140586
140841
  );
@@ -140588,11 +140843,11 @@ async function ensureClaudeHooks() {
140588
140843
  }
140589
140844
  async function ensureSkillsInstalled() {
140590
140845
  try {
140591
- const result = await installSkills({ log: log45 });
140846
+ const result = await installSkills({ log: log46 });
140592
140847
  const wrote = result.written.length + result.updated.length;
140593
140848
  const linkChange = result.linked.length;
140594
140849
  if (wrote > 0 || linkChange > 0 || result.conflicts.length > 0) {
140595
- log45.info(
140850
+ log46.info(
140596
140851
  "Synced CLI skills (shared: %d written, %d updated, %d unchanged; symlinks: %d created, %d already-linked, %d conflicts, %d skipped)",
140597
140852
  result.written.length,
140598
140853
  result.updated.length,
@@ -140604,7 +140859,7 @@ async function ensureSkillsInstalled() {
140604
140859
  );
140605
140860
  }
140606
140861
  } catch (err) {
140607
- log45.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
140862
+ log46.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
140608
140863
  }
140609
140864
  }
140610
140865
  var SetupService = class {
@@ -140618,7 +140873,7 @@ var setupService = new SetupService();
140618
140873
  function logCrash(message) {
140619
140874
  try {
140620
140875
  mkdirSync8(bandHome(), { recursive: true });
140621
- appendFileSync(join35(bandHome(), "server.log"), message, "utf-8");
140876
+ appendFileSync(join36(bandHome(), "server.log"), message, "utf-8");
140622
140877
  } catch {
140623
140878
  }
140624
140879
  }
@@ -140648,7 +140903,7 @@ ${error40.stack || error40.message}
140648
140903
  process.exit(1);
140649
140904
  });
140650
140905
  var SERVER_ROOT = import.meta.dirname;
140651
- var clientDir = join35(SERVER_ROOT, "client");
140906
+ var clientDir = join36(SERVER_ROOT, "client");
140652
140907
  function resolveInitialPort() {
140653
140908
  const fromEnv = Number.parseInt(process.env.PORT ?? "", 10);
140654
140909
  if (Number.isFinite(fromEnv) && fromEnv > 0) return fromEnv;
@@ -140675,7 +140930,7 @@ function getOpenApiSpec() {
140675
140930
  if (isDev) {
140676
140931
  const { generateOpenAPIDocument } = await import("@trpc/openapi");
140677
140932
  const doc2 = await generateOpenAPIDocument(
140678
- join35(SERVER_ROOT, "src", "server", "api", "router.ts"),
140933
+ join36(SERVER_ROOT, "src", "server", "api", "router.ts"),
140679
140934
  {
140680
140935
  title: "Band API",
140681
140936
  version: "1.0.0"
@@ -140684,7 +140939,7 @@ function getOpenApiSpec() {
140684
140939
  doc2.servers = [{ url: "/trpc" }];
140685
140940
  return JSON.stringify(doc2, null, 2);
140686
140941
  }
140687
- const openApiDoc = JSON.parse(readFileSync8(join35(SERVER_ROOT, "openapi.json"), "utf-8"));
140942
+ const openApiDoc = JSON.parse(readFileSync8(join36(SERVER_ROOT, "openapi.json"), "utf-8"));
140688
140943
  openApiDoc.servers = [{ url: "/trpc" }];
140689
140944
  return JSON.stringify(openApiDoc, null, 2);
140690
140945
  })().catch((err) => {
@@ -140707,7 +140962,7 @@ function serveStaticFile(res, root, subdir, rawFilename) {
140707
140962
  res.end("Bad request");
140708
140963
  return;
140709
140964
  }
140710
- const filePath = join35(root, subdir, filename);
140965
+ const filePath = join36(root, subdir, filename);
140711
140966
  try {
140712
140967
  const fileStat = statSync10(filePath);
140713
140968
  const contentType = mimeTypeFromFilename(filename);
@@ -140730,7 +140985,7 @@ function serveWorkspaceFile(res, workspaceId, rawPath) {
140730
140985
  return;
140731
140986
  }
140732
140987
  const root = workspace.worktree.path;
140733
- const target = resolve11(join35(root, rawPath));
140988
+ const target = resolve11(join36(root, rawPath));
140734
140989
  if (!target.startsWith(root + sep8) && target !== root) {
140735
140990
  res.writeHead(400);
140736
140991
  res.end("Bad request");
@@ -140883,6 +141138,36 @@ async function main() {
140883
141138
  serveStaticFile(res, bandHome(), "uploads", req.url.slice("/api/uploads/".length));
140884
141139
  return;
140885
141140
  }
141141
+ const projectAvatarMatch = req.url?.match(/^\/api\/project-avatar\/([^/?]+)(?:\?|$)/);
141142
+ if (projectAvatarMatch && req.method === "GET") {
141143
+ let projectName;
141144
+ try {
141145
+ projectName = decodeURIComponent(projectAvatarMatch[1]);
141146
+ } catch {
141147
+ res.writeHead(400);
141148
+ res.end("Bad request");
141149
+ return;
141150
+ }
141151
+ const avatar = await projectAvatarService.image(projectName);
141152
+ if (!avatar) {
141153
+ res.writeHead(404, { "Cache-Control": "no-store" });
141154
+ res.end("Not found");
141155
+ return;
141156
+ }
141157
+ res.writeHead(200, {
141158
+ "Content-Type": avatar.contentType,
141159
+ "Content-Length": avatar.bytes.length.toString(),
141160
+ "Cache-Control": "private, max-age=3600",
141161
+ "X-Content-Type-Options": "nosniff",
141162
+ // The bytes come from a remote host. If one is ever opened as a
141163
+ // document rather than through <img>, it gets no script and no
141164
+ // access to Band's origin.
141165
+ "Content-Security-Policy": "default-src 'none'; sandbox",
141166
+ "Content-Disposition": "inline"
141167
+ });
141168
+ res.end(avatar.bytes);
141169
+ return;
141170
+ }
140886
141171
  if (req.url?.startsWith("/api/shared/")) {
140887
141172
  const rest = req.url.slice("/api/shared/".length);
140888
141173
  const slashIdx = rest.indexOf("/");
@@ -140897,7 +141182,7 @@ async function main() {
140897
141182
  res.end("Bad request");
140898
141183
  return;
140899
141184
  }
140900
- serveStaticFile(res, bandHome(), join35("shared", partition), rest.slice(slashIdx + 1));
141185
+ serveStaticFile(res, bandHome(), join36("shared", partition), rest.slice(slashIdx + 1));
140901
141186
  return;
140902
141187
  }
140903
141188
  if (req.url?.startsWith("/api/workspace-file/")) {
@@ -141078,7 +141363,7 @@ async function main() {
141078
141363
  const mod = await viteServer.ssrLoadModule("@tanstack/react-start/server-entry");
141079
141364
  return mod.default.fetch(request);
141080
141365
  };
141081
- const apiDir = join35(SERVER_ROOT, "src", "server", "api");
141366
+ const apiDir = join36(SERVER_ROOT, "src", "server", "api");
141082
141367
  viteServer.watcher.on("change", (file2) => {
141083
141368
  if (file2.startsWith(apiDir)) {
141084
141369
  _openApiSpec = null;