@band-app/server 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/client/assets/{DockviewBrowserContainer-c5TBCFK6.js → DockviewBrowserContainer-Bh7ygcym.js} +2 -2
  2. package/dist/client/assets/{DockviewTerminalContainer-De1DHQ5S.js → DockviewTerminalContainer-BA10dl2w.js} +2 -2
  3. package/dist/client/assets/{TerminalPanel-DR6CDpEJ.js → TerminalPanel-C40mohhY.js} +1 -1
  4. package/dist/client/assets/{_basePickBy-DjS8T81h.js → _basePickBy-BoN5C7c3.js} +1 -1
  5. package/dist/client/assets/{_baseUniq-BoA3Q22r.js → _baseUniq-hs8Z8eGG.js} +1 -1
  6. package/dist/client/assets/{arc-DzFH-F6i.js → arc-DStHWz7g.js} +1 -1
  7. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DpWdRDqh.js → architectureDiagram-VXUJARFQ-BmuwLrzR.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-VD42YOAC-In-FvNuA.js → blockDiagram-VD42YOAC-CpfEplz4.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-YG6GDRKO-uWim35od.js → c4Diagram-YG6GDRKO-DFNXKd12.js} +1 -1
  10. package/dist/client/assets/channel-cGiKwLh2.js +1 -0
  11. package/dist/client/assets/{chunk-4BX2VUAB-uNqF21Qn.js → chunk-4BX2VUAB-BhKLwyZj.js} +1 -1
  12. package/dist/client/assets/{chunk-55IACEB6-BEB0DppO.js → chunk-55IACEB6--1nGJwoJ.js} +1 -1
  13. package/dist/client/assets/{chunk-B4BG7PRW-Csf_UWBG.js → chunk-B4BG7PRW-DfW_4HED.js} +1 -1
  14. package/dist/client/assets/{chunk-DI55MBZ5-ehQAiitH.js → chunk-DI55MBZ5-BBLPj3y_.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-Ddw3wom4.js → chunk-FMBD7UC4-22_QzB6-.js} +1 -1
  16. package/dist/client/assets/{chunk-QN33PNHL-ICAdKyID.js → chunk-QN33PNHL-BsNBNA8p.js} +1 -1
  17. package/dist/client/assets/{chunk-QZHKN3VN-CWKRx0Nc.js → chunk-QZHKN3VN-t5QozrKy.js} +1 -1
  18. package/dist/client/assets/{chunk-TZMSLE5B-DEAJFNe9.js → chunk-TZMSLE5B-DTbuaeiD.js} +1 -1
  19. package/dist/client/assets/classDiagram-2ON5EDUG-aEV-2-qP.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-WZHVMYZB-aEV-2-qP.js +1 -0
  21. package/dist/client/assets/clone-CArWpwXp.js +1 -0
  22. package/dist/client/assets/{cose-bilkent-S5V4N54A-CbS4okPK.js → cose-bilkent-S5V4N54A-HZO5t4GF.js} +1 -1
  23. package/dist/client/assets/{dagre-6UL2VRFP-BsLKz8AK.js → dagre-6UL2VRFP-DnOsaGGD.js} +1 -1
  24. package/dist/client/assets/{diagram-PSM6KHXK-M6PnJuei.js → diagram-PSM6KHXK-tirWXx7b.js} +1 -1
  25. package/dist/client/assets/{diagram-QEK2KX5R-B__5YbI4.js → diagram-QEK2KX5R-Cjtr8l3E.js} +1 -1
  26. package/dist/client/assets/{diagram-S2PKOQOG-DKHL_M-B.js → diagram-S2PKOQOG-CuNpvzLc.js} +1 -1
  27. package/dist/client/assets/{erDiagram-Q2GNP2WA-BfFW0JbE.js → erDiagram-Q2GNP2WA-D2Rb5UvQ.js} +1 -1
  28. package/dist/client/assets/{flowDiagram-NV44I4VS-DjhRrkWq.js → flowDiagram-NV44I4VS-BSQxdSDJ.js} +1 -1
  29. package/dist/client/assets/{ganttDiagram-JELNMOA3-COYeUCef.js → ganttDiagram-JELNMOA3-Cj0PWn4F.js} +3 -3
  30. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-BxnB-BVL.js → gitGraphDiagram-V2S2FVAM-DMoH-grQ.js} +1 -1
  31. package/dist/client/assets/{graph-B6AmaXta.js → graph-B7ABrrXm.js} +1 -1
  32. package/dist/client/assets/{highlighted-body-B3W2YXNL-wXSbO2Nz.js → highlighted-body-B3W2YXNL-DCQslkUR.js} +1 -1
  33. package/dist/client/assets/{index-B_tLkjtQ.js → index-8PaDaRYT.js} +1 -1
  34. package/dist/client/assets/{index-dPGgxYg7.js → index-9FCRbBun.js} +1 -1
  35. package/dist/client/assets/{index-CXAmq9J9.js → index-B22f7bFn.js} +1 -1
  36. package/dist/client/assets/{index-BR4JJgox.js → index-BCA8lija.js} +1 -1
  37. package/dist/client/assets/{index-DQcyjj1n.js → index-BG3Ltnuv.js} +1 -1
  38. package/dist/client/assets/index-BQhRobL8.js +1 -0
  39. package/dist/client/assets/{index-DOipD6Mc.js → index-BaT5I2xy.js} +1 -1
  40. package/dist/client/assets/{index-C9my7XIp.js → index-BsEwdsSv.js} +1 -1
  41. package/dist/client/assets/{index-Bu4tJzS5.js → index-C99EKoUY.js} +1 -1
  42. package/dist/client/assets/{index-CFh_QYgy.js → index-CBLjtUwT.js} +1 -1
  43. package/dist/client/assets/{index-DPAcHZUY.js → index-COql1I_y.js} +1 -1
  44. package/dist/client/assets/{index-YemckZzk.js → index-D9SknX6B.js} +1 -1
  45. package/dist/client/assets/{index-B-xrNHzx.js → index-DWj9bxNA.js} +1 -1
  46. package/dist/client/assets/{index-DKFuGU2w.js → index-DWqvtyLc.js} +1 -1
  47. package/dist/client/assets/{index-oWFAyhhb.js → index-DaWbWCgj.js} +1 -1
  48. package/dist/client/assets/{index-e6iwsWag.js → index-Diyv48F3.js} +1 -1
  49. package/dist/client/assets/{index-DjFJyRsb.js → index-DjFlwM8l.js} +1 -1
  50. package/dist/client/assets/{index-C5FWnSNO.js → index-Myu-_U8q.js} +1 -1
  51. package/dist/client/assets/{infoDiagram-HS3SLOUP-8jgZTWHc.js → infoDiagram-HS3SLOUP-C_wVpnnp.js} +1 -1
  52. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-C7UnOrYP.js → journeyDiagram-XKPGCS4Q-DcF--XQH.js} +1 -1
  53. package/dist/client/assets/{kanban-definition-3W4ZIXB7-BfAJ2XMs.js → kanban-definition-3W4ZIXB7-BA1w8rep.js} +1 -1
  54. package/dist/client/assets/{layout-BFiS4INQ.js → layout-DVMDYrln.js} +1 -1
  55. package/dist/client/assets/{main-SDku1HcN.js → main-B6t1j7Kr.js} +231 -231
  56. package/dist/client/assets/main-i-GTiqUd.css +1 -0
  57. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CHJqgPgK.js → mindmap-definition-VGOIOE7T-C1vA0wr2.js} +1 -1
  58. package/dist/client/assets/{pieDiagram-ADFJNKIX-v1PBCyig.js → pieDiagram-ADFJNKIX-Q71p26az.js} +2 -2
  59. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-BmSciYlO.js → quadrantDiagram-AYHSOK5B-Bxcd0mzk.js} +1 -1
  60. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-Cpc8-ItX.js → requirementDiagram-UZGBJVZJ-DWqCIKiG.js} +1 -1
  61. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BimDWo8J.js → sankeyDiagram-TZEHDZUN-D9rSnLVX.js} +1 -1
  62. package/dist/client/assets/{sequenceDiagram-WL72ISMW-CL72CIvP.js → sequenceDiagram-WL72ISMW-Co2Jz6Fl.js} +1 -1
  63. package/dist/client/assets/{square-terminal-DAh77hNm.js → square-terminal-C3zI_mkt.js} +1 -1
  64. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DPD5YOcB.js → stateDiagram-FKZM4ZOC-CXLDkeLY.js} +1 -1
  65. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-R8LzGctw.js +1 -0
  66. package/dist/client/assets/{timeline-definition-IT6M3QCI-UujIEPPc.js → timeline-definition-IT6M3QCI-BXxZZYsm.js} +1 -1
  67. package/dist/client/assets/{treemap-GDKQZRPO-CnxwYqSA.js → treemap-GDKQZRPO-BgMoU0kM.js} +1 -1
  68. package/dist/client/assets/workspace._workspaceId-Bww_ZNFK.js +2 -0
  69. package/dist/client/assets/{workspace._workspaceId--WY7ydFH.js → workspace._workspaceId-C_KGLGyB.js} +1 -1
  70. package/dist/client/assets/{xychartDiagram-PRI3JC2R-QNPzTKdU.js → xychartDiagram-PRI3JC2R-BQxVaOKh.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-C6QVux14.js} +1 -1
  75. package/dist/server/assets/{DockviewTerminalContainer-D6ZTAITZ.js → DockviewTerminalContainer-OevWE65L.js} +3 -3
  76. package/dist/server/assets/{TerminalPanel-D1qOucYL.js → TerminalPanel-BhOjwcFW.js} +1 -1
  77. package/dist/server/assets/{_basePickBy-DCBLSYIo.js → _basePickBy-DVK5KtlH.js} +2 -2
  78. package/dist/server/assets/{_baseUniq-D6dm-LAQ.js → _baseUniq-DSFYYhGd.js} +1 -1
  79. package/dist/server/assets/_tanstack-start-manifest_v-C_7Mj4aJ.js +4 -0
  80. package/dist/server/assets/{arc-BAoORaWl.js → arc-BpwEbxUR.js} +1 -1
  81. package/dist/server/assets/{architecture-7HQA4BMR-bh4pvUjy.js → architecture-7HQA4BMR-CNyHLOO7.js} +6 -6
  82. package/dist/server/assets/{architectureDiagram-VXUJARFQ-B6S0AQBn.js → architectureDiagram-VXUJARFQ-DVUpIskI.js} +6 -6
  83. package/dist/server/assets/{blockDiagram-VD42YOAC-DLnnO4-n.js → blockDiagram-VD42YOAC-CRv2pc0L.js} +6 -6
  84. package/dist/server/assets/{c4Diagram-YG6GDRKO-CqN2DKBx.js → c4Diagram-YG6GDRKO-CBv74bWb.js} +2 -2
  85. package/dist/server/assets/{channel-f3Ahc3R0.js → channel-C_c7u4ky.js} +1 -1
  86. package/dist/server/assets/{chunk-4BX2VUAB-CuDavVBE.js → chunk-4BX2VUAB-85OXnz_P.js} +1 -1
  87. package/dist/server/assets/{chunk-55IACEB6-D_qe5s0S.js → chunk-55IACEB6-Cl8taExZ.js} +1 -1
  88. package/dist/server/assets/{chunk-B4BG7PRW-C0ML39A6.js → chunk-B4BG7PRW-C7W_R9n6.js} +4 -4
  89. package/dist/server/assets/{chunk-DI55MBZ5-DGj3ha0C.js → chunk-DI55MBZ5-CTi30KuT.js} +3 -3
  90. package/dist/server/assets/{chunk-FMBD7UC4-D-f7FIcf.js → chunk-FMBD7UC4-CsuoPD3I.js} +1 -1
  91. package/dist/server/assets/{chunk-QN33PNHL-DSo_m7vF.js → chunk-QN33PNHL-BHHMj_a1.js} +1 -1
  92. package/dist/server/assets/{chunk-QZHKN3VN-gT8icS8l.js → chunk-QZHKN3VN-DwwXlOCl.js} +1 -1
  93. package/dist/server/assets/{chunk-TZMSLE5B-CoUTe4U3.js → chunk-TZMSLE5B-ECyN9wrL.js} +1 -1
  94. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-CbQuH3ni.js → classDiagram-2ON5EDUG-qbF8ds74.js} +5 -5
  95. package/dist/server/assets/{classDiagram-2ON5EDUG-CbQuH3ni.js → classDiagram-v2-WZHVMYZB-qbF8ds74.js} +5 -5
  96. package/dist/server/assets/{clone-DhkQMQiL.js → clone-BCajbdd5.js} +1 -1
  97. package/dist/server/assets/{cose-bilkent-S5V4N54A-Q7Nl8Zqm.js → cose-bilkent-S5V4N54A-D5-w_t4l.js} +1 -1
  98. package/dist/server/assets/{dagre-6UL2VRFP-RuiqkM_u.js → dagre-6UL2VRFP-CCIdAwdB.js} +6 -6
  99. package/dist/server/assets/{diagram-PSM6KHXK-mvCbaKci.js → diagram-PSM6KHXK-CWGITxy9.js} +7 -7
  100. package/dist/server/assets/{diagram-QEK2KX5R-B30M6IEM.js → diagram-QEK2KX5R-B07zrGgY.js} +6 -6
  101. package/dist/server/assets/{diagram-S2PKOQOG-BapZgpGh.js → diagram-S2PKOQOG-XGIpbjo1.js} +6 -6
  102. package/dist/server/assets/{erDiagram-Q2GNP2WA-LKD5sOpF.js → erDiagram-Q2GNP2WA-DYHtO3j9.js} +4 -4
  103. package/dist/server/assets/{flowDiagram-NV44I4VS-Cg70kWHZ.js → flowDiagram-NV44I4VS-Cs7hS9X4.js} +5 -5
  104. package/dist/server/assets/{ganttDiagram-JELNMOA3-CpgS7Gbo.js → ganttDiagram-JELNMOA3-BhLp8xvm.js} +1 -1
  105. package/dist/server/assets/{gitGraph-G5XIXVHT-BX-0wA2S.js → gitGraph-G5XIXVHT-B46gW1OX.js} +6 -6
  106. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-BNe2zRpL.js → gitGraphDiagram-V2S2FVAM-CZHNGOm0.js} +7 -7
  107. package/dist/server/assets/{graph-BohWfDeQ.js → graph-4bVECaJM.js} +2 -2
  108. package/dist/server/assets/{highlighted-body-B3W2YXNL-DpfzVM5P.js → highlighted-body-B3W2YXNL-DSf8s2aV.js} +1 -1
  109. package/dist/server/assets/{index-Cznd5qP8.js → index-14dCbIAi.js} +5 -5
  110. package/dist/server/assets/{index-y6X09Ksj.js → index-1OK7lyTa.js} +2 -2
  111. package/dist/server/assets/{index-B6FFge5B.js → index-8EiXP0Bf.js} +2 -2
  112. package/dist/server/assets/{index-z7NiBua9.js → index-B72BPMJQ.js} +3 -3
  113. package/dist/server/assets/{index-Cvf2IVNx.js → index-BLv-1MtR.js} +5 -5
  114. package/dist/server/assets/{index-Cvmi6T35.js → index-BRzkEVRG.js} +1 -1
  115. package/dist/server/assets/{index-CTCq_dqo.js → index-C7lRWZi8.js} +4 -4
  116. package/dist/server/assets/{index-DF9DvOkv.js → index-CDG7KvBY.js} +2 -2
  117. package/dist/server/assets/{index-DsRToCeg.js → index-CHvqm6Lz.js} +5 -5
  118. package/dist/server/assets/{index-BMCwJ6BW.js → index-CKPuU6Za.js} +2 -2
  119. package/dist/server/assets/{index-Cyz3st2N.js → index-CWr-Kh5M.js} +2 -2
  120. package/dist/server/assets/{index-CnNg602B.js → index-D2uLA4oe.js} +2 -2
  121. package/dist/server/assets/{index-W2MLsk-k.js → index-DAq8fRkd.js} +2 -2
  122. package/dist/server/assets/{index-CWhqy8Ta.js → index-Dz2mzfvS.js} +2 -2
  123. package/dist/server/assets/{index-C4lG0OWB.js → index-Tq3ajWxh.js} +2 -2
  124. package/dist/server/assets/{index-CUej4Ihg.js → index-U3tOcUUV.js} +2 -2
  125. package/dist/server/assets/{index-CE_oTIBT.js → index-pFRKwTv2.js} +2 -2
  126. package/dist/server/assets/{index-DoAhyHsE.js → index-rT9xGtRW.js} +3 -3
  127. package/dist/server/assets/{info-VBDWY6EO-BQ8N2eDS.js → info-VBDWY6EO-DrELfFR0.js} +6 -6
  128. package/dist/server/assets/{infoDiagram-HS3SLOUP-I1ZLYjFY.js → infoDiagram-HS3SLOUP-D40Crb-p.js} +5 -5
  129. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-lFTyhPiV.js → journeyDiagram-XKPGCS4Q-dtlVBwV2.js} +4 -4
  130. package/dist/server/assets/{kanban-definition-3W4ZIXB7-BEr5w27W.js → kanban-definition-3W4ZIXB7-72vgA7Jl.js} +2 -2
  131. package/dist/server/assets/{layout-2KXyirN2.js → layout-DJ0Eul-X.js} +4 -4
  132. package/dist/server/assets/{mermaid-3ZIDBTTL-BfFd_m4-.js → mermaid-3ZIDBTTL-DGEHf_at.js} +1 -1
  133. package/dist/server/assets/{mermaid-parser.core-SoqLW9t8.js → mermaid-parser.core-C1UfVEF8.js} +11 -11
  134. package/dist/server/assets/{mindmap-definition-VGOIOE7T-D9ZbRdf_.js → mindmap-definition-VGOIOE7T-DYfEp2uH.js} +3 -3
  135. package/dist/server/assets/{packet-DYOGHKS2-B2EvMQj5.js → packet-DYOGHKS2-IHYchS32.js} +6 -6
  136. package/dist/server/assets/{pie-VRWISCQL-YRbpkB5e.js → pie-VRWISCQL-R6SvOU4g.js} +6 -6
  137. package/dist/server/assets/{pieDiagram-ADFJNKIX-Bat_eWvt.js → pieDiagram-ADFJNKIX-EgffZsud.js} +7 -7
  138. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-CtqGnRnF.js → quadrantDiagram-AYHSOK5B-n2oJWllV.js} +1 -1
  139. package/dist/server/assets/{radar-ZZBFDIW7-DvOi2qX_.js → radar-ZZBFDIW7-BX2ya_Na.js} +6 -6
  140. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-CtysqbZ4.js → requirementDiagram-UZGBJVZJ-CzCXruFj.js} +3 -3
  141. package/dist/server/assets/{router-ChvYGLZB.js → router-BC8bCsa3.js} +985 -673
  142. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-BTLsDOUO.js → sankeyDiagram-TZEHDZUN-C0GqwqSS.js} +1 -1
  143. package/dist/server/assets/{sequenceDiagram-WL72ISMW-CK0kbINT.js → sequenceDiagram-WL72ISMW-BfX0R0LP.js} +3 -3
  144. package/dist/server/assets/{square-terminal-BLO1pEjb.js → square-terminal-BWcJU95Z.js} +1 -1
  145. package/dist/server/assets/{stateDiagram-FKZM4ZOC-D5FS7RFa.js → stateDiagram-FKZM4ZOC-QowlLVwh.js} +8 -8
  146. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-DoCLlTuy.js → stateDiagram-v2-4FDKWEC3-DVHzQlOF.js} +4 -4
  147. package/dist/server/assets/{timeline-definition-IT6M3QCI-jFqO_Cet.js → timeline-definition-IT6M3QCI-DUoaC7rz.js} +2 -2
  148. package/dist/server/assets/{treemap-GDKQZRPO-CuHJYOCT.js → treemap-GDKQZRPO-B5KIzomx.js} +6 -6
  149. package/dist/server/assets/{workspace._workspaceId-CGq293LY.js → workspace._workspaceId-DRK2dblR.js} +101 -11
  150. package/dist/server/assets/{workspace._workspaceId-B0M_Sxj3.js → workspace._workspaceId-hnIpuUNX.js} +1 -1
  151. package/dist/server/assets/{xychartDiagram-PRI3JC2R-DPvU_7PC.js → xychartDiagram-PRI3JC2R-aNxYxejD.js} +1 -1
  152. package/dist/server/server.js +2 -2
  153. package/dist/start-server.mjs +349 -266
  154. package/package.json +4 -4
  155. package/dist/client/assets/channel-BwZLW4yW.js +0 -1
  156. package/dist/client/assets/classDiagram-2ON5EDUG-CVjdMCqG.js +0 -1
  157. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CVjdMCqG.js +0 -1
  158. package/dist/client/assets/clone-Dj_6A90e.js +0 -1
  159. package/dist/client/assets/index-baLsgCNJ.js +0 -1
  160. package/dist/client/assets/main-tmFPjHOC.css +0 -1
  161. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAf0jK91.js +0 -1
  162. package/dist/client/assets/workspace._workspaceId-jpBhz8sr.js +0 -2
  163. 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,11 +14768,27 @@ 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
