@band-app/server 0.23.0 → 0.24.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 (164) hide show
  1. package/dist/client/assets/{DockviewBrowserContainer-c5TBCFK6.js → DockviewBrowserContainer-pecXom0M.js} +2 -2
  2. package/dist/client/assets/{DockviewTerminalContainer-De1DHQ5S.js → DockviewTerminalContainer-B_36q2Dz.js} +2 -2
  3. package/dist/client/assets/TerminalPanel-DbxLiy2t.js +5 -0
  4. package/dist/client/assets/{_basePickBy-DjS8T81h.js → _basePickBy-CtbD70T-.js} +1 -1
  5. package/dist/client/assets/{_baseUniq-BoA3Q22r.js → _baseUniq-Cb5igq_8.js} +1 -1
  6. package/dist/client/assets/{arc-DzFH-F6i.js → arc-BEzsE6TU.js} +1 -1
  7. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DpWdRDqh.js → architectureDiagram-VXUJARFQ-BnV97au3.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-VD42YOAC-In-FvNuA.js → blockDiagram-VD42YOAC-CVv0vV-s.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-YG6GDRKO-uWim35od.js → c4Diagram-YG6GDRKO-W3bslfZm.js} +1 -1
  10. package/dist/client/assets/channel-2Of2aNA_.js +1 -0
  11. package/dist/client/assets/{chunk-4BX2VUAB-uNqF21Qn.js → chunk-4BX2VUAB-B4zNuPCM.js} +1 -1
  12. package/dist/client/assets/{chunk-55IACEB6-BEB0DppO.js → chunk-55IACEB6-CJb5GOdO.js} +1 -1
  13. package/dist/client/assets/{chunk-B4BG7PRW-Csf_UWBG.js → chunk-B4BG7PRW-m9UNdA4H.js} +1 -1
  14. package/dist/client/assets/{chunk-DI55MBZ5-ehQAiitH.js → chunk-DI55MBZ5-Dyl4ba3F.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-Ddw3wom4.js → chunk-FMBD7UC4-Ds1gRx94.js} +1 -1
  16. package/dist/client/assets/{chunk-QN33PNHL-ICAdKyID.js → chunk-QN33PNHL-yK0yp12G.js} +1 -1
  17. package/dist/client/assets/{chunk-QZHKN3VN-CWKRx0Nc.js → chunk-QZHKN3VN-BiZtPmD0.js} +1 -1
  18. package/dist/client/assets/{chunk-TZMSLE5B-DEAJFNe9.js → chunk-TZMSLE5B-DCz64hjM.js} +1 -1
  19. package/dist/client/assets/classDiagram-2ON5EDUG-D6UcKhcB.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-WZHVMYZB-D6UcKhcB.js +1 -0
  21. package/dist/client/assets/clone-DBCpY5Fq.js +1 -0
  22. package/dist/client/assets/{cose-bilkent-S5V4N54A-CbS4okPK.js → cose-bilkent-S5V4N54A-BZFGVpWR.js} +1 -1
  23. package/dist/client/assets/{dagre-6UL2VRFP-BsLKz8AK.js → dagre-6UL2VRFP-DRDPL67k.js} +1 -1
  24. package/dist/client/assets/{diagram-PSM6KHXK-M6PnJuei.js → diagram-PSM6KHXK-DYAOsIc0.js} +1 -1
  25. package/dist/client/assets/{diagram-QEK2KX5R-B__5YbI4.js → diagram-QEK2KX5R-CnjVQgn2.js} +1 -1
  26. package/dist/client/assets/{diagram-S2PKOQOG-DKHL_M-B.js → diagram-S2PKOQOG-B8sAgSNe.js} +1 -1
  27. package/dist/client/assets/{erDiagram-Q2GNP2WA-BfFW0JbE.js → erDiagram-Q2GNP2WA-WnEcSFDk.js} +1 -1
  28. package/dist/client/assets/{flowDiagram-NV44I4VS-DjhRrkWq.js → flowDiagram-NV44I4VS-BONBJZ3h.js} +1 -1
  29. package/dist/client/assets/{ganttDiagram-JELNMOA3-COYeUCef.js → ganttDiagram-JELNMOA3-BDhpQL_t.js} +3 -3
  30. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-BxnB-BVL.js → gitGraphDiagram-V2S2FVAM-CZGjCgZ_.js} +1 -1
  31. package/dist/client/assets/{graph-B6AmaXta.js → graph-DmGEXolJ.js} +1 -1
  32. package/dist/client/assets/{highlighted-body-B3W2YXNL-wXSbO2Nz.js → highlighted-body-B3W2YXNL-m0iS7EC3.js} +1 -1
  33. package/dist/client/assets/{index-DQcyjj1n.js → index-0oNHljPn.js} +1 -1
  34. package/dist/client/assets/{index-dPGgxYg7.js → index-3O6bsWX3.js} +1 -1
  35. package/dist/client/assets/{index-DPAcHZUY.js → index-B-4gD4iz.js} +1 -1
  36. package/dist/client/assets/{index-B_tLkjtQ.js → index-B102sYPH.js} +1 -1
  37. package/dist/client/assets/{index-DKFuGU2w.js → index-BBy73G4g.js} +1 -1
  38. package/dist/client/assets/{index-e6iwsWag.js → index-BMTzG2fm.js} +1 -1
  39. package/dist/client/assets/index-BoLCZb5I.js +1 -0
  40. package/dist/client/assets/{index-BR4JJgox.js → index-BpxKDn01.js} +1 -1
  41. package/dist/client/assets/{index-DOipD6Mc.js → index-BvzISRCa.js} +1 -1
  42. package/dist/client/assets/{index-B-xrNHzx.js → index-C46YYuZo.js} +1 -1
  43. package/dist/client/assets/{index-Bu4tJzS5.js → index-CDJOOMr2.js} +1 -1
  44. package/dist/client/assets/{index-DjFJyRsb.js → index-CFnCbQSl.js} +1 -1
  45. package/dist/client/assets/{index-CFh_QYgy.js → index-CfW6UcUl.js} +1 -1
  46. package/dist/client/assets/{index-C9my7XIp.js → index-CiKuHiO0.js} +1 -1
  47. package/dist/client/assets/{index-CXAmq9J9.js → index-D6Afu1pA.js} +1 -1
  48. package/dist/client/assets/{index-YemckZzk.js → index-DBnjKdGf.js} +1 -1
  49. package/dist/client/assets/{index-oWFAyhhb.js → index-DgEnCq6K.js} +1 -1
  50. package/dist/client/assets/{index-C5FWnSNO.js → index-Dmse4WDP.js} +1 -1
  51. package/dist/client/assets/{infoDiagram-HS3SLOUP-8jgZTWHc.js → infoDiagram-HS3SLOUP-Bf3MrisJ.js} +1 -1
  52. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-C7UnOrYP.js → journeyDiagram-XKPGCS4Q-Dlf8x32q.js} +1 -1
  53. package/dist/client/assets/{kanban-definition-3W4ZIXB7-BfAJ2XMs.js → kanban-definition-3W4ZIXB7-BVJThDju.js} +1 -1
  54. package/dist/client/assets/{layout-BFiS4INQ.js → layout-CbZgayJn.js} +1 -1
  55. package/dist/client/assets/main-DOmWiUwE.css +1 -0
  56. package/dist/client/assets/{main-SDku1HcN.js → main-RztHx-sU.js} +236 -236
  57. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CHJqgPgK.js → mindmap-definition-VGOIOE7T-C4kJ6VHG.js} +1 -1
  58. package/dist/client/assets/{pieDiagram-ADFJNKIX-v1PBCyig.js → pieDiagram-ADFJNKIX-B4aWIFbt.js} +2 -2
  59. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-BmSciYlO.js → quadrantDiagram-AYHSOK5B-Bec9Hhh2.js} +1 -1
  60. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-Cpc8-ItX.js → requirementDiagram-UZGBJVZJ-CsOubtSM.js} +1 -1
  61. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BimDWo8J.js → sankeyDiagram-TZEHDZUN-C8Gm96t1.js} +1 -1
  62. package/dist/client/assets/{sequenceDiagram-WL72ISMW-CL72CIvP.js → sequenceDiagram-WL72ISMW-Bvgi8x7V.js} +1 -1
  63. package/dist/client/assets/{square-terminal-DAh77hNm.js → square-terminal-BHkrAD3A.js} +1 -1
  64. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DPD5YOcB.js → stateDiagram-FKZM4ZOC-TzlVvqDv.js} +1 -1
  65. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BibE5lUV.js +1 -0
  66. package/dist/client/assets/{timeline-definition-IT6M3QCI-UujIEPPc.js → timeline-definition-IT6M3QCI-BNBrcAuE.js} +1 -1
  67. package/dist/client/assets/{treemap-GDKQZRPO-CnxwYqSA.js → treemap-GDKQZRPO-Dt5TrQzS.js} +1 -1
  68. package/dist/client/assets/workspace._workspaceId-Cx9WUFHK.js +2 -0
  69. package/dist/client/assets/{workspace._workspaceId--WY7ydFH.js → workspace._workspaceId-DGQl6asL.js} +1 -1
  70. package/dist/client/assets/{xychartDiagram-PRI3JC2R-QNPzTKdU.js → xychartDiagram-PRI3JC2R-BbVpQ6GU.js} +1 -1
  71. package/dist/migrations/20260703151516_add_worktree_name/migration.sql +2 -0
  72. package/dist/migrations/20260703151516_add_worktree_name/snapshot.json +1167 -0
  73. package/dist/openapi.json +26 -16
  74. package/dist/server/assets/{DockviewBrowserContainer-B8W-NI5l.js → DockviewBrowserContainer-BDsafKFK.js} +1 -1
  75. package/dist/server/assets/{DockviewTerminalContainer-D6ZTAITZ.js → DockviewTerminalContainer-CMbrr8wZ.js} +3 -3
  76. package/dist/server/assets/{TerminalPanel-D1qOucYL.js → TerminalPanel-nFYTCFHx.js} +26 -24
  77. package/dist/server/assets/{_basePickBy-DCBLSYIo.js → _basePickBy-ljLFy5Cm.js} +2 -2
  78. package/dist/server/assets/{_baseUniq-D6dm-LAQ.js → _baseUniq-DQmNpetJ.js} +1 -1
  79. package/dist/server/assets/_tanstack-start-manifest_v-v9ri0NYD.js +4 -0
  80. package/dist/server/assets/{arc-BAoORaWl.js → arc-KHCw-8vd.js} +1 -1
  81. package/dist/server/assets/{architecture-7HQA4BMR-bh4pvUjy.js → architecture-7HQA4BMR-BScKJqpc.js} +6 -6
  82. package/dist/server/assets/{architectureDiagram-VXUJARFQ-B6S0AQBn.js → architectureDiagram-VXUJARFQ-T9CAFBo1.js} +6 -6
  83. package/dist/server/assets/{blockDiagram-VD42YOAC-DLnnO4-n.js → blockDiagram-VD42YOAC-BKZ2vg7U.js} +6 -6
  84. package/dist/server/assets/{c4Diagram-YG6GDRKO-CqN2DKBx.js → c4Diagram-YG6GDRKO-D585k1An.js} +2 -2
  85. package/dist/server/assets/{channel-f3Ahc3R0.js → channel-CyG4ozZq.js} +1 -1
  86. package/dist/server/assets/{chunk-4BX2VUAB-CuDavVBE.js → chunk-4BX2VUAB-BHWbP2Lt.js} +1 -1
  87. package/dist/server/assets/{chunk-55IACEB6-D_qe5s0S.js → chunk-55IACEB6-CrerCu6v.js} +1 -1
  88. package/dist/server/assets/{chunk-B4BG7PRW-C0ML39A6.js → chunk-B4BG7PRW-D3sl50Aa.js} +4 -4
  89. package/dist/server/assets/{chunk-DI55MBZ5-DGj3ha0C.js → chunk-DI55MBZ5-DR6gThvq.js} +3 -3
  90. package/dist/server/assets/{chunk-FMBD7UC4-D-f7FIcf.js → chunk-FMBD7UC4-Cil9b1Ts.js} +1 -1
  91. package/dist/server/assets/{chunk-QN33PNHL-DSo_m7vF.js → chunk-QN33PNHL-BAKy9Ygg.js} +1 -1
  92. package/dist/server/assets/{chunk-QZHKN3VN-gT8icS8l.js → chunk-QZHKN3VN-G4fU4Ucn.js} +1 -1
  93. package/dist/server/assets/{chunk-TZMSLE5B-CoUTe4U3.js → chunk-TZMSLE5B-LzSrmWV5.js} +1 -1
  94. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-CbQuH3ni.js → classDiagram-2ON5EDUG-Ds7CCTUR.js} +5 -5
  95. package/dist/server/assets/{classDiagram-2ON5EDUG-CbQuH3ni.js → classDiagram-v2-WZHVMYZB-Ds7CCTUR.js} +5 -5
  96. package/dist/server/assets/{clone-DhkQMQiL.js → clone-B4KVJdwD.js} +1 -1
  97. package/dist/server/assets/{cose-bilkent-S5V4N54A-Q7Nl8Zqm.js → cose-bilkent-S5V4N54A-DaKuQRAN.js} +1 -1
  98. package/dist/server/assets/{dagre-6UL2VRFP-RuiqkM_u.js → dagre-6UL2VRFP-CNIyd6rH.js} +6 -6
  99. package/dist/server/assets/{diagram-PSM6KHXK-mvCbaKci.js → diagram-PSM6KHXK-ByElNwdP.js} +7 -7
  100. package/dist/server/assets/{diagram-QEK2KX5R-B30M6IEM.js → diagram-QEK2KX5R-Bpupf8hI.js} +6 -6
  101. package/dist/server/assets/{diagram-S2PKOQOG-BapZgpGh.js → diagram-S2PKOQOG-CSa3a_oJ.js} +6 -6
  102. package/dist/server/assets/{erDiagram-Q2GNP2WA-LKD5sOpF.js → erDiagram-Q2GNP2WA-B3yUU2uu.js} +4 -4
  103. package/dist/server/assets/{flowDiagram-NV44I4VS-Cg70kWHZ.js → flowDiagram-NV44I4VS-CUlvxSwr.js} +5 -5
  104. package/dist/server/assets/{ganttDiagram-JELNMOA3-CpgS7Gbo.js → ganttDiagram-JELNMOA3-BWxUm4vA.js} +1 -1
  105. package/dist/server/assets/{gitGraph-G5XIXVHT-BX-0wA2S.js → gitGraph-G5XIXVHT-DexlvPgJ.js} +6 -6
  106. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-BNe2zRpL.js → gitGraphDiagram-V2S2FVAM-CepF7ieg.js} +7 -7
  107. package/dist/server/assets/{graph-BohWfDeQ.js → graph-BB3rQyk7.js} +2 -2
  108. package/dist/server/assets/{highlighted-body-B3W2YXNL-DpfzVM5P.js → highlighted-body-B3W2YXNL-CktYi1nO.js} +1 -1
  109. package/dist/server/assets/{index-CUej4Ihg.js → index-5St5BCcJ.js} +2 -2
  110. package/dist/server/assets/{index-B6FFge5B.js → index-8fW2N3v4.js} +2 -2
  111. package/dist/server/assets/{index-DsRToCeg.js → index-B9xqso9p.js} +5 -5
  112. package/dist/server/assets/{index-Cvf2IVNx.js → index-BDqHa1DL.js} +5 -5
  113. package/dist/server/assets/{index-Cznd5qP8.js → index-BZSAPXc2.js} +5 -5
  114. package/dist/server/assets/{index-DoAhyHsE.js → index-BiMwh0FT.js} +3 -3
  115. package/dist/server/assets/{index-BMCwJ6BW.js → index-CGm8Czks.js} +2 -2
  116. package/dist/server/assets/{index-CTCq_dqo.js → index-CUnnFiRO.js} +4 -4
  117. package/dist/server/assets/{index-W2MLsk-k.js → index-DEZw9nkv.js} +2 -2
  118. package/dist/server/assets/{index-Cyz3st2N.js → index-DR892S39.js} +2 -2
  119. package/dist/server/assets/{index-C4lG0OWB.js → index-DYiuwMzT.js} +2 -2
  120. package/dist/server/assets/{index-DF9DvOkv.js → index-DipxLM5f.js} +2 -2
  121. package/dist/server/assets/{index-CWhqy8Ta.js → index-DsPBpNpr.js} +2 -2
  122. package/dist/server/assets/{index-y6X09Ksj.js → index-O03NM4sL.js} +2 -2
  123. package/dist/server/assets/{index-z7NiBua9.js → index-bbP5Ilkt.js} +3 -3
  124. package/dist/server/assets/{index-CE_oTIBT.js → index-dAOow3Ru.js} +2 -2
  125. package/dist/server/assets/{index-CnNg602B.js → index-igT3OuCm.js} +2 -2
  126. package/dist/server/assets/{index-Cvmi6T35.js → index-zM-wWcHV.js} +1 -1
  127. package/dist/server/assets/{info-VBDWY6EO-BQ8N2eDS.js → info-VBDWY6EO-BDX5_HTZ.js} +6 -6
  128. package/dist/server/assets/{infoDiagram-HS3SLOUP-I1ZLYjFY.js → infoDiagram-HS3SLOUP-BMd22txJ.js} +5 -5
  129. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-lFTyhPiV.js → journeyDiagram-XKPGCS4Q-DyIx8DQc.js} +4 -4
  130. package/dist/server/assets/{kanban-definition-3W4ZIXB7-BEr5w27W.js → kanban-definition-3W4ZIXB7-D6P6mjw2.js} +2 -2
  131. package/dist/server/assets/{layout-2KXyirN2.js → layout-_MqV9Ys8.js} +4 -4
  132. package/dist/server/assets/{mermaid-3ZIDBTTL-BfFd_m4-.js → mermaid-3ZIDBTTL-CIBz4-1r.js} +1 -1
  133. package/dist/server/assets/{mermaid-parser.core-SoqLW9t8.js → mermaid-parser.core-Cga0uwWI.js} +11 -11
  134. package/dist/server/assets/{mindmap-definition-VGOIOE7T-D9ZbRdf_.js → mindmap-definition-VGOIOE7T-C2EIvkPG.js} +3 -3
  135. package/dist/server/assets/{packet-DYOGHKS2-B2EvMQj5.js → packet-DYOGHKS2-CCOI47dY.js} +6 -6
  136. package/dist/server/assets/{pie-VRWISCQL-YRbpkB5e.js → pie-VRWISCQL-BLqEHL1E.js} +6 -6
  137. package/dist/server/assets/{pieDiagram-ADFJNKIX-Bat_eWvt.js → pieDiagram-ADFJNKIX-Cv-DbjH6.js} +7 -7
  138. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-CtqGnRnF.js → quadrantDiagram-AYHSOK5B-DFyjNST4.js} +1 -1
  139. package/dist/server/assets/{radar-ZZBFDIW7-DvOi2qX_.js → radar-ZZBFDIW7-CWlYIMXf.js} +6 -6
  140. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-CtysqbZ4.js → requirementDiagram-UZGBJVZJ-DFM89i-H.js} +3 -3
  141. package/dist/server/assets/{router-ChvYGLZB.js → router-cAoMUC9Q.js} +1148 -745
  142. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-BTLsDOUO.js → sankeyDiagram-TZEHDZUN-Nmb2f9ga.js} +1 -1
  143. package/dist/server/assets/{sequenceDiagram-WL72ISMW-CK0kbINT.js → sequenceDiagram-WL72ISMW-BiqqAguj.js} +3 -3
  144. package/dist/server/assets/{square-terminal-BLO1pEjb.js → square-terminal-DerzWAi-.js} +1 -1
  145. package/dist/server/assets/{stateDiagram-FKZM4ZOC-D5FS7RFa.js → stateDiagram-FKZM4ZOC-CkiJXki8.js} +8 -8
  146. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-DoCLlTuy.js → stateDiagram-v2-4FDKWEC3-Bt1BL33e.js} +4 -4
  147. package/dist/server/assets/{timeline-definition-IT6M3QCI-jFqO_Cet.js → timeline-definition-IT6M3QCI-DCRlJiLq.js} +2 -2
  148. package/dist/server/assets/{treemap-GDKQZRPO-CuHJYOCT.js → treemap-GDKQZRPO-Ci-r6jiA.js} +6 -6
  149. package/dist/server/assets/{workspace._workspaceId-CGq293LY.js → workspace._workspaceId-BMnOV3pd.js} +101 -11
  150. package/dist/server/assets/{workspace._workspaceId-B0M_Sxj3.js → workspace._workspaceId-Dj6Y8WPo.js} +1 -1
  151. package/dist/server/assets/{xychartDiagram-PRI3JC2R-DPvU_7PC.js → xychartDiagram-PRI3JC2R-r_3LO6yK.js} +1 -1
  152. package/dist/server/server.js +2 -2
  153. package/dist/start-server.mjs +508 -374
  154. package/package.json +4 -4
  155. package/dist/client/assets/TerminalPanel-DR6CDpEJ.js +0 -5
  156. package/dist/client/assets/channel-BwZLW4yW.js +0 -1
  157. package/dist/client/assets/classDiagram-2ON5EDUG-CVjdMCqG.js +0 -1
  158. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CVjdMCqG.js +0 -1
  159. package/dist/client/assets/clone-Dj_6A90e.js +0 -1
  160. package/dist/client/assets/index-baLsgCNJ.js +0 -1
  161. package/dist/client/assets/main-tmFPjHOC.css +0 -1
  162. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAf0jK91.js +0 -1
  163. package/dist/client/assets/workspace._workspaceId-jpBhz8sr.js +0 -2
  164. package/dist/server/assets/_tanstack-start-manifest_v-BffwvUC-.js +0 -4
