@band-app/server 0.16.9 → 0.18.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 (206) hide show
  1. package/dist/client/assets/DockviewBrowserContainer-DjUjHPic.js +5 -0
  2. package/dist/client/assets/DockviewTerminalContainer-Ms5Ihp7N.js +2 -0
  3. package/dist/client/assets/TerminalPanel-DFA3TNjT.js +5 -0
  4. package/dist/client/assets/{_basePickBy-uVqvgsJc.js → _basePickBy-arnwX_WB.js} +1 -1
  5. package/dist/client/assets/{_baseUniq-7i7L1uNE.js → _baseUniq-P2cIT3Cg.js} +1 -1
  6. package/dist/client/assets/arc-CQ9imgVi.js +1 -0
  7. package/dist/client/assets/architectureDiagram-VXUJARFQ-Co2omcgc.js +36 -0
  8. package/dist/client/assets/{blockDiagram-VD42YOAC-CXQSSz3O.js → blockDiagram-VD42YOAC-CawreF4Q.js} +5 -5
  9. package/dist/client/assets/{c4Diagram-YG6GDRKO-DplRXCR2.js → c4Diagram-YG6GDRKO-DGgImgFg.js} +3 -3
  10. package/dist/client/assets/channel-DufC8eM3.js +1 -0
  11. package/dist/client/assets/chunk-4BX2VUAB-CdUSDb5d.js +1 -0
  12. package/dist/client/assets/chunk-55IACEB6-CZzsVv3f.js +1 -0
  13. package/dist/client/assets/{chunk-B4BG7PRW-DlN9tUxh.js → chunk-B4BG7PRW-CglmZrjp.js} +6 -6
  14. package/dist/client/assets/{chunk-DI55MBZ5-a11zyhq4.js → chunk-DI55MBZ5-Cj2wjbCm.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-aGGVV1yn.js → chunk-FMBD7UC4-BNnnH8qi.js} +1 -1
  16. package/dist/client/assets/chunk-QN33PNHL-CPGopyck.js +1 -0
  17. package/dist/client/assets/chunk-QZHKN3VN-DQ2f1Og9.js +1 -0
  18. package/dist/client/assets/chunk-TZMSLE5B-BkXj9bDE.js +1 -0
  19. package/dist/client/assets/classDiagram-2ON5EDUG-6OTp0Ijn.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-WZHVMYZB-6OTp0Ijn.js +1 -0
  21. package/dist/client/assets/clone-BnAVnjoT.js +1 -0
  22. package/dist/client/assets/cose-bilkent-S5V4N54A-CWt-uxWy.js +1 -0
  23. package/dist/client/assets/dagre-6UL2VRFP-CjtHExws.js +4 -0
  24. package/dist/client/assets/diagram-PSM6KHXK-D63FxUPX.js +24 -0
  25. package/dist/client/assets/diagram-QEK2KX5R-bcjaRpQy.js +43 -0
  26. package/dist/client/assets/diagram-S2PKOQOG-BNgqexx6.js +24 -0
  27. package/dist/client/assets/{erDiagram-Q2GNP2WA-kUd-gmjz.js → erDiagram-Q2GNP2WA-CaMPsNqm.js} +4 -4
  28. package/dist/client/assets/{flowDiagram-NV44I4VS-CHbLqCKB.js → flowDiagram-NV44I4VS-DGQOeo3P.js} +5 -5
  29. package/dist/client/assets/ganttDiagram-JELNMOA3-BFJUVCan.js +267 -0
  30. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-DCGODyFn.js +65 -0
  31. package/dist/client/assets/{graph-CSi_akmB.js → graph-CfCyZ7oE.js} +1 -1
  32. package/dist/client/assets/highlighted-body-B3W2YXNL-CxMJmJBc.js +1 -0
  33. package/dist/client/assets/index-6kWpovKB.js +7 -0
  34. package/dist/client/assets/index-BJC5nbeg.js +1 -0
  35. package/dist/client/assets/{index-BPf6S9f1.js → index-BPTxGmQw.js} +1 -1
  36. package/dist/client/assets/{index-C-6dsPog.js → index-BahJEMSD.js} +1 -1
  37. package/dist/client/assets/{index-C4ee_PQ0.js → index-BkI1MMcx.js} +5 -5
  38. package/dist/client/assets/{index-BJP1qdPz.js → index-BomE98r3.js} +1 -1
  39. package/dist/client/assets/{index-CA1NuCd_.js → index-CUSuiGMh.js} +1 -1
  40. package/dist/client/assets/{index-5X7JRvnK.js → index-CeneentR.js} +1 -1
  41. package/dist/client/assets/{index-spwNnd85.js → index-DL6FOBAZ.js} +1 -1
  42. package/dist/client/assets/{index-oolizINO.js → index-DLyLpX_A.js} +1 -1
  43. package/dist/client/assets/{index-T_1b5WRg.js → index-DTmrp96f.js} +1 -1
  44. package/dist/client/assets/{index-B0ZcEU4c.js → index-DU9qIaIU.js} +1 -1
  45. package/dist/client/assets/{index-udv0M-ix.js → index-DawFiDM_.js} +2 -2
  46. package/dist/client/assets/index-DgA9NKMV.js +1 -0
  47. package/dist/client/assets/{index-DfHcm4JM.js → index-DvwEAnql.js} +1 -1
  48. package/dist/client/assets/{index-CNQHGhCu.js → index-DxSYOqNl.js} +1 -1
  49. package/dist/client/assets/{index-C-3PAt1d.js → index-DyzP8Zt_.js} +1 -1
  50. package/dist/client/assets/index-plMivlE6.js +1 -0
  51. package/dist/client/assets/infoDiagram-HS3SLOUP-CNf_MNW6.js +2 -0
  52. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-DIY8FE8Z.js → journeyDiagram-XKPGCS4Q-DK-VcCfU.js} +3 -3
  53. package/dist/client/assets/{kanban-definition-3W4ZIXB7-Cd_JJ8FN.js → kanban-definition-3W4ZIXB7-DqVZenrn.js} +8 -8
  54. package/dist/client/assets/{layout-Bhb5FQCr.js → layout-DBSNY4Lg.js} +1 -1
  55. package/dist/client/assets/{linear-Cmk2RyH_.js → linear-hC1V8gzM.js} +1 -1
  56. package/dist/client/assets/{main-BlRcPsmZ.js → main-BMyWFWYN.js} +227 -226
  57. package/dist/client/assets/main-evBJruhw.css +1 -0
  58. package/dist/client/assets/{mindmap-definition-VGOIOE7T-B-WhBVeY.js → mindmap-definition-VGOIOE7T-C0d6PFL2.js} +3 -3
  59. package/dist/client/assets/pieDiagram-ADFJNKIX-BMZI-9Ki.js +30 -0
  60. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-DHBoMUCQ.js → quadrantDiagram-AYHSOK5B-CQyKjYLy.js} +2 -2
  61. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-DjS5RONh.js → requirementDiagram-UZGBJVZJ-DdSXmDi9.js} +2 -2
  62. package/dist/client/assets/sankeyDiagram-TZEHDZUN-BslS_Swn.js +10 -0
  63. package/dist/client/assets/{sequenceDiagram-WL72ISMW-CzqbRfb_.js → sequenceDiagram-WL72ISMW-DyxawmBP.js} +1 -1
  64. package/dist/client/assets/{square-terminal-CNHJa6OY.js → square-terminal-BXuSt2dW.js} +1 -1
  65. package/dist/client/assets/stateDiagram-FKZM4ZOC-D_5xUVRu.js +1 -0
  66. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DDClSQGJ.js +1 -0
  67. package/dist/client/assets/{timeline-definition-IT6M3QCI-CNKMKDwq.js → timeline-definition-IT6M3QCI-BN5646-s.js} +4 -4
  68. package/dist/client/assets/{treemap-GDKQZRPO-DCEPrZh7.js → treemap-GDKQZRPO-TYUv7aqt.js} +1 -1
  69. package/dist/client/assets/workspace._workspaceId-BVuxUwhR.js +1 -0
  70. package/dist/client/assets/workspace._workspaceId-DCDakxld.js +2 -0
  71. package/dist/client/assets/{xychartDiagram-PRI3JC2R-Cr18I3A3.js → xychartDiagram-PRI3JC2R-TNRUAqXa.js} +4 -4
  72. package/dist/migrations/20260525163504_add_projects_has_origin/migration.sql +1 -0
  73. package/dist/migrations/20260525163504_add_projects_has_origin/snapshot.json +866 -0
  74. package/dist/migrations/20260527120444_panel_labels/migration.sql +1 -0
  75. package/dist/migrations/20260527120444_panel_labels/snapshot.json +876 -0
  76. package/dist/openapi.json +441 -6
  77. package/dist/server/assets/{DockviewBrowserContainer-Bm7ARaqd.js → DockviewBrowserContainer-BHlHNdlw.js} +42 -22
  78. package/dist/server/assets/{DockviewTerminalContainer-BbMZgBJ8.js → DockviewTerminalContainer-B4s5M71S.js} +44 -24
  79. package/dist/server/assets/{TerminalPanel-BmhYCf33.js → TerminalPanel-NJ_oHfHq.js} +1 -1
  80. package/dist/server/assets/{_basePickBy-C7CNOUDi.js → _basePickBy-BstQwUjx.js} +2 -2
  81. package/dist/server/assets/{_baseUniq-DeF47vVO.js → _baseUniq-BloU0u1p.js} +1 -1
  82. package/dist/server/assets/_tanstack-start-manifest_v-DxI647M-.js +4 -0
  83. package/dist/server/assets/{arc-P5FY7IYH.js → arc-D6eCV6DV.js} +1 -1
  84. package/dist/server/assets/{architecture-7HQA4BMR-LvprLHYS.js → architecture-7HQA4BMR-CaZikjMP.js} +6 -6
  85. package/dist/server/assets/{architectureDiagram-VXUJARFQ-Br4iiUzH.js → architectureDiagram-VXUJARFQ-B4vqMbhE.js} +6 -6
  86. package/dist/server/assets/{blockDiagram-VD42YOAC-BahODDhX.js → blockDiagram-VD42YOAC-CO_-9S_E.js} +6 -6
  87. package/dist/server/assets/{c4Diagram-YG6GDRKO-CQcZX6cr.js → c4Diagram-YG6GDRKO-CD7rCwaq.js} +2 -2
  88. package/dist/server/assets/{channel-BmAB_ZKU.js → channel-BMp2wZD3.js} +1 -1
  89. package/dist/server/assets/{chunk-4BX2VUAB-YUvszr4w.js → chunk-4BX2VUAB-DepEjWoL.js} +1 -1
  90. package/dist/server/assets/{chunk-55IACEB6-BUgBPiJd.js → chunk-55IACEB6-Bi12nYoO.js} +1 -1
  91. package/dist/server/assets/{chunk-B4BG7PRW-BxuWeZlV.js → chunk-B4BG7PRW-C_aztpTA.js} +4 -4
  92. package/dist/server/assets/{chunk-DI55MBZ5-DuGkdvte.js → chunk-DI55MBZ5-DyEwLpXK.js} +3 -3
  93. package/dist/server/assets/{chunk-FMBD7UC4-qY-BVG34.js → chunk-FMBD7UC4-BInQidDU.js} +1 -1
  94. package/dist/server/assets/{chunk-QN33PNHL-BM_oi8-e.js → chunk-QN33PNHL-BzMgQvmo.js} +1 -1
  95. package/dist/server/assets/{chunk-QZHKN3VN-BL6_-at8.js → chunk-QZHKN3VN-DyvushgJ.js} +1 -1
  96. package/dist/server/assets/{chunk-TZMSLE5B-38NhX5at.js → chunk-TZMSLE5B-Gk23cBC5.js} +1 -1
  97. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-CwIsZ53p.js → classDiagram-2ON5EDUG-C2IXOi-1.js} +5 -5
  98. package/dist/server/assets/{classDiagram-2ON5EDUG-CwIsZ53p.js → classDiagram-v2-WZHVMYZB-C2IXOi-1.js} +5 -5
  99. package/dist/server/assets/{clone-BXHuGM8i.js → clone-Dw9tAHpg.js} +1 -1
  100. package/dist/server/assets/{cose-bilkent-S5V4N54A-D1CdgGvI.js → cose-bilkent-S5V4N54A-CnP5PKtl.js} +1 -1
  101. package/dist/server/assets/{dagre-6UL2VRFP-UMvdMLG3.js → dagre-6UL2VRFP-Hm-Wejtu.js} +6 -6
  102. package/dist/server/assets/{diagram-PSM6KHXK-DtOD93m7.js → diagram-PSM6KHXK-C6URVSbQ.js} +7 -7
  103. package/dist/server/assets/{diagram-QEK2KX5R-DViyYq-y.js → diagram-QEK2KX5R-D595vsyp.js} +6 -6
  104. package/dist/server/assets/{diagram-S2PKOQOG-C42mRVEn.js → diagram-S2PKOQOG-C69I055N.js} +6 -6
  105. package/dist/server/assets/{erDiagram-Q2GNP2WA-D14z9IvB.js → erDiagram-Q2GNP2WA-DKL3OoDz.js} +4 -4
  106. package/dist/server/assets/{flowDiagram-NV44I4VS-BYBNOZwM.js → flowDiagram-NV44I4VS-vb-7BBaz.js} +5 -5
  107. package/dist/server/assets/{ganttDiagram-JELNMOA3-CaG3uoK-.js → ganttDiagram-JELNMOA3-CryNIjT5.js} +2 -2
  108. package/dist/server/assets/{gitGraph-G5XIXVHT-Dsx3dV0R.js → gitGraph-G5XIXVHT-DizYGNvA.js} +6 -6
  109. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-CrSfx7b3.js → gitGraphDiagram-V2S2FVAM-BrIjiO3l.js} +7 -7
  110. package/dist/server/assets/{graph-gBFInK6H.js → graph-mppr1RdG.js} +2 -2
  111. package/dist/server/assets/{highlighted-body-B3W2YXNL-DjTWk17l.js → highlighted-body-B3W2YXNL-CTUp2Nbw.js} +1 -1
  112. package/dist/server/assets/{index-2gWBdIrR.js → index-B69XH0ed.js} +2 -2
  113. package/dist/server/assets/{index-3wtbr7va.js → index-BCNeT6hv.js} +3 -3
  114. package/dist/server/assets/{index-Bd5jTryJ.js → index-BIskkFyK.js} +2 -2
  115. package/dist/server/assets/{index-5N2Gh0ba.js → index-BQJWbe4d.js} +2 -2
  116. package/dist/server/assets/{index-QxgXX0fb.js → index-Be6X1xir.js} +2 -2
  117. package/dist/server/assets/{index-DZZ6NiTf.js → index-BzMgAG0v.js} +3 -3
  118. package/dist/server/assets/{index-egmIrLx2.js → index-CDaDncKA.js} +4 -4
  119. package/dist/server/assets/{index-Bs6a6-xI.js → index-CIHMj9rA.js} +5 -5
  120. package/dist/server/assets/{index-DsGPaWHg.js → index-CNkj1XIM.js} +2 -2
  121. package/dist/server/assets/{index-C245EJn1.js → index-CVOspA2K.js} +2 -2
  122. package/dist/server/assets/{index-Dv-16VYI.js → index-Cb8rr1Cd.js} +2 -2
  123. package/dist/server/assets/{index-Bw42FDwO.js → index-CbH_b9nh.js} +2 -2
  124. package/dist/server/assets/{index-6Zof9vm8.js → index-D8W-WZ8Y.js} +1 -1
  125. package/dist/server/assets/{index-DXgP0Lsu.js → index-DC7cATF0.js} +2 -2
  126. package/dist/server/assets/{index-B84Urg23.js → index-DJTGOXyp.js} +2 -2
  127. package/dist/server/assets/{index-CD97pPmc.js → index-Dpy7oNI-.js} +1 -1
  128. package/dist/server/assets/{index-CwQ5qWPC.js → index-HTfoqKS_.js} +5 -5
  129. package/dist/server/assets/{index-C3N_Nx6h.js → index-Om1fUMxJ.js} +2 -2
  130. package/dist/server/assets/{info-VBDWY6EO-CueOsYFZ.js → info-VBDWY6EO-B627l6on.js} +6 -6
  131. package/dist/server/assets/{infoDiagram-HS3SLOUP-CeyMzohL.js → infoDiagram-HS3SLOUP-Bx-2RIP1.js} +5 -5
  132. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-ANqeM_TM.js → journeyDiagram-XKPGCS4Q-COrw3Dj9.js} +4 -4
  133. package/dist/server/assets/{kanban-definition-3W4ZIXB7-B0RkH45q.js → kanban-definition-3W4ZIXB7-CexmIyEk.js} +2 -2
  134. package/dist/server/assets/{layout-JjP5jdu6.js → layout-CpkjZ_rj.js} +4 -4
  135. package/dist/server/assets/{linear-BJgoq5J4.js → linear-DhOj0qpX.js} +1 -1
  136. package/dist/server/assets/{mermaid-3ZIDBTTL-CFPuUseQ.js → mermaid-3ZIDBTTL-8k9Pr9Qn.js} +1 -1
  137. package/dist/server/assets/{mermaid-parser.core-CKKZ1VFr.js → mermaid-parser.core-ueKoLtpn.js} +11 -11
  138. package/dist/server/assets/{mindmap-definition-VGOIOE7T-DlEXF5z8.js → mindmap-definition-VGOIOE7T-Lf0rrgEi.js} +3 -3
  139. package/dist/server/assets/{packet-DYOGHKS2-CvyxHTRM.js → packet-DYOGHKS2-Bv6REKYk.js} +6 -6
  140. package/dist/server/assets/{pie-VRWISCQL-DfpVZlpC.js → pie-VRWISCQL-DRcS7bNz.js} +6 -6
  141. package/dist/server/assets/{pieDiagram-ADFJNKIX-CWkrHsNk.js → pieDiagram-ADFJNKIX-m0hjxyCj.js} +7 -7
  142. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-C25p2xz7.js → quadrantDiagram-AYHSOK5B-omed34Wz.js} +2 -2
  143. package/dist/server/assets/{radar-ZZBFDIW7-DWqPsDMi.js → radar-ZZBFDIW7-Ba1phWAD.js} +6 -6
  144. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-ACRVXQGO.js → requirementDiagram-UZGBJVZJ-BCx5DoGU.js} +3 -3
  145. package/dist/server/assets/{router-GhGSLKfP.js → router-DXfwP2_o.js} +1266 -621
  146. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-uzNSHudY.js → sankeyDiagram-TZEHDZUN-9M4Rn44L.js} +1 -1
  147. package/dist/server/assets/{sequenceDiagram-WL72ISMW-C_wFtq8b.js → sequenceDiagram-WL72ISMW-DXMFuhl3.js} +3 -3
  148. package/dist/server/assets/{square-terminal-cghvb5Il.js → square-terminal-CfM5f-d7.js} +1 -1
  149. package/dist/server/assets/{stateDiagram-FKZM4ZOC-B9MGwsuS.js → stateDiagram-FKZM4ZOC-CY6AEWa2.js} +8 -8
  150. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-CLHd8oUa.js → stateDiagram-v2-4FDKWEC3-BNKDdzaI.js} +4 -4
  151. package/dist/server/assets/{timeline-definition-IT6M3QCI-CqKot5RT.js → timeline-definition-IT6M3QCI-D_io-Tfq.js} +2 -2
  152. package/dist/server/assets/{treemap-GDKQZRPO-mMRojqRQ.js → treemap-GDKQZRPO-p84SlzEZ.js} +6 -6
  153. package/dist/server/assets/workspace._workspaceId-BnLo-dj-.js +23 -0
  154. package/dist/server/assets/{workspace._workspaceId-DwsRTXCg.js → workspace._workspaceId-CJcudFN3.js} +125 -97
  155. package/dist/server/assets/{xychartDiagram-PRI3JC2R-j8PckQEj.js → xychartDiagram-PRI3JC2R-Y3f7rM8c.js} +2 -2
  156. package/dist/server/server.js +2 -2
  157. package/dist/start-server.mjs +854 -469
  158. package/package.json +4 -4
  159. package/dist/client/assets/DockviewBrowserContainer-CCBAkU1p.js +0 -5
  160. package/dist/client/assets/DockviewTerminalContainer-B9hdDoMz.js +0 -2
  161. package/dist/client/assets/TerminalPanel-BKfWmj6W.js +0 -5
  162. package/dist/client/assets/arc-DiYEQGs3.js +0 -1
  163. package/dist/client/assets/architectureDiagram-VXUJARFQ-C5z8L1iK.js +0 -36
  164. package/dist/client/assets/channel-BnMJuhcI.js +0 -1
  165. package/dist/client/assets/chunk-4BX2VUAB-B4Mk_d7A.js +0 -1
  166. package/dist/client/assets/chunk-55IACEB6-B0hf8Eje.js +0 -1
  167. package/dist/client/assets/chunk-QN33PNHL-Dit4S-yJ.js +0 -1
  168. package/dist/client/assets/chunk-QZHKN3VN-L-h1VSi0.js +0 -1
  169. package/dist/client/assets/chunk-TZMSLE5B-DpK-hWaC.js +0 -1
  170. package/dist/client/assets/classDiagram-2ON5EDUG-D89oCSXI.js +0 -1
  171. package/dist/client/assets/classDiagram-v2-WZHVMYZB-D89oCSXI.js +0 -1
  172. package/dist/client/assets/clone-X7FA7kE2.js +0 -1
  173. package/dist/client/assets/cose-bilkent-S5V4N54A-CzoIK-3W.js +0 -1
  174. package/dist/client/assets/dagre-6UL2VRFP-BhfXeb7k.js +0 -4
  175. package/dist/client/assets/diagram-PSM6KHXK-BwFVwR1b.js +0 -24
  176. package/dist/client/assets/diagram-QEK2KX5R-BO-CEopy.js +0 -43
  177. package/dist/client/assets/diagram-S2PKOQOG-BxiH83lN.js +0 -24
  178. package/dist/client/assets/ganttDiagram-JELNMOA3-B7gBcAFl.js +0 -267
  179. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-gca_jqKQ.js +0 -65
  180. package/dist/client/assets/highlighted-body-B3W2YXNL-C2a-lsk8.js +0 -1
  181. package/dist/client/assets/index-2F-slvqo.js +0 -1
  182. package/dist/client/assets/index-C4PISrIW.js +0 -1
  183. package/dist/client/assets/index-CiKTedrx.js +0 -1
  184. package/dist/client/assets/index-DNrK0iIn.js +0 -7
  185. package/dist/client/assets/infoDiagram-HS3SLOUP-BK3MmhkJ.js +0 -2
  186. package/dist/client/assets/main-BLOY6Nam.css +0 -1
  187. package/dist/client/assets/pieDiagram-ADFJNKIX-CYoHsaM9.js +0 -30
  188. package/dist/client/assets/sankeyDiagram-TZEHDZUN-DmhEbBY-.js +0 -10
  189. package/dist/client/assets/stateDiagram-FKZM4ZOC-CafvdTb3.js +0 -1
  190. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BkKHK-CQ.js +0 -1
  191. package/dist/client/assets/useSessionListContext-xer-Wcmf.js +0 -1
  192. package/dist/client/assets/workspace._workspaceId-CgG1n_1x.js +0 -1
  193. package/dist/client/assets/workspace._workspaceId.changes-BKX7lUhX.js +0 -1
  194. package/dist/client/assets/workspace._workspaceId.code-BcnxRdZi.js +0 -1
  195. package/dist/client/assets/workspace._workspaceId.code._-BbOt6tOD.js +0 -1
  196. package/dist/client/assets/workspace._workspaceId.code.index-DC2535x-.js +0 -1
  197. package/dist/client/assets/workspace._workspaceId.index-CNjq1nDf.js +0 -1
  198. package/dist/client/assets/workspace._workspaceId.terminal-DhYn8I5t.js +0 -2
  199. package/dist/server/assets/_tanstack-start-manifest_v-BNCQ-izx.js +0 -4
  200. package/dist/server/assets/useSessionListContext-D_vX6E2e.js +0 -23
  201. package/dist/server/assets/workspace._workspaceId.changes-C6vwSbUh.js +0 -38
  202. package/dist/server/assets/workspace._workspaceId.code-Cuj0zH98.js +0 -12
  203. package/dist/server/assets/workspace._workspaceId.code._-BJdg1-Gs.js +0 -44
  204. package/dist/server/assets/workspace._workspaceId.code.index-CE_CMD_I.js +0 -36
  205. package/dist/server/assets/workspace._workspaceId.index-BPhXMwl8.js +0 -112
  206. package/dist/server/assets/workspace._workspaceId.terminal-BdVDaWNH.js +0 -24