+ };
14765
14786
  function DialogContent({
14766
14787
  className,
14767
14788
  overlayClassName,
14768
14789
  children: children2,
14769
14790
  showCloseButton = true,
14791
+ variant = "default",
14770
14792
  ...props
14771
14793
  }) {
14772
14794
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [
@@ -14775,10 +14797,8 @@ function DialogContent({
14775
14797
  Content$1,
14776
14798
  {
14777
14799
  "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
- ),
14800
+ "data-variant": variant,
14801
+ className: cn$2(DIALOG_CONTENT_VARIANTS[variant], className),
14782
14802
  ...props,
14783
14803
  children: [
14784
14804
  children2,
@@ -20261,16 +20281,16 @@ function createDashboardStore(adapter2) {
20261
20281
  set2({ error: String(e3) });
20262
20282
  }
20263
20283
  },
20264
- gitPull: async (project, branch) => {
20284
+ gitPull: async (project, name2) => {
20265
20285
  try {
20266
- await adapter2.gitPull(project, branch);
20286
+ await adapter2.gitPull(project, name2);
20267
20287
  } catch (e3) {
20268
20288
  set2({ error: String(e3) });
20269
20289
  }
20270
20290
  },
20271
- gitPush: async (project, branch) => {
20291
+ gitPush: async (project, name2) => {
20272
20292
  try {
20273
- await adapter2.gitPush(project, branch);
20293
+ await adapter2.gitPush(project, name2);
20274
20294
  } catch (e3) {
20275
20295
  set2({ error: String(e3) });
20276
20296
  }
@@ -20487,15 +20507,18 @@ function useRemoveWorkspace() {
20487
20507
  const openWorkspace = useDashboardStore((s2) => s2.openWorkspace);
20488
20508
  const store = useRawDashboardStore();
20489
20509
  return useMutation({
20490
- mutationFn: ({ project, branch }) => adapter2.removeWorkspace(project, branch),
20491
- onSuccess: (_data, { project, branch }) => {
20510
+ mutationFn: ({ project, name: name2 }) => adapter2.removeWorkspace(project, name2),
20511
+ onSuccess: (_data, { project, name: name2 }) => {
20492
20512
  queryClient2.invalidateQueries({ queryKey: queryKeys.projects });
20493
- const deletedWorkspaceId = toWorkspaceId(project, branch);
20513
+ const deletedWorkspaceId = toWorkspaceId(project, name2);
20494
20514
  if (store.getState().activeWorkspaceId === deletedWorkspaceId) {
20495
20515
  const projects = queryClient2.getQueryData(queryKeys.projects);
20496
20516
  const projectInfo = projects?.find((p2) => p2.name === project);
20497
20517
  if (projectInfo) {
20498
- openWorkspace(toWorkspaceId(project, projectInfo.defaultBranch));
20518
+ const mainWt = projectInfo.worktrees.find(
20519
+ (wt2) => wt2.name === projectInfo.defaultBranch || wt2.branch === projectInfo.defaultBranch
20520
+ );
20521
+ openWorkspace(toWorkspaceId(project, mainWt?.name ?? projectInfo.defaultBranch));
20499
20522
  }
20500
20523
  }
20501
20524
  },
@@ -20568,7 +20591,7 @@ function AddProjectDialog({ open: open2, onOpenChange, defaultLabel }) {
20568
20591
  }
20569
20592
  };
20570
20593
  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: [
20594
+ 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
20595
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
20573
20596
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Register Project" }),
20574
20597
  /* @__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 +42720,53 @@ async function loadLanguage(lang) {
42697
42720
  try {
42698
42721
  switch (lang) {
42699
42722
  case "javascript":
42700
- return import("./index-B6FFge5B.js").then((m2) => m2.javascript());
42723
+ return import("./index-8EiXP0Bf.js").then((m2) => m2.javascript());
42701
42724
  case "jsx":
42702
- return import("./index-B6FFge5B.js").then((m2) => m2.javascript({ jsx: true }));
42725
+ return import("./index-8EiXP0Bf.js").then((m2) => m2.javascript({ jsx: true }));
42703
42726
  case "typescript":
42704
- return import("./index-B6FFge5B.js").then(
42727
+ return import("./index-8EiXP0Bf.js").then(
42705
42728
  (m2) => m2.javascript({ typescript: true })
42706
42729
  );
42707
42730
  case "tsx":
42708
- return import("./index-B6FFge5B.js").then(
42731
+ return import("./index-8EiXP0Bf.js").then(
42709
42732
  (m2) => m2.javascript({ jsx: true, typescript: true })
42710
42733
  );
42711
42734
  case "python":
42712
- return import("./index-CWhqy8Ta.js").then((m2) => m2.python());
42735
+ return import("./index-Dz2mzfvS.js").then((m2) => m2.python());
42713
42736
  case "html":
42714
- return import("./index-CTCq_dqo.js").then((m2) => m2.html());
42737
+ return import("./index-C7lRWZi8.js").then((m2) => m2.html());
42715
42738
  case "css":
42716
- return import("./index-y6X09Ksj.js").then((m2) => m2.css());
42739
+ return import("./index-1OK7lyTa.js").then((m2) => m2.css());
42717
42740
  case "scss":
42718
42741
  case "sass":
42719
- return import("./index-z7NiBua9.js").then((m2) => m2.sass());
42742
+ return import("./index-B72BPMJQ.js").then((m2) => m2.sass());
42720
42743
  case "less":
42721
- return import("./index-DoAhyHsE.js").then((m2) => m2.less());
42744
+ return import("./index-rT9xGtRW.js").then((m2) => m2.less());
42722
42745
  case "json":
42723
42746
  case "jsonc":
42724
- return import("./index-DF9DvOkv.js").then((m2) => m2.json());
42747
+ return import("./index-CDG7KvBY.js").then((m2) => m2.json());
42725
42748
  case "markdown":
42726
42749
  case "mdx":
42727
- return import("./index-Cvf2IVNx.js").then((m2) => m2.markdown());
42750
+ return import("./index-BLv-1MtR.js").then((m2) => m2.markdown());
42728
42751
  case "xml":
42729
- return import("./index-W2MLsk-k.js").then((m2) => m2.xml());
42752
+ return import("./index-DAq8fRkd.js").then((m2) => m2.xml());
42730
42753
  case "yaml":
42731
- return import("./index-CE_oTIBT.js").then((m2) => m2.yaml());
42754
+ return import("./index-pFRKwTv2.js").then((m2) => m2.yaml());
42732
42755
  case "sql":
42733
- return import("./index-CnNg602B.js").then((m2) => m2.sql());
42756
+ return import("./index-D2uLA4oe.js").then((m2) => m2.sql());
42734
42757
  case "rust":
42735
- return import("./index-BMCwJ6BW.js").then((m2) => m2.rust());
42758
+ return import("./index-CKPuU6Za.js").then((m2) => m2.rust());
42736
42759
  case "go":
42737
- return import("./index-C4lG0OWB.js").then((m2) => m2.go());
42760
+ return import("./index-Tq3ajWxh.js").then((m2) => m2.go());
42738
42761
  case "java":
42739
- return import("./index-CUej4Ihg.js").then((m2) => m2.java());
42762
+ return import("./index-U3tOcUUV.js").then((m2) => m2.java());
42740
42763
  case "kotlin":
42741
- return import("./index-CUej4Ihg.js").then((m2) => m2.java());
42764
+ return import("./index-U3tOcUUV.js").then((m2) => m2.java());
42742
42765
  case "c":
42743
42766
  case "cpp":
42744
- return import("./index-Cyz3st2N.js").then((m2) => m2.cpp());
42767
+ return import("./index-CWr-Kh5M.js").then((m2) => m2.cpp());
42745
42768
  case "php":
42746
- return import("./index-Cznd5qP8.js").then((m2) => m2.php());
42769
+ return import("./index-14dCbIAi.js").then((m2) => m2.php());
42747
42770
  // Legacy modes via StreamLanguage
42748
42771
  case "bash":
42749
42772
  case "fish":
@@ -48707,7 +48730,7 @@ function usePinnedWorkspaces() {
48707
48730
  list2.push({
48708
48731
  project,
48709
48732
  worktree: wt2,
48710
- workspaceId: toWorkspaceId(project.name, wt2.branch)
48733
+ workspaceId: toWorkspaceId(project.name, wt2.name)
48711
48734
  });
48712
48735
  }
48713
48736
  }
@@ -48719,10 +48742,10 @@ function usePinnedWorkspaces() {
48719
48742
  const mutation = useMutation({
48720
48743
  mutationFn: ({
48721
48744
  project,
48722
- branch,
48745
+ name: name2,
48723
48746
  pinned: nextPinned
48724
- }) => adapter2.setWorkspacePinned(project, branch, nextPinned),
48725
- onMutate: async ({ project, branch, pinned: nextPinned }) => {
48747
+ }) => adapter2.setWorkspacePinned(project, name2, nextPinned),
48748
+ onMutate: async ({ project, name: name2, pinned: nextPinned }) => {
48726
48749
  await queryClient2.cancelQueries({ queryKey: queryKeys.projects });
48727
48750
  const previous2 = queryClient2.getQueryData(queryKeys.projects);
48728
48751
  if (previous2) {
@@ -48730,7 +48753,7 @@ function usePinnedWorkspaces() {
48730
48753
  (p2) => p2.name === project ? {
48731
48754
  ...p2,
48732
48755
  worktrees: p2.worktrees.map(
48733
- (w3) => w3.branch === branch ? { ...w3, pinned: nextPinned } : w3
48756
+ (w3) => w3.name === name2 ? { ...w3, pinned: nextPinned } : w3
48734
48757
  )
48735
48758
  } : p2
48736
48759
  );
@@ -48749,7 +48772,7 @@ function usePinnedWorkspaces() {
48749
48772
  }
48750
48773
  });
48751
48774
  const toggle = reactExports.useCallback(
48752
- (project, branch, currentlyPinned) => mutation.mutate({ project, branch, pinned: !currentlyPinned }),
48775
+ (project, name2, currentlyPinned) => mutation.mutate({ project, name: name2, pinned: !currentlyPinned }),
48753
48776
  [mutation.mutate]
48754
48777
  );
48755
48778
  return { pinned, isPinned, toggle };
@@ -49013,7 +49036,7 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49013
49036
  const gitPush = useDashboardStore((s2) => s2.gitPush);
49014
49037
  const removeWorkspaceMutation = useRemoveWorkspace();
49015
49038
  const isPinned = worktree.pinned;
49016
- const workspaceId = toWorkspaceId(projectName, worktree.branch);
49039
+ const workspaceId = toWorkspaceId(projectName, worktree.name);
49017
49040
  const isActive = useDashboardStore((s2) => s2.activeWorkspaceId === workspaceId);
49018
49041
  const href = capabilities2.getWorkspaceHref?.(workspaceId);
49019
49042
  reactExports.useEffect(() => {
@@ -49063,11 +49086,11 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49063
49086
  const hasUnpushedCommits = (branchStatus?.git.ahead ?? 0) > 0;
49064
49087
  const handleDelete2 = () => {
49065
49088
  if (!hasUnmergedPR && !isDirty && !hasUnpushedCommits) {
49066
- removeWorkspaceMutation.mutate({ project: projectName, branch: worktree.branch });
49089
+ removeWorkspaceMutation.mutate({ project: projectName, name: worktree.name });
49067
49090
  } else {
49068
49091
  onShowDeleteDialog({
49069
49092
  projectName,
49070
- branch: worktree.branch,
49093
+ name: worktree.name,
49071
49094
  isUnmerged: hasUnmergedPR,
49072
49095
  isDirty,
49073
49096
  hasUnpushedCommits
@@ -49083,11 +49106,11 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49083
49106
  "span",
49084
49107
  {
49085
49108
  className: `text-sm truncate ${isActive ? "font-bold text-foreground" : "font-medium text-muted-foreground"}`,
49086
- children: showProjectName ? `${projectName}/${worktree.branch}` : worktree.branch
49109
+ children: showProjectName ? `${projectName}/${worktree.name}` : worktree.name
49087
49110
  }
49088
49111
  )
49089
49112
  ] }) }),
49090
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "right", children: `${projectName}/${worktree.branch}` })
49113
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "right", children: `${projectName}/${worktree.name}` })
49091
49114
  ] }),
49092
49115
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden @[10rem]:flex group-hover:flex items-center gap-2 shrink-0 ml-auto pl-2", children: [
49093
49116
  /* @__PURE__ */ jsxRuntimeExports.jsx(SetupStatusIndicator, { setup: setupStatus }),
@@ -49096,7 +49119,7 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49096
49119
  ] })
49097
49120
  ] }) }),
49098
49121
  /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
49099
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onTogglePinned(projectName, worktree.branch, isPinned), children: [
49122
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onTogglePinned(projectName, worktree.name, isPinned), children: [
49100
49123
  isPinned ? /* @__PURE__ */ jsxRuntimeExports.jsx(PinOff, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, {}),
49101
49124
  isPinned ? "Unpin workspace" : "Pin workspace"
49102
49125
  ] }),
@@ -49117,15 +49140,15 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
49117
49140
  /* @__PURE__ */ jsxRuntimeExports.jsx(Square, {}),
49118
49141
  "Run teardown"
49119
49142
  ] }),