@@ -1226,7 +1226,7 @@ const createLucideIcon = (iconName, iconNode) => {
1226
1226
  Component.displayName = toPascalCase(iconName);
1227
1227
  return Component;
1228
1228
  };
1229
- const __iconNode$1r = [
1229
+ const __iconNode$1s = [
1230
1230
  [
1231
1231
  "path",
1232
1232
  {
@@ -1235,45 +1235,45 @@ const __iconNode$1r = [
1235
1235
  }
1236
1236
  ]
1237
1237
  ];
1238
- const Activity = createLucideIcon("activity", __iconNode$1r);
1239
- const __iconNode$1q = [
1238
+ const Activity = createLucideIcon("activity", __iconNode$1s);
1239
+ const __iconNode$1r = [
1240
1240
  ["path", { d: "M12 17V3", key: "1cwfxf" }],
1241
1241
  ["path", { d: "m6 11 6 6 6-6", key: "12ii2o" }],
1242
1242
  ["path", { d: "M19 21H5", key: "150jfl" }]
1243
1243
  ];
1244
- const ArrowDownToLine = createLucideIcon("arrow-down-to-line", __iconNode$1q);
1245
- const __iconNode$1p = [
1244
+ const ArrowDownToLine = createLucideIcon("arrow-down-to-line", __iconNode$1r);
1245
+ const __iconNode$1q = [
1246
1246
  ["path", { d: "M12 5v14", key: "s699le" }],
1247
1247
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
1248
1248
  ];
1249
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$1p);
1250
- const __iconNode$1o = [
1249
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$1q);
1250
+ const __iconNode$1p = [
1251
1251
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
1252
1252
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
1253
1253
  ];
1254
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1o);
1255
- const __iconNode$1n = [
1254
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1p);
1255
+ const __iconNode$1o = [
1256
1256
  ["path", { d: "M5 12h14", key: "1ays0h" }],
1257
1257
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
1258
1258
  ];
1259
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$1n);
1260
- const __iconNode$1m = [
1259
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$1o);
1260
+ const __iconNode$1n = [
1261
1261
  ["path", { d: "m18 9-6-6-6 6", key: "kcunyi" }],
1262
1262
  ["path", { d: "M12 3v14", key: "7cf3v8" }],
1263
1263
  ["path", { d: "M5 21h14", key: "11awu3" }]
1264
1264
  ];
1265
- const ArrowUpFromLine = createLucideIcon("arrow-up-from-line", __iconNode$1m);
1266
- const __iconNode$1l = [
1265
+ const ArrowUpFromLine = createLucideIcon("arrow-up-from-line", __iconNode$1n);
1266
+ const __iconNode$1m = [
1267
1267
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
1268
1268
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
1269
1269
  ];
1270
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$1l);
1271
- const __iconNode$1k = [
1270
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$1m);
1271
+ const __iconNode$1l = [
1272
1272
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1273
1273
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }]
1274
1274
  ];
1275
- const Ban = createLucideIcon("ban", __iconNode$1k);
1276
- const __iconNode$1j = [
1275
+ const Ban = createLucideIcon("ban", __iconNode$1l);
1276
+ const __iconNode$1k = [
1277
1277
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
1278
1278
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
1279
1279
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -1281,77 +1281,77 @@ const __iconNode$1j = [
1281
1281
  ["path", { d: "M15 13v2", key: "1xurst" }],
1282
1282
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
1283
1283
  ];
1284
- const Bot = createLucideIcon("bot", __iconNode$1j);
1285
- const __iconNode$1i = [
1284
+ const Bot = createLucideIcon("bot", __iconNode$1k);
1285
+ const __iconNode$1j = [
1286
1286
  ["path", { d: "m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16", key: "d5nyq2" }],
1287
1287
  ["path", { d: "M22 9v7", key: "pvm9v3" }],
1288
1288
  ["path", { d: "M3.304 13h6.392", key: "1q3zxz" }],
1289
1289
  ["circle", { cx: "18.5", cy: "12.5", r: "3.5", key: "z97x68" }]
1290
1290
  ];
1291
- const CaseSensitive = createLucideIcon("case-sensitive", __iconNode$1i);
1292
- const __iconNode$1h = [
1291
+ const CaseSensitive = createLucideIcon("case-sensitive", __iconNode$1j);
1292
+ const __iconNode$1i = [
1293
1293
  ["path", { d: "M3 3v16a2 2 0 0 0 2 2h16", key: "c24i48" }],
1294
1294
  ["path", { d: "M18 17V9", key: "2bz60n" }],
1295
1295
  ["path", { d: "M13 17V5", key: "1frdt8" }],
1296
1296
  ["path", { d: "M8 17v-3", key: "17ska0" }]
1297
1297
  ];
1298
- const ChartColumn = createLucideIcon("chart-column", __iconNode$1h);
1299
- const __iconNode$1g = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
1300
- const Check = createLucideIcon("check", __iconNode$1g);
1301
- const __iconNode$1f = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
1302
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$1f);
1303
- const __iconNode$1e = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
1304
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1e);
1305
- const __iconNode$1d = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
1306
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$1d);
1307
- const __iconNode$1c = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
1308
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$1c);
1309
- const __iconNode$1b = [
1298
+ const ChartColumn = createLucideIcon("chart-column", __iconNode$1i);
1299
+ const __iconNode$1h = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
1300
+ const Check = createLucideIcon("check", __iconNode$1h);
1301
+ const __iconNode$1g = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
1302
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1g);
1303
+ const __iconNode$1f = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
1304
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1f);
1305
+ const __iconNode$1e = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
1306
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1e);
1307
+ const __iconNode$1d = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
1308
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1d);
1309
+ const __iconNode$1c = [
1310
1310
  ["path", { d: "m7 20 5-5 5 5", key: "13a0gw" }],
1311
1311
  ["path", { d: "m7 4 5 5 5-5", key: "1kwcof" }]
1312
1312
  ];
1313
- const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$1b);
1314
- const __iconNode$1a = [
1313
+ const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$1c);
1314
+ const __iconNode$1b = [
1315
1315
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
1316
1316
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
1317
1317
  ];
1318
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1a);
1319
- const __iconNode$19 = [
1318
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1b);
1319
+ const __iconNode$1a = [
1320
1320
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1321
1321
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
1322
1322
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
1323
1323
  ];
1324
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$19);
1325
- const __iconNode$18 = [
1324
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1a);
1325
+ const __iconNode$19 = [
1326
1326
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1327
1327
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
1328
1328
  ];
1329
- const CircleCheck = createLucideIcon("circle-check", __iconNode$18);
1330
- const __iconNode$17 = [
1329
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$19);
1330
+ const __iconNode$18 = [
1331
1331
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1332
1332
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
1333
1333
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
1334
1334
  ];
1335
- const CircleX = createLucideIcon("circle-x", __iconNode$17);
1336
- const __iconNode$16 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
1337
- const Circle = createLucideIcon("circle", __iconNode$16);
1338
- const __iconNode$15 = [
1335
+ const CircleX = createLucideIcon("circle-x", __iconNode$18);
1336
+ const __iconNode$17 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
1337
+ const Circle = createLucideIcon("circle", __iconNode$17);
1338
+ const __iconNode$16 = [
1339
1339
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
1340
1340
  ["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2", key: "4jdomd" }],
1341
1341
  ["path", { d: "M16 4h2a2 2 0 0 1 2 2v4", key: "3hqy98" }],
1342
1342
  ["path", { d: "M21 14H11", key: "1bme5i" }],
1343
1343
  ["path", { d: "m15 10-4 4 4 4", key: "5dvupr" }]
1344
1344
  ];
1345
- const ClipboardCopy = createLucideIcon("clipboard-copy", __iconNode$15);
1346
- const __iconNode$14 = [
1345
+ const ClipboardCopy = createLucideIcon("clipboard-copy", __iconNode$16);
1346
+ const __iconNode$15 = [
1347
1347
  ["path", { d: "M11 14h10", key: "1w8e9d" }],
1348
1348
  ["path", { d: "M16 4h2a2 2 0 0 1 2 2v1.344", key: "1e62lh" }],
1349
1349
  ["path", { d: "m17 18 4-4-4-4", key: "z2g111" }],
1350
1350
  ["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113", key: "bjbb7m" }],
1351
1351
  ["rect", { x: "8", y: "2", width: "8", height: "4", rx: "1", key: "ublpy" }]
1352
1352
  ];
1353
- const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$14);
1354
- const __iconNode$13 = [
1353
+ const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$15);
1354
+ const __iconNode$14 = [
1355
1355
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
1356
1356
  [
1357
1357
  "path",
@@ -1361,52 +1361,58 @@ const __iconNode$13 = [
1361
1361
  }
1362
1362
  ]
1363
1363
  ];