@@ -443,7 +443,7 @@ const Link = reactExports.forwardRef(
443
443
  return reactExports.createElement(_asChild, linkProps, children2);
444
444
  }
445
445
  );
446
- let Route$9 = class Route extends BaseRoute {
446
+ let Route$3 = class Route extends BaseRoute {
447
447
  /**
448
448
  * @deprecated Use the `createRoute` function instead.
449
449
  */
@@ -495,7 +495,7 @@ let Route$9 = class Route extends BaseRoute {
495
495
  }
496
496
  };
497
497
  function createRoute(options) {
498
- return new Route$9(
498
+ return new Route$3(
499
499
  // TODO: Help us TypeChris, you're our only hope!
500
500
  options
501
501
  );
@@ -633,7 +633,7 @@ function lazyRouteComponent(importer, exportName) {
633
633
  if (!loadPromise) {
634
634
  loadPromise = importer().then((res) => {
635
635
  loadPromise = void 0;
636
- comp = res[exportName];
636
+ comp = res[exportName ?? "default"];
637
637
  }).catch((err) => {
638
638
  error = err;
639
639
  if (isModuleNotFoundError(error)) {
@@ -1093,6 +1093,16 @@ const createLucideIcon = (iconName, iconNode) => {
1093
1093
  Component.displayName = toPascalCase(iconName);
1094
1094
  return Component;
1095
1095
  };
1096
+ const __iconNode$1p = [
1097
+ [
1098
+ "path",
1099
+ {
1100
+ d: "M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",
1101
+ key: "169zse"
1102
+ }
1103
+ ]
1104
+ ];
1105
+ const Activity = createLucideIcon("activity", __iconNode$1p);
1096
1106
  const __iconNode$1o = [
1097
1107
  ["path", { d: "M12 17V3", key: "1cwfxf" }],
1098
1108
  ["path", { d: "m6 11 6 6 6-6", key: "12ii2o" }],
@@ -40500,53 +40510,53 @@ async function loadLanguage(lang) {
40500
40510
  try {
40501
40511
  switch (lang) {
40502
40512
  case "javascript":
40503
- return import("./index-QxgXX0fb.js").then((m2) => m2.javascript());
40513
+ return import("./index-Be6X1xir.js").then((m2) => m2.javascript());
40504
40514
  case "jsx":
40505
- return import("./index-QxgXX0fb.js").then((m2) => m2.javascript({ jsx: true }));
40515
+ return import("./index-Be6X1xir.js").then((m2) => m2.javascript({ jsx: true }));
40506
40516
  case "typescript":
40507
- return import("./index-QxgXX0fb.js").then(
40517
+ return import("./index-Be6X1xir.js").then(
40508
40518
  (m2) => m2.javascript({ typescript: true })
40509
40519
  );
40510
40520
  case "tsx":
40511
- return import("./index-QxgXX0fb.js").then(
40521
+ return import("./index-Be6X1xir.js").then(
40512
40522
  (m2) => m2.javascript({ jsx: true, typescript: true })
40513
40523
  );
40514
40524
  case "python":
40515
- return import("./index-DsGPaWHg.js").then((m2) => m2.python());
40525
+ return import("./index-CNkj1XIM.js").then((m2) => m2.python());
40516
40526
  case "html":
40517
- return import("./index-egmIrLx2.js").then((m2) => m2.html());
40527
+ return import("./index-CDaDncKA.js").then((m2) => m2.html());
40518
40528
  case "css":
40519
- return import("./index-C245EJn1.js").then((m2) => m2.css());
40529
+ return import("./index-CVOspA2K.js").then((m2) => m2.css());
40520
40530
  case "scss":
40521
40531
  case "sass":
40522
- return import("./index-3wtbr7va.js").then((m2) => m2.sass());
40532
+ return import("./index-BCNeT6hv.js").then((m2) => m2.sass());
40523
40533
  case "less":
40524
- return import("./index-DZZ6NiTf.js").then((m2) => m2.less());
40534
+ return import("./index-BzMgAG0v.js").then((m2) => m2.less());
40525
40535
  case "json":
40526
40536
  case "jsonc":
40527
- return import("./index-DXgP0Lsu.js").then((m2) => m2.json());
40537
+ return import("./index-DC7cATF0.js").then((m2) => m2.json());
40528
40538
  case "markdown":
40529
40539
  case "mdx":
40530
- return import("./index-Bs6a6-xI.js").then((m2) => m2.markdown());
40540
+ return import("./index-CIHMj9rA.js").then((m2) => m2.markdown());
40531
40541
  case "xml":
40532
- return import("./index-5N2Gh0ba.js").then((m2) => m2.xml());
40542
+ return import("./index-BQJWbe4d.js").then((m2) => m2.xml());
40533
40543
  case "yaml":
40534
- return import("./index-Bw42FDwO.js").then((m2) => m2.yaml());
40544
+ return import("./index-CbH_b9nh.js").then((m2) => m2.yaml());
40535
40545
  case "sql":
40536
- return import("./index-Dv-16VYI.js").then((m2) => m2.sql());
40546
+ return import("./index-Cb8rr1Cd.js").then((m2) => m2.sql());
40537
40547
  case "rust":
40538
- return import("./index-C3N_Nx6h.js").then((m2) => m2.rust());
40548
+ return import("./index-Om1fUMxJ.js").then((m2) => m2.rust());
40539
40549
  case "go":
40540
- return import("./index-B84Urg23.js").then((m2) => m2.go());
40550
+ return import("./index-DJTGOXyp.js").then((m2) => m2.go());
40541
40551
  case "java":
40542
- return import("./index-Bd5jTryJ.js").then((m2) => m2.java());
40552
+ return import("./index-BIskkFyK.js").then((m2) => m2.java());
40543
40553
  case "kotlin":
40544
- return import("./index-Bd5jTryJ.js").then((m2) => m2.java());
40554
+ return import("./index-BIskkFyK.js").then((m2) => m2.java());
40545
40555
  case "c":
40546
40556
  case "cpp":
40547
- return import("./index-2gWBdIrR.js").then((m2) => m2.cpp());
40557
+ return import("./index-B69XH0ed.js").then((m2) => m2.cpp());
40548
40558
  case "php":
40549
- return import("./index-CwQ5qWPC.js").then((m2) => m2.php());
40559
+ return import("./index-HTfoqKS_.js").then((m2) => m2.php());
40550
40560
  // Legacy modes via StreamLanguage
40551
40561
  case "bash":
40552
40562
  case "fish":
@@ -40612,7 +40622,7 @@ function baseViewerExtensions(isDark2 = true, opts) {
40612
40622
  rootDarkStyles.height = "100%";
40613
40623
  rootLightStyles.height = "100%";
40614
40624
  }
40615
- const scrollerStyles = naturalHeight ? { overflow: "visible" } : { overflow: "auto" };
40625
+ const scrollerStyles = naturalHeight ? { overflowX: "auto", height: "auto" } : { overflow: "auto" };
40616
40626
  return [
40617
40627
  EditorState.readOnly.of(true),
40618
40628
  EditorView.editable.of(false),
@@ -41770,8 +41780,8 @@ const LABELS_COLLAPSE_KEY = "band.projects-list.collapsed-labels";
41770
41780
  const PINNED_COLLAPSE_KEY = "band.projects-list.collapsed-pinned";
41771
41781
  const UNLABELED_KEY = "__unlabeled";
41772
41782
  const PINNED_SECTION_ID = "__pinned";
41773
- const SYNC_EVENT$1 = "band:collapse-state-change";
41774
- function read$1(key2) {
41783
+ const SYNC_EVENT$2 = "band:collapse-state-change";
41784
+ function read$2(key2) {
41775
41785
  if (typeof window === "undefined") return /* @__PURE__ */ new Set();
41776
41786
  try {
41777
41787
  const raw2 = window.localStorage.getItem(key2);
@@ -41783,27 +41793,27 @@ function read$1(key2) {
41783
41793
  }
41784
41794
  return /* @__PURE__ */ new Set();
41785
41795
  }
41786
- function write$1(key2, set2) {
41796
+ function write$2(key2, set2) {
41787
41797
  if (typeof window === "undefined") return;
41788
41798
  try {
41789
41799
  window.localStorage.setItem(key2, JSON.stringify([...set2]));
41790
41800
  } catch {
41791
41801
  }
41792
- window.dispatchEvent(new CustomEvent(SYNC_EVENT$1, { detail: { key: key2 } }));
41802
+ window.dispatchEvent(new CustomEvent(SYNC_EVENT$2, { detail: { key: key2 } }));
41793
41803
  }
41794
41804
  function useCollapseState(storageKey2) {
41795
- const [collapsed, setCollapsed] = reactExports.useState(() => read$1(storageKey2));
41805
+ const [collapsed, setCollapsed] = reactExports.useState(() => read$2(storageKey2));
41796
41806
  reactExports.useEffect(() => {
41797
41807
  const sync = (e2) => {
41798
41808
  if (e2 instanceof StorageEvent && e2.key !== storageKey2) return;
41799
41809
  if (e2 instanceof CustomEvent && e2.detail?.key !== storageKey2) return;
41800
- setCollapsed(read$1(storageKey2));
41810
+ setCollapsed(read$2(storageKey2));
41801
41811
  };
41802
41812
  window.addEventListener("storage", sync);
41803
- window.addEventListener(SYNC_EVENT$1, sync);
41813
+ window.addEventListener(SYNC_EVENT$2, sync);
41804
41814
  return () => {
41805
41815
  window.removeEventListener("storage", sync);
41806
- window.removeEventListener(SYNC_EVENT$1, sync);
41816
+ window.removeEventListener(SYNC_EVENT$2, sync);
41807
41817
  };
41808
41818
  }, [storageKey2]);
41809
41819
  const isCollapsed = reactExports.useCallback((id28) => collapsed.has(id28), [collapsed]);
@@ -41816,7 +41826,7 @@ function useCollapseState(storageKey2) {
41816
41826
  } else {
41817
41827
  next2.add(id28);
41818
41828
  }
41819
- write$1(storageKey2, next2);
41829
+ write$2(storageKey2, next2);
41820
41830
  return next2;
41821
41831
  });
41822
41832
  },
@@ -41828,7 +41838,7 @@ function useCollapseState(storageKey2) {
41828
41838
  if (!prev2.has(id28)) return prev2;
41829
41839
  const next2 = new Set(prev2);
41830
41840
  next2.delete(id28);
41831
- write$1(storageKey2, next2);
41841
+ write$2(storageKey2, next2);
41832
41842
  return next2;
41833
41843
  });
41834
41844
  },
@@ -41837,7 +41847,7 @@ function useCollapseState(storageKey2) {
41837
41847
  const setAll = reactExports.useCallback(
41838
41848
  (ids2) => {
41839
41849
  const next2 = new Set(ids2);
41840
- write$1(storageKey2, next2);
41850
+ write$2(storageKey2, next2);
41841
41851
  setCollapsed(next2);
41842
41852
  },
41843
41853
  [storageKey2]
@@ -41886,8 +41896,8 @@ function useHooksSetup() {
41886
41896
  return { state: state2, install };
41887
41897
  }
41888
41898
  const LABEL_FILTER_KEY = "band.projects-list.label-filter";
41889
- const SYNC_EVENT = "band:label-filter-change";
41890
- function read() {
41899
+ const SYNC_EVENT$1 = "band:label-filter-change";
41900
+ function read$1() {
41891
41901
  if (typeof window === "undefined") return null;
41892
41902
  try {
41893
41903
  const raw2 = window.localStorage.getItem(LABEL_FILTER_KEY);
@@ -41896,7 +41906,7 @@ function read() {
41896
41906
  return null;
41897
41907
  }
41898
41908
  }
41899
- function write(value) {
41909
+ function write$1(value) {
41900
41910
  if (typeof window === "undefined") return;
41901
41911
  try {
41902
41912
  if (value == null) {
@@ -41906,28 +41916,65 @@ function write(value) {
41906
41916
  }
41907
41917
  } catch {
41908
41918
  }
41909
- window.dispatchEvent(new CustomEvent(SYNC_EVENT));
41919
+ window.dispatchEvent(new CustomEvent(SYNC_EVENT$1));
41910
41920
  }
41911
41921
  function useLabelFilter() {
41912
- const [value, setValue] = reactExports.useState(() => read());
41922
+ const [value, setValue] = reactExports.useState(() => read$1());
41913
41923
  reactExports.useEffect(() => {
41914
41924
  const sync = (e2) => {
41915
41925
  if (e2 instanceof StorageEvent && e2.key !== LABEL_FILTER_KEY) return;
41916
- setValue(read());
41926
+ setValue(read$1());
41917
41927
  };
41918
41928
  window.addEventListener("storage", sync);
41919
- window.addEventListener(SYNC_EVENT, sync);
41929
+ window.addEventListener(SYNC_EVENT$1, sync);
41920
41930
  return () => {
41921
41931
  window.removeEventListener("storage", sync);
41922
- window.removeEventListener(SYNC_EVENT, sync);
41932
+ window.removeEventListener(SYNC_EVENT$1, sync);
41923
41933
  };
41924
41934
  }, []);
41925
41935
  const setLabelFilter = reactExports.useCallback((next2) => {
41926
- write(next2);
41936
+ write$1(next2);
41927
41937
  setValue(next2);
41928
41938
  }, []);
41929
41939
  return [value, setLabelFilter];
41930
41940
  }
41941
+ const LABEL_LAST_WORKSPACE_KEY = "band.projects-list.label-last-workspace";
41942
+ const SYNC_EVENT = "band:label-last-workspace-change";
41943
+ function read() {
41944
+ if (typeof window === "undefined") return {};
41945
+ try {
41946
+ const raw2 = window.localStorage.getItem(LABEL_LAST_WORKSPACE_KEY);
41947
+ if (!raw2) return {};
41948
+ const parsed = JSON.parse(raw2);
41949
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
41950
+ const out = {};
41951
+ for (const [k2, v2] of Object.entries(parsed)) {
41952
+ if (typeof k2 === "string" && typeof v2 === "string") out[k2] = v2;
41953
+ }
41954
+ return out;
41955
+ }
41956
+ } catch {
41957
+ }
41958
+ return {};
41959
+ }
41960
+ function write(value) {
41961
+ if (typeof window === "undefined") return;
41962
+ try {
41963
+ window.localStorage.setItem(LABEL_LAST_WORKSPACE_KEY, JSON.stringify(value));
41964
+ window.dispatchEvent(new CustomEvent(SYNC_EVENT));
41965
+ } catch {
41966
+ }
41967
+ }
41968
+ function useLabelLastWorkspace() {
41969
+ const getLastWorkspace = reactExports.useCallback((labelId) => read()[labelId], []);
41970
+ const setLastWorkspace = reactExports.useCallback((labelId, workspaceId) => {
41971
+ const current = read();
41972
+ if (current[labelId] === workspaceId) return;
41973
+ write({ ...current, [labelId]: workspaceId });
41974
+ }, []);
41975
+ return { getLastWorkspace, setLastWorkspace };
41976
+ }
41977
+ const EMPTY_PROJECTS = Object.freeze([]);
41931
41978
  function useProjects() {
41932
41979
  const adapter2 = useAdapter();
41933
41980
  const { data, isLoading, error } = useQuery({
@@ -41936,7 +41983,7 @@ function useProjects() {
41936
41983
  refetchInterval: 3e4
41937
41984
  });
41938
41985
  return {
41939
- projects: data ?? [],
41986
+ projects: data ?? EMPTY_PROJECTS,
41940
41987
  isLoading,
41941
41988
  error: error ? String(error) : null
41942
41989
  };
@@ -46654,6 +46701,11 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46654
46701
  // "currently-active link in a list of related links".
46655
46702
  "data-active": isActive || void 0,
46656
46703
  "aria-current": isActive ? "page" : void 0,
46704
+ // Stable test hook keyed by workspaceId so integration tests can right-
46705
+ // click the specific card (issue #508). Branches with `/` in them are
46706
+ // collapsed to `-` by `toWorkspaceId` so the attribute value matches
46707
+ // the canonical workspace id used everywhere else in the UI.
46708
+ "data-testid": `project-list__workspace-card--${workspaceId}`,
46657
46709
  onClick: (e2) => {
46658
46710
  e2.stopPropagation();
46659
46711
  handleClick();
@@ -47218,6 +47270,7 @@ function ProjectList({ labelFilter }) {
47218
47270
  {
47219
47271
  ref: containerRef,
47220
47272
  tabIndex: -1,
47273
+ "data-testid": "project-list__root",
47221
47274
  onKeyDown: handleKeyDown,
47222
47275
  onPointerDown: () => {
47223
47276
  keyboardNavRef.current = false;
@@ -48225,7 +48278,10 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
48225
48278
  const [showAddDialog, setShowAddDialog] = reactExports.useState(false);
48226
48279
  const [showErrorDialog, setShowErrorDialog] = reactExports.useState(false);
48227
48280
  const [showSettingsDialog, setShowSettingsDialog] = reactExports.useState(false);
48228
- const [labelFilter, setLabelFilter] = useLabelFilter();
48281
+ const [labelFilter, persistLabelFilter] = useLabelFilter();
48282
+ const { getLastWorkspace, setLastWorkspace } = useLabelLastWorkspace();
48283
+ const capabilities2 = useCapabilities();
48284
+ const activeWorkspaceId = useDashboardStore((s2) => s2.activeWorkspaceId);
48229
48285
  const { state: hooksState, install: installHooks } = useHooksSetup();
48230
48286
  const { state: cliState, install: installCli } = useCliSetup();
48231
48287
  const { state: updateState, install: installUpdate } = useAppUpdate();
@@ -48251,6 +48307,58 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
48251
48307
  () => labelFilter ? labels.find((l4) => l4.id === labelFilter) : null,
48252
48308
  [labelFilter, labels]
48253
48309
  );
48310
+ const findProjectForWorkspace = reactExports.useCallback(
48311
+ (workspaceId) => projects.find(
48312
+ (p2) => p2.worktrees.some((wt2) => toWorkspaceId(p2.name, wt2.branch) === workspaceId)
48313
+ ),
48314
+ [projects]
48315
+ );
48316
+ const lastSeenActiveRef = reactExports.useRef(activeWorkspaceId);
48317
+ reactExports.useEffect(() => {
48318
+ if (!activeWorkspaceId) {
48319
+ lastSeenActiveRef.current = null;
48320
+ return;
48321
+ }
48322
+ if (!labelFilter) {
48323
+ lastSeenActiveRef.current = activeWorkspaceId;
48324
+ return;
48325
+ }
48326
+ if (lastSeenActiveRef.current === activeWorkspaceId) return;
48327
+ lastSeenActiveRef.current = activeWorkspaceId;
48328
+ const project = findProjectForWorkspace(activeWorkspaceId);
48329
+ if (!project || project.label !== labelFilter) return;
48330
+ setLastWorkspace(labelFilter, activeWorkspaceId);
48331
+ }, [labelFilter, activeWorkspaceId, setLastWorkspace, findProjectForWorkspace]);
48332
+ const setLabelFilter = reactExports.useCallback(
48333
+ (newLabel) => {
48334
+ if (newLabel === labelFilter) return;
48335
+ if (labelFilter && activeWorkspaceId) {
48336
+ const project = findProjectForWorkspace(activeWorkspaceId);
48337
+ if (project && project.label === labelFilter) {
48338
+ setLastWorkspace(labelFilter, activeWorkspaceId);
48339
+ }
48340
+ }
48341
+ persistLabelFilter(newLabel);
48342
+ if (!newLabel) return;
48343
+ const target = getLastWorkspace(newLabel);
48344
+ if (!target || target === activeWorkspaceId) return;
48345
+ const targetProject = findProjectForWorkspace(target);
48346
+ if (!targetProject || targetProject.label !== newLabel) return;
48347
+ const href = capabilities2.getWorkspaceHref?.(target);
48348
+ if (href && capabilities2.navigate) {
48349
+ capabilities2.navigate(href);
48350
+ }
48351
+ },
48352
+ [
48353
+ labelFilter,
48354
+ activeWorkspaceId,
48355
+ persistLabelFilter,
48356
+ setLastWorkspace,
48357
+ getLastWorkspace,
48358
+ findProjectForWorkspace,
48359
+ capabilities2
48360
+ ]
48361
+ );
48254
48362
  reactExports.useEffect(() => {
48255
48363
  const globalKey = "__bandOpenSettings";
48256
48364
  const win = window;
@@ -48349,6 +48457,7 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
48349
48457
  {
48350
48458
  size: "sm",
48351
48459
  variant: "ghost",
48460
+ "data-testid": "dashboard__label-filter-trigger",
48352
48461
  className: `min-w-0 text-sm h-7 px-2 gap-1.5 ${labelFilter ? "bg-accent text-accent-foreground" : "text-muted-foreground"}`,
48353
48462
  children: activeLabel ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
48354
48463
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -48366,27 +48475,42 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
48366
48475
  }
48367
48476
  ) }),
48368
48477
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "start", children: [
48369
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: () => setLabelFilter(null), children: [
48370
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0 mr-2 text-muted-foreground" }),
48371
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" }),
48372
- !labelFilter && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
48373
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: "⌘0" })
48374
- ] }),
48375
- labels.map((lbl, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: () => setLabelFilter(lbl.id), children: [
48376
- /* @__PURE__ */ jsxRuntimeExports.jsx(
48377
- "span",
48378
- {
48379
- className: "size-2.5 rounded-full shrink-0 mr-2",
48380
- style: { backgroundColor: lbl.color }
48381
- }
48382
- ),
48383
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: lbl.name }),
48384
- labelFilter === lbl.id && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
48385
- idx < 9 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: [
48386
- "⌘",
48387
- idx + 1
48388
- ] })
48389
- ] }, lbl.id))
48478
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
48479
+ DropdownMenuItem,
48480
+ {
48481
+ "data-testid": "dashboard__label-filter-item--all",
48482
+ onClick: () => setLabelFilter(null),
48483
+ children: [
48484
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tag$1, { className: "size-3.5 shrink-0 mr-2 text-muted-foreground" }),
48485
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: "All" }),
48486
+ !labelFilter && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
48487
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: "⌘0" })
48488
+ ]
48489
+ }
48490
+ ),
48491
+ labels.map((lbl, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
48492
+ DropdownMenuItem,
48493
+ {
48494
+ "data-testid": `dashboard__label-filter-item--${lbl.id}`,
48495
+ onClick: () => setLabelFilter(lbl.id),
48496
+ children: [
48497
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
48498
+ "span",
48499
+ {
48500
+ className: "size-2.5 rounded-full shrink-0 mr-2",
48501
+ style: { backgroundColor: lbl.color }
48502
+ }
48503
+ ),
48504
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: lbl.name }),
48505
+ labelFilter === lbl.id && /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 ml-2 shrink-0" }),
48506
+ idx < 9 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-auto pl-3 text-xs text-muted-foreground tracking-widest", children: [
48507
+ "⌘",
48508
+ idx + 1
48509
+ ] })
48510
+ ]
48511
+ },
48512
+ lbl.id
48513
+ ))
48390
48514
  ] })