49120
- !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPull(projectName, worktree.branch), children: [
49143
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPull(projectName, worktree.name), children: [
49121
49144
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowDownToLine, {}),
49122
49145
  "Git pull"
49123
49146
  ] }),
49124
- !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPush(projectName, worktree.branch), children: [
49147
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPush(projectName, worktree.name), children: [
49125
49148
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowUpFromLine, {}),
49126
49149
  "Git push"
49127
49150
  ] }),
49128
- !isPlain && worktree.branch !== defaultBranch && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: handleDelete2, children: [
49151
+ !isPlain && worktree.name !== defaultBranch && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: handleDelete2, children: [
49129
49152
  /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
49130
49153
  "Delete workspace"
49131
49154
  ] })
@@ -49165,8 +49188,8 @@ function SortableProject({
49165
49188
  };
49166
49189
  const openWorkspace = useDashboardStore((s2) => s2.openWorkspace);
49167
49190
  const clearNeedsAttention = useDashboardStore((s2) => s2.clearNeedsAttention);
49168
- const plainBranch = isPlain ? project.worktrees[0].branch : "";
49169
- const plainWorkspaceId = isPlain ? toWorkspaceId(project.name, plainBranch) : "";
49191
+ const plainName = isPlain ? project.worktrees[0].name : "";
49192
+ const plainWorkspaceId = isPlain ? toWorkspaceId(project.name, plainName) : "";
49170
49193
  const plainIsActive = useDashboardStore(
49171
49194
  (s2) => isPlain && s2.activeWorkspaceId === plainWorkspaceId
49172
49195
  );
@@ -49175,7 +49198,7 @@ function SortableProject({
49175
49198
  const plainIsFocused = isPlain && workspaceIndexStart === focusedIndex;
49176
49199
  const activeWorkspaceId = useDashboardStore((s2) => s2.activeWorkspaceId);
49177
49200
  const gitHeaderIsActive = reactExports.useMemo(
49178
- () => !isPlain && project.worktrees.some((wt2) => toWorkspaceId(project.name, wt2.branch) === activeWorkspaceId),
49201
+ () => !isPlain && project.worktrees.some((wt2) => toWorkspaceId(project.name, wt2.name) === activeWorkspaceId),
49179
49202
  [isPlain, project.worktrees, project.name, activeWorkspaceId]
49180
49203
  );
49181
49204
  const handlePlainOpen = () => {
@@ -49320,7 +49343,7 @@ function SortableProject({
49320
49343
  // the project header above, not as sibling rows. The indentation alone
49321
49344
  // (no divider rail) conveys the hierarchy, keeping the list uncluttered.
49322
49345
  /* @__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);
49346
+ const wsId = toWorkspaceId(project.name, wt2.name);
49324
49347
  const currentIndex = workspaceIndex++;
49325
49348
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
49326
49349
  WorkspaceCard,
@@ -49336,7 +49359,7 @@ function SortableProject({
49336
49359
  onShowDeleteDialog,
49337
49360
  onTogglePinned
49338
49361
  },
49339
- wt2.branch
49362
+ wt2.name
49340
49363
  );
49341
49364
  }) })
49342
49365
  ] });
@@ -49472,7 +49495,7 @@ function ProjectList({ labelFilter }) {
49472
49495
  if (headerVisible && labelCollapse.isCollapsed(groupKey)) return [];
49473
49496
  return g2.projects.flatMap((p2) => {
49474
49497
  if (projectCollapse.isCollapsed(p2.name)) return [];
49475
- return p2.worktrees.map((wt2) => toWorkspaceId(p2.name, wt2.branch));
49498
+ return p2.worktrees.map((wt2) => toWorkspaceId(p2.name, wt2.name));
49476
49499
  });
49477
49500
  });
49478
49501
  return [...pinnedPart, ...rest];
@@ -49532,7 +49555,7 @@ function ProjectList({ labelFilter }) {
49532
49555
  for (const group of groups) {
49533
49556
  for (const project of group.projects) {
49534
49557
  const containsActive = project.worktrees.some(
49535
- (wt2) => toWorkspaceId(project.name, wt2.branch) === activeWorkspaceId
49558
+ (wt2) => toWorkspaceId(project.name, wt2.name) === activeWorkspaceId
49536
49559
  );
49537
49560
  if (!containsActive) continue;
49538
49561
  if (labelFilter && group.labelId !== labelFilter) return;
@@ -49766,12 +49789,12 @@ function ProjectList({ labelFilter }) {
49766
49789
  if (deleteDialog) {
49767
49790
  removeWorkspaceMutation.mutate({
49768
49791
  project: deleteDialog.projectName,
49769
- branch: deleteDialog.branch
49792
+ name: deleteDialog.name
49770
49793
  });
49771
49794
  setDeleteDialog(null);
49772
49795
  }
49773
49796
  },
49774
- branchName: deleteDialog?.branch ?? "",
49797
+ branchName: deleteDialog?.name ?? "",
49775
49798
  isUnmerged: deleteDialog?.isUnmerged ?? false,
49776
49799
  isDirty: deleteDialog?.isDirty ?? false,
49777
49800
  hasUnpushedCommits: deleteDialog?.hasUnpushedCommits ?? false
@@ -50222,16 +50245,8 @@ function SettingsPage({ open: open2, onOpenChange }) {
50222
50245
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
50223
50246
  DialogContent,
50224
50247
  {
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
- ),
50248
+ variant: "bottom-sheet",
50249
+ className: "flex flex-col gap-0 overflow-hidden p-0 lg:h-[80vh] lg:max-w-2xl",
50235
50250
  children: [
50236
50251
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { className: "px-6 pt-6 pb-4 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Settings" }) }),
50237
50252
  /* @__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 +50886,7 @@ async function desktopInvoke$1(cmd2, args) {
50871
50886
  if (bridge) return await bridge.invoke(cmd2, args);
50872
50887
  throw new Error(`desktopInvoke('${cmd2}') called outside the desktop shell`);
50873
50888
  }
50874
- function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
50889
+ function DashboardShell({ bottomActions, hideTitleBar }) {
50875
50890
  const { projects, isLoading: loading } = useProjects();
50876
50891
  const { settings } = useSettingsQuery();
50877
50892
  const labels = settings.labels ?? [];
@@ -50911,7 +50926,7 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
50911
50926
  );
50912
50927
  const findProjectForWorkspace = reactExports.useCallback(
50913
50928
  (workspaceId) => projects.find(
50914
- (p2) => p2.worktrees.some((wt2) => toWorkspaceId(p2.name, wt2.branch) === workspaceId)
50929
+ (p2) => p2.worktrees.some((wt2) => toWorkspaceId(p2.name, wt2.name) === workspaceId)
50915
50930
  ),
50916
50931
  [projects]
50917
50932
  );
@@ -51033,93 +51048,68 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
51033
51048
  }
51034
51049
  ),
51035
51050
  /* @__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"
51051
+ /* @__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: [
51052
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
51053
+ Button,
51054
+ {
51055
+ size: "sm",
51056
+ variant: "ghost",
51057
+ "data-testid": "dashboard__label-filter-trigger",
51058
+ className: `min-w-0 text-sm h-7 px-2 gap-1.5 ${labelFilter ? "bg-accent text-accent-foreground" : "text-muted-foreground"}`,
51059
+ children: activeLabel ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51060
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
51061
+ "span",
51062
+ {
51063
+ className: "size-2.5 rounded-full shrink-0",
51064
+ style: { backgroundColor: activeLabel.color }
51065
+ }
51066
+ ),
51067
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: activeLabel.name })
51068
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51069
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0" }),
51070
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" })
51057
51071
  ] })
51058
- ] })
51059
- ] }),
51060
- labels.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
51061
- /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
51062
- Button,
51072
+ }
51073
+ ) }),
51074
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "start", children: [
51075
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
51076
+ DropdownMenuItem,
51063
51077
  {
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: [
51078
+ "data-testid": "dashboard__label-filter-item--all",
51079
+ onClick: () => setLabelFilter(null),
51080
+ children: [
51081
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0 mr-2 text-muted-foreground" }),
51082
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" }),
51083
+ !labelFilter && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
51084
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: "⌘0" })
51085
+ ]
51086
+ }
51087
+ ),
51088
+ labels.map((lbl, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
51089
+ DropdownMenuItem,
51090
+ {
51091
+ "data-testid": `dashboard__label-filter-item--${lbl.id}`,
51092
+ onClick: () => setLabelFilter(lbl.id),
51093
+ children: [
51069
51094
  /* @__PURE__ */ jsxRuntimeExports.jsx(
51070
51095
  "span",
51071
51096
  {
51072
- className: "size-2.5 rounded-full shrink-0",
51073
- style: { backgroundColor: activeLabel.color }
51097
+ className: "size-2.5 rounded-full shrink-0 mr-2",
51098
+ style: { backgroundColor: lbl.color }
51074
51099
  }
51075
51100
  ),
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
- ] })
51101
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: lbl.name }),
51102
+ labelFilter === lbl.id && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
51103
+ idx < 9 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: [
51104
+ "⌘",
51105
+ idx + 1
51106
+ ] })
51107
+ ]
51108
+ },
51109
+ lbl.id
51110
+ ))
51121
51111
  ] })