1364
- const Clipboard = createLucideIcon("clipboard", __iconNode$13);
1365
- const __iconNode$12 = [
1364
+ const Clipboard = createLucideIcon("clipboard", __iconNode$14);
1365
+ const __iconNode$13 = [
1366
1366
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1367
1367
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
1368
1368
  ];
1369
- const Clock = createLucideIcon("clock", __iconNode$12);
1370
- const __iconNode$11 = [
1369
+ const Clock = createLucideIcon("clock", __iconNode$13);
1370
+ const __iconNode$12 = [
1371
1371
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
1372
1372
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
1373
1373
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
1374
1374
  ];
1375
- const CodeXml = createLucideIcon("code-xml", __iconNode$11);
1376
- const __iconNode$10 = [
1375
+ const CodeXml = createLucideIcon("code-xml", __iconNode$12);
1376
+ const __iconNode$11 = [
1377
1377
  ["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
1378
1378
  ["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
1379
1379
  ];
1380
- const Code = createLucideIcon("code", __iconNode$10);
1381
- const __iconNode$$ = [
1380
+ const Code = createLucideIcon("code", __iconNode$11);
1381
+ const __iconNode$10 = [
1382
1382
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
1383
1383
  ["path", { d: "M12 3v18", key: "108xh3" }]
1384
1384
  ];
1385
- const Columns2 = createLucideIcon("columns-2", __iconNode$$);
1386
- const __iconNode$_ = [
1385
+ const Columns2 = createLucideIcon("columns-2", __iconNode$10);
1386
+ const __iconNode$$ = [
1387
1387
  [
1388
1388
  "path",
1389
1389
  { d: "M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3", key: "11bfej" }
1390
1390
  ]
1391
1391
  ];
1392
- const Command$1 = createLucideIcon("command", __iconNode$_);
1393
- const __iconNode$Z = [
1392
+ const Command$1 = createLucideIcon("command", __iconNode$$);
1393
+ const __iconNode$_ = [
1394
1394
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
1395
1395
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
1396
1396
  ];
1397
- const Copy = createLucideIcon("copy", __iconNode$Z);
1398
- const __iconNode$Y = [
1397
+ const Copy = createLucideIcon("copy", __iconNode$_);
1398
+ const __iconNode$Z = [
1399
1399
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
1400
1400
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
1401
1401
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
1402
1402
  ];
1403
- const Download = createLucideIcon("download", __iconNode$Y);
1404
- const __iconNode$X = [
1403
+ const Download = createLucideIcon("download", __iconNode$Z);
1404
+ const __iconNode$Y = [
1405
1405
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
1406
1406
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
1407
1407
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
1408
1408
  ];
1409
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$X);
1409
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$Y);
1410
+ const __iconNode$X = [
1411
+ ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
1412
+ ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
1413
+ ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
1414
+ ];
1415
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$X);
1410
1416
  const __iconNode$W = [
1411
1417
  ["path", { d: "m15 15 6 6", key: "1s409w" }],
1412
1418
  ["path", { d: "m15 9 6-6", key: "ko1vev" }],
@@ -14762,23 +14768,80 @@ function DialogOverlay({
14762
14768
  }
14763
14769
  );
14764
14770
  }
14771
+ const DIALOG_CONTENT_VARIANTS = {
14772
+ default: "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",
14773
+ "bottom-sheet": [
14774
+ // Shared
14775
+ "fixed z-50 flex flex-col bg-background shadow-lg duration-200 outline-none",
14776
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
14777
+ // Mobile (< lg): bottom drawer
14778
+ "inset-x-0 bottom-0 w-full max-w-none rounded-t-2xl border border-b-0 p-6",
14779
+ "max-h-[calc(100dvh-env(safe-area-inset-top)-1.5rem)]",
14780
+ "max-lg:data-[state=open]:slide-in-from-bottom max-lg:data-[state=closed]:slide-out-to-bottom",
14781
+ // Desktop (lg+): revert to the centred modal
14782
+ "lg:inset-auto lg:top-[50%] lg:left-[50%] lg:bottom-auto lg:w-full lg:max-w-lg lg:max-h-[85vh] lg:translate-x-[-50%] lg:translate-y-[-50%] lg:rounded-lg lg:border-b",
14783
+ "lg:data-[state=open]:zoom-in-95 lg:data-[state=closed]:zoom-out-95"
14784
+ ].join(" "),
14785
+ "command-palette": [
14786
+ // Shared
14787
+ "fixed z-50 flex flex-col bg-background shadow-lg duration-200 outline-none",
14788
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
14789
+ // Mobile (< lg): bottom drawer with the input pinned to the bottom. Flip
14790
+ // the command's flex direction so the input sits below the results list,
14791
+ // and flip the input wrapper's divider to a top border to match. The sheet
14792
+ // floats at `bottom: var(--kb-inset)` (keyboard height; 0 when closed) so
14793
+ // the input clears the on-screen keyboard — see `useKeyboardInset`.
14794
+ "inset-x-0 bottom-[var(--kb-inset,0px)] w-full max-w-none rounded-t-2xl border border-b-0",
14795
+ "max-h-[calc(100dvh-var(--kb-inset,0px)-env(safe-area-inset-top)-1.5rem)]",
14796
+ "max-lg:[&_[data-slot=command]]:flex-col-reverse",
14797
+ "max-lg:[&_[cmdk-input-wrapper]]:border-t max-lg:[&_[cmdk-input-wrapper]]:border-b-0",
14798
+ "max-lg:data-[state=open]:slide-in-from-bottom max-lg:data-[state=closed]:slide-out-to-bottom",
14799
+ // Desktop (lg+): anchored in the upper third by its TOP edge — no
14800
+ // `translate-y`, so the input never moves as the list grows downward.
14801
+ "lg:inset-x-auto lg:bottom-auto lg:top-[12vh] lg:left-1/2 lg:w-full lg:max-w-lg lg:max-h-[70vh] lg:-translate-x-1/2 lg:rounded-lg lg:border",
14802
+ "lg:data-[state=open]:zoom-in-95 lg:data-[state=closed]:zoom-out-95"
14803
+ ].join(" ")
14804
+ };
14805
+ const keyboardInsetHolders = /* @__PURE__ */ new Set();
14806
+ function useKeyboardInset(active) {
14807
+ reactExports.useEffect(() => {
14808
+ const vv = window.visualViewport;
14809
+ if (!active || !vv) return;
14810
+ const root2 = document.documentElement;
14811
+ const token2 = {};
14812
+ const update = () => {
14813
+ const inset = Math.max(0, window.innerHeight - vv.height - vv.offsetTop);
14814
+ root2.style.setProperty("--kb-inset", `${inset}px`);
14815
+ };
14816
+ keyboardInsetHolders.add(token2);
14817
+ update();
14818
+ vv.addEventListener("resize", update);
14819
+ vv.addEventListener("scroll", update);
14820
+ return () => {
14821
+ vv.removeEventListener("resize", update);
14822
+ vv.removeEventListener("scroll", update);
14823
+ keyboardInsetHolders.delete(token2);
14824
+ if (keyboardInsetHolders.size === 0) root2.style.removeProperty("--kb-inset");
14825
+ };
14826
+ }, [active]);
14827
+ }
14765
14828
  function DialogContent({
14766
14829
  className,
14767
14830
  overlayClassName,
14768
14831
  children: children2,
14769
14832
  showCloseButton = true,
14833
+ variant = "default",
14770
14834
  ...props
14771
14835
  }) {
14836
+ useKeyboardInset(variant === "command-palette");
14772
14837
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [
14773
14838
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogOverlay, { className: overlayClassName }),
14774
14839
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
14775
14840
  Content$1,
14776
14841
  {
14777
14842
  "data-slot": "dialog-content",
14778
- className: cn$2(
14779
- "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",
14780
- className
14781
- ),
14843
+ "data-variant": variant,
14844
+ className: cn$2(DIALOG_CONTENT_VARIANTS[variant], className),
14782
14845
  ...props,
14783
14846
  children: [
14784
14847
  children2,
@@ -20261,16 +20324,16 @@ function createDashboardStore(adapter2) {
20261
20324
  set2({ error: String(e3) });
20262
20325
  }
20263
20326
  },
20264
- gitPull: async (project, branch) => {
20327
+ gitPull: async (project, name2) => {
20265
20328
  try {
20266
- await adapter2.gitPull(project, branch);
20329
+ await adapter2.gitPull(project, name2);
20267
20330
  } catch (e3) {
20268
20331
  set2({ error: String(e3) });
20269
20332
  }
20270
20333
  },
20271
- gitPush: async (project, branch) => {
20334
+ gitPush: async (project, name2) => {
20272
20335
  try {
20273
- await adapter2.gitPush(project, branch);
20336
+ await adapter2.gitPush(project, name2);
20274
20337
  } catch (e3) {
20275
20338
  set2({ error: String(e3) });
20276
20339
  }
@@ -20487,15 +20550,18 @@ function useRemoveWorkspace() {
20487
20550
  const openWorkspace = useDashboardStore((s2) => s2.openWorkspace);
20488
20551
  const store = useRawDashboardStore();
20489
20552
  return useMutation({
20490
- mutationFn: ({ project, branch }) => adapter2.removeWorkspace(project, branch),
20491
- onSuccess: (_data, { project, branch }) => {
20553
+ mutationFn: ({ project, name: name2 }) => adapter2.removeWorkspace(project, name2),
20554
+ onSuccess: (_data, { project, name: name2 }) => {
20492
20555
  queryClient2.invalidateQueries({ queryKey: queryKeys.projects });
20493
- const deletedWorkspaceId = toWorkspaceId(project, branch);
20556
+ const deletedWorkspaceId = toWorkspaceId(project, name2);
20494
20557
  if (store.getState().activeWorkspaceId === deletedWorkspaceId) {
20495
20558
  const projects = queryClient2.getQueryData(queryKeys.projects);
20496
20559
  const projectInfo = projects?.find((p2) => p2.name === project);
20497
20560
  if (projectInfo) {
20498
- openWorkspace(toWorkspaceId(project, projectInfo.defaultBranch));
20561
+ const mainWt = projectInfo.worktrees.find(
20562
+ (wt2) => wt2.name === projectInfo.defaultBranch || wt2.branch === projectInfo.defaultBranch
20563
+ );
20564
+ openWorkspace(toWorkspaceId(project, mainWt?.name ?? projectInfo.defaultBranch));
20499
20565
  }
20500
20566
  }
20501
20567
  },
@@ -20568,7 +20634,7 @@ function AddProjectDialog({ open: open2, onOpenChange, defaultLabel }) {
20568
20634
  }
20569
20635
  };
20570
20636
  const isBusy = addProjectMutation.isPending;
20571
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogContent, { className: "sm:max-w-[425px]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, children: [
20637
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogContent, { variant: "bottom-sheet", className: "lg:max-w-[425px]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, children: [
20572
20638
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
20573
20639
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Register Project" }),
20574
20640
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Add a folder to manage its workspaces. Git repositories enable branches and PRs; plain folders work too, with a single implicit workspace." })
@@ -42697,53 +42763,53 @@ async function loadLanguage(lang) {
42697
42763
  try {
42698
42764
  switch (lang) {
42699
42765
  case "javascript":
42700
- return import("./index-B6FFge5B.js").then((m2) => m2.javascript());
42766
+ return import("./index-8fW2N3v4.js").then((m2) => m2.javascript());
42701
42767
  case "jsx":
42702
- return import("./index-B6FFge5B.js").then((m2) => m2.javascript({ jsx: true }));
42768
+ return import("./index-8fW2N3v4.js").then((m2) => m2.javascript({ jsx: true }));
42703
42769
  case "typescript":
42704
- return import("./index-B6FFge5B.js").then(
42770
+ return import("./index-8fW2N3v4.js").then(
42705
42771
  (m2) => m2.javascript({ typescript: true })
42706
42772
  );
42707
42773
  case "tsx":
42708
- return import("./index-B6FFge5B.js").then(
42774
+ return import("./index-8fW2N3v4.js").then(
42709
42775
  (m2) => m2.javascript({ jsx: true, typescript: true })
42710
42776
  );
42711
42777
  case "python":
42712
- return import("./index-CWhqy8Ta.js").then((m2) => m2.python());
42778
+ return import("./index-DsPBpNpr.js").then((m2) => m2.python());
42713
42779
  case "html":
42714
- return import("./index-CTCq_dqo.js").then((m2) => m2.html());
42780
+ return import("./index-CUnnFiRO.js").then((m2) => m2.html());
42715
42781
  case "css":
42716
- return import("./index-y6X09Ksj.js").then((m2) => m2.css());
42782
+ return import("./index-O03NM4sL.js").then((m2) => m2.css());
42717
42783
  case "scss":
42718
42784
  case "sass":
42719
- return import("./index-z7NiBua9.js").then((m2) => m2.sass());
42785
+ return import("./index-bbP5Ilkt.js").then((m2) => m2.sass());
42720
42786
  case "less":
42721
- return import("./index-DoAhyHsE.js").then((m2) => m2.less());
42787
+ return import("./index-BiMwh0FT.js").then((m2) => m2.less());
42722
42788
  case "json":
42723
42789
  case "jsonc":
42724
- return import("./index-DF9DvOkv.js").then((m2) => m2.json());
42790
+ return import("./index-DipxLM5f.js").then((m2) => m2.json());
42725
42791
  case "markdown":
42726
42792
  case "mdx":
42727
- return import("./index-Cvf2IVNx.js").then((m2) => m2.markdown());
42793
+ return import("./index-BDqHa1DL.js").then((m2) => m2.markdown());
42728
42794
  case "xml":
42729
- return import("./index-W2MLsk-k.js").then((m2) => m2.xml());
42795
+ return import("./index-DEZw9nkv.js").then((m2) => m2.xml());
42730
42796
  case "yaml":
42731
- return import("./index-CE_oTIBT.js").then((m2) => m2.yaml());
42797
+ return import("./index-dAOow3Ru.js").then((m2) => m2.yaml());
42732
42798
  case "sql":
42733
- return import("./index-CnNg602B.js").then((m2) => m2.sql());
42799
+ return import("./index-igT3OuCm.js").then((m2) => m2.sql());
42734
42800
  case "rust":
42735
- return import("./index-BMCwJ6BW.js").then((m2) => m2.rust());
42801
+ return import("./index-CGm8Czks.js").then((m2) => m2.rust());
42736
42802
  case "go":
42737
- return import("./index-C4lG0OWB.js").then((m2) => m2.go());
42803
+ return import("./index-DYiuwMzT.js").then((m2) => m2.go());
42738
42804
  case "java":
42739
- return import("./index-CUej4Ihg.js").then((m2) => m2.java());
42805
+ return import("./index-5St5BCcJ.js").then((m2) => m2.java());
42740
42806
  case "kotlin":
42741
- return import("./index-CUej4Ihg.js").then((m2) => m2.java());
42807
+ return import("./index-5St5BCcJ.js").then((m2) => m2.java());
42742
42808
  case "c":
42743
42809
  case "cpp":
42744
- return import("./index-Cyz3st2N.js").then((m2) => m2.cpp());
42810
+ return import("./index-DR892S39.js").then((m2) => m2.cpp());
42745
42811
  case "php":
42746
- return import("./index-Cznd5qP8.js").then((m2) => m2.php());
42812
+ return import("./index-BZSAPXc2.js").then((m2) => m2.php());
42747
42813
  // Legacy modes via StreamLanguage
42748
42814
  case "bash":
42749
42815
  case "fish":
@@ -43808,22 +43874,30 @@ function CommandPaletteDialog({ open: open2, onOpenChange, commands }) {
43808
43874
  },
43809
43875
  [onOpenChange]
43810
43876
  );
43811
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "overflow-hidden p-0 sm:max-w-[520px]", showCloseButton: false, children: [
43812
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
43813
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Command Palette" }),
43814
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Search for a command to run" })
43815
- ] }),
43816
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { children: [
43817
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandInput, { placeholder: "Search commands..." }),
43818
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[360px]", children: [
43819
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: "No commands found." }),
43820
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandGroup, { children: commands.map((cmd2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandItem, { value: cmd2.label, onSelect: () => handleSelect(cmd2), children: [
43821
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: cmd2.label }),
43822
- cmd2.shortcut && /* @__PURE__ */ jsxRuntimeExports.jsx(CommandShortcut, { children: formatShortcut(cmd2.shortcut) })
43823
- ] }, cmd2.id)) })
43824
- ] })
43825
- ] })
43826
- ] }) });
43877
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
43878
+ DialogContent,
43879
+ {
43880
+ variant: "command-palette",
43881
+ className: "overflow-hidden p-0 lg:max-w-[520px]",
43882
+ showCloseButton: false,
43883
+ children: [
43884
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
43885
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Command Palette" }),
43886
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Search for a command to run" })
43887
+ ] }),
43888
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { children: [
43889
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandInput, { placeholder: "Search commands..." }),
43890
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[360px]", children: [
43891
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: "No commands found." }),
43892
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandGroup, { children: commands.map((cmd2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandItem, { value: cmd2.label, onSelect: () => handleSelect(cmd2), children: [
43893
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: cmd2.label }),
43894
+ cmd2.shortcut && /* @__PURE__ */ jsxRuntimeExports.jsx(CommandShortcut, { children: formatShortcut(cmd2.shortcut) })
43895
+ ] }, cmd2.id)) })
43896
+ ] })
43897
+ ] })
43898
+ ]
43899
+ }
43900
+ ) });
43827
43901
  }
43828
43902
  function CommitDialog({
43829
43903
  open: open2,
@@ -48707,7 +48781,7 @@ function usePinnedWorkspaces() {
48707
48781
  list2.push({
48708
48782
  project,
48709
48783
  worktree: wt2,
48710
- workspaceId: toWorkspaceId(project.name, wt2.branch)
48784
+ workspaceId: toWorkspaceId(project.name, wt2.name)
48711
48785
  });
48712
48786
  }
48713
48787
  }
@@ -48719,10 +48793,10 @@ function usePinnedWorkspaces() {
48719
48793
  const mutation = useMutation({
48720
48794
  mutationFn: ({
48721
48795
  project,
48722
- branch,
48796
+ name: name2,
48723
48797
  pinned: nextPinned
48724
- }) => adapter2.setWorkspacePinned(project, branch, nextPinned),
48725
- onMutate: async ({ project, branch, pinned: nextPinned }) => {
48798
+ }) => adapter2.setWorkspacePinned(project, name2, nextPinned),
48799
+ onMutate: async ({ project, name: name2, pinned: nextPinned }) => {
48726
48800
  await queryClient2.cancelQueries({ queryKey: queryKeys.projects });
48727
48801
  const previous2 = queryClient2.getQueryData(queryKeys.projects);
48728
48802
  if (previous2) {
@@ -48730,7 +48804,7 @@ function usePinnedWorkspaces() {
48730
48804
  (p2) => p2.name === project ? {
48731
48805
  ...p2,
48732
48806
  worktrees: p2.worktrees.map(
48733
- (w3) => w3.branch === branch ? { ...w3, pinned: nextPinned } : w3
48807
+ (w3) => w3.name === name2 ? { ...w3, pinned: nextPinned } : w3
48734
48808
  )
48735
48809
  } : p2
48736
48810
  );
@@ -48749,7 +48823,7 @@ function usePinnedWorkspaces() {
48749
48823
  }
48750
48824
  });
48751
48825
  const toggle = reactExports.useCallback(
48752
- (project, branch, currentlyPinned) => mutation.mutate({ project, branch, pinned: !currentlyPinned }),
48826
+ (project, name2, currentlyPinned) => mutation.mutate({ project, name: name2, pinned: !currentlyPinned }),
48753
48827
  [mutation.mutate]
48754
48828
  );
48755
48829
  return { pinned, isPinned, toggle };
@@ -49013,7 +49087,7 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49013
49087
  const gitPush = useDashboardStore((s2) => s2.gitPush);
49014
49088
  const removeWorkspaceMutation = useRemoveWorkspace();
49015
49089
  const isPinned = worktree.pinned;
49016
- const workspaceId = toWorkspaceId(projectName, worktree.branch);
49090
+ const workspaceId = toWorkspaceId(projectName, worktree.name);
49017
49091
  const isActive = useDashboardStore((s2) => s2.activeWorkspaceId === workspaceId);
49018
49092
  const href = capabilities2.getWorkspaceHref?.(workspaceId);
49019
49093
  reactExports.useEffect(() => {
@@ -49063,11 +49137,11 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49063
49137
  const hasUnpushedCommits = (branchStatus?.git.ahead ?? 0) > 0;
49064
49138
  const handleDelete2 = () => {
49065
49139
  if (!hasUnmergedPR && !isDirty && !hasUnpushedCommits) {
49066
- removeWorkspaceMutation.mutate({ project: projectName, branch: worktree.branch });
49140
+ removeWorkspaceMutation.mutate({ project: projectName, name: worktree.name });
49067
49141
  } else {
49068
49142
  onShowDeleteDialog({
49069
49143
  projectName,
49070
- branch: worktree.branch,
49144
+ name: worktree.name,
49071
49145
  isUnmerged: hasUnmergedPR,
49072
49146
  isDirty,
49073
49147
  hasUnpushedCommits
@@ -49083,11 +49157,11 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49083
49157
  "span",
49084
49158
  {
49085
49159
  className: `text-sm truncate ${isActive ? "font-bold text-foreground" : "font-medium text-muted-foreground"}`,
49086
- children: showProjectName ? `${projectName}/${worktree.branch}` : worktree.branch
49160
+ children: showProjectName ? `${projectName}/${worktree.name}` : worktree.name
49087
49161
  }
49088
49162
  )
49089
49163
  ] }) }),
49090
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "right", children: `${projectName}/${worktree.branch}` })
49164
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "right", children: `${projectName}/${worktree.name}` })
49091
49165
  ] }),
49092
49166
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden @[10rem]:flex group-hover:flex items-center gap-2 shrink-0 ml-auto pl-2", children: [
49093
49167
  /* @__PURE__ */ jsxRuntimeExports.jsx(SetupStatusIndicator, { setup: setupStatus }),
@@ -49096,7 +49170,7 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49096
49170
  ] })
49097
49171
  ] }) }),
49098
49172
  /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
49099
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onTogglePinned(projectName, worktree.branch, isPinned), children: [
49173
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onTogglePinned(projectName, worktree.name, isPinned), children: [
49100
49174
  isPinned ? /* @__PURE__ */ jsxRuntimeExports.jsx(PinOff, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, {}),
49101
49175
  isPinned ? "Unpin workspace" : "Pin workspace"
49102
49176
  ] }),
@@ -49117,15 +49191,15 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49117
49191
  /* @__PURE__ */ jsxRuntimeExports.jsx(Square, {}),
49118
49192
  "Run teardown"
49119
49193
  ] }),
49120
- !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPull(projectName, worktree.branch), children: [
49194
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPull(projectName, worktree.name), children: [
49121
49195
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowDownToLine, {}),
49122
49196
  "Git pull"
49123
49197
  ] }),
49124
- !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPush(projectName, worktree.branch), children: [
49198
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPush(projectName, worktree.name), children: [
49125
49199
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowUpFromLine, {}),
49126
49200
  "Git push"
49127
49201
  ] }),
49128
- !isPlain && worktree.branch !== defaultBranch && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: handleDelete2, children: [
49202
+ !isPlain && worktree.name !== defaultBranch && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: handleDelete2, children: [
49129
49203
  /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
49130
49204
  "Delete workspace"
49131
49205
  ] })
@@ -49165,8 +49239,8 @@ function SortableProject({
49165
49239
  };
49166
49240
  const openWorkspace = useDashboardStore((s2) => s2.openWorkspace);
49167
49241
  const clearNeedsAttention = useDashboardStore((s2) => s2.clearNeedsAttention);
49168
- const plainBranch = isPlain ? project.worktrees[0].branch : "";
49169
- const plainWorkspaceId = isPlain ? toWorkspaceId(project.name, plainBranch) : "";
49242
+ const plainName = isPlain ? project.worktrees[0].name : "";
49243
+ const plainWorkspaceId = isPlain ? toWorkspaceId(project.name, plainName) : "";
49170
49244
  const plainIsActive = useDashboardStore(
49171
49245
  (s2) => isPlain && s2.activeWorkspaceId === plainWorkspaceId
49172
49246
  );
@@ -49175,7 +49249,7 @@ function SortableProject({
49175
49249
  const plainIsFocused = isPlain && workspaceIndexStart === focusedIndex;
49176
49250
  const activeWorkspaceId = useDashboardStore((s2) => s2.activeWorkspaceId);
49177
49251
  const gitHeaderIsActive = reactExports.useMemo(
49178
- () => !isPlain && project.worktrees.some((wt2) => toWorkspaceId(project.name, wt2.branch) === activeWorkspaceId),
49252
+ () => !isPlain && project.worktrees.some((wt2) => toWorkspaceId(project.name, wt2.name) === activeWorkspaceId),
49179
49253
  [isPlain, project.worktrees, project.name, activeWorkspaceId]
49180
49254
  );
49181
49255
  const handlePlainOpen = () => {
@@ -49320,7 +49394,7 @@ function SortableProject({
49320
49394
  // the project header above, not as sibling rows. The indentation alone
49321
49395
  // (no divider rail) conveys the hierarchy, keeping the list uncluttered.
49322
49396
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-0.5 overflow-hidden ml-3", children: project.worktrees.length === 0 ? hasPinnedSiblings ? null : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground px-4 py-2", children: "No workspaces yet" }) : project.worktrees.map((wt2) => {
49323
- const wsId = toWorkspaceId(project.name, wt2.branch);
49397
+ const wsId = toWorkspaceId(project.name, wt2.name);
49324
49398
  const currentIndex = workspaceIndex++;
49325
49399
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
49326
49400
  WorkspaceCard,
@@ -49336,7 +49410,7 @@ function SortableProject({
49336
49410
  onShowDeleteDialog,
49337
49411
  onTogglePinned
49338
49412
  },
49339
- wt2.branch
49413
+ wt2.name
49340
49414
  );
49341
49415
  }) })
49342
49416
  ] });
@@ -49472,7 +49546,7 @@ function ProjectList({ labelFilter }) {
49472
49546
  if (headerVisible && labelCollapse.isCollapsed(groupKey)) return [];
49473
49547
  return g2.projects.flatMap((p2) => {
49474
49548
  if (projectCollapse.isCollapsed(p2.name)) return [];
49475
- return p2.worktrees.map((wt2) => toWorkspaceId(p2.name, wt2.branch));
49549
+ return p2.worktrees.map((wt2) => toWorkspaceId(p2.name, wt2.name));
49476
49550
  });
49477
49551
  });
49478
49552
  return [...pinnedPart, ...rest];