48391
48515
  ] })
48392
48516
  ] }) }),
@@ -53702,6 +53826,7 @@ function storeViewMode(mode) {
53702
53826
  }
53703
53827
  const UNCOMMITTED_VALUE = "__uncommitted__";
53704
53828
  const EXPAND_ALL_KEY = "band:diff-expand-all";
53829
+ const MAX_MOUNTED_EDITORS = 50;
53705
53830
  function getStoredExpandAll() {
53706
53831
  try {
53707
53832
  return localStorage.getItem(EXPAND_ALL_KEY) === "true";
@@ -54055,6 +54180,8 @@ function LazyFileRow({
54055
54180
  isOpen,
54056
54181
  isActive,
54057
54182
  scrollContainerEl,
54183
+ isMountedAllowed,
54184
+ onRowVisible,
54058
54185
  onToggle,
54059
54186
  onLoadMoreContext,
54060
54187
  onShowFullFile,
@@ -54067,7 +54194,8 @@ function LazyFileRow({
54067
54194
  const [revertDialogOpen, setRevertDialogOpen] = reactExports.useState(false);
54068
54195
  const containerRef = reactExports.useRef(null);
54069
54196
  const diffBodyRef = reactExports.useRef(null);
54070
- const [shouldMount, setShouldMount] = reactExports.useState(false);
54197
+ const [everMounted, setEverMounted] = reactExports.useState(false);
54198
+ const shouldRender = everMounted && isMountedAllowed;
54071
54199
  const [editorRendered, setEditorRendered] = reactExports.useState(false);
54072
54200
  const editorRenderRafRef = reactExports.useRef(null);
54073
54201
  reactExports.useEffect(() => {
@@ -54078,9 +54206,11 @@ function LazyFileRow({
54078
54206
  }
54079
54207
  };
54080
54208
  }, []);
54209
+ const onRowVisibleRef = reactExports.useRef(onRowVisible);
54210
+ onRowVisibleRef.current = onRowVisible;
54081
54211
  reactExports.useEffect(() => {
54082
54212
  if (!isOpen) {
54083
- setShouldMount(false);
54213
+ setEverMounted(false);
54084
54214
  return;
54085
54215
  }
54086
54216
  const el = containerRef.current;
@@ -54092,7 +54222,10 @@ function LazyFileRow({
54092
54222
  if (!entry) return;
54093
54223
  const root2 = entry.rootBounds;
54094
54224
  if (root2 && root2.width === 0 && root2.height === 0) return;
54095
- setShouldMount(entry.isIntersecting);
54225
+ if (entry.isIntersecting) {
54226
+ setEverMounted(true);
54227
+ onRowVisibleRef.current(filename);
54228
+ }
54096
54229
  },
54097
54230
  {
54098
54231
  root: scrollContainerEl,
@@ -54105,9 +54238,9 @@ function LazyFileRow({
54105
54238
  );
54106
54239
  observer.observe(el);
54107
54240
  return () => observer.disconnect();
54108
- }, [isOpen, scrollContainerEl]);
54241
+ }, [isOpen, scrollContainerEl, filename]);
54109
54242
  reactExports.useEffect(() => {
54110
- if (!shouldMount || !editorRendered || !onMeasureHeight) return;
54243
+ if (!shouldRender || !editorRendered || !onMeasureHeight) return;
54111
54244
  const el = diffBodyRef.current;
54112
54245
  if (!el) return;
54113
54246
  if (typeof ResizeObserver === "undefined") return;
@@ -54132,7 +54265,7 @@ function LazyFileRow({
54132
54265
  if (frame2 != null) cancelAnimationFrame(frame2);
54133
54266
  observer.disconnect();
54134
54267
  };
54135
- }, [shouldMount, editorRendered, filename, onMeasureHeight]);
54268
+ }, [shouldRender, editorRendered, filename, onMeasureHeight]);
54136
54269
  const handleEditorViews = reactExports.useCallback(
54137
54270
  (views) => {
54138
54271
  onEditorViews?.(filename, views);
@@ -54152,11 +54285,11 @@ function LazyFileRow({
54152
54285
  [filename, onEditorViews]
54153
54286
  );
54154
54287
  reactExports.useEffect(() => {
54155
- if (!isOpen || !shouldMount) return;
54288
+ if (!isOpen || !shouldRender) return;
54156
54289
  return () => {
54157
54290
  onEditorViews?.(filename, []);
54158
54291
  };
54159
- }, [isOpen, shouldMount, filename, onEditorViews]);
54292
+ }, [isOpen, shouldRender, filename, onEditorViews]);
54160
54293
  const toggle = reactExports.useCallback(() => {
54161
54294
  onToggle(filename);
54162
54295
  }, [filename, onToggle]);
@@ -54183,6 +54316,7 @@ function LazyFileRow({
54183
54316
  {
54184
54317
  type: "button",
54185
54318
  onClick: toggle,
54319
+ "data-testid": "diff-view__file-row-toggle",
54186
54320
  className: "sticky top-0 z-10 flex w-full items-center gap-2 bg-muted px-4 py-2.5 text-left text-sm hover:bg-accent",
54187
54321
  children: [
54188
54322
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -54286,26 +54420,39 @@ function LazyFileRow({
54286
54420
  ),
54287
54421
  isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border/20 bg-muted/30", children: [
54288
54422
  diffError && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-4 text-sm text-destructive", children: diffError }),
54289
- diff2 !== null && (shouldMount ? (
54423
+ diff2 !== null && (shouldRender ? (
54290
54424
  // Wrapper is observed by the ResizeObserver in the effect
54291
54425
  // above. Its rendered height — "Show full file" bar plus the
54292
54426
  // CodeMirror editor — is reported back as
54293
54427
  // `measuredHeight`, then reused verbatim as the placeholder
54294
- // height on the next unmount cycle.
54428
+ // height on the next unmount cycle (a never-visited row or
54429
+ // an LRU-evicted one).
54295
54430
  //
54296
54431
  // The `minHeight` hold prevents a layout shift during the
54297
- // window between (a) shouldMount flipping to true and (b)
54298
- // the editor's async `setup` finishing (loadLanguage await
54299
- // + new MergeView() + first paint). Without it the wrapper
54300
- // is empty-auto-height for that window, collapsing the row
54301
- // to the "Show full file" bar (~30px) and pushing every
54302
- // row below it upward; when the editor paints they snap
54303
- // back down. We pin the wrapper to the cached/estimated
54304
- // height (the same value the placeholder uses) until
54305
- // `editorRendered` flips, then let the editor's natural
54306
- // height take over. The ResizeObserver only attaches once
54307
- // `editorRendered` is true (see deps above), so the held
54308
- // value never bleeds into the measuredHeight cache.
54432
+ // window between (a) `shouldRender` flipping to true and
54433
+ // (b) the editor's async `setup` finishing (loadLanguage
54434
+ // await + new MergeView() + first paint). Without it the
54435
+ // wrapper is empty-auto-height for that window, collapsing
54436
+ // the row to the "Show full file" bar (~30px) and pushing
54437
+ // every row below it upward; when the editor paints they
54438
+ // snap back down. We pin the wrapper to the
54439
+ // cached/estimated height (the same value the placeholder
54440
+ // uses) until `editorRendered` flips, then let the
54441
+ // editor's natural height take over. The ResizeObserver
54442
+ // only attaches once `editorRendered` is true (see deps
54443
+ // above), so the held value never bleeds into the
54444
+ // measuredHeight cache.
54445
+ //
54446
+ // Mount-once: once `shouldRender` flips true, it stays
54447
+ // true across scroll-aways. The editor's natural height
54448
+ // remains in the layout — the row stays the same size
54449
+ // whether the user is currently looking at it or
54450
+ // scrolled past — so there's no scroll-shift trade-off
54451
+ // to manage. The browser handles culling offscreen tiles
54452
+ // cheaply; the only thing that brings `shouldRender`
54453
+ // back to false is collapse / LRU eviction / target
54454
+ // change, all of which deliberately tear the editor
54455
+ // down.
54309
54456
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
54310
54457
  "div",
54311
54458
  {
@@ -54337,10 +54484,12 @@ function LazyFileRow({
54337
54484
  ) : (
54338
54485
  // Placeholder occupying the SAME pixel height the CodeMirror
54339
54486
  // editor would render at, so the row's overall size doesn't
54340
- // change when the observer mounts/unmounts the editor. Without
54341
- // this, scrolling past a row would collapse it back to header
54342
- // size and push everything below upward visually identical
54343
- // to a layout shift, even though no content actually moved.
54487
+ // change when LRU eviction tears the editor down (or while
54488
+ // a never-visited row waits for its first IO intersect).
54489
+ // Without this, switching the body between editor and
54490
+ // placeholder would push everything below upward
54491
+ // visually identical to a layout shift, even though no
54492
+ // content actually moved.
54344
54493
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { height: placeholderHeight } })
54345
54494
  ))
54346
54495
  ] })
@@ -54394,6 +54543,31 @@ function DiffView({
54394
54543
  const [expandedFiles, setExpandedFiles] = reactExports.useState(/* @__PURE__ */ new Set());
54395
54544
  const expandedFilesRef = reactExports.useRef(expandedFiles);
54396
54545
  expandedFilesRef.current = expandedFiles;
54546
+ const [mountedFiles, setMountedFiles] = reactExports.useState(() => /* @__PURE__ */ new Set());
54547
+ const mountRecencyRef = reactExports.useRef(/* @__PURE__ */ new Map());
54548
+ const recencyCounterRef = reactExports.useRef(0);
54549
+ const handleRowVisible = reactExports.useCallback((filename) => {
54550
+ recencyCounterRef.current += 1;
54551
+ mountRecencyRef.current.set(filename, recencyCounterRef.current);
54552
+ setMountedFiles((prev2) => {
54553
+ if (prev2.has(filename) && prev2.size <= MAX_MOUNTED_EDITORS) return prev2;
54554
+ const next2 = new Set(prev2);
54555
+ next2.add(filename);
54556
+ if (next2.size > MAX_MOUNTED_EDITORS) {
54557
+ let oldestFilename = null;
54558
+ let oldestRecency = Number.POSITIVE_INFINITY;
54559
+ for (const candidate of next2) {
54560
+ const r2 = mountRecencyRef.current.get(candidate) ?? 0;
54561
+ if (r2 < oldestRecency) {
54562
+ oldestRecency = r2;
54563
+ oldestFilename = candidate;
54564
+ }
54565
+ }
54566
+ if (oldestFilename !== null) next2.delete(oldestFilename);
54567
+ }
54568
+ return next2;
54569
+ });
54570
+ }, []);
54397
54571
  const prevFilenamesRef = reactExports.useRef(/* @__PURE__ */ new Set());
54398
54572
  const prevFingerprintRef = reactExports.useRef("");
54399
54573
  const [viewMode, setViewModeState] = reactExports.useState(getStoredViewMode);
@@ -54805,6 +54979,8 @@ function DiffView({
54805
54979
  summaryRef.current = null;
54806
54980
  setDiffCache(/* @__PURE__ */ new Map());
54807
54981
  setExpandedFiles(/* @__PURE__ */ new Set());
54982
+ setMountedFiles(/* @__PURE__ */ new Set());
54983
+ mountRecencyRef.current.clear();
54808
54984
  prevFilenamesRef.current = /* @__PURE__ */ new Set();
54809
54985
  prevFingerprintRef.current = "";
54810
54986
  const fetchSummary = (forceRefresh = false) => {
@@ -54983,6 +55159,23 @@ function DiffView({
54983
55159
  if (shouldDispatchFetch(diffCacheRef.current.get(n2))) fetchFileDiff(n2);
54984
55160
  }
54985
55161
  }, [filenames, expandAll, fetchFileDiff]);
55162
+ reactExports.useEffect(() => {
55163
+ const live = new Set(filenames);
55164
+ setMountedFiles((prev2) => {
55165
+ let changed = false;
55166
+ const next2 = new Set(prev2);
55167
+ for (const name2 of prev2) {
55168
+ if (!live.has(name2)) {
55169
+ next2.delete(name2);
55170
+ changed = true;
55171
+ }
55172
+ }
55173
+ return changed ? next2 : prev2;
55174
+ });
55175
+ for (const name2 of Array.from(mountRecencyRef.current.keys())) {
55176
+ if (!live.has(name2)) mountRecencyRef.current.delete(name2);
55177
+ }
55178
+ }, [filenames]);
54986
55179
  const focusedDiffEntry = focusedFile && diffCache.get(focusedFile.path);
54987
55180
  const focusedLineCounts = focusedDiffEntry ? focusedDiffEntry.lineCounts : null;
54988
55181
  const lastScrollRef = reactExports.useRef({
@@ -55334,42 +55527,52 @@ function DiffView({
55334
55527
  )
55335
55528
  }
55336
55529
  ),
55337
- hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: setScrollContainerNode, className: "min-h-0 flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-3 p-3", children: filenames.map((filename, index2) => {
55338
- const isLast = index2 === filenames.length - 1;
55339
- const row2 = /* @__PURE__ */ jsxRuntimeExports.jsx(
55340
- LazyFileRow,
55341
- {
55342
- filename,
55343
- status: fileStatuses[filename],
55344
- cacheEntry: diffCache.get(filename),
55345
- viewMode: effectiveViewMode,
55346
- isOpen: expandedFiles.has(filename),
55347
- isActive: activeFile === filename,
55348
- scrollContainerEl,
55349
- onToggle: handleToggleFile,
55350
- onLoadMoreContext: handleLoadMoreContext,
55351
- onShowFullFile: handleShowFullFile,
55352
- onOpenFile,
55353
- onRevertFile: adapter2.revertFile ? handleRevertFile : void 0,
55354
- onEditorViews: handleEditorViews,
55355
- onMeasureHeight: handleMeasureHeight
55356
- },
55357
- filename
55358
- );
55359
- if (!isLast) return row2;
55360
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
55361
- "div",
55362
- {
55363
- className: "flex flex-col",
55364
- style: scrollContainerHeight > 0 ? { minHeight: scrollContainerHeight } : void 0,
55365
- children: [
55366
- row2,
55367
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "flex-1" })
55368
- ]
55369
- },
55370
- `${filename}-last-wrapper`
55371
- );
55372
- }) }) }),
55530
+ hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsx(
55531
+ "div",
55532
+ {
55533
+ ref: setScrollContainerNode,
55534
+ "data-testid": "diff-view__scroller",
55535
+ className: "min-h-0 flex-1 overflow-y-auto",
55536
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-3 p-3", children: filenames.map((filename, index2) => {
55537
+ const isLast = index2 === filenames.length - 1;
55538
+ const row2 = /* @__PURE__ */ jsxRuntimeExports.jsx(
55539
+ LazyFileRow,
55540
+ {
55541
+ filename,
55542
+ status: fileStatuses[filename],
55543
+ cacheEntry: diffCache.get(filename),
55544
+ viewMode: effectiveViewMode,
55545
+ isOpen: expandedFiles.has(filename),
55546
+ isActive: activeFile === filename,
55547
+ scrollContainerEl,
55548
+ isMountedAllowed: mountedFiles.has(filename),
55549
+ onRowVisible: handleRowVisible,
55550
+ onToggle: handleToggleFile,
55551
+ onLoadMoreContext: handleLoadMoreContext,
55552
+ onShowFullFile: handleShowFullFile,
55553
+ onOpenFile,
55554
+ onRevertFile: adapter2.revertFile ? handleRevertFile : void 0,
55555
+ onEditorViews: handleEditorViews,
55556
+ onMeasureHeight: handleMeasureHeight
55557
+ },
55558
+ filename
55559
+ );
55560
+ if (!isLast) return row2;
55561
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
55562
+ "div",
55563
+ {
55564
+ className: "flex flex-col",
55565
+ style: scrollContainerHeight > 0 ? { minHeight: scrollContainerHeight } : void 0,
55566
+ children: [
55567
+ row2,
55568
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "flex-1" })
55569
+ ]
55570
+ },
55571
+ `${filename}-last-wrapper`
55572
+ );
55573
+ }) })
55574
+ }
55575
+ ),
55373
55576
  gitOpStatus && /* @__PURE__ */ jsxRuntimeExports.jsxs(
55374
55577
  "div",
55375
55578
  {
@@ -64309,22 +64512,16 @@ class WebDashboardAdapter {
64309
64512
  });
64310
64513
  }
64311
64514
  }
64312
- const VALID_TAB_PREFIXES = ["/changes", "/code", "/terminal"];
64313
64515
  class WebCapabilities {
64314
64516
  copyPath = false;
64315
64517
  navigate;
64518
+ // The workspace URL no longer carries a sub-path for the active tab —
64519
+ // tab state lives entirely inside `MobileWorkspaceLayout`, and the
64520
+ // desktop dockview at AppShell renders every panel regardless of URL.
64521
+ // See issue #467 for the refactor that removed the `band-tab:` session
64522
+ // store and the `/changes` / `/code` / `/terminal` child routes.
64316
64523
  getWorkspaceHref(workspaceId) {
64317
- const base2 = `/workspace/${encodeURIComponent(workspaceId)}`;
64318
- try {
64319
- const stored = sessionStorage.getItem(`band-tab:${workspaceId}`);
64320
- if (stored !== null) {
64321
- if (stored === "" || VALID_TAB_PREFIXES.some((p2) => stored.startsWith(p2))) {
64322
- return `${base2}${stored}`;
64323
- }
64324
- }
64325
- } catch {
64326
- }
64327
- return base2;
64524
+ return `/workspace/${encodeURIComponent(workspaceId)}`;
64328
64525
  }
64329
64526
  async openUrl(url) {
64330
64527
  window.open(url, "_blank");
@@ -79943,6 +80140,101 @@ function applyMaximizedGroupToApi(api, desired) {
79943
80140
  if (next2.api.isMaximized()) return;
79944
80141
  next2.api.maximize();
79945
80142
  }
80143
+ const EDGE_GROUP_IDS$1 = {
80144
+ left: "edge-left",
80145
+ right: "edge-right",
80146
+ bottom: "edge-bottom"
80147
+ };
80148
+ function ensureEdgeGroups(api) {
80149
+ if (api.getEdgeGroup("top")) {
80150
+ try {
80151
+ api.removeEdgeGroup("top");
80152
+ } catch {
80153
+ }
80154
+ }
80155
+ for (const direction of Object.keys(EDGE_GROUP_IDS$1)) {
80156
+ const id28 = EDGE_GROUP_IDS$1[direction];
80157
+ if (!api.groups.some((g2) => g2.id === id28)) {
80158
+ try {
80159
+ api.addEdgeGroup(direction, { id: id28, collapsed: true });
80160
+ } catch {
80161
+ }
80162
+ }
80163
+ }
80164
+ refreshEdgeGroupVisibility(api, false);
80165
+ }
80166
+ function refreshEdgeGroupVisibility(api, forceVisible) {
80167
+ for (const direction of Object.keys(EDGE_GROUP_IDS$1)) {
80168
+ const id28 = EDGE_GROUP_IDS$1[direction];
80169
+ const group = api.groups.find((g2) => g2.id === id28);
80170
+ if (!group) continue;
80171
+ const isEmpty2 = group.panels.length === 0;
80172
+ try {
80173
+ api.setEdgeGroupVisible(direction, forceVisible || !isEmpty2);
80174
+ } catch {
80175
+ }
80176
+ }
80177
+ }
80178
+ const innerDockviewRegistrations = /* @__PURE__ */ new Set();
80179
+ function registerInnerDockview(containerEl, api) {
80180
+ const registration = { containerEl, api };
80181
+ innerDockviewRegistrations.add(registration);
80182
+ return () => {
80183
+ innerDockviewRegistrations.delete(registration);
80184
+ };
80185
+ }
80186
+ function findFocusedInnerDockview() {
80187
+ const active = document.activeElement;
80188
+ if (!active) return null;
80189
+ for (const reg of innerDockviewRegistrations) {
80190
+ if (reg.containerEl.contains(active)) {
80191
+ return reg.api;
80192
+ }
80193
+ }
80194
+ return null;
80195
+ }
80196
+ function toggleEdgeGroup(api, direction) {
80197
+ const id28 = EDGE_GROUP_IDS$1[direction];
80198
+ const group = api.groups.find((g2) => g2.id === id28);
80199
+ if (!group) return false;
80200
+ if (group.panels.length === 0) return false;
80201
+ try {
80202
+ if (group.api.isCollapsed()) group.api.expand();
80203
+ else group.api.collapse();
80204
+ } catch {
80205
+ return false;
80206
+ }
80207
+ return true;
80208
+ }
80209
+ function attachEdgeGroupDragVisibility(api) {
80210
+ let isDragging = false;
80211
+ const refresh = () => {
80212
+ refreshEdgeGroupVisibility(api, isDragging);
80213
+ };
80214
+ const startDrag = () => {
80215
+ isDragging = true;
80216
+ refresh();
80217
+ };
80218
+ const endDrag = () => {
80219
+ isDragging = false;
80220
+ refresh();
80221
+ };
80222
+ const d1 = api.onWillDragPanel(startDrag);
80223
+ const d2 = api.onWillDragGroup(startDrag);
80224
+ const d3 = api.onDidMovePanel(endDrag);
80225
+ const d4 = api.onDidRemovePanel(endDrag);
80226
+ const onDragEndNative = () => endDrag();
80227
+ document.addEventListener("drop", onDragEndNative, true);
80228
+ document.addEventListener("dragend", onDragEndNative, true);
80229
+ return () => {
80230
+ d1.dispose();
80231
+ d2.dispose();
80232
+ d3.dispose();
80233
+ d4.dispose();
80234
+ document.removeEventListener("drop", onDragEndNative, true);
80235
+ document.removeEventListener("dragend", onDragEndNative, true);
80236
+ };
80237
+ }
79946
80238
  function parseWorkspaceFromPath(pathname) {
79947
80239
  const match = pathname.match(/^\/workspace\/([^/]+)/);
79948
80240
  return match ? decodeURIComponent(match[1]) : null;
@@ -108159,7 +108451,7 @@ var tn = f$5("block", "before:content-[counter(line)]", "before:inline-block", "
108159
108451
  var et$1 = ({ className: e2, 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", e2), "data-incomplete": n2 || void 0, "data-language": t2, "data-streamdown": "code-block", style: { contentVisibility: "auto", containIntrinsicSize: "auto 200px", ...o3 }, ...s2 });
108160
108452
  var Se$1 = reactExports.createContext({ code: "" }), de$2 = () => reactExports.useContext(Se$1);
108161
108453
  var ot$1 = ({ language: e2 }) => jsxRuntimeExports.jsx("div", { className: "flex h-8 items-center text-muted-foreground text-xs", "data-language": e2, "data-streamdown": "code-block-header", children: jsxRuntimeExports.jsx("span", { className: "ml-1 font-mono lowercase", children: e2 }) });
108162
- var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-DjTWk17l.js").then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), rt = ({ code: e2, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
108454
+ var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-CTUp2Nbw.js").then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), rt = ({ code: e2, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
108163
108455
  let i2 = reactExports.useMemo(() => e2.replace(cn, ""), [e2]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i2.split(`
108164
108456
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i2]);
108165
108457
  return jsxRuntimeExports.jsx(Se$1.Provider, { value: { code: e2 }, 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 }) })] }) });
@@ -108481,7 +108773,7 @@ var Dt = ({ children: e2, className: t2, onDownload: o3, onError: n2 }) => {
108481
108773
  }, []), 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: e2 != null ? e2 : 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] });
108482
108774
  };
108483
108775
  var Vt = ({ children: e2, 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: e2 }) })] });
108484
- var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-CFPuUseQ.js").then((e2) => ({ default: e2.Mermaid }))), Kn = /language-([^\s]+)/;
108776
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-8k9Pr9Qn.js").then((e2) => ({ default: e2.Mermaid }))), Kn = /language-([^\s]+)/;
108485
108777
  function ke$1(e2, t2) {
108486
108778
  if (!(e2 != null && e2.position || t2 != null && t2.position)) return true;
108487
108779
  if (!(e2 != null && e2.position && (t2 != null && t2.position))) return false;
@@ -158283,12 +158575,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
158283
158575
  registerLayoutLoaders([
158284
158576
  {
158285
158577
  name: "dagre",
158286
- loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-UMvdMLG3.js"), "loader")
158578
+ loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-Hm-Wejtu.js"), "loader")
158287
158579
  },
158288
158580
  ...[
158289
158581
  {
158290
158582
  name: "cose-bilkent",
158291
- loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-D1CdgGvI.js"), "loader")
158583
+ loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-CnP5PKtl.js"), "loader")
158292
158584
  }
158293
158585
  ]
158294
158586
  ]);
@@ -158727,7 +159019,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
158727
159019
  return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
158728
159020
  }, "detector");
158729
159021
  var loader = /* @__PURE__ */ __name(async () => {
158730
- const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CQcZX6cr.js");
159022
+ const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CD7rCwaq.js");
158731
159023
  return { id, diagram: diagram2 };
158732
159024
  }, "loader");
158733
159025
  var plugin = {
@@ -158744,7 +159036,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
158744
159036
  return /^\s*graph/.test(txt);
158745
159037
  }, "detector");
158746
159038
  var loader2 = /* @__PURE__ */ __name(async () => {
158747
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BYBNOZwM.js");
159039
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-vb-7BBaz.js");
158748
159040
  return { id: id2, diagram: diagram2 };
158749
159041
  }, "loader");
158750
159042
  var plugin2 = {
@@ -158767,7 +159059,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
158767
159059
  return /^\s*flowchart/.test(txt);
158768
159060
  }, "detector");
158769
159061
  var loader3 = /* @__PURE__ */ __name(async () => {
158770
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BYBNOZwM.js");
159062
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-vb-7BBaz.js");
158771
159063
  return { id: id3, diagram: diagram2 };
158772
159064
  }, "loader");
158773
159065
  var plugin3 = {
@@ -158781,7 +159073,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
158781
159073
  return /^\s*erDiagram/.test(txt);
158782
159074
  }, "detector");
158783
159075
  var loader4 = /* @__PURE__ */ __name(async () => {
158784
- const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-D14z9IvB.js");
159076
+ const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-DKL3OoDz.js");
158785
159077
  return { id: id4, diagram: diagram2 };
158786
159078
  }, "loader");
158787
159079
  var plugin4 = {
@@ -158795,7 +159087,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
158795
159087
  return /^\s*gitGraph/.test(txt);
158796
159088
  }, "detector");
158797
159089
  var loader5 = /* @__PURE__ */ __name(async () => {
158798
- const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-CrSfx7b3.js");
159090
+ const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-BrIjiO3l.js");
158799
159091
  return { id: id5, diagram: diagram2 };
158800
159092
  }, "loader");
158801
159093
  var plugin5 = {
@@ -158809,7 +159101,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
158809
159101
  return /^\s*gantt/.test(txt);
158810
159102
  }, "detector");
158811
159103
  var loader6 = /* @__PURE__ */ __name(async () => {
158812
- const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-CaG3uoK-.js");
159104
+ const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-CryNIjT5.js");
158813
159105
  return { id: id6, diagram: diagram2 };
158814
159106
  }, "loader");
158815
159107
  var plugin6 = {
@@ -158823,7 +159115,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
158823
159115
  return /^\s*info/.test(txt);
158824
159116
  }, "detector");
158825
159117
  var loader7 = /* @__PURE__ */ __name(async () => {
158826
- const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-CeyMzohL.js");
159118
+ const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-Bx-2RIP1.js");
158827
159119
  return { id: id7, diagram: diagram2 };
158828
159120
  }, "loader");
158829
159121
  var info = {
@@ -158836,7 +159128,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
158836
159128
  return /^\s*pie/.test(txt);
158837
159129
  }, "detector");
158838
159130
  var loader8 = /* @__PURE__ */ __name(async () => {
158839
- const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-CWkrHsNk.js");
159131
+ const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-m0hjxyCj.js");
158840
159132
  return { id: id8, diagram: diagram2 };
158841
159133
  }, "loader");
158842
159134
  var pie = {
@@ -158849,7 +159141,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
158849
159141
  return /^\s*quadrantChart/.test(txt);
158850
159142
  }, "detector");
158851
159143
  var loader9 = /* @__PURE__ */ __name(async () => {
158852
- const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-C25p2xz7.js");
159144
+ const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-omed34Wz.js");
158853
159145
  return { id: id9, diagram: diagram2 };
158854
159146
  }, "loader");
158855
159147
  var plugin7 = {
@@ -158863,7 +159155,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
158863
159155
  return /^\s*xychart(-beta)?/.test(txt);
158864
159156
  }, "detector");
158865
159157
  var loader10 = /* @__PURE__ */ __name(async () => {
158866
- const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-j8PckQEj.js");
159158
+ const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-Y3f7rM8c.js");
158867
159159
  return { id: id10, diagram: diagram2 };
158868
159160
  }, "loader");
158869
159161
  var plugin8 = {
@@ -158877,7 +159169,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
158877
159169
  return /^\s*requirement(Diagram)?/.test(txt);
158878
159170
  }, "detector");
158879
159171
  var loader11 = /* @__PURE__ */ __name(async () => {
158880
- const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-ACRVXQGO.js");
159172
+ const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-BCx5DoGU.js");
158881
159173
  return { id: id11, diagram: diagram2 };
158882
159174
  }, "loader");
158883
159175
  var plugin9 = {
@@ -158891,7 +159183,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
158891
159183
  return /^\s*sequenceDiagram/.test(txt);
158892
159184
  }, "detector");
158893
159185
  var loader12 = /* @__PURE__ */ __name(async () => {
158894
- const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-C_wFtq8b.js");
159186
+ const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-DXMFuhl3.js");
158895
159187
  return { id: id12, diagram: diagram2 };
158896
159188
  }, "loader");
158897
159189
  var plugin10 = {
@@ -158908,7 +159200,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
158908
159200
  return /^\s*classDiagram/.test(txt);
158909
159201
  }, "detector");
158910
159202
  var loader13 = /* @__PURE__ */ __name(async () => {
158911
- const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-CwIsZ53p.js");
159203
+ const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-C2IXOi-1.js");
158912
159204
  return { id: id13, diagram: diagram2 };
158913
159205
  }, "loader");
158914
159206
  var plugin11 = {
@@ -158925,7 +159217,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
158925
159217
  return /^\s*classDiagram-v2/.test(txt);
158926
159218
  }, "detector");
158927
159219
  var loader14 = /* @__PURE__ */ __name(async () => {
158928
- const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-CwIsZ53p.js");
159220
+ const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-C2IXOi-1.js");
158929
159221
  return { id: id14, diagram: diagram2 };
158930
159222
  }, "loader");
158931
159223
  var plugin12 = {
@@ -158942,7 +159234,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
158942
159234
  return /^\s*stateDiagram/.test(txt);
158943
159235
  }, "detector");
158944
159236
  var loader15 = /* @__PURE__ */ __name(async () => {
158945
- const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-B9MGwsuS.js");
159237
+ const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-CY6AEWa2.js");
158946
159238
  return { id: id15, diagram: diagram2 };
158947
159239
  }, "loader");
158948
159240
  var plugin13 = {
@@ -158962,7 +159254,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
158962
159254
  return false;
158963
159255
  }, "detector");
158964
159256
  var loader16 = /* @__PURE__ */ __name(async () => {
158965
- const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-CLHd8oUa.js");
159257
+ const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-BNKDdzaI.js");
158966
159258
  return { id: id16, diagram: diagram2 };
158967
159259
  }, "loader");
158968
159260
  var plugin14 = {
@@ -158976,7 +159268,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
158976
159268
  return /^\s*journey/.test(txt);
158977
159269
  }, "detector");
158978
159270
  var loader17 = /* @__PURE__ */ __name(async () => {
158979
- const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-ANqeM_TM.js");
159271
+ const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-COrw3Dj9.js");
158980
159272
  return { id: id17, diagram: diagram2 };
158981
159273
  }, "loader");
158982
159274
  var plugin15 = {
@@ -159043,7 +159335,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
159043
159335
  return false;
159044
159336
  }, "detector");
159045
159337
  var loader18 = /* @__PURE__ */ __name(async () => {
159046
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BYBNOZwM.js");
159338
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-vb-7BBaz.js");
159047
159339
  return { id: id18, diagram: diagram2 };
159048
159340
  }, "loader");
159049
159341
  var plugin16 = {
@@ -159057,7 +159349,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
159057
159349
  return /^\s*timeline/.test(txt);
159058
159350
  }, "detector");
159059
159351
  var loader19 = /* @__PURE__ */ __name(async () => {
159060
- const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-CqKot5RT.js");
159352
+ const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-D_io-Tfq.js");
159061
159353
  return { id: id19, diagram: diagram2 };
159062
159354
  }, "loader");
159063
159355
  var plugin17 = {
@@ -159071,7 +159363,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
159071
159363
  return /^\s*mindmap/.test(txt);
159072
159364
  }, "detector");
159073
159365
  var loader20 = /* @__PURE__ */ __name(async () => {
159074
- const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-DlEXF5z8.js");
159366
+ const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-Lf0rrgEi.js");
159075
159367
  return { id: id20, diagram: diagram2 };
159076
159368
  }, "loader");
159077
159369
  var plugin18 = {
@@ -159085,7 +159377,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
159085
159377
  return /^\s*kanban/.test(txt);
159086
159378
  }, "detector");
159087
159379
  var loader21 = /* @__PURE__ */ __name(async () => {
159088
- const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-B0RkH45q.js");
159380
+ const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-CexmIyEk.js");
159089
159381
  return { id: id21, diagram: diagram2 };
159090
159382
  }, "loader");
159091
159383
  var plugin19 = {
@@ -159099,7 +159391,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
159099
159391
  return /^\s*sankey(-beta)?/.test(txt);
159100
159392
  }, "detector");
159101
159393
  var loader22 = /* @__PURE__ */ __name(async () => {
159102
- const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-uzNSHudY.js");
159394
+ const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-9M4Rn44L.js");
159103
159395
  return { id: id22, diagram: diagram2 };
159104
159396
  }, "loader");
159105
159397
  var plugin20 = {
@@ -159113,7 +159405,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
159113
159405
  return /^\s*packet(-beta)?/.test(txt);
159114
159406
  }, "detector");
159115
159407
  var loader23 = /* @__PURE__ */ __name(async () => {
159116
- const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-C42mRVEn.js");
159408
+ const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-C69I055N.js");
159117
159409
  return { id: id23, diagram: diagram2 };
159118
159410
  }, "loader");
159119
159411
  var packet = {
@@ -159126,7 +159418,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
159126
159418
  return /^\s*radar-beta/.test(txt);
159127
159419
  }, "detector");
159128
159420
  var loader24 = /* @__PURE__ */ __name(async () => {
159129
- const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-DViyYq-y.js");
159421
+ const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-D595vsyp.js");
159130
159422
  return { id: id24, diagram: diagram2 };
159131
159423
  }, "loader");
159132
159424
  var radar = {
@@ -159139,7 +159431,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
159139
159431
  return /^\s*block(-beta)?/.test(txt);
159140
159432
  }, "detector");
159141
159433
  var loader25 = /* @__PURE__ */ __name(async () => {
159142
- const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-BahODDhX.js");
159434
+ const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-CO_-9S_E.js");
159143
159435
  return { id: id25, diagram: diagram2 };
159144
159436
  }, "loader");
159145
159437
  var plugin21 = {
@@ -159153,7 +159445,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
159153
159445
  return /^\s*architecture/.test(txt);
159154
159446
  }, "detector");
159155
159447
  var loader26 = /* @__PURE__ */ __name(async () => {
159156
- const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-Br4iiUzH.js");
159448
+ const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-B4vqMbhE.js");
159157
159449
  return { id: id26, diagram: diagram2 };
159158
159450
  }, "loader");
159159
159451
  var architecture = {
@@ -159167,7 +159459,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
159167
159459
  return /^\s*treemap/.test(txt);
159168
159460
  }, "detector");
159169
159461
  var loader27 = /* @__PURE__ */ __name(async () => {
159170
- const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-DtOD93m7.js");
159462
+ const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-C6URVSbQ.js");
159171
159463
  return { id: id27, diagram: diagram2 };
159172
159464
  }, "loader");
159173
159465
  var treemap = {
@@ -161491,8 +161783,13 @@ function readElement(group) {
161491
161783
  const el = group.element;
161492
161784
  return el && typeof el.getBoundingClientRect === "function" ? el : null;
161493
161785
  }
161494
- function getGridGroupsInVisualOrder(api) {
161495
- const groups = api.groups.filter((g2) => g2.api.location.type === "grid");
161786
+ function getNavigableGroupsInVisualOrder(api) {
161787
+ const groups = api.groups.filter((g2) => {
161788
+ const loc = g2.api.location;
161789
+ if (loc.type === "grid") return true;
161790
+ if (loc.type === "edge") return g2.panels.length > 0;
161791
+ return false;
161792
+ });
161496
161793
  if (groups.length < 2) return groups;
161497
161794
  const rects = [];
161498
161795
  for (const g2 of groups) {
@@ -161512,7 +161809,7 @@ function getGridGroupsInVisualOrder(api) {
161512
161809
  }
161513
161810
  function cycleGridGroups(api, direction, refocus) {
161514
161811
  if (!api) return;
161515
- const groups = getGridGroupsInVisualOrder(api);
161812
+ const groups = getNavigableGroupsInVisualOrder(api);
161516
161813
  if (groups.length < 2) return;
161517
161814
  const current = api.activeGroup;
161518
161815
  const idx = current ? groups.findIndex((g2) => g2.id === current.id) : -1;
@@ -161536,7 +161833,7 @@ function selectNeighbourBeforeRemove(api, panelId) {
161536
161833
  return;
161537
161834
  }
161538
161835
  if (!group) return;
161539
- const ordered = getGridGroupsInVisualOrder(api);
161836
+ const ordered = getNavigableGroupsInVisualOrder(api);
161540
161837
  if (ordered.length <= 1) return;
161541
161838
  const groupIdx = ordered.findIndex((g2) => g2.id === group.id);
161542
161839
  if (groupIdx < 0) return;
@@ -170212,12 +170509,33 @@ function extractMarkdown(item) {
170212
170509
  }
170213
170510
  function StatusDot({ isError, isInProgress }) {
170214
170511
  if (isError) {
170215
- return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 shrink-0 rounded-full bg-red-500" });
170512
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
170513
+ "span",
170514
+ {
170515
+ "data-testid": "tool-call__status-dot",
170516
+ "data-status": "error",
170517
+ className: "size-2 shrink-0 rounded-full bg-red-500"
170518
+ }
170519
+ );
170216
170520
  }
170217
170521
  if (isInProgress) {
170218
- return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 shrink-0 animate-pulse rounded-full bg-orange-500" });
170522
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
170523
+ "span",
170524
+ {
170525
+ "data-testid": "tool-call__status-dot",
170526
+ "data-status": "in-progress",
170527
+ className: "size-2 shrink-0 animate-pulse rounded-full bg-orange-500"
170528
+ }
170529
+ );
170219
170530
  }
170220
- return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 shrink-0 rounded-full bg-green-500" });
170531
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
170532
+ "span",
170533
+ {
170534
+ "data-testid": "tool-call__status-dot",
170535
+ "data-status": "complete",
170536
+ className: "size-2 shrink-0 rounded-full bg-green-500"
170537
+ }
170538
+ );
170221
170539
  }
170222
170540
  function ToolCall({ item }) {
170223
170541
  if (item.toolName === "AskUserQuestion" && item.approvalId && item.isInProgress) {
@@ -170232,20 +170550,29 @@ function ToolCall({ item }) {
170232
170550
  }
170233
170551
  const title = item.displayTitle ?? item.toolName;
170234
170552
  const markdown = extractMarkdown(item);
170553
+ const status = item.isError ? "error" : item.isInProgress ? "in-progress" : "complete";
170235
170554
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
170236
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Collapsible, { className: "group not-prose w-full rounded border border-border/30 bg-muted/20", children: [
170237
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "flex w-full items-center justify-between gap-4 px-2 py-1.5", children: [
170238
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
170239
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatusDot, { isError: item.isError, isInProgress: item.isInProgress }),
170240
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-medium text-xs text-muted-foreground", children: title })
170241
- ] }),
170242
- /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" })
170243
- ] }),
170244
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleContent, { className: "space-y-3 border-t border-border/30 px-3 py-2 text-popover-foreground", children: [
170245
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolInput, { input: item.input }),
170246
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolOutput, { output: item.output, errorText: item.errorText })
170247
- ] })
170248
- ] }),
170555
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
170556
+ Collapsible,
170557
+ {
170558
+ "data-testid": "tool-call__container",
170559
+ "data-status": status,
170560
+ className: "group not-prose w-full rounded border border-border/30 bg-muted/20",
170561
+ children: [
170562
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "flex w-full items-center justify-between gap-4 px-2 py-1.5", children: [
170563
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
170564
+ /* @__PURE__ */ jsxRuntimeExports.jsx(StatusDot, { isError: item.isError, isInProgress: item.isInProgress }),
170565
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-medium text-xs text-muted-foreground", children: title })
170566
+ ] }),
170567
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" })
170568
+ ] }),
170569
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleContent, { className: "space-y-3 border-t border-border/30 px-3 py-2 text-popover-foreground", children: [
170570
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolInput, { input: item.input }),
170571
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolOutput, { output: item.output, errorText: item.errorText })
170572
+ ] })
170573
+ ]
170574
+ }
170575
+ ),
170249
170576
  markdown && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageResponse, { children: markdown })
170250
170577
  ] });
170251
170578
  }
@@ -170512,16 +170839,31 @@ function chatEventReducer(state2, event) {
170512
170839
  };
170513
170840
  }
170514
170841
  case "tool-output-available": {
170515
- const assistantId = state2.currentAssistantId;
170516
- if (!assistantId) return { ...state2, lastEventId };
170517
- const asstMsg = state2.messages.find((m2) => m2.id === assistantId);
170518
- const prevPart = asstMsg?.parts.find((p2) => {
170519
- const pp = p2;
170520
- return pp.toolCallId === event.toolCallId;
170521
- });
170842
+ let ownerId;
170843
+ let prevPart;
170844
+ for (let i2 = state2.messages.length - 1; i2 >= 0; i2--) {
170845
+ const msg = state2.messages[i2];
170846
+ if (msg.role !== "assistant") continue;
170847
+ const part = msg.parts.find((p2) => {
170848
+ const pp = p2;
170849
+ return pp.toolCallId === event.toolCallId;
170850
+ });
170851
+ if (part) {
170852
+ ownerId = msg.id;
170853
+ prevPart = part;
170854
+ break;
170855
+ }
170856
+ }
170857
+ if (!ownerId) {
170858
+ console.warn(
170859
+ "[chat] tool-output-available for unknown toolCallId — dropping",
170860
+ event.toolCallId
170861
+ );
170862
+ return { ...state2, lastEventId };
170863
+ }
170522
170864
  const messages = replaceToolPart(
170523
170865
  state2.messages,
170524
- assistantId,
170866
+ ownerId,
170525
170867
  event.toolCallId,
170526
170868
  makeToolOutputPart(prevPart, event)
170527
170869
  );
@@ -172172,29 +172514,32 @@ const closeTabRef = {
172172
172514
  current: null
172173
172515
  };
172174
172516
  const RightHeaderActions = React$1.memo(function RightHeaderActions2(props) {
172517
+ const isGridGroup = (props.location?.type ?? "grid") === "grid";
172175
172518
  const { onAdd: onAdd2, onSplit } = addTabRef.current;
172176
172519
  const groupId = props.group.id;
172177
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full items-center", children: [
172178
- /* @__PURE__ */ jsxRuntimeExports.jsx(
172179
- "button",
172180
- {
172181
- type: "button",
172182
- className: "inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors",
172183
- onClick: () => onSplit(groupId, "right"),
172184
- title: "Split right",
172185
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Columns2, { className: "size-3.5" })
172186
- }
172187
- ),
172188
- /* @__PURE__ */ jsxRuntimeExports.jsx(
172189
- "button",
172190
- {
172191
- type: "button",
172192
- className: "inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors",
172193
- onClick: () => onSplit(groupId, "below"),
172194
- title: "Split down",
172195
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Rows2, { className: "size-3.5" })
172196
- }
172197
- ),
172520
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full w-full items-center justify-center", children: [
172521
+ isGridGroup && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
172522
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
172523
+ "button",
172524
+ {
172525
+ type: "button",
172526
+ className: "inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors",
172527
+ onClick: () => onSplit(groupId, "right"),
172528
+ title: "Split right",
172529
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Columns2, { className: "size-3.5" })
172530
+ }
172531
+ ),
172532
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
172533
+ "button",
172534
+ {
172535
+ type: "button",
172536
+ className: "inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors",
172537
+ onClick: () => onSplit(groupId, "below"),
172538
+ title: "Split down",
172539
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Rows2, { className: "size-3.5" })
172540
+ }
172541
+ )
172542
+ ] }),
172198
172543
  /* @__PURE__ */ jsxRuntimeExports.jsx(
172199
172544
  "button",
172200
172545
  {
@@ -172223,6 +172568,8 @@ function DockviewChatContainer({
172223
172568
  const apiRef = reactExports.useRef(null);
172224
172569
  const isRestoringRef = reactExports.useRef(false);
172225
172570
  const containerRef = reactExports.useRef(null);
172571
+ const edgeDragDisposerRef = reactExports.useRef(null);
172572
+ const innerRegisterDisposerRef = reactExports.useRef(null);
172226
172573
  const { data: initialData } = useQuery({
172227
172574
  queryKey: chatLayoutKey(workspaceId),
172228
172575
  queryFn: async () => {
@@ -172434,6 +172781,14 @@ function DockviewChatContainer({
172434
172781
  }, [adapter2, workspaceId]);
172435
172782
  addTabRef.current = { onAdd: handleAddTab, onSplit: handleSplit };
172436
172783
  closeTabRef.current = closeTab;
172784
+ reactExports.useEffect(() => {
172785
+ return () => {
172786
+ edgeDragDisposerRef.current?.();
172787
+ edgeDragDisposerRef.current = null;
172788
+ innerRegisterDisposerRef.current?.();
172789
+ innerRegisterDisposerRef.current = null;
172790
+ };
172791
+ }, []);
172437
172792
  const initialLayoutRef = reactExports.useRef(null);
172438
172793
  initialLayoutRef.current = initialData?.layout ?? null;
172439
172794
  const initialChatIdsRef = reactExports.useRef(null);
@@ -172475,6 +172830,13 @@ function DockviewChatContainer({
172475
172830
  createDefaultPanel(event.api, workspaceId);
172476
172831
  persistToServer(workspaceId, event.api.toJSON(), { queryClient: queryClientRef.current });
172477
172832
  }
172833
+ ensureEdgeGroups(event.api);
172834
+ edgeDragDisposerRef.current?.();
172835
+ edgeDragDisposerRef.current = attachEdgeGroupDragVisibility(event.api);
172836
+ innerRegisterDisposerRef.current?.();
172837
+ if (containerRef.current) {
172838
+ innerRegisterDisposerRef.current = registerInnerDockview(containerRef.current, event.api);
172839
+ }
172478
172840
  const persist = () => schedulePersist();
172479
172841
  event.api.onDidLayoutChange(persist);
172480
172842
  event.api.onDidAddPanel(persist);
@@ -172596,6 +172958,33 @@ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
172596
172958
  return next2;
172597
172959
  });
172598
172960
  }, [activeWorkspaceId]);
172961
+ const { projects, isLoading, error } = useProjects();
172962
+ reactExports.useEffect(() => {
172963
+ if (isLoading || error) return;
172964
+ const validIds = /* @__PURE__ */ new Set();
172965
+ for (const project of projects) {
172966
+ for (const worktree of project.worktrees) {
172967
+ validIds.add(toWorkspaceId(project.name, worktree.branch));
172968
+ }
172969
+ }
172970
+ setCache((prev2) => {
172971
+ let hasStale = false;
172972
+ for (const id28 of prev2.keys()) {
172973
+ if (!validIds.has(id28) && id28 !== activeWorkspaceId) {
172974
+ hasStale = true;
172975
+ break;
172976
+ }
172977
+ }
172978
+ if (!hasStale) return prev2;
172979
+ const next2 = new Map(prev2);
172980
+ for (const id28 of next2.keys()) {
172981
+ if (!validIds.has(id28) && id28 !== activeWorkspaceId) {
172982
+ next2.delete(id28);
172983
+ }
172984
+ }
172985
+ return next2;
172986
+ });
172987
+ }, [projects, isLoading, error, activeWorkspaceId]);
172599
172988
  const lastCacheKeysRef = reactExports.useRef(/* @__PURE__ */ new Set());
172600
172989
  reactExports.useEffect(() => {
172601
172990
  const current = new Set(cache.keys());
@@ -172610,6 +172999,7 @@ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
172610
172999
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
172611
173000
  "div",
172612
173001
  {
173002
+ "data-testid": `workspace-panel-host__cached-entry--${workspaceId}`,
172613
173003
  className: "absolute inset-0 transition-opacity duration-150 ease-out",
172614
173004
  style: {
172615
173005
  opacity: isActive ? 1 : 0,
@@ -173857,6 +174247,325 @@ function PrereqDialog({ open: open2, onOpenChange, onReady }) {
173857
174247
  ] })
173858
174248
  ] }) });
173859
174249
  }
174250
+ const BYTES_PER_MB = 1024 * 1024;
174251
+ function formatMB(bytes) {
174252
+ return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;
174253
+ }
174254
+ function formatBytes(bytes) {
174255
+ if (bytes < 1024) return `${bytes} B`;
174256
+ if (bytes < BYTES_PER_MB) return `${(bytes / 1024).toFixed(1)} KB`;
174257
+ if (bytes < BYTES_PER_MB * 1024) return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;
174258
+ return `${(bytes / (BYTES_PER_MB * 1024)).toFixed(2)} GB`;
174259
+ }
174260
+ function formatUptime(seconds) {
174261
+ const s2 = Math.floor(seconds % 60);
174262
+ const m2 = Math.floor(seconds / 60 % 60);
174263
+ const h2 = Math.floor(seconds / 3600 % 24);
174264
+ const d2 = Math.floor(seconds / 86400);
174265
+ const parts = [];
174266
+ if (d2 > 0) parts.push(`${d2}d`);
174267
+ if (h2 > 0) parts.push(`${h2}h`);
174268
+ if (m2 > 0) parts.push(`${m2}m`);
174269
+ parts.push(`${s2}s`);
174270
+ return parts.join(" ");
174271
+ }
174272
+ function formatCpuMs(micros) {
174273
+ const ms = micros / 1e3;
174274
+ if (ms < 1e3) return `${ms.toFixed(1)} ms`;
174275
+ return `${(ms / 1e3).toFixed(2)} s`;
174276
+ }
174277
+ function testIdForWorktree(project, branch) {
174278
+ const safe = (s2) => s2.replace(/[^\w-]/g, "_");
174279
+ return `${safe(project)}__${safe(branch)}`;
174280
+ }
174281
+ const PROJECT_FETCH_CONCURRENCY = 3;
174282
+ async function runWithLimit(items, limit, fn2, isCancelled) {
174283
+ let nextIdx = 0;
174284
+ async function worker() {
174285
+ while (true) {
174286
+ if (isCancelled()) return;
174287
+ const idx = nextIdx++;
174288
+ if (idx >= items.length) return;
174289
+ await fn2(items[idx]);
174290
+ }
174291
+ }
174292
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => worker()));
174293
+ }
174294
+ function ResourcesPage() {
174295
+ const serverQuery = useQuery({
174296
+ queryKey: ["resources", "server"],
174297
+ queryFn: () => trpc.services.resourcesServer.query()
174298
+ });
174299
+ const projectsQuery = useQuery({
174300
+ queryKey: ["resources", "projects"],
174301
+ queryFn: () => trpc.services.resourcesProjects.query(),
174302
+ refetchOnWindowFocus: false,
174303
+ refetchOnReconnect: false,
174304
+ refetchInterval: false,
174305
+ staleTime: Number.POSITIVE_INFINITY
174306
+ });
174307
+ const [sizes, setSizes] = reactExports.useState(() => /* @__PURE__ */ new Map());
174308
+ const [refreshKey, setRefreshKey] = reactExports.useState(0);
174309
+ const server = serverQuery.data;
174310
+ const projects = projectsQuery.data?.projects ?? [];
174311
+ const projectNames = projects.map((p2) => p2.project).join("\n");
174312
+ const projectsRef = reactExports.useMemo(() => projects, [projectNames]);
174313
+ reactExports.useEffect(() => {
174314
+ if (projectsRef.length === 0) return;
174315
+ let cancelled = false;
174316
+ setSizes(/* @__PURE__ */ new Map());
174317
+ void runWithLimit(
174318
+ projectsRef,
174319
+ PROJECT_FETCH_CONCURRENCY,
174320
+ async (p2) => {
174321
+ try {
174322
+ const data = await trpc.services.resourcesProjectSize.query({ project: p2.project });
174323
+ if (cancelled) return;
174324
+ setSizes((prev2) => {
174325
+ const next2 = new Map(prev2);
174326
+ next2.set(p2.project, data);
174327
+ return next2;
174328
+ });
174329
+ } catch (err) {
174330
+ if (cancelled) return;
174331
+ setSizes((prev2) => {
174332
+ const next2 = new Map(prev2);
174333
+ next2.set(p2.project, {
174334
+ project: p2.project,
174335
+ sizeBytes: 0,
174336
+ worktrees: [],
174337
+ error: err instanceof Error ? err.message : String(err)
174338
+ });
174339
+ return next2;
174340
+ });
174341
+ }
174342
+ },
174343
+ () => cancelled
174344
+ );
174345
+ return () => {
174346
+ cancelled = true;
174347
+ };
174348
+ }, [projectsRef, refreshKey]);
174349
+ const handleRefreshSizes = reactExports.useCallback(async () => {
174350
+ await projectsQuery.refetch();
174351
+ setRefreshKey((k2) => k2 + 1);
174352
+ }, [projectsQuery]);
174353
+ const [expandedProjects, setExpandedProjects] = reactExports.useState(() => /* @__PURE__ */ new Set());
174354
+ const toggleProject = (project) => {
174355
+ setExpandedProjects((prev2) => {
174356
+ const next2 = new Set(prev2);
174357
+ if (next2.has(project)) next2.delete(project);
174358
+ else next2.add(project);
174359
+ return next2;
174360
+ });
174361
+ };
174362
+ const sortedProjects = [...projects].sort((a2, b2) => {
174363
+ const sa = sizes.get(a2.project);
174364
+ const sb = sizes.get(b2.project);
174365
+ if (sa && sb) return sb.sizeBytes - sa.sizeBytes;
174366
+ if (sa && !sb) return -1;
174367
+ if (!sa && sb) return 1;
174368
+ return 0;
174369
+ });
174370
+ const knownTotalBytes = Array.from(sizes.values()).reduce((sum, s2) => sum + s2.sizeBytes, 0);
174371
+ const allLoaded = sizes.size === projects.length;
174372
+ 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: [
174373
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-server-card", className: "space-y-3", children: [
174374
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2", children: [
174375
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
174376
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: "Server" }),
174377
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
174378
+ "The Node process serving the Band dashboard (",
174379
+ server ? `pid ${server.pid}` : "…",
174380
+ ")."
174381
+ ] })
174382
+ ] }),
174383
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
174384
+ Button,
174385
+ {
174386
+ variant: "outline",
174387
+ size: "sm",
174388
+ "data-testid": "resources-refresh-server",
174389
+ onClick: () => serverQuery.refetch(),
174390
+ disabled: serverQuery.isFetching,
174391
+ children: [
174392
+ serverQuery.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
174393
+ "Refresh"
174394
+ ]
174395
+ }
174396
+ )
174397
+ ] }),
174398
+ serverQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
174399
+ "Failed to load server snapshot: ",
174400
+ String(serverQuery.error)
174401
+ ] }) : !server ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
174402
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }),
174403
+ "Loading…"
174404
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-x-6 gap-y-2 text-sm md:grid-cols-3", children: [
174405
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "PID", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { "data-testid": "resources-server-pid", children: server.pid }) }),
174406
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Uptime", children: formatUptime(server.uptimeSeconds) }),
174407
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Node", children: server.nodeVersion }),
174408
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ServerField, { label: "Platform", children: [
174409
+ server.platform,
174410
+ " (",
174411
+ server.arch,
174412
+ ")"
174413
+ ] }),
174414
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "RSS", children: formatMB(server.memory.rssBytes) }),
174415
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Heap used", children: formatMB(server.memory.heapUsedBytes) }),
174416
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Heap total", children: formatMB(server.memory.heapTotalBytes) }),
174417
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "External", children: formatMB(server.memory.externalBytes) }),
174418
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Array buffers", children: formatMB(server.memory.arrayBuffersBytes) }),
174419
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (user)", children: formatCpuMs(server.cpu.userMicros) }),
174420
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (system)", children: formatCpuMs(server.cpu.systemMicros) })
174421
+ ] })
174422
+ ] }),
174423
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-worktrees-card", className: "space-y-3", children: [
174424
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2", children: [
174425
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
174426
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: "Worktrees" }),
174427
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
174428
+ "Disk usage per tracked git project (allocated blocks, as reported by",
174429
+ " ",
174430
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "du" }),
174431
+ "). Sizes load per project in batches of ",
174432
+ PROJECT_FETCH_CONCURRENCY,
174433
+ ". Click a project to see its per-worktree breakdown."
174434
+ ] })
174435
+ ] }),
174436
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
174437
+ Button,
174438
+ {
174439
+ variant: "outline",
174440
+ size: "sm",
174441
+ "data-testid": "resources-refresh-worktrees",
174442
+ onClick: handleRefreshSizes,
174443
+ disabled: projectsQuery.isFetching || !allLoaded,
174444
+ children: [
174445
+ projectsQuery.isFetching || !allLoaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
174446
+ "Refresh"
174447
+ ]
174448
+ }
174449
+ )
174450
+ ] }),
174451
+ projectsQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
174452
+ "Failed to load projects: ",
174453
+ String(projectsQuery.error)
174454
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
174455
+ "table",
174456
+ {
174457
+ "data-testid": "resources-projects-table",
174458
+ className: "w-full border-collapse text-sm",
174459
+ children: [
174460
+ /* @__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: [
174461
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3", children: "Project" }),
174462
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Worktrees" }),
174463
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Total size" })
174464
+ ] }) }),
174465
+ /* @__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) => {
174466
+ const size2 = sizes.get(project.project);
174467
+ const isExpanded = expandedProjects.has(project.project);
174468
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(reactExports.Fragment, { children: [
174469
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
174470
+ "tr",
174471
+ {
174472
+ "data-testid": `resources-project-row-${project.project}`,
174473
+ "data-expanded": isExpanded ? "true" : "false",
174474
+ className: "border-b border-border/60 last:border-0 hover:bg-muted/40",
174475
+ children: [
174476
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 font-medium", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
174477
+ "button",
174478
+ {
174479
+ type: "button",
174480
+ "aria-expanded": isExpanded,
174481
+ onClick: () => toggleProject(project.project),
174482
+ className: "inline-flex w-full cursor-pointer items-center gap-1 text-left",
174483
+ children: [
174484
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174485
+ ChevronRight,
174486
+ {
174487
+ className: `size-3.5 shrink-0 transition-transform ${isExpanded ? "rotate-90" : ""}`
174488
+ }
174489
+ ),
174490
+ project.project
174491
+ ]
174492
+ }
174493
+ ) }),
174494
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: project.worktrees.length }),
174495
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174496
+ "td",
174497
+ {
174498
+ className: "py-2 pr-3 text-right tabular-nums",
174499
+ "data-testid": `resources-project-size-${project.project}`,
174500
+ children: size2 === void 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center justify-end gap-1.5 text-muted-foreground", children: [
174501
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }),
174502
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: "measuring…" })
174503
+ ] }) : size2.error ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", title: size2.error, children: "error" }) : formatBytes(size2.sizeBytes)
174504
+ }
174505
+ )
174506
+ ]
174507
+ }
174508
+ ),
174509
+ isExpanded && (size2 === void 0 ? (
174510
+ // Sizes haven't landed yet — show one
174511
+ // child row with a spinner so the
174512
+ // expand isn't an empty void.
174513
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tr", { className: "border-b border-border/40 bg-muted/20", children: /* @__PURE__ */ jsxRuntimeExports.jsx("td", { colSpan: 3, className: "py-2 pl-8 pr-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-2 text-xs text-muted-foreground", children: [
174514
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }),
174515
+ "Measuring worktrees…"
174516
+ ] }) }) })
174517
+ ) : size2.worktrees.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("tr", { className: "border-b border-border/40 bg-muted/20", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
174518
+ "td",
174519
+ {
174520
+ colSpan: 3,
174521
+ className: "py-2 pl-8 pr-3 text-xs text-muted-foreground",
174522
+ children: "No worktrees"
174523
+ }
174524
+ ) }) : size2.worktrees.map((wt2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
174525
+ "tr",
174526
+ {
174527
+ "data-testid": `resources-worktree-row-${testIdForWorktree(project.project, wt2.branch)}`,
174528
+ className: "border-b border-border/40 bg-muted/20 last:border-0",
174529
+ children: [
174530
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pl-8 pr-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [
174531
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-xs", children: wt2.branch || "—" }),
174532
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-mono text-[11px] text-muted-foreground", children: wt2.path })
174533
+ ] }) }),
174534
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3" }),
174535
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3 text-right tabular-nums", children: wt2.error ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "error" }) : formatBytes(wt2.sizeBytes) })
174536
+ ]
174537
+ },
174538
+ `${project.project}::${wt2.branch}::${wt2.path}`
174539
+ )))
174540
+ ] }, project.project);
174541
+ }) }),
174542
+ projects.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("tfoot", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t-2 border-border font-medium", children: [
174543
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "py-2 pr-3", children: [
174544
+ "Total",
174545
+ allLoaded ? "" : " (partial)"
174546
+ ] }),
174547
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: projects.reduce((sum, p2) => sum + p2.worktrees.length, 0) }),
174548
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174549
+ "td",
174550
+ {
174551
+ className: "py-2 pr-3 text-right tabular-nums",
174552
+ "data-testid": "resources-projects-total",
174553
+ children: formatBytes(knownTotalBytes)
174554
+ }
174555
+ )
174556
+ ] }) })
174557
+ ]
174558
+ }
174559
+ ) })
174560
+ ] })
174561
+ ] }) });
174562
+ }
174563
+ function ServerField({ label, children: children2 }) {
174564
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-0.5", children: [
174565
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: label }),
174566
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-sm", children: children2 })
174567
+ ] });
174568
+ }
173860
174569
  function relativeTime(ms) {
173861
174570
  const seconds = Math.floor((Date.now() - ms) / 1e3);
173862
174571
  if (seconds < 60) return "just now";
@@ -175532,6 +176241,7 @@ function useAnyToolbarDialogOpen() {
175532
176241
  function ToolbarOverflowProvider({ children: children2 }) {
175533
176242
  const [showTasksDialog, setShowTasksDialog] = reactExports.useState(false);
175534
176243
  const [showCronjobsDialog, setShowCronjobsDialog] = reactExports.useState(false);
176244
+ const [showResourcesDialog, setShowResourcesDialog] = reactExports.useState(false);
175535
176245
  const {
175536
176246
  webServerRunning,
175537
176247
  tunnelUrl,
@@ -175548,11 +176258,19 @@ function ToolbarOverflowProvider({ children: children2 }) {
175548
176258
  const openTasks = reactExports.useCallback(() => setShowTasksDialog(true), []);
175549
176259
  const openCronjobs = reactExports.useCallback(() => setShowCronjobsDialog(true), []);
175550
176260
  const openTunnel = reactExports.useCallback(() => openTunnelDialog(), [openTunnelDialog]);
176261
+ const openResources = reactExports.useCallback(() => setShowResourcesDialog(true), []);
175551
176262
  const tunnelStatus = tunnelError ? "error" : webServerRunning ? "running" : "idle";
175552
- const anyDialogOpen = showTasksDialog || showCronjobsDialog || showTunnelDialog || showPrereq;
176263
+ const anyDialogOpen = showTasksDialog || showCronjobsDialog || showTunnelDialog || showPrereq || showResourcesDialog;
175553
176264
  const value = reactExports.useMemo(
175554
- () => ({ openTasks, openCronjobs, openTunnel, tunnelStatus, anyDialogOpen }),
175555
- [openTasks, openCronjobs, openTunnel, tunnelStatus, anyDialogOpen]
176265
+ () => ({
176266
+ openTasks,
176267
+ openCronjobs,
176268
+ openTunnel,
176269
+ openResources,
176270
+ tunnelStatus,
176271
+ anyDialogOpen
176272
+ }),
176273
+ [openTasks, openCronjobs, openTunnel, openResources, tunnelStatus, anyDialogOpen]
175556
176274
  );
175557
176275
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(ToolbarOverflowContext.Provider, { value, children: [
175558
176276
  children2,
@@ -175564,6 +176282,17 @@ function ToolbarOverflowProvider({ children: children2 }) {
175564
176282
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { className: "px-6 pt-6 pb-4 border-b border-border/50 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Cronjobs" }) }),
175565
176283
  /* @__PURE__ */ jsxRuntimeExports.jsx(CronjobsPageContent, {})
175566
176284
  ] }) }),
176285
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: showResourcesDialog, onOpenChange: setShowResourcesDialog, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
176286
+ DialogContent,
176287
+ {
176288
+ className: "sm:max-w-6xl h-[80vh] flex flex-col p-0 gap-0",
176289
+ "data-testid": "resources-dialog",
176290
+ children: [
176291
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { className: "px-6 pt-6 pb-4 border-b border-border/50 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Resources" }) }),
176292
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ResourcesPage, {}) })
176293
+ ]
176294
+ }
176295
+ ) }),
175567
176296
  /* @__PURE__ */ jsxRuntimeExports.jsx(PrereqDialog, { open: showPrereq, onOpenChange: setShowPrereq, onReady: onPrereqReady }),
175568
176297
  /* @__PURE__ */ jsxRuntimeExports.jsx(
175569
176298
  TunnelDialog,
@@ -175599,6 +176328,10 @@ function ToolbarOverflowMenuItems() {
175599
176328
  }
175600
176329
  ),
175601
176330
  ctx.tunnelStatus === "running" ? "Mobile access" : "Start tunnel"
176331
+ ] }),
176332
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openResources, "data-testid": "menu__resources", children: [
176333
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Activity, { className: "size-4" }),
176334
+ "Resources"
175602
176335
  ] })
175603
176336
  ] });
175604
176337
  }
@@ -175622,12 +176355,12 @@ const PANEL_SHORTCUTS = {
175622
176355
  browser: "⇧⌘B"
175623
176356
  };
175624
176357
  const DockviewTerminalContainer = reactExports.lazy(
175625
- () => import("./DockviewTerminalContainer-BbMZgBJ8.js").then((m2) => ({
176358
+ () => import("./DockviewTerminalContainer-B4s5M71S.js").then((m2) => ({
175626
176359
  default: m2.DockviewTerminalContainer
175627
176360
  }))
175628
176361
  );
175629
176362
  const DockviewBrowserContainer = reactExports.lazy(
175630
- () => import("./DockviewBrowserContainer-Bm7ARaqd.js").then((m2) => ({
176363
+ () => import("./DockviewBrowserContainer-BHlHNdlw.js").then((m2) => ({
175631
176364
  default: m2.DockviewBrowserContainer
175632
176365
  }))
175633
176366
  );
@@ -176241,13 +176974,21 @@ function SharedDockviewLayout() {
176241
176974
  window.dispatchEvent(new CustomEvent("band:focus-browser"));
176242
176975
  });
176243
176976
  }
176244
- } else if (key2 === "b" && !e2.shiftKey && api) {
176977
+ } else if (key2 === "b" && !e2.shiftKey && !e2.altKey && api) {
176245
176978
  e2.preventDefault();
176246
- const left = api.groups.find((g2) => g2.id === EDGE_GROUP_IDS.left);
176247
- if (left) {
176248
- if (left.api.isCollapsed()) left.api.expand();
176249
- else left.api.collapse();
176250
- }
176979
+ const inner2 = findFocusedInnerDockview();
176980
+ if (inner2 && toggleEdgeGroup(inner2, "left")) return;
176981
+ toggleEdgeGroup(api, "left");
176982
+ } else if (e2.code === "KeyB" && e2.altKey && !e2.shiftKey && api) {
176983
+ e2.preventDefault();
176984
+ const inner2 = findFocusedInnerDockview();
176985
+ if (inner2 && toggleEdgeGroup(inner2, "right")) return;
176986
+ toggleEdgeGroup(api, "right");
176987
+ } else if (key2 === "j" && !e2.shiftKey && !e2.altKey && api) {
176988
+ e2.preventDefault();
176989
+ const inner2 = findFocusedInnerDockview();
176990
+ if (inner2 && toggleEdgeGroup(inner2, "bottom")) return;
176991
+ toggleEdgeGroup(api, "bottom");
176251
176992
  } else if (key2 === "m" && e2.shiftKey && api) {
176252
176993
  e2.preventDefault();
176253
176994
  const active = api.activeGroup;
@@ -176871,32 +177612,23 @@ function useZoom() {
176871
177612
  return () => window.removeEventListener("keydown", handler, true);
176872
177613
  }, []);
176873
177614
  }
176874
- function dispatchOpenFileEvent(event, options) {
177615
+ function dispatchOpenFileEvent(event, handlers2) {
176875
177616
  if (event.kind !== "open-file") return { handled: false, reason: "not-open-file" };
176876
177617
  const workspaceId = typeof event.workspaceId === "string" ? event.workspaceId : void 0;
176877
177618
  if (!workspaceId) return { handled: false, reason: "missing-workspace-id" };
176878
177619
  const filePath = typeof event.filePath === "string" ? event.filePath : void 0;
176879
177620
  if (!filePath) return { handled: false, reason: "missing-file-path" };
176880
- const { isDockview, handlers: handlers2 } = options;
176881
177621
  if (event.external === true) {
176882
177622
  enqueueExternalOpen(workspaceId, filePath);
176883
- if (isDockview) {
176884
- handlers2.onActivateFilesPanel(workspaceId);
176885
- return { handled: true, kind: "dockview-external" };
176886
- }
176887
- handlers2.navigateToWorkspaceCode(workspaceId);
176888
- return { handled: true, kind: "mobile-external" };
177623
+ handlers2.onActivateFilesPanel(workspaceId);
177624
+ return { handled: true, kind: "external" };
176889
177625
  }
176890
- if (isDockview) {
176891
- handlers2.onOpenFile(workspaceId, filePath);
176892
- return { handled: true, kind: "dockview-in-workspace" };
176893
- }
176894
- handlers2.navigateInWorkspace(workspaceId, filePath);
176895
- return { handled: true, kind: "mobile-in-workspace" };
177626
+ handlers2.onOpenFile(workspaceId, filePath);
177627
+ return { handled: true, kind: "in-workspace" };
176896
177628
  }
176897
177629
  const adapter = isDesktop ? new DesktopDashboardAdapter() : new WebDashboardAdapter();
176898
177630
  const capabilities = isDesktop ? new NativeShellCapabilities() : new WebCapabilities();
176899
- const Route$8 = createRootRoute({
177631
+ const Route$2 = createRootRoute({
176900
177632
  head: () => ({
176901
177633
  meta: [
176902
177634
  { charSet: "utf-8" },
@@ -177060,27 +177792,14 @@ function AppShell() {
177060
177792
  useDesktopLayoutRef.current = useDesktopLayout;
177061
177793
  reactExports.useEffect(() => {
177062
177794
  const unsubscribe = adapter.subscribeStatusEvents((event) => {
177795
+ if (!useDesktopLayoutRef.current) return;
177063
177796
  dispatchOpenFileEvent(event, {
177064
- isDockview: useDesktopLayoutRef.current,
177065
- handlers: {
177066
- onOpenFile: crossPanelHandlers.onOpenFile,
177067
- onActivateFilesPanel: crossPanelHandlers.onActivateFilesPanel,
177068
- navigateInWorkspace: (workspaceId, filePath) => router2.navigate({
177069
- to: "/workspace/$workspaceId/code/$",
177070
- params: {
177071
- workspaceId: encodeURIComponent(workspaceId),
177072
- _splat: filePath
177073
- }
177074
- }),
177075
- navigateToWorkspaceCode: (workspaceId) => router2.navigate({
177076
- to: "/workspace/$workspaceId/code",
177077
- params: { workspaceId: encodeURIComponent(workspaceId) }
177078
- })
177079
- }
177797
+ onOpenFile: crossPanelHandlers.onOpenFile,
177798
+ onActivateFilesPanel: crossPanelHandlers.onActivateFilesPanel
177080
177799
  });
177081
177800
  });
177082
177801
  return unsubscribe;
177083
- }, [router2]);
177802
+ }, []);
177084
177803
  const panelItems = reactExports.useMemo(
177085
177804
  () => [
177086
177805
  { id: "chat", label: "Chat", icon: MessageSquare, shortcut: "⌃⌘I" },
@@ -177175,112 +177894,42 @@ function RootLayout() {
177175
177894
  ] })
177176
177895
  ] });
177177
177896
  }
177178
- const $$splitComponentImporter$7 = () => import("./index-6Zof9vm8.js");
177179
- const Route$7 = createFileRoute("/")({
177180
- component: lazyRouteComponent($$splitComponentImporter$7, "component")
177181
- });
177182
- const $$splitComponentImporter$6 = () => import("./workspace._workspaceId-DwsRTXCg.js");
177183
- const Route$6 = createFileRoute("/workspace/$workspaceId")({
177184
- component: lazyRouteComponent($$splitComponentImporter$6, "component")
177185
- });
177186
- const DiffStatsContext = reactExports.createContext({
177187
- diffStats: null,
177188
- setDiffStats: () => {
177189
- }
177190
- });
177191
- function useDiffStatsContext() {
177192
- return reactExports.useContext(DiffStatsContext);
177193
- }
177194
- const FindInFileContext = reactExports.createContext({
177195
- setFindInFile: () => {
177196
- }
177197
- });
177198
- function useFindInFileContext() {
177199
- return reactExports.useContext(FindInFileContext);
177200
- }
177201
- const $$splitComponentImporter$5 = () => import("./workspace._workspaceId.index-BPhXMwl8.js");
177202
- const Route$5 = createFileRoute("/workspace/$workspaceId/")({
177203
- component: lazyRouteComponent($$splitComponentImporter$5, "component")
177204
- });
177205
- const $$splitComponentImporter$4 = () => import("./workspace._workspaceId.terminal-BdVDaWNH.js");
177206
- const Route$4 = createFileRoute("/workspace/$workspaceId/terminal")({
177207
- component: lazyRouteComponent($$splitComponentImporter$4, "component")
177208
- });
177209
- const $$splitComponentImporter$3 = () => import("./workspace._workspaceId.code-Cuj0zH98.js");
177210
- const Route$3 = createFileRoute("/workspace/$workspaceId/code")({
177211
- component: lazyRouteComponent($$splitComponentImporter$3, "component")
177212
- });
177213
- const $$splitComponentImporter$2 = () => import("./workspace._workspaceId.changes-C6vwSbUh.js");
177214
- const Route$2 = createFileRoute("/workspace/$workspaceId/changes")({
177215
- component: lazyRouteComponent($$splitComponentImporter$2, "component")
177216
- });
177217
- const $$splitComponentImporter$1 = () => import("./workspace._workspaceId.code.index-CE_CMD_I.js");
177218
- const Route$1 = createFileRoute("/workspace/$workspaceId/code/")({
177897
+ const $$splitComponentImporter$1 = () => import("./index-D8W-WZ8Y.js");
177898
+ const Route$1 = createFileRoute("/")({
177219
177899
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
177220
177900
  });
177221
- const $$splitComponentImporter = () => import("./workspace._workspaceId.code._-BJdg1-Gs.js");
177222
- const Route2 = createFileRoute("/workspace/$workspaceId/code/$")({
177223
- component: lazyRouteComponent($$splitComponentImporter, "component")
177901
+ const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-BnLo-dj-.js");
177902
+ const $$splitComponentImporter = () => import("./workspace._workspaceId-CJcudFN3.js");
177903
+ const Route2 = createFileRoute("/workspace/$workspaceId")({
177904
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
177905
+ // Bookmarks / shared links from before route unification (`/workspace/$id/changes`,
177906
+ // `/workspace/$id/code/foo.ts`, `/workspace/$id/terminal`) used to resolve to
177907
+ // child routes that no longer exist. Redirect them to the canonical workspace
177908
+ // URL instead of showing the root 404. See issue #467.
177909
+ //
177910
+ // CAVEAT: this catches ANY unmatched sub-path under `/workspace/$id`, not
177911
+ // just the five retired routes. If a future child route is added here, a
177912
+ // typo'd link (e.g. `/workspace/$id/settigns` for a real `/settings` route)
177913
+ // will silently land on the workspace root rather than surfacing a 404.
177914
+ // If that becomes a problem, narrow this to an allowlist of known retired
177915
+ // path prefixes.
177916
+ notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent")
177224
177917
  });
177225
- const IndexRoute = Route$7.update({
177918
+ const IndexRoute = Route$1.update({
177226
177919
  id: "/",
177227
177920
  path: "/",
177228
- getParentRoute: () => Route$8
177921
+ getParentRoute: () => Route$2
177229
177922
  });
177230
- const WorkspaceWorkspaceIdRoute = Route$6.update({
177923
+ const WorkspaceWorkspaceIdRoute = Route2.update({
177231
177924
  id: "/workspace/$workspaceId",
177232
177925
  path: "/workspace/$workspaceId",
177233
- getParentRoute: () => Route$8
177234
- });
177235
- const WorkspaceWorkspaceIdIndexRoute = Route$5.update({
177236
- id: "/",
177237
- path: "/",
177238
- getParentRoute: () => WorkspaceWorkspaceIdRoute
177239
- });
177240
- const WorkspaceWorkspaceIdTerminalRoute = Route$4.update({
177241
- id: "/terminal",
177242
- path: "/terminal",
177243
- getParentRoute: () => WorkspaceWorkspaceIdRoute
177244
- });
177245
- const WorkspaceWorkspaceIdCodeRoute = Route$3.update({
177246
- id: "/code",
177247
- path: "/code",
177248
- getParentRoute: () => WorkspaceWorkspaceIdRoute
177249
- });
177250
- const WorkspaceWorkspaceIdChangesRoute = Route$2.update({
177251
- id: "/changes",
177252
- path: "/changes",
177253
- getParentRoute: () => WorkspaceWorkspaceIdRoute
177254
- });
177255
- const WorkspaceWorkspaceIdCodeIndexRoute = Route$1.update({
177256
- id: "/",
177257
- path: "/",
177258
- getParentRoute: () => WorkspaceWorkspaceIdCodeRoute
177259
- });
177260
- const WorkspaceWorkspaceIdCodeSplatRoute = Route2.update({
177261
- id: "/$",
177262
- path: "/$",
177263
- getParentRoute: () => WorkspaceWorkspaceIdCodeRoute
177926
+ getParentRoute: () => Route$2
177264
177927
  });
177265
- const WorkspaceWorkspaceIdCodeRouteChildren = {
177266
- WorkspaceWorkspaceIdCodeSplatRoute,
177267
- WorkspaceWorkspaceIdCodeIndexRoute
177268
- };
177269
- const WorkspaceWorkspaceIdCodeRouteWithChildren = WorkspaceWorkspaceIdCodeRoute._addFileChildren(
177270
- WorkspaceWorkspaceIdCodeRouteChildren
177271
- );
177272
- const WorkspaceWorkspaceIdRouteChildren = {
177273
- WorkspaceWorkspaceIdChangesRoute,
177274
- WorkspaceWorkspaceIdCodeRoute: WorkspaceWorkspaceIdCodeRouteWithChildren,
177275
- WorkspaceWorkspaceIdTerminalRoute,
177276
- WorkspaceWorkspaceIdIndexRoute
177277
- };
177278
- const WorkspaceWorkspaceIdRouteWithChildren = WorkspaceWorkspaceIdRoute._addFileChildren(WorkspaceWorkspaceIdRouteChildren);
177279
177928
  const rootRouteChildren = {
177280
177929
  IndexRoute,
177281
- WorkspaceWorkspaceIdRoute: WorkspaceWorkspaceIdRouteWithChildren
177930
+ WorkspaceWorkspaceIdRoute
177282
177931
  };
177283
- const routeTree = Route$8._addFileChildren(rootRouteChildren)._addFileTypes();
177932
+ const routeTree = Route$2._addFileChildren(rootRouteChildren)._addFileTypes();
177284
177933
  function getRouter() {
177285
177934
  return createRouter({
177286
177935
  routeTree,
@@ -177292,275 +177941,271 @@ const router = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
177292
177941
  getRouter
177293
177942
  }, Symbol.toStringTag, { value: "Module" }));
177294
177943
  export {
177295
- getAccTitle as $,
177296
- DefaultBufferLength as A,
177297
- NodeProp as B,
177298
- ChatView as C,
177299
- DiffView as D,
177300
- createLucideIcon as E,
177301
- useAdapter as F,
177302
- useQueryClient as G,
177303
- useQuery as H,
177944
+ wrapLabel as $,
177945
+ cycleTabsInActiveGroup as A,
177946
+ cycleGridGroups as B,
177947
+ Columns2 as C,
177948
+ DefaultBufferLength as D,
177949
+ R$4 as E,
177950
+ setAccDescription as F,
177951
+ getAccDescription as G,
177952
+ getAccTitle as H,
177304
177953
  IterMode as I,
177305
- selectNeighbourBeforeRemove as J,
177306
- DockviewReact as K,
177954
+ setAccTitle as J,
177955
+ Ks as K,
177307
177956
  LanguageSupport as L,
177308
- Columns2 as M,
177957
+ getConfig2 as M,
177309
177958
  Nt as N,
177310
- Rows2 as O,
177959
+ select as O,
177311
177960
  Parser$2 as P,
177312
- Plus as Q,
177313
- Route$5 as R,
177314
- cycleTabsInActiveGroup as S,
177961
+ Qe$1 as Q,
177962
+ Route2 as R,
177963
+ log as S,
177315
177964
  Tree as T,
177316
- cycleGridGroups as U,
177317
- R$4 as V,
177318
- Ks as W,
177965
+ configureSvgSize as U,
177966
+ assignWithDepth_default as V,
177967
+ calculateTextWidth as W,
177319
177968
  X$7 as X,
177320
- Qe$1 as Y,
177321
- setAccDescription as Z,
177322
- getAccDescription as _,
177969
+ sanitizeText as Y,
177970
+ distExports as Z,
177971
+ __name as _,
177323
177972
  Navigate as a,
177324
- setupGraphViewbox as a$,
177325
- setAccTitle as a0,
177326
- __name as a1,
177327
- getConfig2 as a2,
177328
- select as a3,
177329
- log as a4,
177330
- configureSvgSize as a5,
177331
- assignWithDepth_default as a6,
177332
- calculateTextWidth as a7,
177333
- sanitizeText as a8,
177334
- distExports as a9,
177335
- package_default as aA,
177336
- withPath as aB,
177337
- halfPi as aC,
177338
- epsilon as aD,
177339
- tau as aE,
177340
- cos as aF,
177341
- sin as aG,
177342
- min as aH,
177343
- abs$1 as aI,
177344
- pi as aJ,
177345
- sqrt as aK,
177346
- atan2 as aL,
177347
- constant$1 as aM,
177348
- asin as aN,
177349
- acos as aO,
177350
- max as aP,
177351
- getThemeVariables3 as aQ,
177352
- hasKatex as aR,
177353
- calculateMathMLDimensions as aS,
177354
- parseFontSize as aT,
177355
- ZERO_WIDTH_SPACE as aU,
177356
- getUrl as aV,
177357
- renderKatexSanitized as aW,
177358
- parseGenericTypes as aX,
177359
- line$1 as aY,
177360
- curveBasis as aZ,
177361
- generateId as a_,
177362
- wrapLabel as aa,
177363
- common_default as ab,
177364
- calculateTextHeight as ac,
177365
- lineBreakRegex as ad,
177366
- setConfig2 as ae,
177367
- getRegisteredLayoutAlgorithm as af,
177368
- render$1 as ag,
177369
- utils_default as ah,
177370
- setDiagramTitle as ai,
177371
- getDiagramTitle as aj,
177372
- load as ak,
177373
- JSON_SCHEMA as al,
177374
- isValidShape as am,
177375
- getEdgeId as an,
177376
- clear$2 as ao,
177377
- defaultConfig2 as ap,
177378
- rgba$1 as aq,
177379
- Utils as ar,
177380
- Color$1 as as,
177381
- __export$1 as at,
177382
- setupGraphViewbox2 as au,
177383
- cleanAndMerge as av,
177384
- defaultConfig_default as aw,
177385
- getConfig as ax,
177386
- random as ay,
177387
- selectSvgElement as az,
177388
- useSettingsQuery as b,
177389
- DashboardShell as b$,
177390
- isDark as b0,
177391
- lighten as b1,
177392
- darken as b2,
177393
- commonDb_exports as b3,
177394
- insertCluster as b4,
177395
- insertNode as b5,
177396
- positionNode as b6,
177397
- getLineFunctionsWithOffset as b7,
177398
- evaluate as b8,
177399
- createText as b9,
177400
- foldService as bA,
177401
- defineLanguageFacet as bB,
177402
- CompletionContext as bC,
177403
- EditorState as bD,
177404
- languageDataProp as bE,
177405
- LanguageDescription as bF,
177406
- ParseContext as bG,
177407
- bracketMatchingHandle as bH,
177408
- flatIndent as bI,
177409
- sublanguageProp as bJ,
177410
- baseRest as bK,
177411
- isArrayLikeObject as bL,
177412
- constant as bM,
177413
- isFunction as bN,
177414
- isEmpty as bO,
177415
- markers_default as bP,
177416
- clear2 as bQ,
177417
- clear as bR,
177418
- clear$1 as bS,
177419
- updateNodeBounds as bT,
177420
- setNodeElem as bU,
177421
- insertEdge as bV,
177422
- positionEdgeLabel as bW,
177423
- insertEdgeLabel as bX,
177424
- computeDimensionOfText as bY,
177425
- Ut$1 as bZ,
177426
- Yt$1 as b_,
177427
- getSubGraphTitleMargins as ba,
177428
- replaceIconSubstring as bb,
177429
- decodeEntities as bc,
177430
- getStylesFromArray as bd,
177431
- MessageSquare as be,
177432
- GitCompare as bf,
177433
- FolderOpen as bg,
177434
- Route$6 as bh,
177435
- useDashboardStore as bi,
177436
- DesktopDragRegion as bj,
177437
- ArrowLeft as bk,
177438
- QuickOpenDialog as bl,
177439
- SearchFilesDialog as bm,
177440
- useDiffTarget as bn,
177441
- delimitedIndent as bo,
177442
- NodeWeakMap as bp,
177443
- snippetCompletion as bq,
177444
- Tag as br,
177445
- parseMixed as bs,
177446
- EditorSelection as bt,
177447
- countColumn as bu,
177448
- Prec as bv,
177449
- keymap as bw,
177450
- EditorView as bx,
177451
- Language as by,
177452
- indentUnit as bz,
177453
- agentTypeSupportsSessionListing as c,
177454
- isObjectLike as c$,
177455
- Qt$1 as c0,
177456
- ToolbarOverflowProvider as c1,
177457
- ToolbarOverflowMenuItems as c2,
177458
- array$2 as c3,
177459
- getUserDefinedConfig as c4,
177460
- ArrowRight as c5,
177461
- ArrowUp as c6,
177462
- ArrowDown as c7,
177463
- ClipboardPaste as c8,
177464
- getCurrentZoomLevel as c9,
177465
- eq as cA,
177466
- isArrayLike as cB,
177467
- isArray as cC,
177468
- identity as cD,
177469
- isIndex as cE,
177470
- assignValue as cF,
177471
- constant$2 as cG,
177472
- interpolateNumber as cH,
177473
- color as cI,
177474
- interpolateRgb as cJ,
177475
- interpolateString as cK,
177476
- styles2String as cL,
177477
- isLabelStyle as cM,
177478
- Rgb as cN,
177479
- rgbConvert as cO,
177480
- define as cP,
177481
- extend$2 as cQ,
177482
- Color as cR,
177483
- nogamma as cS,
177484
- hue as cT,
177485
- dayjs2 as cU,
177486
- setToString as cV,
177487
- overRest as cW,
177488
- baseFor as cX,
177489
- baseAssignValue as cY,
177490
- baseUnary as cZ,
177491
- merge$1 as c_,
177492
- openExternalUrl as ca,
177493
- subscribeToZoomChanges as cb,
177494
- SearchBar as cc,
177495
- ZOOM_CSS_VAR as cd,
177496
- getIconSVG as ce,
177497
- registerIconPacks as cf,
177498
- unknownIcon as cg,
177499
- invoke as ch,
177500
- listen as ci,
177501
- reactDomExports as cj,
177502
- Globe as ck,
177503
- Popover as cl,
177504
- PopoverTrigger as cm,
177505
- PopoverContent as cn,
177506
- Search as co,
177507
- Trash2 as cp,
177508
- DropdownMenu as cq,
177509
- DropdownMenuTrigger as cr,
177510
- ChevronDown as cs,
177511
- DropdownMenuContent as ct,
177512
- DropdownMenuItem as cu,
177513
- TriangleAlert as cv,
177514
- RotateCw as cw,
177515
- isObject$1 as cx,
177516
- isIterateeCall as cy,
177517
- keysIn as cz,
177518
- Route$4 as d,
177519
- baseGetTag as d0,
177520
- Symbol$1 as d1,
177521
- arrayLikeKeys as d2,
177522
- baseKeys as d3,
177523
- memoize as d4,
177524
- isArguments as d5,
177525
- copyObject as d6,
177526
- getPrototype as d7,
177527
- cloneArrayBuffer as d8,
177528
- cloneTypedArray as d9,
177529
- getTag as da,
177530
- nodeUtil as db,
177531
- copyArray as dc,
177532
- isBuffer as dd,
177533
- cloneBuffer as de,
177534
- initCloneObject as df,
177535
- Stack as dg,
177536
- MapCache as dh,
177537
- Uint8Array$1 as di,
177538
- isTypedArray as dj,
177539
- isLength as dk,
177540
- Set$1 as dl,
177541
- createAssigner as dm,
177542
- isPrototype as dn,
177543
- router as dp,
177544
- Route$2 as e,
177545
- useNavigate as f,
177546
- useDiffStatsContext as g,
177547
- useFindInFileContext as h,
177548
- isDesktop as i,
177549
- Route$1 as j,
177550
- CodeBrowserView as k,
177551
- Route2 as l,
177552
- LRLanguage as m,
177553
- indentNodeProp as n,
177554
- continuedIndent as o,
177555
- foldNodeProp as p,
177556
- foldInside as q,
177557
- tags as r,
177973
+ getSubGraphTitleMargins as a$,
177974
+ common_default as a0,
177975
+ calculateTextHeight as a1,
177976
+ lineBreakRegex as a2,
177977
+ setConfig2 as a3,
177978
+ getRegisteredLayoutAlgorithm as a4,
177979
+ render$1 as a5,
177980
+ utils_default as a6,
177981
+ setDiagramTitle as a7,
177982
+ getDiagramTitle as a8,
177983
+ load as a9,
177984
+ atan2 as aA,
177985
+ constant$1 as aB,
177986
+ asin as aC,
177987
+ acos as aD,
177988
+ max as aE,
177989
+ getThemeVariables3 as aF,
177990
+ hasKatex as aG,
177991
+ calculateMathMLDimensions as aH,
177992
+ parseFontSize as aI,
177993
+ ZERO_WIDTH_SPACE as aJ,
177994
+ getUrl as aK,
177995
+ renderKatexSanitized as aL,
177996
+ parseGenericTypes as aM,
177997
+ line$1 as aN,
177998
+ curveBasis as aO,
177999
+ generateId as aP,
178000
+ setupGraphViewbox as aQ,
178001
+ isDark as aR,
178002
+ lighten as aS,
178003
+ darken as aT,
178004
+ commonDb_exports as aU,
178005
+ insertCluster as aV,
178006
+ insertNode as aW,
178007
+ positionNode as aX,
178008
+ getLineFunctionsWithOffset as aY,
178009
+ evaluate as aZ,
178010
+ createText as a_,
178011
+ JSON_SCHEMA as aa,
178012
+ isValidShape as ab,
178013
+ getEdgeId as ac,
178014
+ clear$2 as ad,
178015
+ defaultConfig2 as ae,
178016
+ rgba$1 as af,
178017
+ Utils as ag,
178018
+ Color$1 as ah,
178019
+ __export$1 as ai,
178020
+ setupGraphViewbox2 as aj,
178021
+ cleanAndMerge as ak,
178022
+ defaultConfig_default as al,
178023
+ getConfig as am,
178024
+ random as an,
178025
+ selectSvgElement as ao,
178026
+ package_default as ap,
178027
+ withPath as aq,
178028
+ halfPi as ar,
178029
+ epsilon as as,
178030
+ tau as at,
178031
+ cos as au,
178032
+ sin as av,
178033
+ min as aw,
178034
+ abs$1 as ax,
178035
+ pi as ay,
178036
+ sqrt as az,
178037
+ LRLanguage as b,
178038
+ array$2 as b$,
178039
+ replaceIconSubstring as b0,
178040
+ decodeEntities as b1,
178041
+ getStylesFromArray as b2,
178042
+ delimitedIndent as b3,
178043
+ NodeWeakMap as b4,
178044
+ snippetCompletion as b5,
178045
+ Tag as b6,
178046
+ parseMixed as b7,
178047
+ EditorSelection as b8,
178048
+ countColumn as b9,
178049
+ insertEdge as bA,
178050
+ positionEdgeLabel as bB,
178051
+ insertEdgeLabel as bC,
178052
+ computeDimensionOfText as bD,
178053
+ Ut$1 as bE,
178054
+ Yt$1 as bF,
178055
+ DashboardShell as bG,
178056
+ Qt$1 as bH,
178057
+ MessageSquare as bI,
178058
+ useIsDesktop as bJ,
178059
+ ToolbarOverflowProvider as bK,
178060
+ ToolbarOverflowMenuItems as bL,
178061
+ isDesktop as bM,
178062
+ GitCompare as bN,
178063
+ FolderOpen as bO,
178064
+ useDashboardStore as bP,
178065
+ useNavigate as bQ,
178066
+ DesktopDragRegion as bR,
178067
+ ArrowLeft as bS,
178068
+ DiffView as bT,
178069
+ CodeBrowserView as bU,
178070
+ QuickOpenDialog as bV,
178071
+ SearchFilesDialog as bW,
178072
+ useDiffTarget as bX,
178073
+ useSettingsQuery as bY,
178074
+ agentTypeSupportsSessionListing as bZ,
178075
+ ChatView as b_,
178076
+ Prec as ba,
178077
+ keymap as bb,
178078
+ EditorView as bc,
178079
+ Language as bd,
178080
+ indentUnit as be,
178081
+ foldService as bf,
178082
+ defineLanguageFacet as bg,
178083
+ CompletionContext as bh,
178084
+ EditorState as bi,
178085
+ languageDataProp as bj,
178086
+ LanguageDescription as bk,
178087
+ ParseContext as bl,
178088
+ bracketMatchingHandle as bm,
178089
+ flatIndent as bn,
178090
+ sublanguageProp as bo,
178091
+ baseRest as bp,
178092
+ isArrayLikeObject as bq,
178093
+ constant as br,
178094
+ isFunction as bs,
178095
+ isEmpty as bt,
178096
+ markers_default as bu,
178097
+ clear2 as bv,
178098
+ clear as bw,
178099
+ clear$1 as bx,
178100
+ updateNodeBounds as by,
178101
+ setNodeElem as bz,
178102
+ continuedIndent as c,
178103
+ baseKeys as c$,
178104
+ getUserDefinedConfig as c0,
178105
+ ArrowRight as c1,
178106
+ ArrowUp as c2,
178107
+ ArrowDown as c3,
178108
+ ClipboardPaste as c4,
178109
+ getCurrentZoomLevel as c5,
178110
+ openExternalUrl as c6,
178111
+ subscribeToZoomChanges as c7,
178112
+ SearchBar as c8,
178113
+ ZOOM_CSS_VAR as c9,
178114
+ isIndex as cA,
178115
+ assignValue as cB,
178116
+ constant$2 as cC,
178117
+ interpolateNumber as cD,
178118
+ color as cE,
178119
+ interpolateRgb as cF,
178120
+ interpolateString as cG,
178121
+ styles2String as cH,
178122
+ isLabelStyle as cI,
178123
+ Rgb as cJ,
178124
+ rgbConvert as cK,
178125
+ define as cL,
178126
+ extend$2 as cM,
178127
+ Color as cN,
178128
+ nogamma as cO,
178129
+ hue as cP,
178130
+ dayjs2 as cQ,
178131
+ setToString as cR,
178132
+ overRest as cS,
178133
+ baseFor as cT,
178134
+ baseAssignValue as cU,
178135
+ baseUnary as cV,
178136
+ merge$1 as cW,
178137
+ isObjectLike as cX,
178138
+ baseGetTag as cY,
178139
+ Symbol$1 as cZ,
178140
+ arrayLikeKeys as c_,
178141
+ getIconSVG as ca,
178142
+ registerIconPacks as cb,
178143
+ unknownIcon as cc,
178144
+ invoke as cd,
178145
+ listen as ce,
178146
+ reactDomExports as cf,
178147
+ Globe as cg,
178148
+ Popover as ch,
178149
+ PopoverTrigger as ci,
178150
+ PopoverContent as cj,
178151
+ Search as ck,
178152
+ Trash2 as cl,
178153
+ DropdownMenu as cm,
178154
+ DropdownMenuTrigger as cn,
178155
+ ChevronDown as co,
178156
+ DropdownMenuContent as cp,
178157
+ DropdownMenuItem as cq,
178158
+ TriangleAlert as cr,
178159
+ RotateCw as cs,
178160
+ isObject$1 as ct,
178161
+ isIterateeCall as cu,
178162
+ keysIn as cv,
178163
+ eq as cw,
178164
+ isArrayLike as cx,
178165
+ isArray as cy,
178166
+ identity as cz,
178167
+ foldInside as d,
178168
+ memoize as d0,
178169
+ isArguments as d1,
178170
+ copyObject as d2,
178171
+ getPrototype as d3,
178172
+ cloneArrayBuffer as d4,
178173
+ cloneTypedArray as d5,
178174
+ getTag as d6,
178175
+ nodeUtil as d7,
178176
+ copyArray as d8,
178177
+ isBuffer as d9,
178178
+ cloneBuffer as da,
178179
+ initCloneObject as db,
178180
+ Stack as dc,
178181
+ MapCache as dd,
178182
+ Uint8Array$1 as de,
178183
+ isTypedArray as df,
178184
+ isLength as dg,
178185
+ Set$1 as dh,
178186
+ createAssigner as di,
178187
+ isPrototype as dj,
178188
+ router as dk,
178189
+ ifNotIn as e,
178190
+ foldNodeProp as f,
178191
+ completeFromList as g,
178192
+ syntaxTree as h,
178193
+ indentNodeProp as i,
178194
+ NodeSet as j,
178195
+ NodeType as k,
178196
+ NodeProp as l,
178197
+ createLucideIcon as m,
178198
+ useQueryClient as n,
178199
+ useQuery as o,
178200
+ trpc as p,
178201
+ selectNeighbourBeforeRemove as q,
178202
+ ensureEdgeGroups as r,
177558
178203
  styleTags as s,
177559
- trpc as t,
177560
- useIsDesktop as u,
177561
- ifNotIn as v,
177562
- completeFromList as w,
177563
- syntaxTree as x,
177564
- NodeSet as y,
177565
- NodeType as z
178204
+ tags as t,
178205
+ useAdapter as u,
178206
+ attachEdgeGroupDragVisibility as v,
178207
+ registerInnerDockview as w,
178208
+ DockviewReact as x,
178209
+ Rows2 as y,
178210
+ Plus as z
177566
178211
  };