51122
- ] }) }),
51112
+ ] }) }) }),
51123
51113
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 pr-2", children: [
51124
51114
  projects.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
51125
51115
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -51216,6 +51206,30 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
51216
51206
  }
51217
51207
  )
51218
51208
  ] }),
51209
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
51210
+ "div",
51211
+ {
51212
+ className: "shrink-0 flex h-9 items-center justify-between gap-1 border-t border-border px-2",
51213
+ "data-testid": "project-list__action-bar",
51214
+ children: [
51215
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
51216
+ Button,
51217
+ {
51218
+ size: "sm",
51219
+ variant: "ghost",
51220
+ className: "text-muted-foreground",
51221
+ "data-testid": "project-list__settings-button",
51222
+ onClick: handleSettingsClick,
51223
+ children: [
51224
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Settings$1, { className: "size-4" }),
51225
+ "Settings"
51226
+ ]
51227
+ }
51228
+ ),
51229
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-0.5", children: bottomActions })
51230
+ ]
51231
+ }
51232
+ ),
51219
51233
  /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: showErrorDialog, onOpenChange: setShowErrorDialog, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { children: [
51220
51234
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
51221
51235
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { className: "text-destructive", children: "Error" }),
@@ -52881,7 +52895,7 @@ function useProjectKindMap() {
52881
52895
  const map2 = /* @__PURE__ */ new Map();
52882
52896
  for (const p2 of projects) {
52883
52897
  for (const wt2 of p2.worktrees) {
52884
- map2.set(toWorkspaceId(p2.name, wt2.branch), p2.kind);
52898
+ map2.set(toWorkspaceId(p2.name, wt2.name), p2.kind);
52885
52899
  }
52886
52900
  }
52887
52901
  return map2;
@@ -53013,7 +53027,7 @@ function useWorkspacePath(workspaceId) {
53013
53027
  return reactExports.useMemo(() => {
53014
53028
  for (const proj of projects) {
53015
53029
  for (const wt2 of proj.worktrees) {
53016
- if (toWorkspaceId(proj.name, wt2.branch) === workspaceId) {
53030
+ if (toWorkspaceId(proj.name, wt2.name) === workspaceId) {
53017
53031
  return wt2.path;
53018
53032
  }
53019
53033
  }
@@ -57076,81 +57090,91 @@ function LazyFileRow({
57076
57090
  fileStatus: status
57077
57091
  }
57078
57092
  ),
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
- ] })
57093
+ isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs(
57094
+ "div",
57095
+ {
57096
+ className: "border-t border-border/20 bg-muted/30",
57097
+ style: placeholderHeight > 0 ? {
57098
+ contentVisibility: "auto",
57099
+ containIntrinsicBlockSize: `${placeholderHeight}px`
57100
+ } : void 0,
57101
+ children: [
57102
+ diffError && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-4 text-sm text-destructive", children: diffError }),
57103
+ diff2 !== null && (shouldRender ? (
57104
+ // Wrapper is observed by the ResizeObserver in the effect
57105
+ // above. Its rendered height — "Show full file" bar plus the
57106
+ // CodeMirror editor — is reported back as
57107
+ // `measuredHeight`, then reused verbatim as the placeholder
57108
+ // height on the next unmount cycle (a never-visited row or
57109
+ // an LRU-evicted one).
57110
+ //
57111
+ // The `minHeight` hold prevents a layout shift during the
57112
+ // window between (a) `shouldRender` flipping to true and
57113
+ // (b) the editor's async `setup` finishing (loadLanguage
57114
+ // await + new MergeView() + first paint). Without it the
57115
+ // wrapper is empty-auto-height for that window, collapsing
57116
+ // the row to the "Show full file" bar (~30px) and pushing
57117
+ // every row below it upward; when the editor paints they
57118
+ // snap back down. We pin the wrapper to the
57119
+ // cached/estimated height (the same value the placeholder
57120
+ // uses) until `editorRendered` flips, then let the
57121
+ // editor's natural height take over. The ResizeObserver
57122
+ // only attaches once `editorRendered` is true (see deps
57123
+ // above), so the held value never bleeds into the
57124
+ // measuredHeight cache.
57125
+ //
57126
+ // Mount-once: once `shouldRender` flips true, it stays
57127
+ // true across scroll-aways. The editor's natural height
57128
+ // remains in the layout — the row stays the same size
57129
+ // whether the user is currently looking at it or
57130
+ // scrolled past — so there's no scroll-shift trade-off
57131
+ // to manage. The browser handles culling offscreen tiles
57132
+ // cheaply; the only thing that brings `shouldRender`
57133
+ // back to false is collapse / LRU eviction / target
57134
+ // change, all of which deliberately tear the editor
57135
+ // down.
57136
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
57137
+ "div",
57138
+ {
57139
+ ref: diffBodyRef,
57140
+ style: editorRendered ? void 0 : { minHeight: placeholderHeight },
57141
+ children: [
57142
+ 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(
57143
+ "button",
57144
+ {
57145
+ type: "button",
57146
+ onClick: () => onShowFullFile(filename),
57147
+ className: "text-xs text-muted-foreground transition-colors hover:text-foreground",
57148
+ children: "Show full file"
57149
+ }
57150
+ ) }),
57151
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
57152
+ DiffFileContent,
57153
+ {
57154
+ hunks: diff2,
57155
+ filename,
57156
+ viewMode,
57157
+ onEditorViews: handleEditorViews,
57158
+ onLoadMoreContext: canLoadMore ? () => onLoadMoreContext(filename) : void 0
57159
+ }
57160
+ )
57161
+ ]
57162
+ }
57163
+ )
57164
+ ) : (
57165
+ // Placeholder occupying the SAME pixel height the CodeMirror
57166
+ // editor would render at, so the row's overall size doesn't
57167
+ // change when LRU eviction tears the editor down (or while
57168
+ // a never-visited row waits for its first IO intersect).
57169
+ // Without this, switching the body between editor and
57170
+ // placeholder would push everything below upward —
57171
+ // visually identical to a layout shift, even though no
57172
+ // content actually moved.
57173
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { height: placeholderHeight } })
57174
+ ))
57175
+ ]
57176
+ }
57177
+ )
57154
57178
  ]
57155
57179
  }
57156
57180
  );