@@ -49532,7 +49606,7 @@ function ProjectList({ labelFilter }) {
49532
49606
  for (const group of groups) {
49533
49607
  for (const project of group.projects) {
49534
49608
  const containsActive = project.worktrees.some(
49535
- (wt2) => toWorkspaceId(project.name, wt2.branch) === activeWorkspaceId
49609
+ (wt2) => toWorkspaceId(project.name, wt2.name) === activeWorkspaceId
49536
49610
  );
49537
49611
  if (!containsActive) continue;
49538
49612
  if (labelFilter && group.labelId !== labelFilter) return;
@@ -49766,12 +49840,12 @@ function ProjectList({ labelFilter }) {
49766
49840
  if (deleteDialog) {
49767
49841
  removeWorkspaceMutation.mutate({
49768
49842
  project: deleteDialog.projectName,
49769
- branch: deleteDialog.branch
49843
+ name: deleteDialog.name
49770
49844
  });
49771
49845
  setDeleteDialog(null);
49772
49846
  }
49773
49847
  },
49774
- branchName: deleteDialog?.branch ?? "",
49848
+ branchName: deleteDialog?.name ?? "",
49775
49849
  isUnmerged: deleteDialog?.isUnmerged ?? false,
49776
49850
  isDirty: deleteDialog?.isDirty ?? false,
49777
49851
  hasUnpushedCommits: deleteDialog?.hasUnpushedCommits ?? false
@@ -50222,16 +50296,8 @@ function SettingsPage({ open: open2, onOpenChange }) {
50222
50296
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
50223
50297
  DialogContent,
50224
50298
  {
50225
- className: (
50226
- // Mobile: take the full viewport — no margin, no rounded corners,
50227
- // top-anchored so the address-bar doesn't clip the footer.
50228
- // Desktop (sm+): float as a centered, capped-width card.
50229
- [
50230
- "inset-0 left-0 top-0 h-dvh w-full max-w-none translate-x-0 translate-y-0 rounded-none",
50231
- "sm:inset-auto sm:top-[50%] sm:left-[50%] sm:h-[80vh] sm:w-full sm:max-w-2xl sm:translate-x-[-50%] sm:translate-y-[-50%] sm:rounded-lg",
50232
- "overflow-hidden p-0 flex flex-col gap-0"
50233
- ].join(" ")
50234
- ),
50299
+ variant: "bottom-sheet",
50300
+ className: "flex flex-col gap-0 overflow-hidden p-0 lg:h-[80vh] lg:max-w-2xl",
50235
50301
  children: [
50236
50302
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { className: "px-6 pt-6 pb-4 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Settings" }) }),
50237
50303
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-y-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-6 px-6 pb-6", children: [
@@ -50871,7 +50937,7 @@ async function desktopInvoke$1(cmd2, args) {
50871
50937
  if (bridge) return await bridge.invoke(cmd2, args);
50872
50938
  throw new Error(`desktopInvoke('${cmd2}') called outside the desktop shell`);
50873
50939
  }
50874
- function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
50940
+ function DashboardShell({ bottomActions, hideTitleBar }) {
50875
50941
  const { projects, isLoading: loading } = useProjects();
50876
50942
  const { settings } = useSettingsQuery();
50877
50943
  const labels = settings.labels ?? [];
@@ -50911,7 +50977,7 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
50911
50977
  );
50912
50978
  const findProjectForWorkspace = reactExports.useCallback(
50913
50979
  (workspaceId) => projects.find(
50914
- (p2) => p2.worktrees.some((wt2) => toWorkspaceId(p2.name, wt2.branch) === workspaceId)
50980
+ (p2) => p2.worktrees.some((wt2) => toWorkspaceId(p2.name, wt2.name) === workspaceId)
50915
50981
  ),
50916
50982
  [projects]
50917
50983
  );
@@ -51033,93 +51099,68 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
51033
51099
  }
51034
51100
  ),
51035
51101
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-9 shrink-0 items-center justify-between border-b border-border", children: [
51036
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-w-0 items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 pl-2", children: [
51037
- !hideMenu && /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
51038
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
51039
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
51040
- Button,
51041
- {
51042
- size: "icon-sm",
51043
- variant: "ghost",
51044
- className: "text-muted-foreground",
51045
- "aria-label": "Menu",
51046
- "data-testid": "dashboard__menu-trigger",
51047
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Menu$1, { className: "size-5" })
51048
- }
51049
- ) }) }),
51050
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "bottom", children: "More" })
51051
- ] }),
51052
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "start", children: [
51053
- toolbarMenuItems,
51054
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: handleSettingsClick, children: [
51055
- /* @__PURE__ */ jsxRuntimeExports.jsx(Settings$1, { className: "size-4" }),
51056
- "Settings"
51102
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-w-0 items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1 pl-2", children: labels.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
51103
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
51104
+ Button,
51105
+ {
51106
+ size: "sm",
51107
+ variant: "ghost",
51108
+ "data-testid": "dashboard__label-filter-trigger",
51109
+ className: `min-w-0 text-sm h-7 px-2 gap-1.5 ${labelFilter ? "bg-accent text-accent-foreground" : "text-muted-foreground"}`,
51110
+ children: activeLabel ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51111
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
51112
+ "span",
51113
+ {
51114
+ className: "size-2.5 rounded-full shrink-0",
51115
+ style: { backgroundColor: activeLabel.color }
51116
+ }
51117
+ ),
51118
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: activeLabel.name })
51119
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51120
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0" }),
51121
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" })
51057
51122
  ] })
51058
- ] })
51059
- ] }),
51060
- labels.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
51061
- /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
51062
- Button,
51123
+ }
51124
+ ) }),
51125
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "start", children: [
51126
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
51127
+ DropdownMenuItem,
51063
51128
  {
51064
- size: "sm",
51065
- variant: "ghost",
51066
- "data-testid": "dashboard__label-filter-trigger",
51067
- className: `min-w-0 text-sm h-7 px-2 gap-1.5 ${labelFilter ? "bg-accent text-accent-foreground" : "text-muted-foreground"}`,
51068
- children: activeLabel ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51129
+ "data-testid": "dashboard__label-filter-item--all",
51130
+ onClick: () => setLabelFilter(null),
51131
+ children: [
51132
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0 mr-2 text-muted-foreground" }),
51133
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" }),
51134
+ !labelFilter && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
51135
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: "⌘0" })
51136
+ ]
51137
+ }
51138
+ ),
51139
+ labels.map((lbl, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
51140
+ DropdownMenuItem,
51141
+ {
51142
+ "data-testid": `dashboard__label-filter-item--${lbl.id}`,
51143
+ onClick: () => setLabelFilter(lbl.id),
51144
+ children: [
51069
51145
  /* @__PURE__ */ jsxRuntimeExports.jsx(
51070
51146
  "span",
51071
51147
  {
51072
- className: "size-2.5 rounded-full shrink-0",
51073
- style: { backgroundColor: activeLabel.color }
51148
+ className: "size-2.5 rounded-full shrink-0 mr-2",
51149
+ style: { backgroundColor: lbl.color }
51074
51150
  }
51075
51151
  ),
51076
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: activeLabel.name })
51077
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51078
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0" }),
51079
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" })
51080
- ] })
51081
- }
51082
- ) }),
51083
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "start", children: [
51084
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
51085
- DropdownMenuItem,
51086
- {
51087
- "data-testid": "dashboard__label-filter-item--all",
51088
- onClick: () => setLabelFilter(null),
51089
- children: [
51090
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0 mr-2 text-muted-foreground" }),
51091
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" }),
51092
- !labelFilter && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
51093
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: "⌘0" })
51094
- ]
51095
- }
51096
- ),
51097
- labels.map((lbl, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
51098
- DropdownMenuItem,
51099
- {
51100
- "data-testid": `dashboard__label-filter-item--${lbl.id}`,
51101
- onClick: () => setLabelFilter(lbl.id),
51102
- children: [
51103
- /* @__PURE__ */ jsxRuntimeExports.jsx(
51104
- "span",
51105
- {
51106
- className: "size-2.5 rounded-full shrink-0 mr-2",
51107
- style: { backgroundColor: lbl.color }
51108
- }
51109
- ),
51110
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: lbl.name }),
51111
- labelFilter === lbl.id && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
51112
- idx < 9 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: [
51113
- "⌘",
51114
- idx + 1
51115
- ] })
51116
- ]
51117
- },
51118
- lbl.id
51119
- ))
51120
- ] })
51152
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: lbl.name }),
51153
+ labelFilter === lbl.id && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
51154
+ idx < 9 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: [
51155
+ "⌘",
51156
+ idx + 1
51157
+ ] })
51158
+ ]
51159
+ },
51160
+ lbl.id
51161
+ ))
51121
51162
  ] })
51122
- ] }) }),
51163
+ ] }) }) }),
51123
51164
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 pr-2", children: [
51124
51165
  projects.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
51125
51166
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -51216,6 +51257,30 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
51216
51257
  }
51217
51258
  )
51218
51259
  ] }),
51260
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
51261
+ "div",
51262
+ {
51263
+ className: "shrink-0 flex h-9 items-center justify-between gap-1 border-t border-border px-2",
51264
+ "data-testid": "project-list__action-bar",
51265
+ children: [
51266
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
51267
+ Button,
51268
+ {
51269
+ size: "sm",
51270
+ variant: "ghost",
51271
+ className: "text-muted-foreground",
51272
+ "data-testid": "project-list__settings-button",
51273
+ onClick: handleSettingsClick,
51274
+ children: [
51275
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Settings$1, { className: "size-4" }),
51276
+ "Settings"
51277
+ ]
51278
+ }
51279
+ ),
51280
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-0.5", children: bottomActions })
51281
+ ]
51282
+ }
51283
+ ),
51219
51284
  /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: showErrorDialog, onOpenChange: setShowErrorDialog, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { children: [
51220
51285
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
51221
51286
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { className: "text-destructive", children: "Error" }),
@@ -52791,7 +52856,7 @@ function readStoredDiffMode(workspaceId) {
52791
52856
  if (v2 === "uncommitted" || v2 === "branch") return v2;
52792
52857
  } catch {
52793
52858
  }
52794
- return "branch";
52859
+ return "uncommitted";
52795
52860
  }
52796
52861
  function readStoredCompareBranch(workspaceId) {
52797
52862
  try {
@@ -52881,7 +52946,7 @@ function useProjectKindMap() {
52881
52946
  const map2 = /* @__PURE__ */ new Map();
52882
52947
  for (const p2 of projects) {
52883
52948
  for (const wt2 of p2.worktrees) {
52884
- map2.set(toWorkspaceId(p2.name, wt2.branch), p2.kind);
52949
+ map2.set(toWorkspaceId(p2.name, wt2.name), p2.kind);
52885
52950
  }
52886
52951
  }
52887
52952
  return map2;
@@ -53013,7 +53078,7 @@ function useWorkspacePath(workspaceId) {
53013
53078
  return reactExports.useMemo(() => {
53014
53079
  for (const proj of projects) {
53015
53080
  for (const wt2 of proj.worktrees) {
53016
- if (toWorkspaceId(proj.name, wt2.branch) === workspaceId) {
53081
+ if (toWorkspaceId(proj.name, wt2.name) === workspaceId) {
53017
53082
  return wt2.path;
53018
53083
  }
53019
53084
  }
@@ -56403,7 +56468,10 @@ const SearchBar = reactExports.forwardRef(function SearchBar2({
56403
56468
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
56404
56469
  "div",
56405
56470
  {
56406
- className: `flex shrink-0 items-center gap-1.5 border-b border-border bg-muted/30 px-3 py-1.5 ${className ?? ""}`,
56471
+ className: cn$2(
56472
+ "flex shrink-0 items-center gap-1.5 border-b border-border bg-muted/30 px-3 py-1.5",
56473
+ className
56474
+ ),
56407
56475
  children: [
56408
56476
  /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
56409
56477
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -56483,6 +56551,17 @@ function storeViewMode(mode) {
56483
56551
  }
56484
56552
  }
56485
56553
  const UNCOMMITTED_VALUE = "__uncommitted__";
56554
+ const STAGING_BRANCH_PRIORITY = [
56555
+ "develop",
56556
+ "dev",
56557
+ "development",
56558
+ "stage",
56559
+ "staging",
56560
+ "integration",
56561
+ "release",
56562
+ "qa",
56563
+ "uat"
56564
+ ];
56486
56565
  const EXPAND_ALL_KEY = "band:diff-expand-all";
56487
56566
  const MAX_MOUNTED_EDITORS = 50;
56488
56567
  function getStoredExpandAll() {
@@ -57076,81 +57155,91 @@ function LazyFileRow({
57076
57155
  fileStatus: status
57077
57156
  }
57078
57157
  ),
57079
- isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border/20 bg-muted/30", children: [
57080
- diffError && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-4 text-sm text-destructive", children: diffError }),
57081
- diff2 !== null && (shouldRender ? (
57082
- // Wrapper is observed by the ResizeObserver in the effect
57083
- // above. Its rendered height — "Show full file" bar plus the
57084
- // CodeMirror editor — is reported back as
57085
- // `measuredHeight`, then reused verbatim as the placeholder
57086
- // height on the next unmount cycle (a never-visited row or
57087
- // an LRU-evicted one).
57088
- //
57089
- // The `minHeight` hold prevents a layout shift during the
57090
- // window between (a) `shouldRender` flipping to true and
57091
- // (b) the editor's async `setup` finishing (loadLanguage
57092
- // await + new MergeView() + first paint). Without it the
57093
- // wrapper is empty-auto-height for that window, collapsing
57094
- // the row to the "Show full file" bar (~30px) and pushing
57095
- // every row below it upward; when the editor paints they
57096
- // snap back down. We pin the wrapper to the
57097
- // cached/estimated height (the same value the placeholder
57098
- // uses) until `editorRendered` flips, then let the
57099
- // editor's natural height take over. The ResizeObserver
57100
- // only attaches once `editorRendered` is true (see deps
57101
- // above), so the held value never bleeds into the
57102
- // measuredHeight cache.
57103
- //
57104
- // Mount-once: once `shouldRender` flips true, it stays
57105
- // true across scroll-aways. The editor's natural height
57106
- // remains in the layout — the row stays the same size
57107
- // whether the user is currently looking at it or
57108
- // scrolled past — so there's no scroll-shift trade-off
57109
- // to manage. The browser handles culling offscreen tiles
57110
- // cheaply; the only thing that brings `shouldRender`
57111
- // back to false is collapse / LRU eviction / target
57112
- // change, all of which deliberately tear the editor
57113
- // down.
57114
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
57115
- "div",
57116
- {
57117
- ref: diffBodyRef,
57118
- style: editorRendered ? void 0 : { minHeight: placeholderHeight },
57119
- children: [
57120
- canLoadMore && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center border-b border-border/20 px-4 py-1.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
57121
- "button",
57122
- {
57123
- type: "button",
57124
- onClick: () => onShowFullFile(filename),
57125
- className: "text-xs text-muted-foreground transition-colors hover:text-foreground",
57126
- children: "Show full file"
57127
- }
57128
- ) }),
57129
- /* @__PURE__ */ jsxRuntimeExports.jsx(
57130
- DiffFileContent,
57131
- {
57132
- hunks: diff2,
57133
- filename,
57134
- viewMode,
57135
- onEditorViews: handleEditorViews,
57136
- onLoadMoreContext: canLoadMore ? () => onLoadMoreContext(filename) : void 0
57137
- }
57138
- )
57139
- ]
57140
- }
57141
- )
57142
- ) : (
57143
- // Placeholder occupying the SAME pixel height the CodeMirror
57144
- // editor would render at, so the row's overall size doesn't
57145
- // change when LRU eviction tears the editor down (or while
57146
- // a never-visited row waits for its first IO intersect).
57147
- // Without this, switching the body between editor and
57148
- // placeholder would push everything below upward —
57149
- // visually identical to a layout shift, even though no
57150
- // content actually moved.
57151
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { height: placeholderHeight } })
57152
- ))
57153
- ] })
57158
+ isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs(
57159
+ "div",
57160
+ {
57161
+ className: "border-t border-border/20 bg-muted/30",
57162
+ style: placeholderHeight > 0 ? {
57163
+ contentVisibility: "auto",
57164
+ containIntrinsicBlockSize: `${placeholderHeight}px`
57165
+ } : void 0,
57166
+ children: [
57167
+ diffError && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-4 text-sm text-destructive", children: diffError }),
57168
+ diff2 !== null && (shouldRender ? (
57169
+ // Wrapper is observed by the ResizeObserver in the effect
57170
+ // above. Its rendered height — "Show full file" bar plus the
57171
+ // CodeMirror editor — is reported back as
57172
+ // `measuredHeight`, then reused verbatim as the placeholder
57173
+ // height on the next unmount cycle (a never-visited row or
57174
+ // an LRU-evicted one).
57175
+ //
57176
+ // The `minHeight` hold prevents a layout shift during the
57177
+ // window between (a) `shouldRender` flipping to true and
57178
+ // (b) the editor's async `setup` finishing (loadLanguage
57179
+ // await + new MergeView() + first paint). Without it the
57180
+ // wrapper is empty-auto-height for that window, collapsing
57181
+ // the row to the "Show full file" bar (~30px) and pushing
57182
+ // every row below it upward; when the editor paints they
57183
+ // snap back down. We pin the wrapper to the
57184
+ // cached/estimated height (the same value the placeholder
57185
+ // uses) until `editorRendered` flips, then let the
57186
+ // editor's natural height take over. The ResizeObserver
57187
+ // only attaches once `editorRendered` is true (see deps
57188
+ // above), so the held value never bleeds into the
57189
+ // measuredHeight cache.
57190
+ //
57191
+ // Mount-once: once `shouldRender` flips true, it stays
57192
+ // true across scroll-aways. The editor's natural height
57193
+ // remains in the layout — the row stays the same size
57194
+ // whether the user is currently looking at it or
57195
+ // scrolled past — so there's no scroll-shift trade-off
57196
+ // to manage. The browser handles culling offscreen tiles
57197
+ // cheaply; the only thing that brings `shouldRender`
57198
+ // back to false is collapse / LRU eviction / target
57199
+ // change, all of which deliberately tear the editor
57200
+ // down.
57201
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
57202
+ "div",
57203
+ {
57204
+ ref: diffBodyRef,
57205
+ style: editorRendered ? void 0 : { minHeight: placeholderHeight },
57206
+ children: [
57207
+ canLoadMore && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center border-b border-border/20 px-4 py-1.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
57208
+ "button",
57209
+ {
57210
+ type: "button",
57211
+ onClick: () => onShowFullFile(filename),
57212
+ className: "text-xs text-muted-foreground transition-colors hover:text-foreground",
57213
+ children: "Show full file"
57214
+ }
57215
+ ) }),
57216
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
57217
+ DiffFileContent,
57218
+ {
57219
+ hunks: diff2,
57220
+ filename,
57221
+ viewMode,
57222
+ onEditorViews: handleEditorViews,
57223
+ onLoadMoreContext: canLoadMore ? () => onLoadMoreContext(filename) : void 0
57224
+ }
57225
+ )
57226
+ ]
57227
+ }
57228
+ )
57229
+ ) : (
57230
+ // Placeholder occupying the SAME pixel height the CodeMirror
57231
+ // editor would render at, so the row's overall size doesn't
57232
+ // change when LRU eviction tears the editor down (or while
57233
+ // a never-visited row waits for its first IO intersect).
57234
+ // Without this, switching the body between editor and
57235
+ // placeholder would push everything below upward —
57236
+ // visually identical to a layout shift, even though no
57237
+ // content actually moved.
57238
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { height: placeholderHeight } })
57239
+ ))
57240
+ ]
57241
+ }
57242
+ )
57154
57243
  ]
57155
57244
  }
57156
57245
  );
@@ -57191,6 +57280,7 @@ function DiffView({
57191
57280
  const workspacePath = useWorkspacePath(workspaceId);
57192
57281
  const [summary, setSummary] = reactExports.useState(null);
57193
57282
  const summaryRef = reactExports.useRef(null);
57283
+ const lastHeadBranchRef = reactExports.useRef(null);
57194
57284
  const [error, setError] = reactExports.useState(null);
57195
57285
  const [loading, setLoading] = reactExports.useState(true);
57196
57286
  const fetchSummaryRef = reactExports.useRef(null);
@@ -57726,16 +57816,22 @@ function DiffView({
57726
57816
  }, [active]);
57727
57817
  const summaryCompareBranch = summary?.compareBranch ?? null;
57728
57818
  const defaultBranch = summary?.defaultBranch ?? availableDefaultBranch ?? null;
57729
- const branchOptions = availableBranches.length > 0 ? availableBranches : summaryCompareBranch ? [summaryCompareBranch] : [];
57819
+ const branchOptions = reactExports.useMemo(
57820
+ () => availableBranches.length > 0 ? availableBranches : summaryCompareBranch ? [summaryCompareBranch] : [],
57821
+ [availableBranches, summaryCompareBranch]
57822
+ );
57730
57823
  const targetBranch = compareBranch ?? branchOptions[0] ?? summaryCompareBranch;
57731
- const topSectionBranches = [];
57732
- if (targetBranch) {
57733
- topSectionBranches.push(targetBranch);
57734
- }
57735
- if (defaultBranch && defaultBranch !== targetBranch && branchOptions.includes(defaultBranch)) {
57736
- topSectionBranches.push(defaultBranch);
57737
- }
57738
- const otherBranches = branchOptions.filter((b2) => !topSectionBranches.includes(b2)).sort((a2, b2) => a2.localeCompare(b2));
57824
+ const { topSectionBranches, otherBranches } = reactExports.useMemo(() => {
57825
+ const stagingBranches = STAGING_BRANCH_PRIORITY.map(
57826
+ (name2) => branchOptions.find((b2) => b2.toLowerCase() === name2)
57827
+ ).filter((b2) => b2 != null);
57828
+ const topSection = [...stagingBranches];
57829
+ if (defaultBranch && branchOptions.includes(defaultBranch) && !topSection.includes(defaultBranch)) {
57830
+ topSection.push(defaultBranch);
57831
+ }
57832
+ const others = branchOptions.filter((b2) => !topSection.includes(b2)).sort((a2, b2) => a2.localeCompare(b2));
57833
+ return { topSectionBranches: topSection, otherBranches: others };
57834
+ }, [branchOptions, defaultBranch]);
57739
57835
  const diffSelectValue = diffMode === "uncommitted" ? UNCOMMITTED_VALUE : targetBranch ?? UNCOMMITTED_VALUE;
57740
57836
  const handleDiffSelectChange = (value) => {
57741
57837
  if (value === UNCOMMITTED_VALUE) {
@@ -57746,11 +57842,18 @@ function DiffView({
57746
57842
  }
57747
57843
  };
57748
57844
  const renderDiffSelect = () => /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: diffSelectValue, onValueChange: handleDiffSelectChange, children: [
57749
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-6 w-auto max-w-[300px] gap-1 rounded-md border-0 bg-transparent px-1.5 text-xs font-medium text-foreground shadow-none hover:bg-accent [&>[data-slot=select-value]]:truncate [&>[data-slot=select-value]]:block", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
57845
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
57846
+ SelectTrigger,
57847
+ {
57848
+ "data-testid": "diff-view__target-select",
57849
+ className: "h-6 w-auto max-w-[300px] gap-1 rounded-md border-0 bg-transparent px-1.5 text-xs font-medium text-foreground shadow-none hover:bg-accent [&>[data-slot=select-value]]:truncate [&>[data-slot=select-value]]:block",
57850
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {})
57851
+ }
57852
+ ),
57750
57853
  /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
57854
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: UNCOMMITTED_VALUE, "data-testid": "diff-view__target-option-uncommitted", children: "Uncommitted" }),
57751
57855
  topSectionBranches.map((branch) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: branch, children: branch }, branch)),
57752
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: UNCOMMITTED_VALUE, children: "Uncommitted" }),
57753
- otherBranches.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(SelectSeparator, {}),
57856
+ topSectionBranches.length > 0 && otherBranches.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(SelectSeparator, {}),
57754
57857
  otherBranches.map((branch) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: branch, children: branch }, branch))
57755
57858
  ] })
57756
57859
  ] });
@@ -57762,6 +57865,10 @@ function DiffView({
57762
57865
  );
57763
57866
  filenamesRef.current = filenames;
57764
57867
  const stats = hasChanges ? summary.stats : null;
57868
+ reactExports.useEffect(() => {
57869
+ if (summary?.headBranch) lastHeadBranchRef.current = summary.headBranch;
57870
+ }, [summary?.headBranch]);
57871
+ const headBranchLabel = summary?.headBranch ?? lastHeadBranchRef.current;
57765
57872
  reactExports.useEffect(() => {
57766
57873
  const container = scrollContainerRef.current;
57767
57874
  if (!container) return;
@@ -57919,9 +58026,9 @@ function DiffView({
57919
58026
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(PanelLeft, { className: "size-3.5" })
57920
58027
  }
57921
58028
  );
57922
- const renderBranchIndicator = (headBranchLabel) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
57923
- headBranchLabel && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden items-center gap-1.5 @[32rem]/diff:flex", children: [
57924
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: headBranchLabel }),
58029
+ const renderBranchIndicator = (headBranchLabel2) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
58030
+ headBranchLabel2 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden items-center gap-1.5 @[32rem]/diff:flex", children: [
58031
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { "data-testid": "diff-view__head-branch", className: "font-medium text-foreground", children: headBranchLabel2 }),
57925
58032
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "size-3", "aria-hidden": true })
57926
58033
  ] }),
57927
58034
  renderDiffSelect()
@@ -57997,7 +58104,7 @@ function DiffView({
57997
58104
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-9 shrink-0 items-center justify-between gap-3 border-b border-border pl-2 pr-3", children: [
57998
58105
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
57999
58106
  renderSidebarToggle(),
58000
- renderBranchIndicator(summary?.headBranch)
58107
+ renderBranchIndicator(headBranchLabel)
58001
58108
  ] }),
58002
58109
  !hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
58003
58110
  renderGitSyncButtons(),
@@ -59433,44 +59540,52 @@ function LanguagePickerDialog({
59433
59540
  },
59434
59541
  [onOpenChange, onSelect]
59435
59542
  );
59436
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "overflow-hidden p-0 sm:max-w-[480px]", showCloseButton: false, children: [
59437
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
59438
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Select Language Mode" }),
59439
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Search for a language to syntax-highlight the file" })
59440
- ] }),
59441
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { children: [
59442
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandInput, { placeholder: "Select language mode…", autoFocus: true }),
59443
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[360px]", children: [
59444
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: "No languages found." }),
59445
- hasOverride && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
59446
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandGroup, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
59447
- CommandItem,
59448
- {
59449
- value: "Auto Detect",
59450
- onSelect: () => handleSelect(AUTO_DETECT_LANGUAGE_ID),
59451
- children: [
59452
- /* @__PURE__ */ jsxRuntimeExports.jsx(WandSparkles, { className: "size-3.5" }),
59453
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 text-sm", children: "Auto Detect" })
59454
- ]
59455
- }
59456
- ) }),
59457
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandSeparator, {})
59543
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
59544
+ DialogContent,
59545
+ {
59546
+ variant: "command-palette",
59547
+ className: "overflow-hidden p-0 lg:max-w-[480px]",
59548
+ showCloseButton: false,
59549
+ children: [
59550
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
59551
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Select Language Mode" }),
59552
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Search for a language to syntax-highlight the file" })
59458
59553
  ] }),
59459
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandGroup, { children: SUPPORTED_LANGUAGES.map((lang) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
59460
- CommandItem,
59461
- {
59462
- value: `${lang.label} ${lang.id}`,
59463
- onSelect: () => handleSelect(lang.id),
59464
- children: [
59465
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 text-sm", children: lang.label }),
59466
- lang.id === currentLanguage && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5 text-muted-foreground" })
59467
- ]
59468
- },
59469
- lang.id
59470
- )) })
59471
- ] })
59472
- ] })
59473
- ] }) });
59554
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { children: [
59555
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandInput, { placeholder: "Select language mode…", autoFocus: true }),
59556
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[360px]", children: [
59557
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: "No languages found." }),
59558
+ hasOverride && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
59559
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandGroup, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
59560
+ CommandItem,
59561
+ {
59562
+ value: "Auto Detect",
59563
+ onSelect: () => handleSelect(AUTO_DETECT_LANGUAGE_ID),
59564
+ children: [
59565
+ /* @__PURE__ */ jsxRuntimeExports.jsx(WandSparkles, { className: "size-3.5" }),
59566
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 text-sm", children: "Auto Detect" })
59567
+ ]
59568
+ }
59569
+ ) }),
59570
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandSeparator, {})
59571
+ ] }),
59572
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandGroup, { children: SUPPORTED_LANGUAGES.map((lang) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
59573
+ CommandItem,
59574
+ {
59575
+ value: `${lang.label} ${lang.id}`,
59576
+ onSelect: () => handleSelect(lang.id),
59577
+ children: [
59578
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 text-sm", children: lang.label }),
59579
+ lang.id === currentLanguage && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5 text-muted-foreground" })
59580
+ ]
59581
+ },
59582
+ lang.id
59583
+ )) })
59584
+ ] })
59585
+ ] })
59586
+ ]
59587
+ }
59588
+ ) });
59474
59589
  }
59475
59590
  function PdfPreview({ src, filename }) {
59476
59591
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full flex-col", children: /* @__PURE__ */ jsxRuntimeExports.jsx("iframe", { src, title: filename, className: "h-full w-full border-0" }) });
@@ -60165,7 +60280,8 @@ function QuickOpenDialog({
60165
60280
  DialogContent,
60166
60281
  {
60167
60282
  "data-testid": "quick-open__root",
60168
- className: "overflow-hidden p-0 sm:max-w-[520px]",
60283
+ variant: "command-palette",
60284
+ className: "overflow-hidden p-0 lg:max-w-[520px]",
60169
60285
  showCloseButton: false,
60170
60286
  children: [
60171
60287
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
@@ -60312,62 +60428,72 @@ function SearchFilesDialog({
60312
60428
  [onOpenFile, onOpenChange]
60313
60429
  );
60314
60430
  const totalMatches = results.length;
60315
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "overflow-hidden p-0 sm:max-w-[640px]", showCloseButton: false, children: [
60316
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
60317
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Search in Files" }),
60318
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Text search across workspace files" })
60319
- ] }),
60320
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { shouldFilter: false, value: selectedValue, onValueChange: setSelectedValue, children: [
60321
- /* @__PURE__ */ jsxRuntimeExports.jsx(
60322
- SearchBar,
60323
- {
60324
- ref: searchBarRef,
60325
- query,
60326
- onQueryChange: setQuery,
60327
- options: searchOptions,
60328
- onOptionsChange: setSearchOptions,
60329
- placeholder: "Search in files..."
60330
- }
60331
- ),
60332
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[400px]", children: [
60333
- /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: loading ? "Searching..." : query.length < 2 ? "Type at least 2 characters to search." : "No results found." }),
60334
- grouped.map(([file2, matches2]) => {
60335
- const FileIcon = getFileIcon(file2);
60336
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
60337
- CommandGroup,
60431
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
60432
+ DialogContent,
60433
+ {
60434
+ "data-testid": "search-files__root",
60435
+ variant: "command-palette",
60436
+ className: "overflow-hidden p-0 lg:max-w-[640px]",
60437
+ showCloseButton: false,
60438
+ children: [
60439
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
60440
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Search in Files" }),
60441
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Text search across workspace files" })
60442
+ ] }),
60443
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { shouldFilter: false, value: selectedValue, onValueChange: setSelectedValue, children: [
60444
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
60445
+ SearchBar,
60338
60446
  {
60339
- heading: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
60340
- /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { className: "size-3" }),
60341
- file2
60342
- ] }),
60343
- children: matches2.map((match) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
60344
- CommandItem,
60447
+ ref: searchBarRef,
60448
+ query,
60449
+ onQueryChange: setQuery,
60450
+ options: searchOptions,
60451
+ onOptionsChange: setSearchOptions,
60452
+ placeholder: "Search in files...",
60453
+ className: "max-lg:border-t max-lg:border-b-0"
60454
+ }
60455
+ ),
60456
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[400px]", children: [
60457
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: loading ? "Searching..." : query.length < 2 ? "Type at least 2 characters to search." : "No results found." }),
60458
+ grouped.map(([file2, matches2]) => {
60459
+ const FileIcon = getFileIcon(file2);
60460
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
60461
+ CommandGroup,
60345
60462
  {
60346
- value: `${file2}:${match.line}:${match.content}`,
60347
- onSelect: () => handleSelect(file2, match.line),
60348
- children: [
60349
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-8 shrink-0 text-right font-mono text-xs text-muted-foreground", children: match.line }),
60350
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate font-mono text-xs", children: match.content })
60351
- ]
60463
+ heading: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
60464
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { className: "size-3" }),
60465
+ file2
60466
+ ] }),
60467
+ children: matches2.map((match) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
60468
+ CommandItem,
60469
+ {
60470
+ value: `${file2}:${match.line}:${match.content}`,
60471
+ onSelect: () => handleSelect(file2, match.line),
60472
+ children: [
60473
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-8 shrink-0 text-right font-mono text-xs text-muted-foreground", children: match.line }),
60474
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate font-mono text-xs", children: match.content })
60475
+ ]
60476
+ },
60477
+ `${file2}:${match.line}:${match.content}`
60478
+ ))
60352
60479
  },
60353
- `${file2}:${match.line}:${match.content}`
60354
- ))
60355
- },
60356
- file2
60357
- );
60358
- })
60359
- ] }),
60360
- totalMatches > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t px-3 py-1.5 text-xs text-muted-foreground", children: [
60361
- totalMatches,
60362
- " result",
60363
- totalMatches !== 1 ? "s" : "",
60364
- " in ",
60365
- grouped.length,
60366
- " file",
60367
- grouped.length !== 1 ? "s" : ""
60368
- ] })
60369
- ] })
60370
- ] }) });
60480
+ file2
60481
+ );
60482
+ })
60483
+ ] }),
60484
+ totalMatches > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t px-3 py-1.5 text-xs text-muted-foreground", children: [
60485
+ totalMatches,
60486
+ " result",
60487
+ totalMatches !== 1 ? "s" : "",
60488
+ " in ",
60489
+ grouped.length,
60490
+ " file",
60491
+ grouped.length !== 1 ? "s" : ""
60492
+ ] })
60493
+ ] })
60494
+ ]
60495
+ }
60496
+ ) });
60371
60497
  }
60372
60498
  const STORAGE_KEY = "band-recent-workspaces";
60373
60499
  const MAX_ENTRIES = 50;
@@ -60413,10 +60539,11 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60413
60539
  const entries2 = [];
60414
60540
  for (const project of projects) {
60415
60541
  for (const worktree of project.worktrees) {
60416
- const workspaceId = toWorkspaceId(project.name, worktree.branch);
60542
+ const workspaceId = toWorkspaceId(project.name, worktree.name);
60417
60543
  entries2.push({
60418
60544
  workspaceId,
60419
60545
  projectName: project.name,
60546
+ name: worktree.name,
60420
60547
  branch: worktree.branch,
60421
60548
  agent: statuses.get(workspaceId)?.agent
60422
60549
  });
@@ -60454,8 +60581,8 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60454
60581
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
60455
60582
  DialogContent,
60456
60583
  {
60457
- className: "overflow-hidden border-0 bg-popover p-0 shadow-2xl sm:max-w-[520px]",
60458
- overlayClassName: "backdrop-blur-sm",
60584
+ variant: "command-palette",
60585
+ className: "overflow-hidden p-0 lg:max-w-[520px]",
60459
60586
  showCloseButton: false,
60460
60587
  "data-testid": "workspace-picker",
60461
60588
  onOpenAutoFocus: (e3) => {
@@ -60476,7 +60603,7 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60476
60603
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
60477
60604
  CommandItem,
60478
60605
  {
60479
- value: `${entry.projectName} ${entry.branch}`,
60606
+ value: `${entry.projectName} ${entry.name} ${entry.branch}`,
60480
60607
  onSelect: () => handleSelect(entry.workspaceId),
60481
60608
  "data-testid": `workspace-picker__item--${entry.workspaceId}`,
60482
60609
  className: "group touch-manipulation [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:gap-3",
@@ -60485,7 +60612,7 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60485
60612
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-medium", children: [
60486
60613
  entry.projectName,
60487
60614
  "/",
60488
- entry.branch
60615
+ entry.name
60489
60616
  ] }),
60490
60617
  pinnedNow && /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { className: "size-3 -rotate-45 text-muted-foreground shrink-0" }),
60491
60618
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
@@ -60502,7 +60629,7 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60502
60629
  onClick: (e3) => {
60503
60630
  e3.preventDefault();
60504
60631
  e3.stopPropagation();
60505
- togglePinned(entry.projectName, entry.branch, pinnedNow);
60632
+ togglePinned(entry.projectName, entry.name, pinnedNow);
60506
60633
  },
60507
60634
  children: pinnedNow ? /* @__PURE__ */ jsxRuntimeExports.jsx(PinOff, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { className: "size-3.5" })
60508
60635
  }