@@ -60165,7 +60189,8 @@ function QuickOpenDialog({
60165
60189
  DialogContent,
60166
60190
  {
60167
60191
  "data-testid": "quick-open__root",
60168
- className: "overflow-hidden p-0 sm:max-w-[520px]",
60192
+ variant: "bottom-sheet",
60193
+ className: "overflow-hidden p-0 lg:max-w-[520px]",
60169
60194
  showCloseButton: false,
60170
60195
  children: [
60171
60196
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
@@ -60312,62 +60337,71 @@ function SearchFilesDialog({
60312
60337
  [onOpenFile, onOpenChange]
60313
60338
  );
60314
60339
  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,
60340
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
60341
+ DialogContent,
60342
+ {
60343
+ "data-testid": "search-files__root",
60344
+ variant: "bottom-sheet",
60345
+ className: "overflow-hidden p-0 lg:max-w-[640px]",
60346
+ showCloseButton: false,
60347
+ children: [
60348
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "sr-only", children: [
60349
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Search in Files" }),
60350
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Text search across workspace files" })
60351
+ ] }),
60352
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Command, { shouldFilter: false, value: selectedValue, onValueChange: setSelectedValue, children: [
60353
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
60354
+ SearchBar,
60338
60355
  {
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,
60356
+ ref: searchBarRef,
60357
+ query,
60358
+ onQueryChange: setQuery,
60359
+ options: searchOptions,
60360
+ onOptionsChange: setSearchOptions,
60361
+ placeholder: "Search in files..."
60362
+ }
60363
+ ),
60364
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CommandList, { className: "max-h-[400px]", children: [
60365
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CommandEmpty, { children: loading ? "Searching..." : query.length < 2 ? "Type at least 2 characters to search." : "No results found." }),
60366
+ grouped.map(([file2, matches2]) => {
60367
+ const FileIcon = getFileIcon(file2);
60368
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
60369
+ CommandGroup,
60345
60370
  {
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
- ]
60371
+ heading: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
60372
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { className: "size-3" }),
60373
+ file2
60374
+ ] }),
60375
+ children: matches2.map((match) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
60376
+ CommandItem,
60377
+ {
60378
+ value: `${file2}:${match.line}:${match.content}`,
60379
+ onSelect: () => handleSelect(file2, match.line),
60380
+ children: [
60381
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-8 shrink-0 text-right font-mono text-xs text-muted-foreground", children: match.line }),
60382
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate font-mono text-xs", children: match.content })
60383
+ ]
60384
+ },
60385
+ `${file2}:${match.line}:${match.content}`
60386
+ ))
60352
60387
  },
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
- ] }) });
60388
+ file2
60389
+ );
60390
+ })
60391
+ ] }),
60392
+ totalMatches > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t px-3 py-1.5 text-xs text-muted-foreground", children: [
60393
+ totalMatches,
60394
+ " result",
60395
+ totalMatches !== 1 ? "s" : "",
60396
+ " in ",
60397
+ grouped.length,
60398
+ " file",
60399
+ grouped.length !== 1 ? "s" : ""
60400
+ ] })
60401
+ ] })
60402
+ ]
60403
+ }
60404
+ ) });
60371
60405
  }
60372
60406
  const STORAGE_KEY = "band-recent-workspaces";
60373
60407
  const MAX_ENTRIES = 50;
@@ -60413,10 +60447,11 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60413
60447
  const entries2 = [];
60414
60448
  for (const project of projects) {
60415
60449
  for (const worktree of project.worktrees) {
60416
- const workspaceId = toWorkspaceId(project.name, worktree.branch);
60450
+ const workspaceId = toWorkspaceId(project.name, worktree.name);
60417
60451
  entries2.push({
60418
60452
  workspaceId,
60419
60453
  projectName: project.name,
60454
+ name: worktree.name,
60420
60455
  branch: worktree.branch,
60421
60456
  agent: statuses.get(workspaceId)?.agent
60422
60457
  });
@@ -60454,7 +60489,8 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60454
60489
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
60455
60490
  DialogContent,
60456
60491
  {
60457
- className: "overflow-hidden border-0 bg-popover p-0 shadow-2xl sm:max-w-[520px]",
60492
+ variant: "bottom-sheet",
60493
+ className: "overflow-hidden border-0 bg-popover p-0 shadow-2xl lg:max-w-[520px] lg:border-0",
60458
60494
  overlayClassName: "backdrop-blur-sm",
60459
60495
  showCloseButton: false,
60460
60496
  "data-testid": "workspace-picker",
@@ -60476,7 +60512,7 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60476
60512
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
60477
60513
  CommandItem,
60478
60514
  {
60479
- value: `${entry.projectName} ${entry.branch}`,
60515
+ value: `${entry.projectName} ${entry.name} ${entry.branch}`,
60480
60516
  onSelect: () => handleSelect(entry.workspaceId),
60481
60517
  "data-testid": `workspace-picker__item--${entry.workspaceId}`,
60482
60518
  className: "group touch-manipulation [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:gap-3",
@@ -60485,7 +60521,7 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60485
60521
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-medium", children: [
60486
60522
  entry.projectName,
60487
60523
  "/",
60488
- entry.branch
60524
+ entry.name
60489
60525
  ] }),
60490
60526
  pinnedNow && /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { className: "size-3 -rotate-45 text-muted-foreground shrink-0" }),
60491
60527
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
@@ -60502,7 +60538,7 @@ function WorkspacePickerDialog({ open: open2, onOpenChange }) {
60502
60538
  onClick: (e3) => {
60503
60539
  e3.preventDefault();
60504
60540
  e3.stopPropagation();
60505
- togglePinned(entry.projectName, entry.branch, pinnedNow);
60541
+ togglePinned(entry.projectName, entry.name, pinnedNow);
60506
60542
  },
60507
60543
  children: pinnedNow ? /* @__PURE__ */ jsxRuntimeExports.jsx(PinOff, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Pin, { className: "size-3.5" })
60508
60544
  }
@@ -67006,11 +67042,11 @@ class WebDashboardAdapter {
67006
67042
  async createWorkspace(project, branch, base2, prompt) {
67007
67043
  await this.trpc.workspaces.create.mutate({ project, branch, base: base2, prompt });
67008
67044
  }
67009
- async removeWorkspace(project, branch) {
67010
- await this.trpc.workspaces.remove.mutate({ project, branch });
67045
+ async removeWorkspace(project, name2) {
67046
+ await this.trpc.workspaces.remove.mutate({ project, name: name2 });
67011
67047
  }
67012
- async setWorkspacePinned(project, branch, pinned) {
67013
- await this.trpc.workspaces.setPinned.mutate({ project, branch, pinned });
67048
+ async setWorkspacePinned(project, name2, pinned) {
67049
+ await this.trpc.workspaces.setPinned.mutate({ project, name: name2, pinned });
67014
67050
  }
67015
67051
  async clearNeedsAttention(workspaceId) {
67016
67052
  await this.trpc.statuses.clearNeedsAttention.mutate({ workspaceId });
@@ -67018,11 +67054,11 @@ class WebDashboardAdapter {
67018
67054
  async runScript(path2, scriptType) {
67019
67055
  await this.trpc.workspaces.runScript.mutate({ path: path2, scriptType });
67020
67056
  }
67021
- async gitPull(project, branch) {
67022
- await this.trpc.workspaces.gitPull.mutate({ project, branch });
67057
+ async gitPull(project, name2) {
67058
+ await this.trpc.workspaces.gitPull.mutate({ project, name: name2 });
67023
67059
  }
67024
- async gitPush(project, branch) {
67025
- await this.trpc.workspaces.gitPush.mutate({ project, branch });
67060
+ async gitPush(project, name2) {
67061
+ await this.trpc.workspaces.gitPush.mutate({ project, name: name2 });
67026
67062
  }
67027
67063
  async getSettings() {
67028
67064
  return await this.trpc.settings.get.query();
@@ -109252,7 +109288,7 @@ var tn = f$5("block", "before:content-[counter(line)]", "before:inline-block", "
109252
109288
  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
109289
  var Se$1 = reactExports.createContext({ code: "" }), de$2 = () => reactExports.useContext(Se$1);
109254
109290
  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 }) => {
109291
+ var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-DSf8s2aV.js").then((e3) => ({ default: e3.HighlightedCodeBlockBody }))), rt = ({ code: e3, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
109256
109292
  let i2 = reactExports.useMemo(() => e3.replace(cn, ""), [e3]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i2.split(`
109257
109293
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i2]);
109258
109294
  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 +109610,7 @@ var Dt = ({ children: e3, className: t2, onDownload: o3, onError: n2 }) => {
109574
109610
  }, []), 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
109611
  };
109576
109612
  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]+)/;
109613
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-DGEHf_at.js").then((e3) => ({ default: e3.Mermaid }))), Kn = /language-([^\s]+)/;
109578
109614
  function ke$1(e3, t2) {
109579
109615
  if (!(e3 != null && e3.position || t2 != null && t2.position)) return true;
109580
109616
  if (!(e3 != null && e3.position && (t2 != null && t2.position))) return false;
@@ -161745,12 +161781,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
161745
161781
  registerLayoutLoaders([
161746
161782
  {
161747
161783
  name: "dagre",
161748
- loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-RuiqkM_u.js"), "loader")
161784
+ loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-CCIdAwdB.js"), "loader")
161749
161785
  },
161750
161786
  ...[
161751
161787
  {
161752
161788
  name: "cose-bilkent",
161753
- loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-Q7Nl8Zqm.js"), "loader")
161789
+ loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-D5-w_t4l.js"), "loader")
161754
161790
  }
161755
161791
  ]
161756
161792
  ]);
@@ -162189,7 +162225,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
162189
162225
  return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
162190
162226
  }, "detector");
162191
162227
  var loader = /* @__PURE__ */ __name(async () => {
162192
- const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CqN2DKBx.js");
162228
+ const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CBv74bWb.js");
162193
162229
  return { id, diagram: diagram2 };
162194
162230
  }, "loader");
162195
162231
  var plugin = {
@@ -162206,7 +162242,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
162206
162242
  return /^\s*graph/.test(txt);
162207
162243
  }, "detector");
162208
162244
  var loader2 = /* @__PURE__ */ __name(async () => {
162209
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cg70kWHZ.js");
162245
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cs7hS9X4.js");
162210
162246
  return { id: id2, diagram: diagram2 };
162211
162247
  }, "loader");
162212
162248
  var plugin2 = {
@@ -162229,7 +162265,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
162229
162265
  return /^\s*flowchart/.test(txt);
162230
162266
  }, "detector");
162231
162267
  var loader3 = /* @__PURE__ */ __name(async () => {
162232
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cg70kWHZ.js");
162268
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cs7hS9X4.js");
162233
162269
  return { id: id3, diagram: diagram2 };
162234
162270
  }, "loader");
162235
162271
  var plugin3 = {
@@ -162243,7 +162279,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
162243
162279
  return /^\s*erDiagram/.test(txt);
162244
162280
  }, "detector");
162245
162281
  var loader4 = /* @__PURE__ */ __name(async () => {
162246
- const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-LKD5sOpF.js");
162282
+ const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-DYHtO3j9.js");
162247
162283
  return { id: id4, diagram: diagram2 };
162248
162284
  }, "loader");
162249
162285
  var plugin4 = {
@@ -162257,7 +162293,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
162257
162293
  return /^\s*gitGraph/.test(txt);
162258
162294
  }, "detector");
162259
162295
  var loader5 = /* @__PURE__ */ __name(async () => {
162260
- const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-BNe2zRpL.js");
162296
+ const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-CZHNGOm0.js");
162261
162297
  return { id: id5, diagram: diagram2 };
162262
162298
  }, "loader");
162263
162299
  var plugin5 = {
@@ -162271,7 +162307,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
162271
162307
  return /^\s*gantt/.test(txt);
162272
162308
  }, "detector");
162273
162309
  var loader6 = /* @__PURE__ */ __name(async () => {
162274
- const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-CpgS7Gbo.js");
162310
+ const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-BhLp8xvm.js");
162275
162311
  return { id: id6, diagram: diagram2 };
162276
162312
  }, "loader");
162277
162313
  var plugin6 = {
@@ -162285,7 +162321,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
162285
162321
  return /^\s*info/.test(txt);
162286
162322
  }, "detector");
162287
162323
  var loader7 = /* @__PURE__ */ __name(async () => {
162288
- const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-I1ZLYjFY.js");
162324
+ const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-D40Crb-p.js");
162289
162325
  return { id: id7, diagram: diagram2 };
162290
162326
  }, "loader");
162291
162327
  var info = {
@@ -162298,7 +162334,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
162298
162334
  return /^\s*pie/.test(txt);
162299
162335
  }, "detector");
162300
162336
  var loader8 = /* @__PURE__ */ __name(async () => {
162301
- const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-Bat_eWvt.js");
162337
+ const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-EgffZsud.js");
162302
162338
  return { id: id8, diagram: diagram2 };
162303
162339
  }, "loader");
162304
162340
  var pie = {
@@ -162311,7 +162347,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
162311
162347
  return /^\s*quadrantChart/.test(txt);
162312
162348
  }, "detector");
162313
162349
  var loader9 = /* @__PURE__ */ __name(async () => {
162314
- const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-CtqGnRnF.js");
162350
+ const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-n2oJWllV.js");
162315
162351
  return { id: id9, diagram: diagram2 };
162316
162352
  }, "loader");
162317
162353
  var plugin7 = {
@@ -162325,7 +162361,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
162325
162361
  return /^\s*xychart(-beta)?/.test(txt);
162326
162362
  }, "detector");
162327
162363
  var loader10 = /* @__PURE__ */ __name(async () => {
162328
- const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-DPvU_7PC.js");
162364
+ const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-aNxYxejD.js");
162329
162365
  return { id: id10, diagram: diagram2 };
162330
162366
  }, "loader");
162331
162367
  var plugin8 = {
@@ -162339,7 +162375,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
162339
162375
  return /^\s*requirement(Diagram)?/.test(txt);
162340
162376
  }, "detector");
162341
162377
  var loader11 = /* @__PURE__ */ __name(async () => {
162342
- const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-CtysqbZ4.js");
162378
+ const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-CzCXruFj.js");
162343
162379
  return { id: id11, diagram: diagram2 };
162344
162380
  }, "loader");
162345
162381
  var plugin9 = {
@@ -162353,7 +162389,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
162353
162389
  return /^\s*sequenceDiagram/.test(txt);
162354
162390
  }, "detector");
162355
162391
  var loader12 = /* @__PURE__ */ __name(async () => {
162356
- const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-CK0kbINT.js");
162392
+ const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-BfX0R0LP.js");
162357
162393
  return { id: id12, diagram: diagram2 };
162358
162394
  }, "loader");
162359
162395
  var plugin10 = {
@@ -162370,7 +162406,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
162370
162406
  return /^\s*classDiagram/.test(txt);
162371
162407
  }, "detector");
162372
162408
  var loader13 = /* @__PURE__ */ __name(async () => {
162373
- const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-CbQuH3ni.js");
162409
+ const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-qbF8ds74.js");
162374
162410
  return { id: id13, diagram: diagram2 };
162375
162411
  }, "loader");
162376
162412
  var plugin11 = {
@@ -162387,7 +162423,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
162387
162423
  return /^\s*classDiagram-v2/.test(txt);
162388
162424
  }, "detector");
162389
162425
  var loader14 = /* @__PURE__ */ __name(async () => {
162390
- const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-CbQuH3ni.js");
162426
+ const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-qbF8ds74.js");
162391
162427
  return { id: id14, diagram: diagram2 };
162392
162428
  }, "loader");
162393
162429
  var plugin12 = {
@@ -162404,7 +162440,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
162404
162440
  return /^\s*stateDiagram/.test(txt);
162405
162441
  }, "detector");
162406
162442
  var loader15 = /* @__PURE__ */ __name(async () => {
162407
- const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-D5FS7RFa.js");
162443
+ const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-QowlLVwh.js");
162408
162444
  return { id: id15, diagram: diagram2 };
162409
162445
  }, "loader");
162410
162446
  var plugin13 = {
@@ -162424,7 +162460,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
162424
162460
  return false;
162425
162461
  }, "detector");
162426
162462
  var loader16 = /* @__PURE__ */ __name(async () => {
162427
- const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-DoCLlTuy.js");
162463
+ const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-DVHzQlOF.js");
162428
162464
  return { id: id16, diagram: diagram2 };
162429
162465
  }, "loader");
162430
162466
  var plugin14 = {
@@ -162438,7 +162474,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
162438
162474
  return /^\s*journey/.test(txt);
162439
162475
  }, "detector");
162440
162476
  var loader17 = /* @__PURE__ */ __name(async () => {
162441
- const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-lFTyhPiV.js");
162477
+ const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-dtlVBwV2.js");
162442
162478
  return { id: id17, diagram: diagram2 };
162443
162479
  }, "loader");
162444
162480
  var plugin15 = {
@@ -162505,7 +162541,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
162505
162541
  return false;
162506
162542
  }, "detector");
162507
162543
  var loader18 = /* @__PURE__ */ __name(async () => {
162508
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cg70kWHZ.js");
162544
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Cs7hS9X4.js");
162509
162545
  return { id: id18, diagram: diagram2 };
162510
162546
  }, "loader");
162511
162547
  var plugin16 = {
@@ -162519,7 +162555,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
162519
162555
  return /^\s*timeline/.test(txt);
162520
162556
  }, "detector");
162521
162557
  var loader19 = /* @__PURE__ */ __name(async () => {
162522
- const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-jFqO_Cet.js");
162558
+ const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-DUoaC7rz.js");
162523
162559
  return { id: id19, diagram: diagram2 };
162524
162560
  }, "loader");
162525
162561
  var plugin17 = {
@@ -162533,7 +162569,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
162533
162569
  return /^\s*mindmap/.test(txt);
162534
162570
  }, "detector");
162535
162571
  var loader20 = /* @__PURE__ */ __name(async () => {
162536
- const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-D9ZbRdf_.js");
162572
+ const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-DYfEp2uH.js");
162537
162573
  return { id: id20, diagram: diagram2 };
162538
162574
  }, "loader");
162539
162575
  var plugin18 = {
@@ -162547,7 +162583,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
162547
162583
  return /^\s*kanban/.test(txt);
162548
162584
  }, "detector");
162549
162585
  var loader21 = /* @__PURE__ */ __name(async () => {
162550
- const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-BEr5w27W.js");
162586
+ const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-72vgA7Jl.js");
162551
162587
  return { id: id21, diagram: diagram2 };
162552
162588
  }, "loader");
162553
162589
  var plugin19 = {
@@ -162561,7 +162597,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
162561
162597
  return /^\s*sankey(-beta)?/.test(txt);
162562
162598
  }, "detector");
162563
162599
  var loader22 = /* @__PURE__ */ __name(async () => {
162564
- const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-BTLsDOUO.js");
162600
+ const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-C0GqwqSS.js");
162565
162601
  return { id: id22, diagram: diagram2 };
162566
162602
  }, "loader");
162567
162603
  var plugin20 = {
@@ -162575,7 +162611,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
162575
162611
  return /^\s*packet(-beta)?/.test(txt);
162576
162612
  }, "detector");
162577
162613
  var loader23 = /* @__PURE__ */ __name(async () => {
162578
- const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-BapZgpGh.js");
162614
+ const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-XGIpbjo1.js");
162579
162615
  return { id: id23, diagram: diagram2 };
162580
162616
  }, "loader");
162581
162617
  var packet = {
@@ -162588,7 +162624,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
162588
162624
  return /^\s*radar-beta/.test(txt);
162589
162625
  }, "detector");
162590
162626
  var loader24 = /* @__PURE__ */ __name(async () => {
162591
- const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-B30M6IEM.js");
162627
+ const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-B07zrGgY.js");
162592
162628
  return { id: id24, diagram: diagram2 };
162593
162629
  }, "loader");
162594
162630
  var radar = {
@@ -162601,7 +162637,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
162601
162637
  return /^\s*block(-beta)?/.test(txt);
162602
162638
  }, "detector");
162603
162639
  var loader25 = /* @__PURE__ */ __name(async () => {
162604
- const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-DLnnO4-n.js");
162640
+ const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-CRv2pc0L.js");
162605
162641
  return { id: id25, diagram: diagram2 };
162606
162642
  }, "loader");
162607
162643
  var plugin21 = {
@@ -162615,7 +162651,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
162615
162651
  return /^\s*architecture/.test(txt);
162616
162652
  }, "detector");
162617
162653
  var loader26 = /* @__PURE__ */ __name(async () => {
162618
- const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-B6S0AQBn.js");
162654
+ const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-DVUpIskI.js");
162619
162655
  return { id: id26, diagram: diagram2 };
162620
162656
  }, "loader");
162621
162657
  var architecture = {
@@ -162629,7 +162665,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
162629
162665
  return /^\s*treemap/.test(txt);
162630
162666
  }, "detector");
162631
162667
  var loader27 = /* @__PURE__ */ __name(async () => {
162632
- const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-mvCbaKci.js");
162668
+ const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-CWGITxy9.js");
162633
162669
  return { id: id27, diagram: diagram2 };
162634
162670
  }, "loader");
162635
162671
  var treemap = {
@@ -178037,7 +178073,7 @@ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
178037
178073
  const validIds = /* @__PURE__ */ new Set();
178038
178074
  for (const project of projects) {
178039
178075
  for (const worktree of project.worktrees) {
178040
- validIds.add(toWorkspaceId(project.name, worktree.branch));
178076
+ validIds.add(toWorkspaceId(project.name, worktree.name));
178041
178077
  }
178042
178078
  }
178043
178079
  setCache((prev2) => {
@@ -199345,6 +199381,11 @@ function ResourcesPage() {
199345
199381
  queryKey: ["resources", "server"],
199346
199382
  queryFn: () => trpc.services.resourcesServer.query()
199347
199383
  });
199384
+ const appMetricsQuery = useQuery({
199385
+ queryKey: ["resources", "app-metrics"],
199386
+ queryFn: () => invoke("get_app_metrics"),
199387
+ enabled: isDesktop
199388
+ });
199348
199389
  const projectsQuery = useQuery({
199349
199390
  queryKey: ["resources", "projects"],
199350
199391
  queryFn: () => trpc.services.resourcesProjects.query(),
@@ -199408,43 +199449,55 @@ function ResourcesPage() {
199408
199449
  return next2;
199409
199450
  });
199410
199451
  };
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);
199452
+ const sortedProjects = reactExports.useMemo(
199453
+ () => [...projects].sort((a2, b2) => {
199454
+ const sa = sizes.get(a2.project);
199455
+ const sb = sizes.get(b2.project);
199456
+ if (sa && sb) return sb.sizeBytes - sa.sizeBytes;
199457
+ if (sa && !sb) return -1;
199458
+ if (!sa && sb) return 1;
199459
+ return 0;
199460
+ }),
199461
+ [projects, sizes]
199462
+ );
199463
+ const knownTotalBytes = reactExports.useMemo(
199464
+ () => Array.from(sizes.values()).reduce((sum, s2) => sum + s2.sizeBytes, 0),
199465
+ [sizes]
199466
+ );
199467
+ const totalWorktreeCount = reactExports.useMemo(
199468
+ () => projects.reduce((sum, p2) => sum + p2.worktrees.length, 0),
199469
+ [projects]
199470
+ );
199420
199471
  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: [
199472
+ const [serverOpen, setServerOpen] = reactExports.useState(false);
199473
+ const [worktreesOpen, setWorktreesOpen] = reactExports.useState(false);
199474
+ 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: [
199475
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open: serverOpen, onOpenChange: setServerOpen, asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-server-card", children: [
199476
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199477
+ PanelHeader,
199478
+ {
199479
+ title: "Server",
199480
+ toggleTestId: "resources-server-toggle",
199481
+ open: serverOpen,
199482
+ totalTestId: "resources-server-total",
199483
+ total: server ? formatMB(server.memory.rssBytes) : "…",
199484
+ description: `The Node process serving the Band dashboard (${server ? `pid ${server.pid}` : "…"}).`,
199485
+ refresh: /* @__PURE__ */ jsxRuntimeExports.jsx(
199486
+ Button,
199487
+ {
199488
+ variant: "outline",
199489
+ size: "icon-sm",
199490
+ "aria-label": "Refresh",
199491
+ title: "Refresh",
199492
+ "data-testid": "resources-refresh-server",
199493
+ onClick: () => serverQuery.refetch(),
199494
+ disabled: serverQuery.isFetching,
199495
+ children: serverQuery.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
199496
+ }
199497
+ )
199498
+ }
199499
+ ),
199500
+ /* @__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
199501
  "Failed to load server snapshot: ",
199449
199502
  String(serverQuery.error)
199450
199503
  ] }) : !server ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
@@ -199467,37 +199520,42 @@ function ResourcesPage() {
199467
199520
  /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Array buffers", children: formatMB(server.memory.arrayBuffersBytes) }),
199468
199521
  /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (user)", children: formatCpuMs(server.cpu.userMicros) }),
199469
199522
  /* @__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: [
199523
+ ] }) }) })
199524
+ ] }) }),
199525
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ElectronCard, { query: appMetricsQuery }),
199526
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open: worktreesOpen, onOpenChange: setWorktreesOpen, asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-worktrees-card", children: [
199527
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199528
+ PanelHeader,
199529
+ {
199530
+ title: "Worktrees",
199531
+ toggleTestId: "resources-worktrees-toggle",
199532
+ open: worktreesOpen,
199533
+ totalTestId: "resources-worktrees-total",
199534
+ total: `${formatBytes(knownTotalBytes)}${allLoaded ? "" : " (partial)"}`,
199535
+ description: /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
199477
199536
  "Disk usage per tracked git project (allocated blocks, as reported by",
199478
199537
  " ",
199479
199538
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "du" }),
199480
199539
  "). Sizes load per project in batches of ",
199481
199540
  PROJECT_FETCH_CONCURRENCY,
199482
199541
  ". 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: [
199542
+ ] }),
199543
+ refresh: /* @__PURE__ */ jsxRuntimeExports.jsx(
199544
+ Button,
199545
+ {
199546
+ variant: "outline",
199547
+ size: "icon-sm",
199548
+ "aria-label": "Refresh",
199549
+ title: "Refresh",
199550
+ "data-testid": "resources-refresh-worktrees",
199551
+ onClick: handleRefreshSizes,
199552
+ disabled: projectsQuery.isFetching || !allLoaded,
199553
+ children: projectsQuery.isFetching || !allLoaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
199554
+ }
199555
+ )
199556
+ }
199557
+ ),
199558
+ /* @__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
199559
  "Failed to load projects: ",
199502
199560
  String(projectsQuery.error)
199503
199561
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -199511,7 +199569,14 @@ function ResourcesPage() {
199511
199569
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Worktrees" }),
199512
199570
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Total size" })
199513
199571
  ] }) }),
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) => {
199572
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: sortedProjects.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("tr", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
199573
+ "td",
199574
+ {
199575
+ colSpan: 3,
199576
+ className: "py-6 text-center text-sm text-muted-foreground",
199577
+ children: projectsQuery.isFetching ? "Loading…" : "No git projects found"
199578
+ }
199579
+ ) }) : sortedProjects.map((project) => {
199515
199580
  const size2 = sizes.get(project.project);
199516
199581
  const isExpanded = expandedProjects.has(project.project);
199517
199582
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(reactExports.Fragment, { children: [
@@ -199593,7 +199658,7 @@ function ResourcesPage() {
199593
199658
  "Total",
199594
199659
  allLoaded ? "" : " (partial)"
199595
199660
  ] }),
199596
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: projects.reduce((sum, p2) => sum + p2.worktrees.length, 0) }),
199661
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: totalWorktreeCount }),
199597
199662
  /* @__PURE__ */ jsxRuntimeExports.jsx(
199598
199663
  "td",
199599
199664
  {
@@ -199605,10 +199670,144 @@ function ResourcesPage() {
199605
199670
  ] }) })
199606
199671
  ]
199607
199672
  }
199608
- ) })
199609
- ] })
199673
+ ) }) }) })
199674
+ ] }) })
199675
+ ] }) }) });
199676
+ }
199677
+ function ElectronCard({ query }) {
199678
+ const [open2, setOpen] = reactExports.useState(false);
199679
+ if (!isDesktop) return null;
199680
+ const metrics = query.data;
199681
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open: open2, onOpenChange: setOpen, asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-electron-card", children: [
199682
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199683
+ PanelHeader,
199684
+ {
199685
+ title: "Desktop app (Electron)",
199686
+ toggleTestId: "resources-electron-toggle",
199687
+ open: open2,
199688
+ totalTestId: "resources-electron-total",
199689
+ total: metrics ? formatBytes(metrics.totalMemoryKB * 1024) : "…",
199690
+ description: "Per-process CPU and memory for the Electron main process, GPU process, Chromium renderers (the dashboard and each browser tab), and utility helpers.",
199691
+ refresh: /* @__PURE__ */ jsxRuntimeExports.jsx(
199692
+ Button,
199693
+ {
199694
+ variant: "outline",
199695
+ size: "icon-sm",
199696
+ "aria-label": "Refresh",
199697
+ title: "Refresh",
199698
+ "data-testid": "resources-refresh-electron",
199699
+ onClick: () => query.refetch(),
199700
+ disabled: query.isFetching,
199701
+ children: query.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
199702
+ }
199703
+ )
199704
+ }
199705
+ ),
199706
+ /* @__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: [
199707
+ "Failed to load Electron metrics: ",
199708
+ String(query.error)
199709
+ ] }) : !metrics ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
199710
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }),
199711
+ "Loading…"
199712
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
199713
+ "table",
199714
+ {
199715
+ "data-testid": "resources-electron-table",
199716
+ className: "w-full border-collapse text-sm",
199717
+ children: [
199718
+ /* @__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: [
199719
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3", children: "Process" }),
199720
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3", children: "Type" }),
199721
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "PID" }),
199722
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "CPU" }),
199723
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Memory" })
199724
+ ] }) }),
199725
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: metrics.processes.map((p2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
199726
+ "tr",
199727
+ {
199728
+ "data-testid": `resources-electron-row-${p2.pid}`,
199729
+ className: "border-b border-border/60 last:border-0 hover:bg-muted/40",
199730
+ children: [
199731
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3", children: p2.label }),
199732
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-muted-foreground", children: p2.type }),
199733
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: p2.pid }),
199734
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: [
199735
+ p2.cpuPercent.toFixed(1),
199736
+ "%"
199737
+ ] }),
199738
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: formatBytes(p2.memoryKB * 1024) })
199739
+ ]
199740
+ },
199741
+ p2.pid
199742
+ )) }),
199743
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tfoot", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t-2 border-border font-medium", children: [
199744
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "py-2 pr-3", "data-testid": "resources-electron-total-count", children: [
199745
+ "Total (",
199746
+ metrics.processCount,
199747
+ ")"
199748
+ ] }),
199749
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3" }),
199750
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3" }),
199751
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
199752
+ "td",
199753
+ {
199754
+ className: "py-2 pr-3 text-right tabular-nums",
199755
+ "data-testid": "resources-electron-total-cpu",
199756
+ children: [
199757
+ metrics.totalCpuPercent.toFixed(1),
199758
+ "%"
199759
+ ]
199760
+ }
199761
+ ),
199762
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199763
+ "td",
199764
+ {
199765
+ className: "py-2 pr-3 text-right tabular-nums",
199766
+ "data-testid": "resources-electron-total-memory",
199767
+ children: formatBytes(metrics.totalMemoryKB * 1024)
199768
+ }
199769
+ )
199770
+ ] }) })
199771
+ ]
199772
+ }
199773
+ ) }) }) })
199610
199774
  ] }) });
199611
199775
  }
199776
+ function PanelHeader({
199777
+ title,
199778
+ toggleTestId,
199779
+ open: open2,
199780
+ total,
199781
+ totalTestId,
199782
+ description,
199783
+ refresh
199784
+ }) {
199785
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2 p-4", children: [
199786
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
199787
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
199788
+ CollapsibleTrigger,
199789
+ {
199790
+ "data-testid": toggleTestId,
199791
+ className: "group flex w-full items-center gap-2 text-left",
199792
+ children: [
199793
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
199794
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: title }),
199795
+ !open2 && /* @__PURE__ */ jsxRuntimeExports.jsx(
199796
+ "span",
199797
+ {
199798
+ "data-testid": totalTestId,
199799
+ className: "ml-auto pl-2 font-mono text-sm font-normal text-muted-foreground",
199800
+ children: total
199801
+ }
199802
+ )
199803
+ ]
199804
+ }
199805
+ ) }),
199806
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "pl-6 text-sm text-muted-foreground", children: description })
199807
+ ] }),
199808
+ refresh
199809
+ ] });
199810
+ }
199612
199811
  function ServerField({ label, children: children2 }) {
199613
199812
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-0.5", children: [
199614
199813
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: label }),
@@ -199698,14 +199897,14 @@ function TasksPageContent() {
199698
199897
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col overflow-hidden", children: [
199699
199898
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b border-border/50 px-4 py-2", children: [
199700
199899
  /* @__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" }) }),
199900
+ /* @__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
199901
  /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
199703
199902
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "all", children: "All Projects" }),
199704
199903
  projectNames.map((name2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: name2, children: name2 }, name2))
199705
199904
  ] })
199706
199905
  ] }),
199707
199906
  /* @__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" }) }),
199907
+ /* @__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
199908
  /* @__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
199909
  ] }),
199711
199910
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ml-auto flex items-center gap-1", children: [
@@ -199724,6 +199923,7 @@ function TasksPageContent() {
199724
199923
  variant: "outline",
199725
199924
  size: "xs",
199726
199925
  className: "hidden sm:inline-flex",
199926
+ "data-testid": "tasks__new-task-button",
199727
199927
  onClick: () => setShowNewTask(true),
199728
199928
  children: [
199729
199929
  /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3" }),
@@ -199752,13 +199952,20 @@ function TasksPageContent() {
199752
199952
  "Retry"
199753
199953
  ] })
199754
199954
  ] }),
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
- ] }),
199955
+ !loading && !error && filteredTasks.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
199956
+ "div",
199957
+ {
199958
+ className: "flex flex-col items-center justify-center gap-3 py-16 text-center",
199959
+ "data-testid": "tasks__empty-state",
199960
+ children: [
199961
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ListTodo, { className: "size-10 text-muted-foreground" }),
199962
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
199963
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium", children: "No tasks found" }),
199964
+ /* @__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" })
199965
+ ] })
199966
+ ]
199967
+ }
199968
+ ),
199762
199969
  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
199970
  ] }),
199764
199971
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -199774,17 +199981,25 @@ function TasksPageContent() {
199774
199981
  function StatusBadge({ status }) {
199775
199982
  switch (status) {
199776
199983
  case "running":
199777
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1.5", children: [
199984
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1.5", "data-testid": "tasks__status-badge--running", children: [
199778
199985
  /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }),
199779
199986
  "Running"
199780
199987
  ] });
199781
199988
  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
- ] });
199989
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
199990
+ Badge,
199991
+ {
199992
+ variant: "secondary",
199993
+ className: "gap-1.5 text-green-600 dark:text-green-400",
199994
+ "data-testid": "tasks__status-badge--completed",
199995
+ children: [
199996
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-3" }),
199997
+ "Completed"
199998
+ ]
199999
+ }
200000
+ );
199786
200001
  case "failed":
199787
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "destructive", className: "gap-1.5", children: [
200002
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "destructive", className: "gap-1.5", "data-testid": "tasks__status-badge--failed", children: [
199788
200003
  /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "size-3" }),
199789
200004
  "Failed"
199790
200005
  ] });
@@ -199819,78 +200034,86 @@ function TaskCard({
199819
200034
  setActing(false);
199820
200035
  }
199821
200036
  }, [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
- ] });
200037
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
200038
+ "div",
200039
+ {
200040
+ className: "flex flex-col gap-2 rounded-lg border-2 border-border/50 p-4 transition-colors hover:border-border",
200041
+ "data-testid": `tasks__card--${task2.id}`,
200042
+ children: [
200043
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
200044
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "line-clamp-2 min-w-0 flex-1 text-sm font-medium text-foreground", children: task2.prompt }),
200045
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
200046
+ task2.status === "running" && /* @__PURE__ */ jsxRuntimeExports.jsx(
200047
+ Button,
200048
+ {
200049
+ variant: "ghost",
200050
+ size: "icon",
200051
+ className: "size-7",
200052
+ onClick: handleCancel,
200053
+ disabled: acting,
200054
+ title: "Cancel task",
200055
+ children: acting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(CircleX, { className: "size-3.5" })
200056
+ }
200057
+ ),
200058
+ (task2.status === "completed" || task2.status === "failed") && /* @__PURE__ */ jsxRuntimeExports.jsx(
200059
+ Button,
200060
+ {
200061
+ variant: "ghost",
200062
+ size: "icon",
200063
+ className: "size-7",
200064
+ onClick: handleRerun,
200065
+ disabled: acting,
200066
+ title: "Re-run task",
200067
+ children: acting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: "size-3.5" })
200068
+ }
200069
+ ),
200070
+ /* @__PURE__ */ jsxRuntimeExports.jsx(StatusBadge, { status: task2.status })
200071
+ ] })
200072
+ ] }),
200073
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
200074
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium text-foreground/70", children: [
200075
+ task2.project,
200076
+ "/",
200077
+ task2.branch
200078
+ ] }),
200079
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200080
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1", children: [
200081
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
200082
+ relativeTime(task2.startedAt)
200083
+ ] }),
200084
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200085
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatDuration(task2.startedAt, task2.completedAt) }),
200086
+ task2.codingAgentId && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200087
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200088
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: agentMap.get(task2.codingAgentId)?.label ?? task2.codingAgentId })
200089
+ ] }),
200090
+ task2.model && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200091
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200092
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: task2.model })
200093
+ ] }),
200094
+ task2.mode && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200095
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200096
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "capitalize", children: task2.mode })
200097
+ ] }),
200098
+ sessionHref && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
200099
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-border", children: "·" }),
200100
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
200101
+ Link,
200102
+ {
200103
+ to: sessionHref,
200104
+ className: "inline-flex items-center gap-1 text-primary hover:underline",
200105
+ "data-testid": "tasks__session-link",
200106
+ children: [
200107
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink$1, { className: "size-3" }),
200108
+ "Session"
200109
+ ]
200110
+ }
200111
+ )
200112
+ ] })
200113
+ ] })
200114
+ ]
200115
+ }
200116
+ );
199894
200117
  }
199895
200118
  function NewTaskDialog({
199896
200119
  open: open2,
@@ -199988,7 +200211,7 @@ function NewTaskDialog({
199988
200211
  setSubmitting(false);
199989
200212
  }
199990
200213
  }, [workspaceId, prompt, selectedMode, selectedModel, selectedAgent, onSubmit]);
199991
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { children: [
200214
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { "data-testid": "tasks__new-task-dialog", children: [
199992
200215
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
199993
200216
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "New Task" }),
199994
200217
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Dispatch a new task to a coding agent" })
@@ -199997,7 +200220,7 @@ function NewTaskDialog({
199997
200220
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
199998
200221
  /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium", htmlFor: "project-select", children: "Project" }),
199999
200222
  /* @__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" }) }),
200223
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "project-select", "data-testid": "tasks__new-task-project", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Select a project" }) }),
200001
200224
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: projects.map((p2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: p2.name, children: p2.name }, p2.name)) })
200002
200225
  ] })
200003
200226
  ] }),
@@ -200010,7 +200233,7 @@ function NewTaskDialog({
200010
200233
  onValueChange: setSelectedBranch,
200011
200234
  disabled: !selectedProject,
200012
200235
  children: [
200013
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "branch-select", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
200236
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "branch-select", "data-testid": "tasks__new-task-workspace", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
200014
200237
  SelectValue,
200015
200238
  {
200016
200239
  placeholder: selectedProject ? "Select a workspace" : "Select a project first"
@@ -200027,6 +200250,7 @@ function NewTaskDialog({
200027
200250
  Textarea,
200028
200251
  {
200029
200252
  id: "task-prompt",
200253
+ "data-testid": "tasks__new-task-prompt",
200030
200254
  placeholder: "Describe what the agent should do...",
200031
200255
  value: prompt,
200032
200256
  onChange: (e3) => setPrompt(e3.target.value),
@@ -201402,6 +201626,79 @@ function ToolbarOverflowMenuItems() {
201402
201626
  ] })
201403
201627
  ] });
201404
201628
  }
201629
+ function ToolbarActionBar() {
201630
+ const ctx = reactExports.useContext(ToolbarOverflowContext);
201631
+ if (!ctx) {
201632
+ throw new Error("ToolbarActionBar must be used inside ToolbarOverflowProvider");
201633
+ }
201634
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
201635
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
201636
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
201637
+ Button,
201638
+ {
201639
+ size: "icon-sm",
201640
+ variant: "ghost",
201641
+ className: "text-muted-foreground",
201642
+ "aria-label": "Resources",
201643
+ "data-testid": "project-list__resources-button",
201644
+ onClick: ctx.openResources,
201645
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Activity, { className: "size-4" })
201646
+ }
201647
+ ) }),
201648
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: "Resources" })
201649
+ ] }),
201650
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
201651
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
201652
+ Button,
201653
+ {
201654
+ size: "icon-sm",
201655
+ variant: "ghost",
201656
+ className: "text-muted-foreground",
201657
+ "aria-label": "Usage",
201658
+ "data-testid": "project-list__usage-button",
201659
+ onClick: ctx.openReports,
201660
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartColumn, { className: "size-4" })
201661
+ }
201662
+ ) }),
201663
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: "Usage" })
201664
+ ] }),
201665
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
201666
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
201667
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
201668
+ Button,
201669
+ {
201670
+ size: "icon-sm",
201671
+ variant: "ghost",
201672
+ className: "text-muted-foreground",
201673
+ "aria-label": "More actions",
201674
+ "data-testid": "project-list__overflow-trigger",
201675
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Ellipsis, { className: "size-4" })
201676
+ }
201677
+ ) }) }),
201678
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: "More" })
201679
+ ] }),
201680
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "end", children: [
201681
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openTasks, children: [
201682
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ListTodo, { className: "size-4" }),
201683
+ "Tasks"
201684
+ ] }),
201685
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openCronjobs, children: [
201686
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Timer$1, { className: "size-4" }),
201687
+ "Cronjobs"
201688
+ ] }),
201689
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openTunnel, children: [
201690
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
201691
+ Globe,
201692
+ {
201693
+ className: ctx.tunnelStatus === "error" ? "size-4 text-red-500" : ctx.tunnelStatus === "running" ? "size-4 text-green-500" : "size-4"
201694
+ }
201695
+ ),
201696
+ ctx.tunnelStatus === "running" ? "Mobile access" : "Start tunnel"
201697
+ ] })
201698
+ ] })
201699
+ ] })
201700
+ ] });
201701
+ }
201405
201702
  const bandTheme = {
201406
201703
  name: "band",
201407
201704
  className: "dockview-theme-band"
@@ -201421,12 +201718,12 @@ const PANEL_SHORTCUTS = {
201421
201718
  browser: "⇧⌘B"
201422
201719
  };
201423
201720
  const DockviewTerminalContainer = reactExports.lazy(
201424
- () => import("./DockviewTerminalContainer-D6ZTAITZ.js").then((m2) => ({
201721
+ () => import("./DockviewTerminalContainer-OevWE65L.js").then((m2) => ({
201425
201722
  default: m2.DockviewTerminalContainer
201426
201723
  }))
201427
201724
  );
201428
201725
  const DockviewBrowserContainer = reactExports.lazy(
201429
- () => import("./DockviewBrowserContainer-B8W-NI5l.js").then((m2) => ({
201726
+ () => import("./DockviewBrowserContainer-C6QVux14.js").then((m2) => ({
201430
201727
  default: m2.DockviewBrowserContainer
201431
201728
  }))
201432
201729
  );
@@ -203125,8 +203422,15 @@ function AppShell() {
203125
203422
  className: "h-full flex flex-col overflow-hidden border-r border-border bg-sidebar",
203126
203423
  "data-testid": "app-shell__sidebar",
203127
203424
  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 }) })
203425
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
203426
+ SidebarTitleBar,
203427
+ {
203428
+ ...navControlProps,
203429
+ menuItems: void 0,
203430
+ offsetClass: titleBarOffset
203431
+ }
203432
+ ),
203433
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardShell, { hideTitleBar: true, bottomActions: /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarActionBar, {}) }) })
203130
203434
  ]
203131
203435
  }
203132
203436
  )
@@ -203176,12 +203480,12 @@ function RootLayout() {
203176
203480
  ] })
203177
203481
  ] });
203178
203482
  }
203179
- const $$splitComponentImporter$1 = () => import("./index-DsRToCeg.js");
203483
+ const $$splitComponentImporter$1 = () => import("./index-CHvqm6Lz.js");
203180
203484
  const Route$1 = createFileRoute("/")({
203181
203485
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
203182
203486
  });
203183
- const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-B0M_Sxj3.js");
203184
- const $$splitComponentImporter = () => import("./workspace._workspaceId-CGq293LY.js");
203487
+ const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-hnIpuUNX.js");
203488
+ const $$splitComponentImporter = () => import("./workspace._workspaceId-DRK2dblR.js");
203185
203489
  const Route2 = createFileRoute("/workspace/$workspaceId")({
203186
203490
  component: lazyRouteComponent($$splitComponentImporter, "component"),
203187
203491
  // Bookmarks / shared links from before route unification (`/workspace/$id/changes`,
@@ -203317,7 +203621,7 @@ export {
203317
203621
  sin as ay,
203318
203622
  min as az,
203319
203623
  LRLanguage as b,
203320
- ArrowLeft as b$,
203624
+ cn$2 as b$,
203321
203625
  insertNode as b0,
203322
203626
  positionNode as b1,
203323
203627
  getLineFunctionsWithOffset as b2,
@@ -203348,13 +203652,13 @@ export {
203348
203652
  MessageSquare as bR,
203349
203653
  useIsDesktop as bS,
203350
203654
  ToolbarOverflowProvider as bT,
203351
- ToolbarOverflowMenuItems as bU,
203655
+ ToolbarActionBar as bU,
203352
203656
  isDesktop as bV,
203353
- GitCompare as bW,
203354
- FolderOpen as bX,
203355
- useDashboardStore as bY,
203356
- useNavigate as bZ,
203357
- DesktopDragRegion as b_,
203657
+ array$2 as bW,
203658
+ ordinal as bX,
203659
+ Root$5 as bY,
203660
+ Content$1 as bZ,
203661
+ Close as b_,
203358
203662
  NodeWeakMap as ba,
203359
203663
  snippetCompletion as bb,
203360
203664
  Tag as bc,
@@ -203382,121 +203686,129 @@ export {
203382
203686
  isFunction$1 as by,
203383
203687
  isEmpty as bz,
203384
203688
  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,
203689
+ dayjs2 as c$,
203690
+ Title as c0,
203691
+ Description as c1,
203692
+ Portal$4 as c2,
203693
+ Overlay$1 as c3,
203694
+ GitCompare as c4,
203695
+ FolderOpen as c5,
203696
+ useDashboardStore as c6,
203697
+ DesktopDragRegion as c7,
203698
+ Menu$1 as c8,
203699
+ ChevronsUpDown as c9,
203700
+ ZOOM_CSS_VAR as cA,
203701
+ invoke as cB,
203702
+ listen as cC,
203703
+ reactDomExports as cD,
203704
+ Globe as cE,
203705
+ Popover as cF,
203706
+ PopoverTrigger as cG,
203707
+ PopoverContent as cH,
203708
+ Search as cI,
203709
+ Trash2 as cJ,
203710
+ DropdownMenu as cK,
203711
+ DropdownMenuTrigger as cL,
203712
+ ChevronDown as cM,
203713
+ DropdownMenuContent as cN,
203714
+ DropdownMenuItem as cO,
203715
+ TriangleAlert as cP,
203716
+ RotateCw as cQ,
203717
+ Rgb as cR,
203718
+ rgbConvert as cS,
203719
+ define as cT,
203720
+ extend$2 as cU,
203721
+ Color as cV,
203722
+ nogamma as cW,
203723
+ hue as cX,
203724
+ time$2 as cY,
203725
+ min$1 as cZ,
203726
+ max$1 as c_,
203727
+ DiffView as ca,
203728
+ CodeBrowserView as cb,
203729
+ QuickOpenDialog as cc,
203730
+ SearchFilesDialog as cd,
203731
+ WorkspacePickerDialog as ce,
203732
+ useDiffTarget as cf,
203733
+ useSettingsQuery as cg,
203734
+ agentTypeSupportsSessionListing as ch,
203735
+ ChatView as ci,
203736
+ getUserDefinedConfig as cj,
203737
+ getIconSVG as ck,
203738
+ registerIconPacks as cl,
203739
+ unknownIcon as cm,
203740
+ isFilePath as cn,
203741
+ writeClipboardText as co,
203742
+ readClipboardText as cp,
203743
+ ArrowLeft as cq,
203744
+ ArrowUp as cr,
203745
+ ArrowDown as cs,
203746
+ ArrowRight as ct,
203747
+ ClipboardCopy as cu,
203748
+ ClipboardPaste as cv,
203749
+ getCurrentZoomLevel as cw,
203750
+ openExternalUrl as cx,
203751
+ subscribeToZoomChanges as cy,
203752
+ SearchBar as cz,
203449
203753
  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,
203754
+ timeFormat as d0,
203755
+ timeMonth as d1,
203756
+ timeSunday as d2,
203757
+ timeSaturday as d3,
203758
+ timeFriday as d4,
203759
+ timeThursday as d5,
203760
+ timeWednesday as d6,
203761
+ timeTuesday as d7,
203762
+ timeMonday as d8,
203763
+ timeDay as d9,
203764
+ arrayLikeKeys as dA,
203765
+ baseKeys as dB,
203766
+ memoize as dC,
203767
+ isArguments$1 as dD,
203768
+ copyObject as dE,
203769
+ getPrototype as dF,
203770
+ cloneArrayBuffer as dG,
203771
+ cloneTypedArray as dH,
203772
+ getTag$1 as dI,
203773
+ nodeUtil as dJ,
203774
+ copyArray as dK,
203775
+ isBuffer$1 as dL,
203776
+ cloneBuffer as dM,
203777
+ initCloneObject as dN,
203778
+ Stack as dO,
203779
+ MapCache as dP,
203780
+ Uint8Array$1 as dQ,
203781
+ isTypedArray$1 as dR,
203782
+ isLength$1 as dS,
203783
+ Set$1 as dT,
203784
+ createAssigner as dU,
203785
+ isPrototype as dV,
203786
+ router as dW,
203787
+ timeHour as da,
203788
+ timeMinute as db,
203789
+ second as dc,
203790
+ millisecond as dd,
203791
+ isObject$2 as de,
203792
+ isIterateeCall$1 as df,
203793
+ keysIn as dg,
203794
+ eq as dh,
203795
+ isArrayLike$1 as di,
203796
+ isArray$1 as dj,
203797
+ identity$1 as dk,
203798
+ isIndex$1 as dl,
203799
+ assignValue as dm,
203800
+ format as dn,
203801
+ styles2String as dp,
203802
+ isLabelStyle as dq,
203803
+ setToString as dr,
203804
+ overRest as ds,
203805
+ baseFor as dt,
203806
+ baseAssignValue as du,
203807
+ baseUnary as dv,
203808
+ merge$1 as dw,
203809
+ isObjectLike$1 as dx,
203810
+ baseGetTag as dy,
203811
+ Symbol$1 as dz,
203500
203812
  ifNotIn as e,
203501
203813
  foldNodeProp as f,
203502
203814
  completeFromList as g,