@@ -67006,11 +67133,11 @@ class WebDashboardAdapter {
67006
67133
  async createWorkspace(project, branch, base2, prompt) {
67007
67134
  await this.trpc.workspaces.create.mutate({ project, branch, base: base2, prompt });
67008
67135
  }
67009
- async removeWorkspace(project, branch) {
67010
- await this.trpc.workspaces.remove.mutate({ project, branch });
67136
+ async removeWorkspace(project, name2) {
67137
+ await this.trpc.workspaces.remove.mutate({ project, name: name2 });
67011
67138
  }
67012
- async setWorkspacePinned(project, branch, pinned) {
67013
- await this.trpc.workspaces.setPinned.mutate({ project, branch, pinned });
67139
+ async setWorkspacePinned(project, name2, pinned) {
67140
+ await this.trpc.workspaces.setPinned.mutate({ project, name: name2, pinned });
67014
67141
  }
67015
67142
  async clearNeedsAttention(workspaceId) {
67016
67143
  await this.trpc.statuses.clearNeedsAttention.mutate({ workspaceId });
@@ -67018,11 +67145,11 @@ class WebDashboardAdapter {
67018
67145
  async runScript(path2, scriptType) {
67019
67146
  await this.trpc.workspaces.runScript.mutate({ path: path2, scriptType });
67020
67147
  }
67021
- async gitPull(project, branch) {
67022
- await this.trpc.workspaces.gitPull.mutate({ project, branch });
67148
+ async gitPull(project, name2) {
67149
+ await this.trpc.workspaces.gitPull.mutate({ project, name: name2 });
67023
67150
  }
67024
- async gitPush(project, branch) {
67025
- await this.trpc.workspaces.gitPush.mutate({ project, branch });
67151
+ async gitPush(project, name2) {
67152
+ await this.trpc.workspaces.gitPush.mutate({ project, name: name2 });
67026
67153
  }
67027
67154
  async getSettings() {
67028
67155
  return await this.trpc.settings.get.query();
@@ -109252,7 +109379,7 @@ var tn = f$5("block", "before:content-[counter(line)]", "before:inline-block", "
109252
109379
  var et$1 = ({ className: e3, language: t2, style: o3, isIncomplete: n2, ...s2 }) => jsxRuntimeExports.jsx("div", { className: f$5("my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2", e3), "data-incomplete": n2 || void 0, "data-language": t2, "data-streamdown": "code-block", style: { contentVisibility: "auto", containIntrinsicSize: "auto 200px", ...o3 }, ...s2 });
109253
109380
  var Se$1 = reactExports.createContext({ code: "" }), de$2 = () => reactExports.useContext(Se$1);
109254
109381
  var ot$1 = ({ language: e3 }) => jsxRuntimeExports.jsx("div", { className: "flex h-8 items-center text-muted-foreground text-xs", "data-language": e3, "data-streamdown": "code-block-header", children: jsxRuntimeExports.jsx("span", { className: "ml-1 font-mono lowercase", children: e3 }) });
109255
- var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-DpfzVM5P.js").then((e3) => ({ default: e3.HighlightedCodeBlockBody }))), rt = ({ code: e3, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
109382
+ var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-CktYi1nO.js").then((e3) => ({ default: e3.HighlightedCodeBlockBody }))), rt = ({ code: e3, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
109256
109383
  let i2 = reactExports.useMemo(() => e3.replace(cn, ""), [e3]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i2.split(`
109257
109384
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i2]);
109258
109385
  return jsxRuntimeExports.jsx(Se$1.Provider, { value: { code: e3 }, children: jsxRuntimeExports.jsxs(et$1, { isIncomplete: s2, language: t2, children: [jsxRuntimeExports.jsx(ot$1, { language: t2 }), n2 ? jsxRuntimeExports.jsx("div", { className: "pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end", children: jsxRuntimeExports.jsx("div", { className: "pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur", "data-streamdown": "code-block-actions", children: n2 }) }) : null, jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: jsxRuntimeExports.jsx(Qe$1, { className: o3, language: t2, result: c2, ...r2 }), children: jsxRuntimeExports.jsx(dn, { className: o3, code: i2, language: t2, raw: c2, ...r2 }) })] }) });
@@ -109574,7 +109701,7 @@ var Dt = ({ children: e3, className: t2, onDownload: o3, onError: n2 }) => {
109574
109701
  }, []), jsxRuntimeExports.jsxs("div", { className: "relative", ref: i2, children: [jsxRuntimeExports.jsx("button", { className: f$5("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50", t2), disabled: c2, onClick: () => r2(!s2), title: "Download table", type: "button", children: e3 != null ? e3 : jsxRuntimeExports.jsx(Z$2, { size: 14 }) }), s2 ? jsxRuntimeExports.jsxs("div", { className: "absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg", children: [jsxRuntimeExports.jsx("button", { className: "w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40", onClick: () => a2("csv"), title: "Download table as CSV", type: "button", children: "CSV" }), jsxRuntimeExports.jsx("button", { className: "w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40", onClick: () => a2("markdown"), title: "Download table as Markdown", type: "button", children: "Markdown" })] }) : null] });
109575
109702
  };
109576
109703
  var Vt = ({ children: e3, className: t2, showControls: o3, ...n2 }) => jsxRuntimeExports.jsxs("div", { className: "my-4 flex flex-col gap-2 rounded-lg border border-border bg-sidebar p-2", "data-streamdown": "table-wrapper", children: [o3 ? jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-end gap-1", children: [jsxRuntimeExports.jsx(Ht, {}), jsxRuntimeExports.jsx(Dt, {})] }) : null, jsxRuntimeExports.jsx("div", { className: "border-collapse overflow-x-auto overscroll-y-auto rounded-md border border-border bg-background", children: jsxRuntimeExports.jsx("table", { className: f$5("w-full divide-y divide-border", t2), "data-streamdown": "table", ...n2, children: e3 }) })] });
109577
- var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-BfFd_m4-.js").then((e3) => ({ default: e3.Mermaid }))), Kn = /language-([^\s]+)/;
109704
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-CIBz4-1r.js").then((e3) => ({ default: e3.Mermaid }))), Kn = /language-([^\s]+)/;
109578
109705
  function ke$1(e3, t2) {
109579
109706
  if (!(e3 != null && e3.position || t2 != null && t2.position)) return true;
109580
109707
  if (!(e3 != null && e3.position && (t2 != null && t2.position))) return false;
@@ -161745,12 +161872,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
161745
161872
  registerLayoutLoaders([
161746
161873
  {
161747
161874
  name: "dagre",
161748
- loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-RuiqkM_u.js"), "loader")
161875
+ loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-CNIyd6rH.js"), "loader")
161749
161876
  },
161750
161877
  ...[
161751
161878
  {
161752
161879
  name: "cose-bilkent",
161753
- loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-Q7Nl8Zqm.js"), "loader")
161880
+ loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-DaKuQRAN.js"), "loader")
161754
161881
  }
161755
161882
  ]
161756
161883
  ]);
@@ -162189,7 +162316,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
162189
162316
  return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
162190
162317
  }, "detector");
162191
162318
  var loader = /* @__PURE__ */ __name(async () => {
162192
- const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CqN2DKBx.js");
162319
+ const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-D585k1An.js");
162193
162320
  return { id, diagram: diagram2 };
162194
162321
  }, "loader");
162195
162322
  var plugin = {
@@ -162206,7 +162333,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
162206
162333
  return /^\s*graph/.test(txt);
162207
162334
  }, "detector");
162208
162335
  var loader2 = /* @__PURE__ */ __name(async () => {
162209
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cg70kWHZ.js");
162336
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-CUlvxSwr.js");
162210
162337
  return { id: id2, diagram: diagram2 };
162211
162338
  }, "loader");
162212
162339
  var plugin2 = {
@@ -162229,7 +162356,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
162229
162356
  return /^\s*flowchart/.test(txt);
162230
162357
  }, "detector");
162231
162358
  var loader3 = /* @__PURE__ */ __name(async () => {
162232
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cg70kWHZ.js");
162359
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-CUlvxSwr.js");
162233
162360
  return { id: id3, diagram: diagram2 };
162234
162361
  }, "loader");
162235
162362
  var plugin3 = {
@@ -162243,7 +162370,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
162243
162370
  return /^\s*erDiagram/.test(txt);
162244
162371
  }, "detector");
162245
162372
  var loader4 = /* @__PURE__ */ __name(async () => {
162246
- const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-LKD5sOpF.js");
162373
+ const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-B3yUU2uu.js");
162247
162374
  return { id: id4, diagram: diagram2 };
162248
162375
  }, "loader");
162249
162376
  var plugin4 = {
@@ -162257,7 +162384,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
162257
162384
  return /^\s*gitGraph/.test(txt);
162258
162385
  }, "detector");
162259
162386
  var loader5 = /* @__PURE__ */ __name(async () => {
162260
- const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-BNe2zRpL.js");
162387
+ const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-CepF7ieg.js");
162261
162388
  return { id: id5, diagram: diagram2 };
162262
162389
  }, "loader");
162263
162390
  var plugin5 = {
@@ -162271,7 +162398,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
162271
162398
  return /^\s*gantt/.test(txt);
162272
162399
  }, "detector");
162273
162400
  var loader6 = /* @__PURE__ */ __name(async () => {
162274
- const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-CpgS7Gbo.js");
162401
+ const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-BWxUm4vA.js");
162275
162402
  return { id: id6, diagram: diagram2 };
162276
162403
  }, "loader");
162277
162404
  var plugin6 = {
@@ -162285,7 +162412,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
162285
162412
  return /^\s*info/.test(txt);
162286
162413
  }, "detector");
162287
162414
  var loader7 = /* @__PURE__ */ __name(async () => {
162288
- const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-I1ZLYjFY.js");
162415
+ const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-BMd22txJ.js");
162289
162416
  return { id: id7, diagram: diagram2 };
162290
162417
  }, "loader");
162291
162418
  var info = {
@@ -162298,7 +162425,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
162298
162425
  return /^\s*pie/.test(txt);
162299
162426
  }, "detector");
162300
162427
  var loader8 = /* @__PURE__ */ __name(async () => {
162301
- const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-Bat_eWvt.js");
162428
+ const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-Cv-DbjH6.js");
162302
162429
  return { id: id8, diagram: diagram2 };
162303
162430
  }, "loader");
162304
162431
  var pie = {
@@ -162311,7 +162438,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
162311
162438
  return /^\s*quadrantChart/.test(txt);
162312
162439
  }, "detector");
162313
162440
  var loader9 = /* @__PURE__ */ __name(async () => {
162314
- const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-CtqGnRnF.js");
162441
+ const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-DFyjNST4.js");
162315
162442
  return { id: id9, diagram: diagram2 };
162316
162443
  }, "loader");
162317
162444
  var plugin7 = {
@@ -162325,7 +162452,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
162325
162452
  return /^\s*xychart(-beta)?/.test(txt);
162326
162453
  }, "detector");
162327
162454
  var loader10 = /* @__PURE__ */ __name(async () => {
162328
- const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-DPvU_7PC.js");
162455
+ const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-r_3LO6yK.js");
162329
162456
  return { id: id10, diagram: diagram2 };
162330
162457
  }, "loader");
162331
162458
  var plugin8 = {
@@ -162339,7 +162466,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
162339
162466
  return /^\s*requirement(Diagram)?/.test(txt);
162340
162467
  }, "detector");
162341
162468
  var loader11 = /* @__PURE__ */ __name(async () => {
162342
- const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-CtysqbZ4.js");
162469
+ const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-DFM89i-H.js");
162343
162470
  return { id: id11, diagram: diagram2 };
162344
162471
  }, "loader");
162345
162472
  var plugin9 = {
@@ -162353,7 +162480,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
162353
162480
  return /^\s*sequenceDiagram/.test(txt);
162354
162481
  }, "detector");
162355
162482
  var loader12 = /* @__PURE__ */ __name(async () => {
162356
- const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-CK0kbINT.js");
162483
+ const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-BiqqAguj.js");
162357
162484
  return { id: id12, diagram: diagram2 };
162358
162485
  }, "loader");
162359
162486
  var plugin10 = {
@@ -162370,7 +162497,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
162370
162497
  return /^\s*classDiagram/.test(txt);
162371
162498
  }, "detector");
162372
162499
  var loader13 = /* @__PURE__ */ __name(async () => {
162373
- const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-CbQuH3ni.js");
162500
+ const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-Ds7CCTUR.js");
162374
162501
  return { id: id13, diagram: diagram2 };
162375
162502
  }, "loader");
162376
162503
  var plugin11 = {
@@ -162387,7 +162514,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
162387
162514
  return /^\s*classDiagram-v2/.test(txt);
162388
162515
  }, "detector");
162389
162516
  var loader14 = /* @__PURE__ */ __name(async () => {
162390
- const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-CbQuH3ni.js");
162517
+ const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-Ds7CCTUR.js");
162391
162518
  return { id: id14, diagram: diagram2 };
162392
162519
  }, "loader");
162393
162520
  var plugin12 = {
@@ -162404,7 +162531,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
162404
162531
  return /^\s*stateDiagram/.test(txt);
162405
162532
  }, "detector");
162406
162533
  var loader15 = /* @__PURE__ */ __name(async () => {
162407
- const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-D5FS7RFa.js");
162534
+ const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-CkiJXki8.js");
162408
162535
  return { id: id15, diagram: diagram2 };
162409
162536
  }, "loader");
162410
162537
  var plugin13 = {
@@ -162424,7 +162551,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
162424
162551
  return false;
162425
162552
  }, "detector");
162426
162553
  var loader16 = /* @__PURE__ */ __name(async () => {
162427
- const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-DoCLlTuy.js");
162554
+ const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-Bt1BL33e.js");
162428
162555
  return { id: id16, diagram: diagram2 };
162429
162556
  }, "loader");
162430
162557
  var plugin14 = {
@@ -162438,7 +162565,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
162438
162565
  return /^\s*journey/.test(txt);
162439
162566
  }, "detector");
162440
162567
  var loader17 = /* @__PURE__ */ __name(async () => {
162441
- const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-lFTyhPiV.js");
162568
+ const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-DyIx8DQc.js");
162442
162569
  return { id: id17, diagram: diagram2 };
162443
162570
  }, "loader");
162444
162571
  var plugin15 = {
@@ -162505,7 +162632,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
162505
162632
  return false;
162506
162633
  }, "detector");
162507
162634
  var loader18 = /* @__PURE__ */ __name(async () => {
162508
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cg70kWHZ.js");
162635
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-CUlvxSwr.js");
162509
162636
  return { id: id18, diagram: diagram2 };
162510
162637
  }, "loader");
162511
162638
  var plugin16 = {
@@ -162519,7 +162646,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
162519
162646
  return /^\s*timeline/.test(txt);
162520
162647
  }, "detector");
162521
162648
  var loader19 = /* @__PURE__ */ __name(async () => {
162522
- const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-jFqO_Cet.js");
162649
+ const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-DCRlJiLq.js");
162523
162650
  return { id: id19, diagram: diagram2 };
162524
162651
  }, "loader");
162525
162652
  var plugin17 = {
@@ -162533,7 +162660,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
162533
162660
  return /^\s*mindmap/.test(txt);
162534
162661
  }, "detector");
162535
162662
  var loader20 = /* @__PURE__ */ __name(async () => {
162536
- const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-D9ZbRdf_.js");
162663
+ const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-C2EIvkPG.js");
162537
162664
  return { id: id20, diagram: diagram2 };
162538
162665
  }, "loader");
162539
162666
  var plugin18 = {
@@ -162547,7 +162674,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
162547
162674
  return /^\s*kanban/.test(txt);
162548
162675
  }, "detector");
162549
162676
  var loader21 = /* @__PURE__ */ __name(async () => {
162550
- const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-BEr5w27W.js");
162677
+ const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-D6P6mjw2.js");
162551
162678
  return { id: id21, diagram: diagram2 };
162552
162679
  }, "loader");
162553
162680
  var plugin19 = {
@@ -162561,7 +162688,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
162561
162688
  return /^\s*sankey(-beta)?/.test(txt);
162562
162689
  }, "detector");
162563
162690
  var loader22 = /* @__PURE__ */ __name(async () => {
162564
- const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-BTLsDOUO.js");
162691
+ const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-Nmb2f9ga.js");
162565
162692
  return { id: id22, diagram: diagram2 };
162566
162693
  }, "loader");
162567
162694
  var plugin20 = {
@@ -162575,7 +162702,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
162575
162702
  return /^\s*packet(-beta)?/.test(txt);
162576
162703
  }, "detector");
162577
162704
  var loader23 = /* @__PURE__ */ __name(async () => {
162578
- const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-BapZgpGh.js");
162705
+ const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-CSa3a_oJ.js");
162579
162706
  return { id: id23, diagram: diagram2 };
162580
162707
  }, "loader");
162581
162708
  var packet = {
@@ -162588,7 +162715,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
162588
162715
  return /^\s*radar-beta/.test(txt);
162589
162716
  }, "detector");
162590
162717
  var loader24 = /* @__PURE__ */ __name(async () => {
162591
- const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-B30M6IEM.js");
162718
+ const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-Bpupf8hI.js");
162592
162719
  return { id: id24, diagram: diagram2 };
162593
162720
  }, "loader");
162594
162721
  var radar = {
@@ -162601,7 +162728,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
162601
162728
  return /^\s*block(-beta)?/.test(txt);
162602
162729
  }, "detector");
162603
162730
  var loader25 = /* @__PURE__ */ __name(async () => {
162604
- const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-DLnnO4-n.js");
162731
+ const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-BKZ2vg7U.js");
162605
162732
  return { id: id25, diagram: diagram2 };
162606
162733
  }, "loader");
162607
162734
  var plugin21 = {
@@ -162615,7 +162742,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
162615
162742
  return /^\s*architecture/.test(txt);
162616
162743
  }, "detector");
162617
162744
  var loader26 = /* @__PURE__ */ __name(async () => {
162618
- const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-B6S0AQBn.js");
162745
+ const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-T9CAFBo1.js");
162619
162746
  return { id: id26, diagram: diagram2 };
162620
162747
  }, "loader");
162621
162748
  var architecture = {
@@ -162629,7 +162756,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
162629
162756
  return /^\s*treemap/.test(txt);
162630
162757
  }, "detector");
162631
162758
  var loader27 = /* @__PURE__ */ __name(async () => {
162632
- const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-mvCbaKci.js");
162759
+ const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-ByElNwdP.js");
162633
162760
  return { id: id27, diagram: diagram2 };
162634
162761
  }, "loader");
162635
162762
  var treemap = {
@@ -178037,7 +178164,7 @@ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
178037
178164
  const validIds = /* @__PURE__ */ new Set();
178038
178165
  for (const project of projects) {
178039
178166
  for (const worktree of project.worktrees) {
178040
- validIds.add(toWorkspaceId(project.name, worktree.branch));
178167
+ validIds.add(toWorkspaceId(project.name, worktree.name));
178041
178168
  }
178042
178169
  }
178043
178170
  setCache((prev2) => {
@@ -199345,6 +199472,11 @@ function ResourcesPage() {
199345
199472
  queryKey: ["resources", "server"],
199346
199473
  queryFn: () => trpc.services.resourcesServer.query()
199347
199474
  });
199475
+ const appMetricsQuery = useQuery({
199476
+ queryKey: ["resources", "app-metrics"],
199477
+ queryFn: () => invoke("get_app_metrics"),
199478
+ enabled: isDesktop
199479
+ });
199348
199480
  const projectsQuery = useQuery({
199349
199481
  queryKey: ["resources", "projects"],
199350
199482
  queryFn: () => trpc.services.resourcesProjects.query(),
@@ -199408,43 +199540,55 @@ function ResourcesPage() {
199408
199540
  return next2;
199409
199541
  });
199410
199542
  };
199411
- const sortedProjects = [...projects].sort((a2, b2) => {
199412
- const sa = sizes.get(a2.project);
199413
- const sb = sizes.get(b2.project);
199414
- if (sa && sb) return sb.sizeBytes - sa.sizeBytes;
199415
- if (sa && !sb) return -1;
199416
- if (!sa && sb) return 1;
199417
- return 0;
199418
- });
199419
- const knownTotalBytes = Array.from(sizes.values()).reduce((sum, s2) => sum + s2.sizeBytes, 0);
199543
+ const sortedProjects = reactExports.useMemo(
199544
+ () => [...projects].sort((a2, b2) => {
199545
+ const sa = sizes.get(a2.project);
199546
+ const sb = sizes.get(b2.project);
199547
+ if (sa && sb) return sb.sizeBytes - sa.sizeBytes;
199548
+ if (sa && !sb) return -1;
199549
+ if (!sa && sb) return 1;
199550
+ return 0;
199551
+ }),
199552
+ [projects, sizes]
199553
+ );
199554
+ const knownTotalBytes = reactExports.useMemo(
199555
+ () => Array.from(sizes.values()).reduce((sum, s2) => sum + s2.sizeBytes, 0),
199556
+ [sizes]
199557
+ );
199558
+ const totalWorktreeCount = reactExports.useMemo(
199559
+ () => projects.reduce((sum, p2) => sum + p2.worktrees.length, 0),
199560
+ [projects]
199561
+ );
199420
199562
  const allLoaded = sizes.size === projects.length;
199421
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "h-full w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto flex max-w-5xl flex-col gap-8 px-6 py-4", children: [
199422
- /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-server-card", className: "space-y-3", children: [
199423
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2", children: [
199424
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
199425
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: "Server" }),
199426
- /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
199427
- "The Node process serving the Band dashboard (",
199428
- server ? `pid ${server.pid}` : "…",
199429
- ")."
199430
- ] })
199431
- ] }),
199432
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
199433
- Button,
199434
- {
199435
- variant: "outline",
199436
- size: "sm",
199437
- "data-testid": "resources-refresh-server",
199438
- onClick: () => serverQuery.refetch(),
199439
- disabled: serverQuery.isFetching,
199440
- children: [
199441
- serverQuery.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
199442
- "Refresh"
199443
- ]
199444
- }
199445
- )
199446
- ] }),
199447
- serverQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
199563
+ const [serverOpen, setServerOpen] = reactExports.useState(false);
199564
+ const [worktreesOpen, setWorktreesOpen] = reactExports.useState(false);
199565
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "h-full w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-5xl px-6 py-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "overflow-hidden rounded-xl border border-border [&>*+*]:border-t [&>*+*]:border-border", children: [
199566
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open: serverOpen, onOpenChange: setServerOpen, asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-server-card", children: [
199567
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199568
+ PanelHeader,
199569
+ {
199570
+ title: "Server",
199571
+ toggleTestId: "resources-server-toggle",
199572
+ open: serverOpen,
199573
+ totalTestId: "resources-server-total",
199574
+ total: server ? formatMB(server.memory.rssBytes) : "…",
199575
+ description: `The Node process serving the Band dashboard (${server ? `pid ${server.pid}` : "…"}).`,
199576
+ refresh: /* @__PURE__ */ jsxRuntimeExports.jsx(
199577
+ Button,
199578
+ {
199579
+ variant: "outline",
199580
+ size: "icon-sm",
199581
+ "aria-label": "Refresh",
199582
+ title: "Refresh",
199583
+ "data-testid": "resources-refresh-server",
199584
+ onClick: () => serverQuery.refetch(),
199585
+ disabled: serverQuery.isFetching,
199586
+ children: serverQuery.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
199587
+ }
199588
+ )
199589
+ }
199590
+ ),
199591
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border p-4", children: serverQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
199448
199592
  "Failed to load server snapshot: ",
199449
199593
  String(serverQuery.error)
199450
199594
  ] }) : !server ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
@@ -199467,37 +199611,42 @@ function ResourcesPage() {
199467
199611
  /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Array buffers", children: formatMB(server.memory.arrayBuffersBytes) }),
199468
199612
  /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (user)", children: formatCpuMs(server.cpu.userMicros) }),
199469
199613
  /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (system)", children: formatCpuMs(server.cpu.systemMicros) })
199470
- ] })
199471
- ] }),
199472
- /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-worktrees-card", className: "space-y-3", children: [
199473
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2", children: [
199474
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
199475
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: "Worktrees" }),
199476
- /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
199614
+ ] }) }) })
199615
+ ] }) }),
199616
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ElectronCard, { query: appMetricsQuery }),
199617
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open: worktreesOpen, onOpenChange: setWorktreesOpen, asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-worktrees-card", children: [
199618
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199619
+ PanelHeader,
199620
+ {
199621
+ title: "Worktrees",
199622
+ toggleTestId: "resources-worktrees-toggle",
199623
+ open: worktreesOpen,
199624
+ totalTestId: "resources-worktrees-total",
199625
+ total: `${formatBytes(knownTotalBytes)}${allLoaded ? "" : " (partial)"}`,
199626
+ description: /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
199477
199627
  "Disk usage per tracked git project (allocated blocks, as reported by",
199478
199628
  " ",
199479
199629
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "du" }),
199480
199630
  "). Sizes load per project in batches of ",
199481
199631
  PROJECT_FETCH_CONCURRENCY,
199482
199632
  ". Click a project to see its per-worktree breakdown."
199483
- ] })
199484
- ] }),
199485
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
199486
- Button,
199487
- {
199488
- variant: "outline",
199489
- size: "sm",
199490
- "data-testid": "resources-refresh-worktrees",
199491
- onClick: handleRefreshSizes,
199492
- disabled: projectsQuery.isFetching || !allLoaded,
199493
- children: [
199494
- projectsQuery.isFetching || !allLoaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
199495
- "Refresh"
199496
- ]
199497
- }
199498
- )
199499
- ] }),
199500
- projectsQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
199633
+ ] }),
199634
+ refresh: /* @__PURE__ */ jsxRuntimeExports.jsx(
199635
+ Button,
199636
+ {
199637
+ variant: "outline",
199638
+ size: "icon-sm",
199639
+ "aria-label": "Refresh",
199640
+ title: "Refresh",
199641
+ "data-testid": "resources-refresh-worktrees",
199642
+ onClick: handleRefreshSizes,
199643
+ disabled: projectsQuery.isFetching || !allLoaded,
199644
+ children: projectsQuery.isFetching || !allLoaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
199645
+ }
199646
+ )
199647
+ }
199648
+ ),
199649
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border p-4", children: projectsQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
199501
199650
  "Failed to load projects: ",
199502
199651
  String(projectsQuery.error)
199503
199652
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -199511,7 +199660,14 @@ function ResourcesPage() {
199511
199660
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Worktrees" }),
199512
199661
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Total size" })
199513
199662
  ] }) }),
199514
- /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: sortedProjects.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("tr", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("td", { colSpan: 3, className: "py-6 text-center text-sm text-muted-foreground", children: projectsQuery.isFetching ? "Loading…" : "No git projects found" }) }) : sortedProjects.map((project) => {
199663
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: sortedProjects.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("tr", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
199664
+ "td",
199665
+ {
199666
+ colSpan: 3,
199667
+ className: "py-6 text-center text-sm text-muted-foreground",
199668
+ children: projectsQuery.isFetching ? "Loading…" : "No git projects found"
199669
+ }
199670
+ ) }) : sortedProjects.map((project) => {
199515
199671
  const size2 = sizes.get(project.project);
199516
199672
  const isExpanded = expandedProjects.has(project.project);
199517
199673
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(reactExports.Fragment, { children: [
@@ -199593,7 +199749,7 @@ function ResourcesPage() {
199593
199749
  "Total",
199594
199750
  allLoaded ? "" : " (partial)"
199595
199751
  ] }),
199596
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: projects.reduce((sum, p2) => sum + p2.worktrees.length, 0) }),
199752
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: totalWorktreeCount }),
199597
199753
  /* @__PURE__ */ jsxRuntimeExports.jsx(
199598
199754
  "td",
199599
199755
  {
@@ -199605,10 +199761,144 @@ function ResourcesPage() {
199605
199761
  ] }) })
199606
199762
  ]
199607
199763
  }
199608
- ) })
199609
- ] })
199764
+ ) }) }) })
199765
+ ] }) })
199766
+ ] }) }) });
199767
+ }
199768
+ function ElectronCard({ query }) {
199769
+ const [open2, setOpen] = reactExports.useState(false);
199770
+ if (!isDesktop) return null;
199771
+ const metrics = query.data;
199772
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open: open2, onOpenChange: setOpen, asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-electron-card", children: [
199773
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199774
+ PanelHeader,
199775
+ {
199776
+ title: "Desktop app (Electron)",
199777
+ toggleTestId: "resources-electron-toggle",
199778
+ open: open2,
199779
+ totalTestId: "resources-electron-total",
199780
+ total: metrics ? formatBytes(metrics.totalMemoryKB * 1024) : "…",
199781
+ description: "Per-process CPU and memory for the Electron main process, GPU process, Chromium renderers (the dashboard and each browser tab), and utility helpers.",
199782
+ refresh: /* @__PURE__ */ jsxRuntimeExports.jsx(
199783
+ Button,
199784
+ {
199785
+ variant: "outline",
199786
+ size: "icon-sm",
199787
+ "aria-label": "Refresh",
199788
+ title: "Refresh",
199789
+ "data-testid": "resources-refresh-electron",
199790
+ onClick: () => query.refetch(),
199791
+ disabled: query.isFetching,
199792
+ children: query.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
199793
+ }
199794
+ )
199795
+ }
199796
+ ),
199797
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border p-4", children: query.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
199798
+ "Failed to load Electron metrics: ",
199799
+ String(query.error)
199800
+ ] }) : !metrics ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
199801
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }),
199802
+ "Loading…"
199803
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
199804
+ "table",
199805
+ {
199806
+ "data-testid": "resources-electron-table",
199807
+ className: "w-full border-collapse text-sm",
199808
+ children: [
199809
+ /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b border-border text-left text-xs font-medium uppercase tracking-wide text-muted-foreground", children: [
199810
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3", children: "Process" }),
199811
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3", children: "Type" }),
199812
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "PID" }),
199813
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "CPU" }),
199814
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Memory" })
199815
+ ] }) }),
199816
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: metrics.processes.map((p2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
199817
+ "tr",
199818
+ {
199819
+ "data-testid": `resources-electron-row-${p2.pid}`,
199820
+ className: "border-b border-border/60 last:border-0 hover:bg-muted/40",
199821
+ children: [
199822
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3", children: p2.label }),
199823
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-muted-foreground", children: p2.type }),
199824
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: p2.pid }),
199825
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: [
199826
+ p2.cpuPercent.toFixed(1),
199827
+ "%"
199828
+ ] }),
199829
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: formatBytes(p2.memoryKB * 1024) })
199830
+ ]
199831
+ },
199832
+ p2.pid
199833
+ )) }),
199834
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tfoot", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t-2 border-border font-medium", children: [
199835
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "py-2 pr-3", "data-testid": "resources-electron-total-count", children: [
199836
+ "Total (",
199837
+ metrics.processCount,
199838
+ ")"
199839
+ ] }),
199840
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3" }),
199841
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3" }),
199842
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
199843
+ "td",
199844
+ {
199845
+ className: "py-2 pr-3 text-right tabular-nums",
199846
+ "data-testid": "resources-electron-total-cpu",
199847
+ children: [
199848
+ metrics.totalCpuPercent.toFixed(1),
199849
+ "%"
199850
+ ]
199851
+ }
199852
+ ),
199853
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199854
+ "td",
199855
+ {
199856
+ className: "py-2 pr-3 text-right tabular-nums",
199857
+ "data-testid": "resources-electron-total-memory",
199858
+ children: formatBytes(metrics.totalMemoryKB * 1024)
199859
+ }
199860
+ )
199861
+ ] }) })
199862
+ ]
199863
+ }
199864
+ ) }) }) })
199610
199865
  ] }) });
199611
199866
  }
199867
+ function PanelHeader({
199868
+ title,
199869
+ toggleTestId,
199870
+ open: open2,
199871
+ total,
199872
+ totalTestId,
199873
+ description,
199874
+ refresh
199875
+ }) {
199876
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2 p-4", children: [
199877
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
199878
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
199879
+ CollapsibleTrigger,
199880
+ {
199881
+ "data-testid": toggleTestId,
199882
+ className: "group flex w-full items-center gap-2 text-left",
199883
+ children: [
199884
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
199885
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: title }),
199886
+ !open2 && /* @__PURE__ */ jsxRuntimeExports.jsx(
199887
+ "span",
199888
+ {
199889
+ "data-testid": totalTestId,
199890
+ className: "ml-auto pl-2 font-mono text-sm font-normal text-muted-foreground",
199891
+ children: total
199892
+ }
199893
+ )
199894
+ ]
199895
+ }
199896
+ ) }),
199897
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "pl-6 text-sm text-muted-foreground", children: description })
199898
+ ] }),
199899
+ refresh
199900
+ ] });
199901
+ }
199612
199902
  function ServerField({ label, children: children2 }) {
199613
199903
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-0.5", children: [
199614
199904
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: label }),
@@ -199698,14 +199988,14 @@ function TasksPageContent() {
199698
199988
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col overflow-hidden", children: [
199699
199989
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b border-border/50 px-4 py-2", children: [
199700
199990
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: projectFilter, onValueChange: setProjectFilter, children: [
199701
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 w-40 text-xs", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All Projects" }) }),
199991
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 w-40 text-xs", "data-testid": "tasks__project-filter", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All Projects" }) }),
199702
199992
  /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
199703
199993
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "all", children: "All Projects" }),
199704
199994
  projectNames.map((name2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: name2, children: name2 }, name2))
199705
199995
  ] })
199706
199996
  ] }),
199707
199997
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: statusFilter, onValueChange: (v2) => setStatusFilter(v2), children: [
199708
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 w-40 text-xs", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All Statuses" }) }),
199998
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 w-40 text-xs", "data-testid": "tasks__status-filter", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All Statuses" }) }),
199709
199999
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: ["all", "running", "completed", "failed"].map((status) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: status, className: "capitalize", children: status === "all" ? "All Statuses" : status }, status)) })
199710
200000
  ] }),
199711
200001
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-1", children: [
@@ -199724,6 +200014,7 @@ function TasksPageContent() {
199724
200014
  variant: "outline",
199725
200015
  size: "xs",
199726
200016
  className: "hidden sm:inline-flex",
200017
+ "data-testid": "tasks__new-task-button",
199727
200018
  onClick: () => setShowNewTask(true),
199728
200019
  children: [
199729
200020
  /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3" }),
@@ -199752,13 +200043,20 @@ function TasksPageContent() {
199752
200043
  "Retry"
199753
200044
  ] })
199754
200045
  ] }),
199755
- !loading && !error && filteredTasks.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center gap-3 py-16 text-center", children: [
199756
- /* @__PURE__ */ jsxRuntimeExports.jsx(ListTodo, { className: "size-10 text-muted-foreground" }),
199757
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
199758
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium", children: "No tasks found" }),
199759
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: tasks.length > 0 ? "Try adjusting your filters" : "Dispatch a new task to get started" })
199760
- ] })
199761
- ] }),
200046
+ !loading && !error && filteredTasks.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
200047
+ "div",
200048
+ {
200049
+ className: "flex flex-col items-center justify-center gap-3 py-16 text-center",
200050
+ "data-testid": "tasks__empty-state",
200051
+ children: [
200052
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ListTodo, { className: "size-10 text-muted-foreground" }),
200053
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
200054
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium", children: "No tasks found" }),
200055
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: tasks.length > 0 ? "Try adjusting your filters" : "Dispatch a new task to get started" })
200056
+ ] })
200057
+ ]
200058
+ }
200059
+ ),
199762
200060
  filteredTasks.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-2 p-4", children: filteredTasks.map((task2) => /* @__PURE__ */ jsxRuntimeExports.jsx(TaskCard, { task: task2, onAction: fetchData, agentMap }, task2.id)) })
199763
200061
  ] }),
199764
200062
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -199774,17 +200072,25 @@ function TasksPageContent() {
199774
200072
  function StatusBadge({ status }) {
199775
200073
  switch (status) {
199776
200074
  case "running":
199777
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1.5", children: [
200075
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1.5", "data-testid": "tasks__status-badge--running", children: [
199778
200076
  /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }),
199779
200077
  "Running"
199780
200078
  ] });
199781
200079
  case "completed":
199782
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1.5 text-green-600 dark:text-green-400", children: [
199783
- /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-3" }),
199784
- "Completed"
199785
- ] });
200080
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
200081
+ Badge,
200082
+ {
200083
+ variant: "secondary",
200084
+ className: "gap-1.5 text-green-600 dark:text-green-400",
200085
+ "data-testid": "tasks__status-badge--completed",
200086
+ children: [
200087
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-3" }),
200088
+ "Completed"
200089
+ ]
200090
+ }
200091
+ );
199786
200092
  case "failed":
199787
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "destructive", className: "gap-1.5", children: [
200093
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "destructive", className: "gap-1.5", "data-testid": "tasks__status-badge--failed", children: [
199788
200094
  /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "size-3" }),
199789
200095
  "Failed"
199790
200096
  ] });
@@ -199819,78 +200125,86 @@ function TaskCard({
199819
200125
  setActing(false);
199820
200126
  }
199821
200127
  }, [task2.id, onAction]);
199822
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 rounded-lg border-2 border-border/50 p-4 transition-colors hover:border-border", children: [
199823
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
199824
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "line-clamp-2 min-w-0 flex-1 text-sm font-medium text-foreground", children: task2.prompt }),
199825
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
199826
- task2.status === "running" && /* @__PURE__ */ jsxRuntimeExports.jsx(
199827
- Button,
199828
- {
199829
- variant: "ghost",
199830
- size: "icon",
199831
- className: "size-7",
199832
- onClick: handleCancel,
199833
- disabled: acting,
199834
- title: "Cancel task",
199835
- children: acting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(CircleX, { className: "size-3.5" })
199836
- }
199837
- ),
199838
- (task2.status === "completed" || task2.status === "failed") && /* @__PURE__ */ jsxRuntimeExports.jsx(
199839
- Button,
199840
- {
199841
- variant: "ghost",
199842
- size: "icon",
199843
- className: "size-7",
199844
- onClick: handleRerun,
199845
- disabled: acting,
199846
- title: "Re-run task",
199847
- children: acting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: "size-3.5" })
199848
- }
199849
- ),
199850
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatusBadge, { status: task2.status })
199851
- ] })
199852
- ] }),
199853
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
199854
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium text-foreground/70", children: [
199855
- task2.project,
199856
- "/",
199857
- task2.branch
199858
- ] }),
199859
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
199860
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1", children: [
199861
- /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
199862
- relativeTime(task2.startedAt)
199863
- ] }),
199864
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
199865
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatDuration(task2.startedAt, task2.completedAt) }),
199866
- task2.codingAgentId && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
199867
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
199868
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: agentMap.get(task2.codingAgentId)?.label ?? task2.codingAgentId })
199869
- ] }),
199870
- task2.model && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
199871
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
199872
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: task2.model })
199873
- ] }),
199874
- task2.mode && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
199875
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
199876
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "capitalize", children: task2.mode })
199877
- ] }),
199878
- sessionHref && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
199879
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
199880
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
199881
- Link,
199882
- {
199883
- to: sessionHref,
199884
- className: "inline-flex items-center gap-1 text-primary hover:underline",
199885
- children: [
199886
- /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink$1, { className: "size-3" }),
199887
- "Session"
199888
- ]
199889
- }
199890
- )
199891
- ] })
199892
- ] })
199893
- ] });
200128
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
200129
+ "div",
200130
+ {
200131
+ className: "flex flex-col gap-2 rounded-lg border-2 border-border/50 p-4 transition-colors hover:border-border",
200132
+ "data-testid": `tasks__card--${task2.id}`,
200133
+ children: [
200134
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
200135
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "line-clamp-2 min-w-0 flex-1 text-sm font-medium text-foreground", children: task2.prompt }),
200136
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
200137
+ task2.status === "running" && /* @__PURE__ */ jsxRuntimeExports.jsx(
200138
+ Button,
200139
+ {
200140
+ variant: "ghost",
200141
+ size: "icon",
200142
+ className: "size-7",
200143
+ onClick: handleCancel,
200144
+ disabled: acting,
200145
+ title: "Cancel task",
200146
+ children: acting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(CircleX, { className: "size-3.5" })
200147
+ }
200148
+ ),
200149
+ (task2.status === "completed" || task2.status === "failed") && /* @__PURE__ */ jsxRuntimeExports.jsx(
200150
+ Button,
200151
+ {
200152
+ variant: "ghost",
200153
+ size: "icon",
200154
+ className: "size-7",
200155
+ onClick: handleRerun,
200156
+ disabled: acting,
200157
+ title: "Re-run task",
200158
+ children: acting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: "size-3.5" })
200159
+ }
200160
+ ),
200161
+ /* @__PURE__ */ jsxRuntimeExports.jsx(StatusBadge, { status: task2.status })
200162
+ ] })
200163
+ ] }),
200164
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
200165
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium text-foreground/70", children: [
200166
+ task2.project,
200167
+ "/",
200168
+ task2.branch
200169
+ ] }),
200170
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200171
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1", children: [
200172
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
200173
+ relativeTime(task2.startedAt)
200174
+ ] }),
200175
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200176
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatDuration(task2.startedAt, task2.completedAt) }),
200177
+ task2.codingAgentId && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200178
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200179
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: agentMap.get(task2.codingAgentId)?.label ?? task2.codingAgentId })
200180
+ ] }),
200181
+ task2.model && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200182
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200183
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: task2.model })
200184
+ ] }),
200185
+ task2.mode && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200186
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200187
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "capitalize", children: task2.mode })
200188
+ ] }),
200189
+ sessionHref && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200190
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200191
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
200192
+ Link,
200193
+ {
200194
+ to: sessionHref,
200195
+ className: "inline-flex items-center gap-1 text-primary hover:underline",
200196
+ "data-testid": "tasks__session-link",
200197
+ children: [
200198
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink$1, { className: "size-3" }),
200199
+ "Session"
200200
+ ]
200201
+ }
200202
+ )
200203
+ ] })
200204
+ ] })
200205
+ ]
200206
+ }
200207
+ );
199894
200208
  }
199895
200209
  function NewTaskDialog({
199896
200210
  open: open2,
@@ -199988,7 +200302,7 @@ function NewTaskDialog({
199988
200302
  setSubmitting(false);
199989
200303
  }
199990
200304
  }, [workspaceId, prompt, selectedMode, selectedModel, selectedAgent, onSubmit]);
199991
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { children: [
200305
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { "data-testid": "tasks__new-task-dialog", children: [
199992
200306
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
199993
200307
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "New Task" }),
199994
200308
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Dispatch a new task to a coding agent" })
@@ -199997,7 +200311,7 @@ function NewTaskDialog({
199997
200311
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
199998
200312
  /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium", htmlFor: "project-select", children: "Project" }),
199999
200313
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: selectedProject, onValueChange: handleProjectChange, children: [
200000
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "project-select", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Select a project" }) }),
200314
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "project-select", "data-testid": "tasks__new-task-project", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Select a project" }) }),
200001
200315
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: projects.map((p2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: p2.name, children: p2.name }, p2.name)) })
200002
200316
  ] })
200003
200317
  ] }),
@@ -200010,7 +200324,7 @@ function NewTaskDialog({
200010
200324
  onValueChange: setSelectedBranch,
200011
200325
  disabled: !selectedProject,
200012
200326
  children: [
200013
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "branch-select", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
200327
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "branch-select", "data-testid": "tasks__new-task-workspace", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
200014
200328
  SelectValue,
200015
200329
  {
200016
200330
  placeholder: selectedProject ? "Select a workspace" : "Select a project first"
@@ -200027,6 +200341,7 @@ function NewTaskDialog({
200027
200341
  Textarea,
200028
200342
  {
200029
200343
  id: "task-prompt",
200344
+ "data-testid": "tasks__new-task-prompt",
200030
200345
  placeholder: "Describe what the agent should do...",
200031
200346
  value: prompt,
200032
200347
  onChange: (e3) => setPrompt(e3.target.value),
@@ -201402,6 +201717,79 @@ function ToolbarOverflowMenuItems() {
201402
201717
  ] })
201403
201718
  ] });
201404
201719
  }
201720
+ function ToolbarActionBar() {
201721
+ const ctx = reactExports.useContext(ToolbarOverflowContext);
201722
+ if (!ctx) {
201723
+ throw new Error("ToolbarActionBar must be used inside ToolbarOverflowProvider");
201724
+ }
201725
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
201726
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
201727
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
201728
+ Button,
201729
+ {
201730
+ size: "icon-sm",
201731
+ variant: "ghost",
201732
+ className: "text-muted-foreground",
201733
+ "aria-label": "Resources",
201734
+ "data-testid": "project-list__resources-button",
201735
+ onClick: ctx.openResources,
201736
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Activity, { className: "size-4" })
201737
+ }
201738
+ ) }),
201739
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: "Resources" })
201740
+ ] }),
201741
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
201742
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
201743
+ Button,
201744
+ {
201745
+ size: "icon-sm",
201746
+ variant: "ghost",
201747
+ className: "text-muted-foreground",
201748
+ "aria-label": "Usage",
201749
+ "data-testid": "project-list__usage-button",
201750
+ onClick: ctx.openReports,
201751
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartColumn, { className: "size-4" })
201752
+ }
201753
+ ) }),
201754
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: "Usage" })
201755
+ ] }),
201756
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
201757
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
201758
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
201759
+ Button,
201760
+ {
201761
+ size: "icon-sm",
201762
+ variant: "ghost",
201763
+ className: "text-muted-foreground",
201764
+ "aria-label": "More actions",
201765
+ "data-testid": "project-list__overflow-trigger",
201766
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Ellipsis, { className: "size-4" })
201767
+ }
201768
+ ) }) }),
201769
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: "More" })
201770
+ ] }),
201771
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "end", children: [
201772
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openTasks, children: [
201773
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ListTodo, { className: "size-4" }),
201774
+ "Tasks"
201775
+ ] }),
201776
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openCronjobs, children: [
201777
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Timer$1, { className: "size-4" }),
201778
+ "Cronjobs"
201779
+ ] }),
201780
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openTunnel, children: [
201781
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
201782
+ Globe,
201783
+ {
201784
+ className: ctx.tunnelStatus === "error" ? "size-4 text-red-500" : ctx.tunnelStatus === "running" ? "size-4 text-green-500" : "size-4"
201785
+ }
201786
+ ),
201787
+ ctx.tunnelStatus === "running" ? "Mobile access" : "Start tunnel"
201788
+ ] })
201789
+ ] })
201790
+ ] })
201791
+ ] });
201792
+ }
201405
201793
  const bandTheme = {
201406
201794
  name: "band",
201407
201795
  className: "dockview-theme-band"
@@ -201421,12 +201809,12 @@ const PANEL_SHORTCUTS = {
201421
201809
  browser: "⇧⌘B"
201422
201810
  };
201423
201811
  const DockviewTerminalContainer = reactExports.lazy(
201424
- () => import("./DockviewTerminalContainer-D6ZTAITZ.js").then((m2) => ({
201812
+ () => import("./DockviewTerminalContainer-CMbrr8wZ.js").then((m2) => ({
201425
201813
  default: m2.DockviewTerminalContainer
201426
201814
  }))
201427
201815
  );
201428
201816
  const DockviewBrowserContainer = reactExports.lazy(
201429
- () => import("./DockviewBrowserContainer-B8W-NI5l.js").then((m2) => ({
201817
+ () => import("./DockviewBrowserContainer-BDsafKFK.js").then((m2) => ({
201430
201818
  default: m2.DockviewBrowserContainer
201431
201819
  }))
201432
201820
  );
@@ -203125,8 +203513,15 @@ function AppShell() {
203125
203513
  className: "h-full flex flex-col overflow-hidden border-r border-border bg-sidebar",
203126
203514
  "data-testid": "app-shell__sidebar",
203127
203515
  children: [
203128
- /* @__PURE__ */ jsxRuntimeExports.jsx(SidebarTitleBar, { ...navControlProps, offsetClass: titleBarOffset }),
203129
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardShell, { hideMenu: true, hideTitleBar: true }) })
203516
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
203517
+ SidebarTitleBar,
203518
+ {
203519
+ ...navControlProps,
203520
+ menuItems: void 0,
203521
+ offsetClass: titleBarOffset
203522
+ }
203523
+ ),
203524
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardShell, { hideTitleBar: true, bottomActions: /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarActionBar, {}) }) })
203130
203525
  ]
203131
203526
  }
203132
203527
  )
@@ -203176,12 +203571,12 @@ function RootLayout() {
203176
203571
  ] })
203177
203572
  ] });
203178
203573
  }
203179
- const $$splitComponentImporter$1 = () => import("./index-DsRToCeg.js");
203574
+ const $$splitComponentImporter$1 = () => import("./index-B9xqso9p.js");
203180
203575
  const Route$1 = createFileRoute("/")({
203181
203576
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
203182
203577
  });
203183
- const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-B0M_Sxj3.js");
203184
- const $$splitComponentImporter = () => import("./workspace._workspaceId-CGq293LY.js");
203578
+ const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-Dj6Y8WPo.js");
203579
+ const $$splitComponentImporter = () => import("./workspace._workspaceId-BMnOV3pd.js");
203185
203580
  const Route2 = createFileRoute("/workspace/$workspaceId")({
203186
203581
  component: lazyRouteComponent($$splitComponentImporter, "component"),
203187
203582
  // Bookmarks / shared links from before route unification (`/workspace/$id/changes`,
@@ -203317,7 +203712,7 @@ export {
203317
203712
  sin as ay,
203318
203713
  min as az,
203319
203714
  LRLanguage as b,
203320
- ArrowLeft as b$,
203715
+ cn$2 as b$,
203321
203716
  insertNode as b0,
203322
203717
  positionNode as b1,
203323
203718
  getLineFunctionsWithOffset as b2,
@@ -203348,13 +203743,13 @@ export {
203348
203743
  MessageSquare as bR,
203349
203744
  useIsDesktop as bS,
203350
203745
  ToolbarOverflowProvider as bT,
203351
- ToolbarOverflowMenuItems as bU,
203746
+ ToolbarActionBar as bU,
203352
203747
  isDesktop as bV,
203353
- GitCompare as bW,
203354
- FolderOpen as bX,
203355
- useDashboardStore as bY,
203356
- useNavigate as bZ,
203357
- DesktopDragRegion as b_,
203748
+ array$2 as bW,
203749
+ ordinal as bX,
203750
+ Root$5 as bY,
203751
+ Content$1 as bZ,
203752
+ Close as b_,
203358
203753
  NodeWeakMap as ba,
203359
203754
  snippetCompletion as bb,
203360
203755
  Tag as bc,
@@ -203382,121 +203777,129 @@ export {
203382
203777
  isFunction$1 as by,
203383
203778
  isEmpty as bz,
203384
203779
  continuedIndent as c,
203385
- timeTuesday as c$,
203386
- ChevronsUpDown as c0,
203387
- DiffView as c1,
203388
- CodeBrowserView as c2,
203389
- QuickOpenDialog as c3,
203390
- SearchFilesDialog as c4,
203391
- WorkspacePickerDialog as c5,
203392
- useDiffTarget as c6,
203393
- useSettingsQuery as c7,
203394
- agentTypeSupportsSessionListing as c8,
203395
- ChatView as c9,
203396
- Search as cA,
203397
- Trash2 as cB,
203398
- DropdownMenu as cC,
203399
- DropdownMenuTrigger as cD,
203400
- ChevronDown as cE,
203401
- DropdownMenuContent as cF,
203402
- DropdownMenuItem as cG,
203403
- TriangleAlert as cH,
203404
- RotateCw as cI,
203405
- Rgb as cJ,
203406
- rgbConvert as cK,
203407
- define as cL,
203408
- extend$2 as cM,
203409
- Color as cN,
203410
- nogamma as cO,
203411
- hue as cP,
203412
- time$2 as cQ,
203413
- min$1 as cR,
203414
- max$1 as cS,
203415
- dayjs2 as cT,
203416
- timeFormat as cU,
203417
- timeMonth as cV,
203418
- timeSunday as cW,
203419
- timeSaturday as cX,
203420
- timeFriday as cY,
203421
- timeThursday as cZ,
203422
- timeWednesday as c_,
203423
- array$2 as ca,
203424
- ordinal as cb,
203425
- getUserDefinedConfig as cc,
203426
- getIconSVG as cd,
203427
- registerIconPacks as ce,
203428
- unknownIcon as cf,
203429
- isFilePath as cg,
203430
- writeClipboardText as ch,
203431
- readClipboardText as ci,
203432
- ArrowUp as cj,
203433
- ArrowDown as ck,
203434
- ArrowRight as cl,
203435
- ClipboardCopy as cm,
203436
- ClipboardPaste as cn,
203437
- getCurrentZoomLevel as co,
203438
- openExternalUrl as cp,
203439
- subscribeToZoomChanges as cq,
203440
- SearchBar as cr,
203441
- ZOOM_CSS_VAR as cs,
203442
- invoke as ct,
203443
- listen as cu,
203444
- reactDomExports as cv,
203445
- Globe as cw,
203446
- Popover as cx,
203447
- PopoverTrigger as cy,
203448
- PopoverContent as cz,
203780
+ dayjs2 as c$,
203781
+ Title as c0,
203782
+ Description as c1,
203783
+ Portal$4 as c2,
203784
+ Overlay$1 as c3,
203785
+ GitCompare as c4,
203786
+ FolderOpen as c5,
203787
+ useDashboardStore as c6,
203788
+ DesktopDragRegion as c7,
203789
+ Menu$1 as c8,
203790
+ ChevronsUpDown as c9,
203791
+ ZOOM_CSS_VAR as cA,
203792
+ invoke as cB,
203793
+ listen as cC,
203794
+ reactDomExports as cD,
203795
+ Globe as cE,
203796
+ Popover as cF,
203797
+ PopoverTrigger as cG,
203798
+ PopoverContent as cH,
203799
+ Search as cI,
203800
+ Trash2 as cJ,
203801
+ DropdownMenu as cK,
203802
+ DropdownMenuTrigger as cL,
203803
+ ChevronDown as cM,
203804
+ DropdownMenuContent as cN,
203805
+ DropdownMenuItem as cO,
203806
+ TriangleAlert as cP,
203807
+ RotateCw as cQ,
203808
+ Rgb as cR,
203809
+ rgbConvert as cS,
203810
+ define as cT,
203811
+ extend$2 as cU,
203812
+ Color as cV,
203813
+ nogamma as cW,
203814
+ hue as cX,
203815
+ time$2 as cY,
203816
+ min$1 as cZ,
203817
+ max$1 as c_,
203818
+ DiffView as ca,
203819
+ CodeBrowserView as cb,
203820
+ QuickOpenDialog as cc,
203821
+ SearchFilesDialog as cd,
203822
+ WorkspacePickerDialog as ce,
203823
+ useDiffTarget as cf,
203824
+ useSettingsQuery as cg,
203825
+ agentTypeSupportsSessionListing as ch,
203826
+ ChatView as ci,
203827
+ getUserDefinedConfig as cj,
203828
+ getIconSVG as ck,
203829
+ registerIconPacks as cl,
203830
+ unknownIcon as cm,
203831
+ isFilePath as cn,
203832
+ writeClipboardText as co,
203833
+ readClipboardText as cp,
203834
+ ArrowLeft as cq,
203835
+ ArrowUp as cr,
203836
+ ArrowDown as cs,
203837
+ ArrowRight as ct,
203838
+ ClipboardCopy as cu,
203839
+ ClipboardPaste as cv,
203840
+ getCurrentZoomLevel as cw,
203841
+ openExternalUrl as cx,
203842
+ subscribeToZoomChanges as cy,
203843
+ SearchBar as cz,
203449
203844
  foldInside as d,
203450
- timeMonday as d0,
203451
- timeDay as d1,
203452
- timeHour as d2,
203453
- timeMinute as d3,
203454
- second as d4,
203455
- millisecond as d5,
203456
- isObject$2 as d6,
203457
- isIterateeCall$1 as d7,
203458
- keysIn as d8,
203459
- eq as d9,
203460
- getTag$1 as dA,
203461
- nodeUtil as dB,
203462
- copyArray as dC,
203463
- isBuffer$1 as dD,
203464
- cloneBuffer as dE,
203465
- initCloneObject as dF,
203466
- Stack as dG,
203467
- MapCache as dH,
203468
- Uint8Array$1 as dI,
203469
- isTypedArray$1 as dJ,
203470
- isLength$1 as dK,
203471
- Set$1 as dL,
203472
- createAssigner as dM,
203473
- isPrototype as dN,
203474
- router as dO,
203475
- isArrayLike$1 as da,
203476
- isArray$1 as db,
203477
- identity$1 as dc,
203478
- isIndex$1 as dd,
203479
- assignValue as de,
203480
- format as df,
203481
- styles2String as dg,
203482
- isLabelStyle as dh,
203483
- setToString as di,
203484
- overRest as dj,
203485
- baseFor as dk,
203486
- baseAssignValue as dl,
203487
- baseUnary as dm,
203488
- merge$1 as dn,
203489
- isObjectLike$1 as dp,
203490
- baseGetTag as dq,
203491
- Symbol$1 as dr,
203492
- arrayLikeKeys as ds,
203493
- baseKeys as dt,
203494
- memoize as du,
203495
- isArguments$1 as dv,
203496
- copyObject as dw,
203497
- getPrototype as dx,
203498
- cloneArrayBuffer as dy,
203499
- cloneTypedArray as dz,
203845
+ timeFormat as d0,
203846
+ timeMonth as d1,
203847
+ timeSunday as d2,
203848
+ timeSaturday as d3,
203849
+ timeFriday as d4,
203850
+ timeThursday as d5,
203851
+ timeWednesday as d6,
203852
+ timeTuesday as d7,
203853
+ timeMonday as d8,
203854
+ timeDay as d9,
203855
+ arrayLikeKeys as dA,
203856
+ baseKeys as dB,
203857
+ memoize as dC,
203858
+ isArguments$1 as dD,
203859
+ copyObject as dE,
203860
+ getPrototype as dF,
203861
+ cloneArrayBuffer as dG,
203862
+ cloneTypedArray as dH,
203863
+ getTag$1 as dI,
203864
+ nodeUtil as dJ,
203865
+ copyArray as dK,
203866
+ isBuffer$1 as dL,
203867
+ cloneBuffer as dM,
203868
+ initCloneObject as dN,
203869
+ Stack as dO,
203870
+ MapCache as dP,
203871
+ Uint8Array$1 as dQ,
203872
+ isTypedArray$1 as dR,
203873
+ isLength$1 as dS,
203874
+ Set$1 as dT,
203875
+ createAssigner as dU,
203876
+ isPrototype as dV,
203877
+ router as dW,
203878
+ timeHour as da,
203879
+ timeMinute as db,
203880
+ second as dc,
203881
+ millisecond as dd,
203882
+ isObject$2 as de,
203883
+ isIterateeCall$1 as df,
203884
+ keysIn as dg,
203885
+ eq as dh,
203886
+ isArrayLike$1 as di,
203887
+ isArray$1 as dj,
203888
+ identity$1 as dk,
203889
+ isIndex$1 as dl,
203890
+ assignValue as dm,
203891
+ format as dn,
203892
+ styles2String as dp,
203893
+ isLabelStyle as dq,
203894
+ setToString as dr,
203895
+ overRest as ds,
203896
+ baseFor as dt,
203897
+ baseAssignValue as du,
203898
+ baseUnary as dv,
203899
+ merge$1 as dw,
203900
+ isObjectLike$1 as dx,
203901
+ baseGetTag as dy,
203902
+ Symbol$1 as dz,
203500
203903
  ifNotIn as e,
203501
203904
  foldNodeProp as f,
203502
203905
  completeFromList as g,