@band-app/server 0.16.9 → 0.17.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 (204) hide show
  1. package/dist/client/assets/DockviewBrowserContainer-B_oEene2.js +5 -0
  2. package/dist/client/assets/DockviewTerminalContainer-CfQMvR_k.js +2 -0
  3. package/dist/client/assets/TerminalPanel-DxZK0ClB.js +5 -0
  4. package/dist/client/assets/{_basePickBy-uVqvgsJc.js → _basePickBy-Ct-e0Qqq.js} +1 -1
  5. package/dist/client/assets/{_baseUniq-7i7L1uNE.js → _baseUniq-CxKOXF1k.js} +1 -1
  6. package/dist/client/assets/arc-CKSDLbJ_.js +1 -0
  7. package/dist/client/assets/architectureDiagram-VXUJARFQ-DX7YfptV.js +36 -0
  8. package/dist/client/assets/{blockDiagram-VD42YOAC-CXQSSz3O.js → blockDiagram-VD42YOAC-CsuIx-c9.js} +5 -5
  9. package/dist/client/assets/{c4Diagram-YG6GDRKO-DplRXCR2.js → c4Diagram-YG6GDRKO-DychwT1W.js} +3 -3
  10. package/dist/client/assets/channel-B-u6m7I1.js +1 -0
  11. package/dist/client/assets/chunk-4BX2VUAB-loz8MPPD.js +1 -0
  12. package/dist/client/assets/chunk-55IACEB6-D29ChrqC.js +1 -0
  13. package/dist/client/assets/{chunk-B4BG7PRW-DlN9tUxh.js → chunk-B4BG7PRW-DKCONMEK.js} +6 -6
  14. package/dist/client/assets/{chunk-DI55MBZ5-a11zyhq4.js → chunk-DI55MBZ5-D5zzjeE8.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-aGGVV1yn.js → chunk-FMBD7UC4-D1xESdhD.js} +1 -1
  16. package/dist/client/assets/chunk-QN33PNHL-DXisPMUT.js +1 -0
  17. package/dist/client/assets/chunk-QZHKN3VN-Ch8ZVx4Y.js +1 -0
  18. package/dist/client/assets/chunk-TZMSLE5B-GuM5n4Rs.js +1 -0
  19. package/dist/client/assets/classDiagram-2ON5EDUG-ZLOOfEOW.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-WZHVMYZB-ZLOOfEOW.js +1 -0
  21. package/dist/client/assets/clone-CDLv4lRU.js +1 -0
  22. package/dist/client/assets/cose-bilkent-S5V4N54A-Cf0f3nH9.js +1 -0
  23. package/dist/client/assets/dagre-6UL2VRFP-BEjucV14.js +4 -0
  24. package/dist/client/assets/diagram-PSM6KHXK-4UTMLb3J.js +24 -0
  25. package/dist/client/assets/diagram-QEK2KX5R-B9rhi9zE.js +43 -0
  26. package/dist/client/assets/diagram-S2PKOQOG-CS7F4WJO.js +24 -0
  27. package/dist/client/assets/{erDiagram-Q2GNP2WA-kUd-gmjz.js → erDiagram-Q2GNP2WA-D-EqIR9o.js} +4 -4
  28. package/dist/client/assets/{flowDiagram-NV44I4VS-CHbLqCKB.js → flowDiagram-NV44I4VS-_GH1A_sS.js} +5 -5
  29. package/dist/client/assets/ganttDiagram-JELNMOA3-Dtb6N1ze.js +267 -0
  30. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-B_QsP5ak.js +65 -0
  31. package/dist/client/assets/{graph-CSi_akmB.js → graph-H6OCDpse.js} +1 -1
  32. package/dist/client/assets/highlighted-body-B3W2YXNL-Pz2rshlt.js +1 -0
  33. package/dist/client/assets/index-B-KsZlI_.js +1 -0
  34. package/dist/client/assets/{index-udv0M-ix.js → index-BCbe81ki.js} +2 -2
  35. package/dist/client/assets/index-BOdifnXB.js +1 -0
  36. package/dist/client/assets/{index-BPf6S9f1.js → index-BQW7Zpk7.js} +1 -1
  37. package/dist/client/assets/index-BX_7-t5E.js +1 -0
  38. package/dist/client/assets/{index-B0ZcEU4c.js → index-BktK8Iwc.js} +1 -1
  39. package/dist/client/assets/{index-C-6dsPog.js → index-BtEs1oEp.js} +1 -1
  40. package/dist/client/assets/{index-T_1b5WRg.js → index-BtajlvkF.js} +1 -1
  41. package/dist/client/assets/{index-CNQHGhCu.js → index-Bx3rRbZG.js} +1 -1
  42. package/dist/client/assets/{index-DfHcm4JM.js → index-C6MgAn1q.js} +1 -1
  43. package/dist/client/assets/{index-C4ee_PQ0.js → index-CzCjpAqZ.js} +5 -5
  44. package/dist/client/assets/{index-oolizINO.js → index-DQAckahj.js} +1 -1
  45. package/dist/client/assets/index-DaRnNd02.js +7 -0
  46. package/dist/client/assets/{index-BJP1qdPz.js → index-Im7rGMYn.js} +1 -1
  47. package/dist/client/assets/{index-CA1NuCd_.js → index-WmGuuT8Z.js} +1 -1
  48. package/dist/client/assets/{index-C-3PAt1d.js → index-aTt3zXBv.js} +1 -1
  49. package/dist/client/assets/{index-5X7JRvnK.js → index-nPplcWzt.js} +1 -1
  50. package/dist/client/assets/{index-spwNnd85.js → index-vaGaAlmP.js} +1 -1
  51. package/dist/client/assets/infoDiagram-HS3SLOUP-Dp2iuUeA.js +2 -0
  52. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-DIY8FE8Z.js → journeyDiagram-XKPGCS4Q-BaVzrE3V.js} +3 -3
  53. package/dist/client/assets/{kanban-definition-3W4ZIXB7-Cd_JJ8FN.js → kanban-definition-3W4ZIXB7-DdbWsnm7.js} +8 -8
  54. package/dist/client/assets/{layout-Bhb5FQCr.js → layout-vxWf40Ht.js} +1 -1
  55. package/dist/client/assets/{linear-Cmk2RyH_.js → linear-BstrgKy8.js} +1 -1
  56. package/dist/client/assets/{main-BlRcPsmZ.js → main-DRq9Axai.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-CAEEMYhK.js} +3 -3
  59. package/dist/client/assets/pieDiagram-ADFJNKIX-DCNv4UlO.js +30 -0
  60. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-DHBoMUCQ.js → quadrantDiagram-AYHSOK5B-BeP4t0hp.js} +2 -2
  61. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-DjS5RONh.js → requirementDiagram-UZGBJVZJ-CAdiLb_M.js} +2 -2
  62. package/dist/client/assets/sankeyDiagram-TZEHDZUN-DW9xKT5Y.js +10 -0
  63. package/dist/client/assets/{sequenceDiagram-WL72ISMW-CzqbRfb_.js → sequenceDiagram-WL72ISMW-D9y8fK_R.js} +1 -1
  64. package/dist/client/assets/{square-terminal-CNHJa6OY.js → square-terminal-VjG9-RoZ.js} +1 -1
  65. package/dist/client/assets/stateDiagram-FKZM4ZOC-QYuyBeVm.js +1 -0
  66. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-VVONI0Hb.js +1 -0
  67. package/dist/client/assets/{timeline-definition-IT6M3QCI-CNKMKDwq.js → timeline-definition-IT6M3QCI-Ci_SXZdO.js} +4 -4
  68. package/dist/client/assets/{treemap-GDKQZRPO-DCEPrZh7.js → treemap-GDKQZRPO-fDacl-jS.js} +1 -1
  69. package/dist/client/assets/workspace._workspaceId-C9BVWo6-.js +2 -0
  70. package/dist/client/assets/workspace._workspaceId-CMlw9wn8.js +1 -0
  71. package/dist/client/assets/{xychartDiagram-PRI3JC2R-Cr18I3A3.js → xychartDiagram-PRI3JC2R-rRpBADcB.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/openapi.json +414 -4
  75. package/dist/server/assets/{DockviewBrowserContainer-Bm7ARaqd.js → DockviewBrowserContainer-BAe7TLKD.js} +42 -22
  76. package/dist/server/assets/{DockviewTerminalContainer-BbMZgBJ8.js → DockviewTerminalContainer-CC7i0yMZ.js} +44 -24
  77. package/dist/server/assets/{TerminalPanel-BmhYCf33.js → TerminalPanel-gBh8VBn0.js} +1 -1
  78. package/dist/server/assets/{_basePickBy-C7CNOUDi.js → _basePickBy-CTks6QXq.js} +2 -2
  79. package/dist/server/assets/{_baseUniq-DeF47vVO.js → _baseUniq-BJI4qneQ.js} +1 -1
  80. package/dist/server/assets/_tanstack-start-manifest_v-CfuSyuIp.js +4 -0
  81. package/dist/server/assets/{arc-P5FY7IYH.js → arc-Fdc_l0PB.js} +1 -1
  82. package/dist/server/assets/{architecture-7HQA4BMR-LvprLHYS.js → architecture-7HQA4BMR-CfPXboDr.js} +6 -6
  83. package/dist/server/assets/{architectureDiagram-VXUJARFQ-Br4iiUzH.js → architectureDiagram-VXUJARFQ-D6UEkzy_.js} +6 -6
  84. package/dist/server/assets/{blockDiagram-VD42YOAC-BahODDhX.js → blockDiagram-VD42YOAC-BvasIENt.js} +6 -6
  85. package/dist/server/assets/{c4Diagram-YG6GDRKO-CQcZX6cr.js → c4Diagram-YG6GDRKO-MW5H9zoJ.js} +2 -2
  86. package/dist/server/assets/{channel-BmAB_ZKU.js → channel-XhTiPor2.js} +1 -1
  87. package/dist/server/assets/{chunk-4BX2VUAB-YUvszr4w.js → chunk-4BX2VUAB-C6POw9HJ.js} +1 -1
  88. package/dist/server/assets/{chunk-55IACEB6-BUgBPiJd.js → chunk-55IACEB6-BZ0x-UQb.js} +1 -1
  89. package/dist/server/assets/{chunk-B4BG7PRW-BxuWeZlV.js → chunk-B4BG7PRW-BAYqNQHL.js} +4 -4
  90. package/dist/server/assets/{chunk-DI55MBZ5-DuGkdvte.js → chunk-DI55MBZ5-DbsR50vR.js} +3 -3
  91. package/dist/server/assets/{chunk-FMBD7UC4-qY-BVG34.js → chunk-FMBD7UC4-D_KXTL87.js} +1 -1
  92. package/dist/server/assets/{chunk-QN33PNHL-BM_oi8-e.js → chunk-QN33PNHL-RXXHu7T0.js} +1 -1
  93. package/dist/server/assets/{chunk-QZHKN3VN-BL6_-at8.js → chunk-QZHKN3VN-5QE6weTd.js} +1 -1
  94. package/dist/server/assets/{chunk-TZMSLE5B-38NhX5at.js → chunk-TZMSLE5B-HlRXkCDZ.js} +1 -1
  95. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-CwIsZ53p.js → classDiagram-2ON5EDUG-B90fR_EV.js} +5 -5
  96. package/dist/server/assets/{classDiagram-2ON5EDUG-CwIsZ53p.js → classDiagram-v2-WZHVMYZB-B90fR_EV.js} +5 -5
  97. package/dist/server/assets/{clone-BXHuGM8i.js → clone-Bjcb6OQr.js} +1 -1
  98. package/dist/server/assets/{cose-bilkent-S5V4N54A-D1CdgGvI.js → cose-bilkent-S5V4N54A-BgnWrjAl.js} +1 -1
  99. package/dist/server/assets/{dagre-6UL2VRFP-UMvdMLG3.js → dagre-6UL2VRFP-LfRXD26Q.js} +6 -6
  100. package/dist/server/assets/{diagram-PSM6KHXK-DtOD93m7.js → diagram-PSM6KHXK-DLrJ9Eja.js} +7 -7
  101. package/dist/server/assets/{diagram-QEK2KX5R-DViyYq-y.js → diagram-QEK2KX5R-atbHIh96.js} +6 -6
  102. package/dist/server/assets/{diagram-S2PKOQOG-C42mRVEn.js → diagram-S2PKOQOG-BnxctnIJ.js} +6 -6
  103. package/dist/server/assets/{erDiagram-Q2GNP2WA-D14z9IvB.js → erDiagram-Q2GNP2WA-Ct1zXovC.js} +4 -4
  104. package/dist/server/assets/{flowDiagram-NV44I4VS-BYBNOZwM.js → flowDiagram-NV44I4VS-DtWHb6Ay.js} +5 -5
  105. package/dist/server/assets/{ganttDiagram-JELNMOA3-CaG3uoK-.js → ganttDiagram-JELNMOA3-CySyldy4.js} +2 -2
  106. package/dist/server/assets/{gitGraph-G5XIXVHT-Dsx3dV0R.js → gitGraph-G5XIXVHT-DFo7FJzL.js} +6 -6
  107. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-CrSfx7b3.js → gitGraphDiagram-V2S2FVAM-DvT5EUG7.js} +7 -7
  108. package/dist/server/assets/{graph-gBFInK6H.js → graph-B5XlkLf_.js} +2 -2
  109. package/dist/server/assets/{highlighted-body-B3W2YXNL-DjTWk17l.js → highlighted-body-B3W2YXNL-CLJWhRU_.js} +1 -1
  110. package/dist/server/assets/{index-C3N_Nx6h.js → index--4MijjkY.js} +2 -2
  111. package/dist/server/assets/{index-C245EJn1.js → index-4SOjxyuO.js} +2 -2
  112. package/dist/server/assets/{index-3wtbr7va.js → index-BQ5LDgRA.js} +3 -3
  113. package/dist/server/assets/{index-CD97pPmc.js → index-BanzNq86.js} +1 -1
  114. package/dist/server/assets/{index-2gWBdIrR.js → index-BvJzvUfR.js} +2 -2
  115. package/dist/server/assets/{index-B84Urg23.js → index-C2GzB22l.js} +2 -2
  116. package/dist/server/assets/{index-QxgXX0fb.js → index-CAJcSCqE.js} +2 -2
  117. package/dist/server/assets/{index-Bs6a6-xI.js → index-CLUle2oh.js} +5 -5
  118. package/dist/server/assets/{index-5N2Gh0ba.js → index-CMO4FLK_.js} +2 -2
  119. package/dist/server/assets/{index-6Zof9vm8.js → index-CXMNOcuN.js} +1 -1
  120. package/dist/server/assets/{index-Dv-16VYI.js → index-CXmMBSCL.js} +2 -2
  121. package/dist/server/assets/{index-DXgP0Lsu.js → index-CdgmRfZg.js} +2 -2
  122. package/dist/server/assets/{index-CwQ5qWPC.js → index-DJ8A5E65.js} +5 -5
  123. package/dist/server/assets/{index-DZZ6NiTf.js → index-DjySh3G7.js} +3 -3
  124. package/dist/server/assets/{index-Bd5jTryJ.js → index-DuXjusjn.js} +2 -2
  125. package/dist/server/assets/{index-DsGPaWHg.js → index-QiPzMfSX.js} +2 -2
  126. package/dist/server/assets/{index-Bw42FDwO.js → index-SuLB6TaE.js} +2 -2
  127. package/dist/server/assets/{index-egmIrLx2.js → index-bmq-aMYV.js} +4 -4
  128. package/dist/server/assets/{info-VBDWY6EO-CueOsYFZ.js → info-VBDWY6EO-CW57QiJi.js} +6 -6
  129. package/dist/server/assets/{infoDiagram-HS3SLOUP-CeyMzohL.js → infoDiagram-HS3SLOUP-D_Zdx-MM.js} +5 -5
  130. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-ANqeM_TM.js → journeyDiagram-XKPGCS4Q-BcO9qzr2.js} +4 -4
  131. package/dist/server/assets/{kanban-definition-3W4ZIXB7-B0RkH45q.js → kanban-definition-3W4ZIXB7-BatZ7RKG.js} +2 -2
  132. package/dist/server/assets/{layout-JjP5jdu6.js → layout-Cwuj9CwZ.js} +4 -4
  133. package/dist/server/assets/{linear-BJgoq5J4.js → linear-CP3xC85V.js} +1 -1
  134. package/dist/server/assets/{mermaid-3ZIDBTTL-CFPuUseQ.js → mermaid-3ZIDBTTL-BZm8jQDo.js} +1 -1
  135. package/dist/server/assets/{mermaid-parser.core-CKKZ1VFr.js → mermaid-parser.core-Cx17C8XR.js} +11 -11
  136. package/dist/server/assets/{mindmap-definition-VGOIOE7T-DlEXF5z8.js → mindmap-definition-VGOIOE7T-CpzqFomk.js} +3 -3
  137. package/dist/server/assets/{packet-DYOGHKS2-CvyxHTRM.js → packet-DYOGHKS2-x3ihoqUO.js} +6 -6
  138. package/dist/server/assets/{pie-VRWISCQL-DfpVZlpC.js → pie-VRWISCQL-DsMBDe8r.js} +6 -6
  139. package/dist/server/assets/{pieDiagram-ADFJNKIX-CWkrHsNk.js → pieDiagram-ADFJNKIX-DI4Hh6KE.js} +7 -7
  140. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-C25p2xz7.js → quadrantDiagram-AYHSOK5B-Cqc_vrUG.js} +2 -2
  141. package/dist/server/assets/{radar-ZZBFDIW7-DWqPsDMi.js → radar-ZZBFDIW7-CqwCJm3D.js} +6 -6
  142. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-ACRVXQGO.js → requirementDiagram-UZGBJVZJ-96ab-40P.js} +3 -3
  143. package/dist/server/assets/{router-GhGSLKfP.js → router-CYNdQEN4.js} +1116 -579
  144. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-uzNSHudY.js → sankeyDiagram-TZEHDZUN-Bux2-BQd.js} +1 -1
  145. package/dist/server/assets/{sequenceDiagram-WL72ISMW-C_wFtq8b.js → sequenceDiagram-WL72ISMW-CFKyfvmC.js} +3 -3
  146. package/dist/server/assets/{square-terminal-cghvb5Il.js → square-terminal-gVSeBp7-.js} +1 -1
  147. package/dist/server/assets/{stateDiagram-FKZM4ZOC-B9MGwsuS.js → stateDiagram-FKZM4ZOC-DGZQd18J.js} +8 -8
  148. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-CLHd8oUa.js → stateDiagram-v2-4FDKWEC3-DJXeLDOB.js} +4 -4
  149. package/dist/server/assets/{timeline-definition-IT6M3QCI-CqKot5RT.js → timeline-definition-IT6M3QCI-DzTJZPN5.js} +2 -2
  150. package/dist/server/assets/{treemap-GDKQZRPO-mMRojqRQ.js → treemap-GDKQZRPO-CD9jkQrA.js} +6 -6
  151. package/dist/server/assets/workspace._workspaceId-ClAAZ5aq.js +23 -0
  152. package/dist/server/assets/{workspace._workspaceId-DwsRTXCg.js → workspace._workspaceId-DT6Kz8RH.js} +125 -97
  153. package/dist/server/assets/{xychartDiagram-PRI3JC2R-j8PckQEj.js → xychartDiagram-PRI3JC2R-ByA0_p8p.js} +2 -2
  154. package/dist/server/server.js +2 -2
  155. package/dist/start-server.mjs +489 -242
  156. package/package.json +4 -4
  157. package/dist/client/assets/DockviewBrowserContainer-CCBAkU1p.js +0 -5
  158. package/dist/client/assets/DockviewTerminalContainer-B9hdDoMz.js +0 -2
  159. package/dist/client/assets/TerminalPanel-BKfWmj6W.js +0 -5
  160. package/dist/client/assets/arc-DiYEQGs3.js +0 -1
  161. package/dist/client/assets/architectureDiagram-VXUJARFQ-C5z8L1iK.js +0 -36
  162. package/dist/client/assets/channel-BnMJuhcI.js +0 -1
  163. package/dist/client/assets/chunk-4BX2VUAB-B4Mk_d7A.js +0 -1
  164. package/dist/client/assets/chunk-55IACEB6-B0hf8Eje.js +0 -1
  165. package/dist/client/assets/chunk-QN33PNHL-Dit4S-yJ.js +0 -1
  166. package/dist/client/assets/chunk-QZHKN3VN-L-h1VSi0.js +0 -1
  167. package/dist/client/assets/chunk-TZMSLE5B-DpK-hWaC.js +0 -1
  168. package/dist/client/assets/classDiagram-2ON5EDUG-D89oCSXI.js +0 -1
  169. package/dist/client/assets/classDiagram-v2-WZHVMYZB-D89oCSXI.js +0 -1
  170. package/dist/client/assets/clone-X7FA7kE2.js +0 -1
  171. package/dist/client/assets/cose-bilkent-S5V4N54A-CzoIK-3W.js +0 -1
  172. package/dist/client/assets/dagre-6UL2VRFP-BhfXeb7k.js +0 -4
  173. package/dist/client/assets/diagram-PSM6KHXK-BwFVwR1b.js +0 -24
  174. package/dist/client/assets/diagram-QEK2KX5R-BO-CEopy.js +0 -43
  175. package/dist/client/assets/diagram-S2PKOQOG-BxiH83lN.js +0 -24
  176. package/dist/client/assets/ganttDiagram-JELNMOA3-B7gBcAFl.js +0 -267
  177. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-gca_jqKQ.js +0 -65
  178. package/dist/client/assets/highlighted-body-B3W2YXNL-C2a-lsk8.js +0 -1
  179. package/dist/client/assets/index-2F-slvqo.js +0 -1
  180. package/dist/client/assets/index-C4PISrIW.js +0 -1
  181. package/dist/client/assets/index-CiKTedrx.js +0 -1
  182. package/dist/client/assets/index-DNrK0iIn.js +0 -7
  183. package/dist/client/assets/infoDiagram-HS3SLOUP-BK3MmhkJ.js +0 -2
  184. package/dist/client/assets/main-BLOY6Nam.css +0 -1
  185. package/dist/client/assets/pieDiagram-ADFJNKIX-CYoHsaM9.js +0 -30
  186. package/dist/client/assets/sankeyDiagram-TZEHDZUN-DmhEbBY-.js +0 -10
  187. package/dist/client/assets/stateDiagram-FKZM4ZOC-CafvdTb3.js +0 -1
  188. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BkKHK-CQ.js +0 -1
  189. package/dist/client/assets/useSessionListContext-xer-Wcmf.js +0 -1
  190. package/dist/client/assets/workspace._workspaceId-CgG1n_1x.js +0 -1
  191. package/dist/client/assets/workspace._workspaceId.changes-BKX7lUhX.js +0 -1
  192. package/dist/client/assets/workspace._workspaceId.code-BcnxRdZi.js +0 -1
  193. package/dist/client/assets/workspace._workspaceId.code._-BbOt6tOD.js +0 -1
  194. package/dist/client/assets/workspace._workspaceId.code.index-DC2535x-.js +0 -1
  195. package/dist/client/assets/workspace._workspaceId.index-CNjq1nDf.js +0 -1
  196. package/dist/client/assets/workspace._workspaceId.terminal-DhYn8I5t.js +0 -2
  197. package/dist/server/assets/_tanstack-start-manifest_v-BNCQ-izx.js +0 -4
  198. package/dist/server/assets/useSessionListContext-D_vX6E2e.js +0 -23
  199. package/dist/server/assets/workspace._workspaceId.changes-C6vwSbUh.js +0 -38
  200. package/dist/server/assets/workspace._workspaceId.code-Cuj0zH98.js +0 -12
  201. package/dist/server/assets/workspace._workspaceId.code._-BJdg1-Gs.js +0 -44
  202. package/dist/server/assets/workspace._workspaceId.code.index-CE_CMD_I.js +0 -36
  203. package/dist/server/assets/workspace._workspaceId.index-BPhXMwl8.js +0 -112
  204. 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-CAJcSCqE.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-CAJcSCqE.js").then((m2) => m2.javascript({ jsx: true }));
40506
40516
  case "typescript":
40507
- return import("./index-QxgXX0fb.js").then(
40517
+ return import("./index-CAJcSCqE.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-CAJcSCqE.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-QiPzMfSX.js").then((m2) => m2.python());
40516
40526
  case "html":
40517
- return import("./index-egmIrLx2.js").then((m2) => m2.html());
40527
+ return import("./index-bmq-aMYV.js").then((m2) => m2.html());
40518
40528
  case "css":
40519
- return import("./index-C245EJn1.js").then((m2) => m2.css());
40529
+ return import("./index-4SOjxyuO.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-BQ5LDgRA.js").then((m2) => m2.sass());
40523
40533
  case "less":
40524
- return import("./index-DZZ6NiTf.js").then((m2) => m2.less());
40534
+ return import("./index-DjySh3G7.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-CdgmRfZg.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-CLUle2oh.js").then((m2) => m2.markdown());
40531
40541
  case "xml":
40532
- return import("./index-5N2Gh0ba.js").then((m2) => m2.xml());
40542
+ return import("./index-CMO4FLK_.js").then((m2) => m2.xml());
40533
40543
  case "yaml":
40534
- return import("./index-Bw42FDwO.js").then((m2) => m2.yaml());
40544
+ return import("./index-SuLB6TaE.js").then((m2) => m2.yaml());
40535
40545
  case "sql":
40536
- return import("./index-Dv-16VYI.js").then((m2) => m2.sql());
40546
+ return import("./index-CXmMBSCL.js").then((m2) => m2.sql());
40537
40547
  case "rust":
40538
- return import("./index-C3N_Nx6h.js").then((m2) => m2.rust());
40548
+ return import("./index--4MijjkY.js").then((m2) => m2.rust());
40539
40549
  case "go":
40540
- return import("./index-B84Urg23.js").then((m2) => m2.go());
40550
+ return import("./index-C2GzB22l.js").then((m2) => m2.go());
40541
40551
  case "java":
40542
- return import("./index-Bd5jTryJ.js").then((m2) => m2.java());
40552
+ return import("./index-DuXjusjn.js").then((m2) => m2.java());
40543
40553
  case "kotlin":
40544
- return import("./index-Bd5jTryJ.js").then((m2) => m2.java());
40554
+ return import("./index-DuXjusjn.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-BvJzvUfR.js").then((m2) => m2.cpp());
40548
40558
  case "php":
40549
- return import("./index-CwQ5qWPC.js").then((m2) => m2.php());
40559
+ return import("./index-DJ8A5E65.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),
@@ -41928,6 +41938,7 @@ function useLabelFilter() {
41928
41938
  }, []);
41929
41939
  return [value, setLabelFilter];
41930
41940
  }
41941
+ const EMPTY_PROJECTS = Object.freeze([]);
41931
41942
  function useProjects() {
41932
41943
  const adapter2 = useAdapter();
41933
41944
  const { data, isLoading, error } = useQuery({
@@ -41936,7 +41947,7 @@ function useProjects() {
41936
41947
  refetchInterval: 3e4
41937
41948
  });
41938
41949
  return {
41939
- projects: data ?? [],
41950
+ projects: data ?? EMPTY_PROJECTS,
41940
41951
  isLoading,
41941
41952
  error: error ? String(error) : null
41942
41953
  };
@@ -46654,6 +46665,11 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46654
46665
  // "currently-active link in a list of related links".
46655
46666
  "data-active": isActive || void 0,
46656
46667
  "aria-current": isActive ? "page" : void 0,
46668
+ // Stable test hook keyed by workspaceId so integration tests can right-
46669
+ // click the specific card (issue #508). Branches with `/` in them are
46670
+ // collapsed to `-` by `toWorkspaceId` so the attribute value matches
46671
+ // the canonical workspace id used everywhere else in the UI.
46672
+ "data-testid": `project-list__workspace-card--${workspaceId}`,
46657
46673
  onClick: (e2) => {
46658
46674
  e2.stopPropagation();
46659
46675
  handleClick();
@@ -53702,6 +53718,7 @@ function storeViewMode(mode) {
53702
53718
  }
53703
53719
  const UNCOMMITTED_VALUE = "__uncommitted__";
53704
53720
  const EXPAND_ALL_KEY = "band:diff-expand-all";
53721
+ const MAX_MOUNTED_EDITORS = 50;
53705
53722
  function getStoredExpandAll() {
53706
53723
  try {
53707
53724
  return localStorage.getItem(EXPAND_ALL_KEY) === "true";
@@ -54055,6 +54072,8 @@ function LazyFileRow({
54055
54072
  isOpen,
54056
54073
  isActive,
54057
54074
  scrollContainerEl,
54075
+ isMountedAllowed,
54076
+ onRowVisible,
54058
54077
  onToggle,
54059
54078
  onLoadMoreContext,
54060
54079
  onShowFullFile,
@@ -54067,7 +54086,8 @@ function LazyFileRow({
54067
54086
  const [revertDialogOpen, setRevertDialogOpen] = reactExports.useState(false);
54068
54087
  const containerRef = reactExports.useRef(null);
54069
54088
  const diffBodyRef = reactExports.useRef(null);
54070
- const [shouldMount, setShouldMount] = reactExports.useState(false);
54089
+ const [everMounted, setEverMounted] = reactExports.useState(false);
54090
+ const shouldRender = everMounted && isMountedAllowed;
54071
54091
  const [editorRendered, setEditorRendered] = reactExports.useState(false);
54072
54092
  const editorRenderRafRef = reactExports.useRef(null);
54073
54093
  reactExports.useEffect(() => {
@@ -54078,9 +54098,11 @@ function LazyFileRow({
54078
54098
  }
54079
54099
  };
54080
54100
  }, []);
54101
+ const onRowVisibleRef = reactExports.useRef(onRowVisible);
54102
+ onRowVisibleRef.current = onRowVisible;
54081
54103
  reactExports.useEffect(() => {
54082
54104
  if (!isOpen) {
54083
- setShouldMount(false);
54105
+ setEverMounted(false);
54084
54106
  return;
54085
54107
  }
54086
54108
  const el = containerRef.current;
@@ -54092,7 +54114,10 @@ function LazyFileRow({
54092
54114
  if (!entry) return;
54093
54115
  const root2 = entry.rootBounds;
54094
54116
  if (root2 && root2.width === 0 && root2.height === 0) return;
54095
- setShouldMount(entry.isIntersecting);
54117
+ if (entry.isIntersecting) {
54118
+ setEverMounted(true);
54119
+ onRowVisibleRef.current(filename);
54120
+ }
54096
54121
  },
54097
54122
  {
54098
54123
  root: scrollContainerEl,
@@ -54105,9 +54130,9 @@ function LazyFileRow({
54105
54130
  );
54106
54131
  observer.observe(el);
54107
54132
  return () => observer.disconnect();
54108
- }, [isOpen, scrollContainerEl]);
54133
+ }, [isOpen, scrollContainerEl, filename]);
54109
54134
  reactExports.useEffect(() => {
54110
- if (!shouldMount || !editorRendered || !onMeasureHeight) return;
54135
+ if (!shouldRender || !editorRendered || !onMeasureHeight) return;
54111
54136
  const el = diffBodyRef.current;
54112
54137
  if (!el) return;
54113
54138
  if (typeof ResizeObserver === "undefined") return;
@@ -54132,7 +54157,7 @@ function LazyFileRow({
54132
54157
  if (frame2 != null) cancelAnimationFrame(frame2);
54133
54158
  observer.disconnect();
54134
54159
  };
54135
- }, [shouldMount, editorRendered, filename, onMeasureHeight]);
54160
+ }, [shouldRender, editorRendered, filename, onMeasureHeight]);
54136
54161
  const handleEditorViews = reactExports.useCallback(
54137
54162
  (views) => {
54138
54163
  onEditorViews?.(filename, views);
@@ -54152,11 +54177,11 @@ function LazyFileRow({
54152
54177
  [filename, onEditorViews]
54153
54178
  );
54154
54179
  reactExports.useEffect(() => {
54155
- if (!isOpen || !shouldMount) return;
54180
+ if (!isOpen || !shouldRender) return;
54156
54181
  return () => {
54157
54182
  onEditorViews?.(filename, []);
54158
54183
  };
54159
- }, [isOpen, shouldMount, filename, onEditorViews]);
54184
+ }, [isOpen, shouldRender, filename, onEditorViews]);
54160
54185
  const toggle = reactExports.useCallback(() => {
54161
54186
  onToggle(filename);
54162
54187
  }, [filename, onToggle]);
@@ -54183,6 +54208,7 @@ function LazyFileRow({
54183
54208
  {
54184
54209
  type: "button",
54185
54210
  onClick: toggle,
54211
+ "data-testid": "diff-view__file-row-toggle",
54186
54212
  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
54213
  children: [
54188
54214
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -54286,26 +54312,39 @@ function LazyFileRow({
54286
54312
  ),
54287
54313
  isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border/20 bg-muted/30", children: [
54288
54314
  diffError && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-4 text-sm text-destructive", children: diffError }),
54289
- diff2 !== null && (shouldMount ? (
54315
+ diff2 !== null && (shouldRender ? (
54290
54316
  // Wrapper is observed by the ResizeObserver in the effect
54291
54317
  // above. Its rendered height — "Show full file" bar plus the
54292
54318
  // CodeMirror editor — is reported back as
54293
54319
  // `measuredHeight`, then reused verbatim as the placeholder
54294
- // height on the next unmount cycle.
54320
+ // height on the next unmount cycle (a never-visited row or
54321
+ // an LRU-evicted one).
54295
54322
  //
54296
54323
  // 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.
54324
+ // window between (a) `shouldRender` flipping to true and
54325
+ // (b) the editor's async `setup` finishing (loadLanguage
54326
+ // await + new MergeView() + first paint). Without it the
54327
+ // wrapper is empty-auto-height for that window, collapsing
54328
+ // the row to the "Show full file" bar (~30px) and pushing
54329
+ // every row below it upward; when the editor paints they
54330
+ // snap back down. We pin the wrapper to the
54331
+ // cached/estimated height (the same value the placeholder
54332
+ // uses) until `editorRendered` flips, then let the
54333
+ // editor's natural height take over. The ResizeObserver
54334
+ // only attaches once `editorRendered` is true (see deps
54335
+ // above), so the held value never bleeds into the
54336
+ // measuredHeight cache.
54337
+ //
54338
+ // Mount-once: once `shouldRender` flips true, it stays
54339
+ // true across scroll-aways. The editor's natural height
54340
+ // remains in the layout — the row stays the same size
54341
+ // whether the user is currently looking at it or
54342
+ // scrolled past — so there's no scroll-shift trade-off
54343
+ // to manage. The browser handles culling offscreen tiles
54344
+ // cheaply; the only thing that brings `shouldRender`
54345
+ // back to false is collapse / LRU eviction / target
54346
+ // change, all of which deliberately tear the editor
54347
+ // down.
54309
54348
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
54310
54349
  "div",
54311
54350
  {
@@ -54337,10 +54376,12 @@ function LazyFileRow({
54337
54376
  ) : (
54338
54377
  // Placeholder occupying the SAME pixel height the CodeMirror
54339
54378
  // 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.
54379
+ // change when LRU eviction tears the editor down (or while
54380
+ // a never-visited row waits for its first IO intersect).
54381
+ // Without this, switching the body between editor and
54382
+ // placeholder would push everything below upward
54383
+ // visually identical to a layout shift, even though no
54384
+ // content actually moved.
54344
54385
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { height: placeholderHeight } })
54345
54386
  ))
54346
54387
  ] })
@@ -54394,6 +54435,31 @@ function DiffView({
54394
54435
  const [expandedFiles, setExpandedFiles] = reactExports.useState(/* @__PURE__ */ new Set());
54395
54436
  const expandedFilesRef = reactExports.useRef(expandedFiles);
54396
54437
  expandedFilesRef.current = expandedFiles;
54438
+ const [mountedFiles, setMountedFiles] = reactExports.useState(() => /* @__PURE__ */ new Set());
54439
+ const mountRecencyRef = reactExports.useRef(/* @__PURE__ */ new Map());
54440
+ const recencyCounterRef = reactExports.useRef(0);
54441
+ const handleRowVisible = reactExports.useCallback((filename) => {
54442
+ recencyCounterRef.current += 1;
54443
+ mountRecencyRef.current.set(filename, recencyCounterRef.current);
54444
+ setMountedFiles((prev2) => {
54445
+ if (prev2.has(filename) && prev2.size <= MAX_MOUNTED_EDITORS) return prev2;
54446
+ const next2 = new Set(prev2);
54447
+ next2.add(filename);
54448
+ if (next2.size > MAX_MOUNTED_EDITORS) {
54449
+ let oldestFilename = null;
54450
+ let oldestRecency = Number.POSITIVE_INFINITY;
54451
+ for (const candidate of next2) {
54452
+ const r2 = mountRecencyRef.current.get(candidate) ?? 0;
54453
+ if (r2 < oldestRecency) {
54454
+ oldestRecency = r2;
54455
+ oldestFilename = candidate;
54456
+ }
54457
+ }
54458
+ if (oldestFilename !== null) next2.delete(oldestFilename);
54459
+ }
54460
+ return next2;
54461
+ });
54462
+ }, []);
54397
54463
  const prevFilenamesRef = reactExports.useRef(/* @__PURE__ */ new Set());
54398
54464
  const prevFingerprintRef = reactExports.useRef("");
54399
54465
  const [viewMode, setViewModeState] = reactExports.useState(getStoredViewMode);
@@ -54805,6 +54871,8 @@ function DiffView({
54805
54871
  summaryRef.current = null;
54806
54872
  setDiffCache(/* @__PURE__ */ new Map());
54807
54873
  setExpandedFiles(/* @__PURE__ */ new Set());
54874
+ setMountedFiles(/* @__PURE__ */ new Set());
54875
+ mountRecencyRef.current.clear();
54808
54876
  prevFilenamesRef.current = /* @__PURE__ */ new Set();
54809
54877
  prevFingerprintRef.current = "";
54810
54878
  const fetchSummary = (forceRefresh = false) => {
@@ -54983,6 +55051,23 @@ function DiffView({
54983
55051
  if (shouldDispatchFetch(diffCacheRef.current.get(n2))) fetchFileDiff(n2);
54984
55052
  }
54985
55053
  }, [filenames, expandAll, fetchFileDiff]);
55054
+ reactExports.useEffect(() => {
55055
+ const live = new Set(filenames);
55056
+ setMountedFiles((prev2) => {
55057
+ let changed = false;
55058
+ const next2 = new Set(prev2);
55059
+ for (const name2 of prev2) {
55060
+ if (!live.has(name2)) {
55061
+ next2.delete(name2);
55062
+ changed = true;
55063
+ }
55064
+ }
55065
+ return changed ? next2 : prev2;
55066
+ });
55067
+ for (const name2 of Array.from(mountRecencyRef.current.keys())) {
55068
+ if (!live.has(name2)) mountRecencyRef.current.delete(name2);
55069
+ }
55070
+ }, [filenames]);
54986
55071
  const focusedDiffEntry = focusedFile && diffCache.get(focusedFile.path);
54987
55072
  const focusedLineCounts = focusedDiffEntry ? focusedDiffEntry.lineCounts : null;
54988
55073
  const lastScrollRef = reactExports.useRef({
@@ -55334,42 +55419,52 @@ function DiffView({
55334
55419
  )
55335
55420
  }
55336
55421
  ),
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
- }) }) }),
55422
+ hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsx(
55423
+ "div",
55424
+ {
55425
+ ref: setScrollContainerNode,
55426
+ "data-testid": "diff-view__scroller",
55427
+ className: "min-h-0 flex-1 overflow-y-auto",
55428
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-3 p-3", children: filenames.map((filename, index2) => {
55429
+ const isLast = index2 === filenames.length - 1;
55430
+ const row2 = /* @__PURE__ */ jsxRuntimeExports.jsx(
55431
+ LazyFileRow,
55432
+ {
55433
+ filename,
55434
+ status: fileStatuses[filename],
55435
+ cacheEntry: diffCache.get(filename),
55436
+ viewMode: effectiveViewMode,
55437
+ isOpen: expandedFiles.has(filename),
55438
+ isActive: activeFile === filename,
55439
+ scrollContainerEl,
55440
+ isMountedAllowed: mountedFiles.has(filename),
55441
+ onRowVisible: handleRowVisible,
55442
+ onToggle: handleToggleFile,
55443
+ onLoadMoreContext: handleLoadMoreContext,
55444
+ onShowFullFile: handleShowFullFile,
55445
+ onOpenFile,
55446
+ onRevertFile: adapter2.revertFile ? handleRevertFile : void 0,
55447
+ onEditorViews: handleEditorViews,
55448
+ onMeasureHeight: handleMeasureHeight
55449
+ },
55450
+ filename
55451
+ );
55452
+ if (!isLast) return row2;
55453
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
55454
+ "div",
55455
+ {
55456
+ className: "flex flex-col",
55457
+ style: scrollContainerHeight > 0 ? { minHeight: scrollContainerHeight } : void 0,
55458
+ children: [
55459
+ row2,
55460
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "flex-1" })
55461
+ ]
55462
+ },
55463
+ `${filename}-last-wrapper`
55464
+ );
55465
+ }) })
55466
+ }
55467
+ ),
55373
55468
  gitOpStatus && /* @__PURE__ */ jsxRuntimeExports.jsxs(
55374
55469
  "div",
55375
55470
  {
@@ -64309,22 +64404,16 @@ class WebDashboardAdapter {
64309
64404
  });
64310
64405
  }
64311
64406
  }
64312
- const VALID_TAB_PREFIXES = ["/changes", "/code", "/terminal"];
64313
64407
  class WebCapabilities {
64314
64408
  copyPath = false;
64315
64409
  navigate;
64410
+ // The workspace URL no longer carries a sub-path for the active tab —
64411
+ // tab state lives entirely inside `MobileWorkspaceLayout`, and the
64412
+ // desktop dockview at AppShell renders every panel regardless of URL.
64413
+ // See issue #467 for the refactor that removed the `band-tab:` session
64414
+ // store and the `/changes` / `/code` / `/terminal` child routes.
64316
64415
  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;
64416
+ return `/workspace/${encodeURIComponent(workspaceId)}`;
64328
64417
  }
64329
64418
  async openUrl(url) {
64330
64419
  window.open(url, "_blank");
@@ -79943,6 +80032,101 @@ function applyMaximizedGroupToApi(api, desired) {
79943
80032
  if (next2.api.isMaximized()) return;
79944
80033
  next2.api.maximize();
79945
80034
  }
80035
+ const EDGE_GROUP_IDS$1 = {
80036
+ left: "edge-left",
80037
+ right: "edge-right",
80038
+ bottom: "edge-bottom"
80039
+ };
80040
+ function ensureEdgeGroups(api) {
80041
+ if (api.getEdgeGroup("top")) {
80042
+ try {
80043
+ api.removeEdgeGroup("top");
80044
+ } catch {
80045
+ }
80046
+ }
80047
+ for (const direction of Object.keys(EDGE_GROUP_IDS$1)) {
80048
+ const id28 = EDGE_GROUP_IDS$1[direction];
80049
+ if (!api.groups.some((g2) => g2.id === id28)) {
80050
+ try {
80051
+ api.addEdgeGroup(direction, { id: id28, collapsed: true });
80052
+ } catch {
80053
+ }
80054
+ }
80055
+ }
80056
+ refreshEdgeGroupVisibility(api, false);
80057
+ }
80058
+ function refreshEdgeGroupVisibility(api, forceVisible) {
80059
+ for (const direction of Object.keys(EDGE_GROUP_IDS$1)) {
80060
+ const id28 = EDGE_GROUP_IDS$1[direction];
80061
+ const group = api.groups.find((g2) => g2.id === id28);
80062
+ if (!group) continue;
80063
+ const isEmpty2 = group.panels.length === 0;
80064
+ try {
80065
+ api.setEdgeGroupVisible(direction, forceVisible || !isEmpty2);
80066
+ } catch {
80067
+ }
80068
+ }
80069
+ }
80070
+ const innerDockviewRegistrations = /* @__PURE__ */ new Set();
80071
+ function registerInnerDockview(containerEl, api) {
80072
+ const registration = { containerEl, api };
80073
+ innerDockviewRegistrations.add(registration);
80074
+ return () => {
80075
+ innerDockviewRegistrations.delete(registration);
80076
+ };
80077
+ }
80078
+ function findFocusedInnerDockview() {
80079
+ const active = document.activeElement;
80080
+ if (!active) return null;
80081
+ for (const reg of innerDockviewRegistrations) {
80082
+ if (reg.containerEl.contains(active)) {
80083
+ return reg.api;
80084
+ }
80085
+ }
80086
+ return null;
80087
+ }
80088
+ function toggleEdgeGroup(api, direction) {
80089
+ const id28 = EDGE_GROUP_IDS$1[direction];
80090
+ const group = api.groups.find((g2) => g2.id === id28);
80091
+ if (!group) return false;
80092
+ if (group.panels.length === 0) return false;
80093
+ try {
80094
+ if (group.api.isCollapsed()) group.api.expand();
80095
+ else group.api.collapse();
80096
+ } catch {
80097
+ return false;
80098
+ }
80099
+ return true;
80100
+ }
80101
+ function attachEdgeGroupDragVisibility(api) {
80102
+ let isDragging = false;
80103
+ const refresh = () => {
80104
+ refreshEdgeGroupVisibility(api, isDragging);
80105
+ };
80106
+ const startDrag = () => {
80107
+ isDragging = true;
80108
+ refresh();
80109
+ };
80110
+ const endDrag = () => {
80111
+ isDragging = false;
80112
+ refresh();
80113
+ };
80114
+ const d1 = api.onWillDragPanel(startDrag);
80115
+ const d2 = api.onWillDragGroup(startDrag);
80116
+ const d3 = api.onDidMovePanel(endDrag);
80117
+ const d4 = api.onDidRemovePanel(endDrag);
80118
+ const onDragEndNative = () => endDrag();
80119
+ document.addEventListener("drop", onDragEndNative, true);
80120
+ document.addEventListener("dragend", onDragEndNative, true);
80121
+ return () => {
80122
+ d1.dispose();
80123
+ d2.dispose();
80124
+ d3.dispose();
80125
+ d4.dispose();
80126
+ document.removeEventListener("drop", onDragEndNative, true);
80127
+ document.removeEventListener("dragend", onDragEndNative, true);
80128
+ };
80129
+ }
79946
80130
  function parseWorkspaceFromPath(pathname) {
79947
80131
  const match = pathname.match(/^\/workspace\/([^/]+)/);
79948
80132
  return match ? decodeURIComponent(match[1]) : null;
@@ -108159,7 +108343,7 @@ var tn = f$5("block", "before:content-[counter(line)]", "before:inline-block", "
108159
108343
  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
108344
  var Se$1 = reactExports.createContext({ code: "" }), de$2 = () => reactExports.useContext(Se$1);
108161
108345
  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 }) => {
108346
+ var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-CLJWhRU_.js").then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), rt = ({ code: e2, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
108163
108347
  let i2 = reactExports.useMemo(() => e2.replace(cn, ""), [e2]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i2.split(`
108164
108348
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i2]);
108165
108349
  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 +108665,7 @@ var Dt = ({ children: e2, className: t2, onDownload: o3, onError: n2 }) => {
108481
108665
  }, []), 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
108666
  };
108483
108667
  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]+)/;
108668
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-BZm8jQDo.js").then((e2) => ({ default: e2.Mermaid }))), Kn = /language-([^\s]+)/;
108485
108669
  function ke$1(e2, t2) {
108486
108670
  if (!(e2 != null && e2.position || t2 != null && t2.position)) return true;
108487
108671
  if (!(e2 != null && e2.position && (t2 != null && t2.position))) return false;
@@ -158283,12 +158467,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
158283
158467
  registerLayoutLoaders([
158284
158468
  {
158285
158469
  name: "dagre",
158286
- loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-UMvdMLG3.js"), "loader")
158470
+ loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-LfRXD26Q.js"), "loader")
158287
158471
  },
158288
158472
  ...[
158289
158473
  {
158290
158474
  name: "cose-bilkent",
158291
- loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-D1CdgGvI.js"), "loader")
158475
+ loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-BgnWrjAl.js"), "loader")
158292
158476
  }
158293
158477
  ]
158294
158478
  ]);
@@ -158727,7 +158911,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
158727
158911
  return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
158728
158912
  }, "detector");
158729
158913
  var loader = /* @__PURE__ */ __name(async () => {
158730
- const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CQcZX6cr.js");
158914
+ const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-MW5H9zoJ.js");
158731
158915
  return { id, diagram: diagram2 };
158732
158916
  }, "loader");
158733
158917
  var plugin = {
@@ -158744,7 +158928,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
158744
158928
  return /^\s*graph/.test(txt);
158745
158929
  }, "detector");
158746
158930
  var loader2 = /* @__PURE__ */ __name(async () => {
158747
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BYBNOZwM.js");
158931
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-DtWHb6Ay.js");
158748
158932
  return { id: id2, diagram: diagram2 };
158749
158933
  }, "loader");
158750
158934
  var plugin2 = {
@@ -158767,7 +158951,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
158767
158951
  return /^\s*flowchart/.test(txt);
158768
158952
  }, "detector");
158769
158953
  var loader3 = /* @__PURE__ */ __name(async () => {
158770
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BYBNOZwM.js");
158954
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-DtWHb6Ay.js");
158771
158955
  return { id: id3, diagram: diagram2 };
158772
158956
  }, "loader");
158773
158957
  var plugin3 = {
@@ -158781,7 +158965,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
158781
158965
  return /^\s*erDiagram/.test(txt);
158782
158966
  }, "detector");
158783
158967
  var loader4 = /* @__PURE__ */ __name(async () => {
158784
- const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-D14z9IvB.js");
158968
+ const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-Ct1zXovC.js");
158785
158969
  return { id: id4, diagram: diagram2 };
158786
158970
  }, "loader");
158787
158971
  var plugin4 = {
@@ -158795,7 +158979,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
158795
158979
  return /^\s*gitGraph/.test(txt);
158796
158980
  }, "detector");
158797
158981
  var loader5 = /* @__PURE__ */ __name(async () => {
158798
- const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-CrSfx7b3.js");
158982
+ const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-DvT5EUG7.js");
158799
158983
  return { id: id5, diagram: diagram2 };
158800
158984
  }, "loader");
158801
158985
  var plugin5 = {
@@ -158809,7 +158993,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
158809
158993
  return /^\s*gantt/.test(txt);
158810
158994
  }, "detector");
158811
158995
  var loader6 = /* @__PURE__ */ __name(async () => {
158812
- const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-CaG3uoK-.js");
158996
+ const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-CySyldy4.js");
158813
158997
  return { id: id6, diagram: diagram2 };
158814
158998
  }, "loader");
158815
158999
  var plugin6 = {
@@ -158823,7 +159007,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
158823
159007
  return /^\s*info/.test(txt);
158824
159008
  }, "detector");
158825
159009
  var loader7 = /* @__PURE__ */ __name(async () => {
158826
- const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-CeyMzohL.js");
159010
+ const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-D_Zdx-MM.js");
158827
159011
  return { id: id7, diagram: diagram2 };
158828
159012
  }, "loader");
158829
159013
  var info = {
@@ -158836,7 +159020,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
158836
159020
  return /^\s*pie/.test(txt);
158837
159021
  }, "detector");
158838
159022
  var loader8 = /* @__PURE__ */ __name(async () => {
158839
- const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-CWkrHsNk.js");
159023
+ const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-DI4Hh6KE.js");
158840
159024
  return { id: id8, diagram: diagram2 };
158841
159025
  }, "loader");
158842
159026
  var pie = {
@@ -158849,7 +159033,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
158849
159033
  return /^\s*quadrantChart/.test(txt);
158850
159034
  }, "detector");
158851
159035
  var loader9 = /* @__PURE__ */ __name(async () => {
158852
- const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-C25p2xz7.js");
159036
+ const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-Cqc_vrUG.js");
158853
159037
  return { id: id9, diagram: diagram2 };
158854
159038
  }, "loader");
158855
159039
  var plugin7 = {
@@ -158863,7 +159047,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
158863
159047
  return /^\s*xychart(-beta)?/.test(txt);
158864
159048
  }, "detector");
158865
159049
  var loader10 = /* @__PURE__ */ __name(async () => {
158866
- const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-j8PckQEj.js");
159050
+ const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-ByA0_p8p.js");
158867
159051
  return { id: id10, diagram: diagram2 };
158868
159052
  }, "loader");
158869
159053
  var plugin8 = {
@@ -158877,7 +159061,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
158877
159061
  return /^\s*requirement(Diagram)?/.test(txt);
158878
159062
  }, "detector");
158879
159063
  var loader11 = /* @__PURE__ */ __name(async () => {
158880
- const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-ACRVXQGO.js");
159064
+ const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-96ab-40P.js");
158881
159065
  return { id: id11, diagram: diagram2 };
158882
159066
  }, "loader");
158883
159067
  var plugin9 = {
@@ -158891,7 +159075,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
158891
159075
  return /^\s*sequenceDiagram/.test(txt);
158892
159076
  }, "detector");
158893
159077
  var loader12 = /* @__PURE__ */ __name(async () => {
158894
- const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-C_wFtq8b.js");
159078
+ const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-CFKyfvmC.js");
158895
159079
  return { id: id12, diagram: diagram2 };
158896
159080
  }, "loader");
158897
159081
  var plugin10 = {
@@ -158908,7 +159092,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
158908
159092
  return /^\s*classDiagram/.test(txt);
158909
159093
  }, "detector");
158910
159094
  var loader13 = /* @__PURE__ */ __name(async () => {
158911
- const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-CwIsZ53p.js");
159095
+ const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-B90fR_EV.js");
158912
159096
  return { id: id13, diagram: diagram2 };
158913
159097
  }, "loader");
158914
159098
  var plugin11 = {
@@ -158925,7 +159109,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
158925
159109
  return /^\s*classDiagram-v2/.test(txt);
158926
159110
  }, "detector");
158927
159111
  var loader14 = /* @__PURE__ */ __name(async () => {
158928
- const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-CwIsZ53p.js");
159112
+ const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-B90fR_EV.js");
158929
159113
  return { id: id14, diagram: diagram2 };
158930
159114
  }, "loader");
158931
159115
  var plugin12 = {
@@ -158942,7 +159126,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
158942
159126
  return /^\s*stateDiagram/.test(txt);
158943
159127
  }, "detector");
158944
159128
  var loader15 = /* @__PURE__ */ __name(async () => {
158945
- const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-B9MGwsuS.js");
159129
+ const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-DGZQd18J.js");
158946
159130
  return { id: id15, diagram: diagram2 };
158947
159131
  }, "loader");
158948
159132
  var plugin13 = {
@@ -158962,7 +159146,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
158962
159146
  return false;
158963
159147
  }, "detector");
158964
159148
  var loader16 = /* @__PURE__ */ __name(async () => {
158965
- const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-CLHd8oUa.js");
159149
+ const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-DJXeLDOB.js");
158966
159150
  return { id: id16, diagram: diagram2 };
158967
159151
  }, "loader");
158968
159152
  var plugin14 = {
@@ -158976,7 +159160,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
158976
159160
  return /^\s*journey/.test(txt);
158977
159161
  }, "detector");
158978
159162
  var loader17 = /* @__PURE__ */ __name(async () => {
158979
- const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-ANqeM_TM.js");
159163
+ const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-BcO9qzr2.js");
158980
159164
  return { id: id17, diagram: diagram2 };
158981
159165
  }, "loader");
158982
159166
  var plugin15 = {
@@ -159043,7 +159227,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
159043
159227
  return false;
159044
159228
  }, "detector");
159045
159229
  var loader18 = /* @__PURE__ */ __name(async () => {
159046
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BYBNOZwM.js");
159230
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-DtWHb6Ay.js");
159047
159231
  return { id: id18, diagram: diagram2 };
159048
159232
  }, "loader");
159049
159233
  var plugin16 = {
@@ -159057,7 +159241,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
159057
159241
  return /^\s*timeline/.test(txt);
159058
159242
  }, "detector");
159059
159243
  var loader19 = /* @__PURE__ */ __name(async () => {
159060
- const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-CqKot5RT.js");
159244
+ const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-DzTJZPN5.js");
159061
159245
  return { id: id19, diagram: diagram2 };
159062
159246
  }, "loader");
159063
159247
  var plugin17 = {
@@ -159071,7 +159255,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
159071
159255
  return /^\s*mindmap/.test(txt);
159072
159256
  }, "detector");
159073
159257
  var loader20 = /* @__PURE__ */ __name(async () => {
159074
- const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-DlEXF5z8.js");
159258
+ const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-CpzqFomk.js");
159075
159259
  return { id: id20, diagram: diagram2 };
159076
159260
  }, "loader");
159077
159261
  var plugin18 = {
@@ -159085,7 +159269,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
159085
159269
  return /^\s*kanban/.test(txt);
159086
159270
  }, "detector");
159087
159271
  var loader21 = /* @__PURE__ */ __name(async () => {
159088
- const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-B0RkH45q.js");
159272
+ const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-BatZ7RKG.js");
159089
159273
  return { id: id21, diagram: diagram2 };
159090
159274
  }, "loader");
159091
159275
  var plugin19 = {
@@ -159099,7 +159283,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
159099
159283
  return /^\s*sankey(-beta)?/.test(txt);
159100
159284
  }, "detector");
159101
159285
  var loader22 = /* @__PURE__ */ __name(async () => {
159102
- const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-uzNSHudY.js");
159286
+ const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-Bux2-BQd.js");
159103
159287
  return { id: id22, diagram: diagram2 };
159104
159288
  }, "loader");
159105
159289
  var plugin20 = {
@@ -159113,7 +159297,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
159113
159297
  return /^\s*packet(-beta)?/.test(txt);
159114
159298
  }, "detector");
159115
159299
  var loader23 = /* @__PURE__ */ __name(async () => {
159116
- const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-C42mRVEn.js");
159300
+ const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-BnxctnIJ.js");
159117
159301
  return { id: id23, diagram: diagram2 };
159118
159302
  }, "loader");
159119
159303
  var packet = {
@@ -159126,7 +159310,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
159126
159310
  return /^\s*radar-beta/.test(txt);
159127
159311
  }, "detector");
159128
159312
  var loader24 = /* @__PURE__ */ __name(async () => {
159129
- const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-DViyYq-y.js");
159313
+ const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-atbHIh96.js");
159130
159314
  return { id: id24, diagram: diagram2 };
159131
159315
  }, "loader");
159132
159316
  var radar = {
@@ -159139,7 +159323,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
159139
159323
  return /^\s*block(-beta)?/.test(txt);
159140
159324
  }, "detector");
159141
159325
  var loader25 = /* @__PURE__ */ __name(async () => {
159142
- const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-BahODDhX.js");
159326
+ const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-BvasIENt.js");
159143
159327
  return { id: id25, diagram: diagram2 };
159144
159328
  }, "loader");
159145
159329
  var plugin21 = {
@@ -159153,7 +159337,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
159153
159337
  return /^\s*architecture/.test(txt);
159154
159338
  }, "detector");
159155
159339
  var loader26 = /* @__PURE__ */ __name(async () => {
159156
- const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-Br4iiUzH.js");
159340
+ const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-D6UEkzy_.js");
159157
159341
  return { id: id26, diagram: diagram2 };
159158
159342
  }, "loader");
159159
159343
  var architecture = {
@@ -159167,7 +159351,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
159167
159351
  return /^\s*treemap/.test(txt);
159168
159352
  }, "detector");
159169
159353
  var loader27 = /* @__PURE__ */ __name(async () => {
159170
- const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-DtOD93m7.js");
159354
+ const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-DLrJ9Eja.js");
159171
159355
  return { id: id27, diagram: diagram2 };
159172
159356
  }, "loader");
159173
159357
  var treemap = {
@@ -161491,8 +161675,13 @@ function readElement(group) {
161491
161675
  const el = group.element;
161492
161676
  return el && typeof el.getBoundingClientRect === "function" ? el : null;
161493
161677
  }
161494
- function getGridGroupsInVisualOrder(api) {
161495
- const groups = api.groups.filter((g2) => g2.api.location.type === "grid");
161678
+ function getNavigableGroupsInVisualOrder(api) {
161679
+ const groups = api.groups.filter((g2) => {
161680
+ const loc = g2.api.location;
161681
+ if (loc.type === "grid") return true;
161682
+ if (loc.type === "edge") return g2.panels.length > 0;
161683
+ return false;
161684
+ });
161496
161685
  if (groups.length < 2) return groups;
161497
161686
  const rects = [];
161498
161687
  for (const g2 of groups) {
@@ -161512,7 +161701,7 @@ function getGridGroupsInVisualOrder(api) {
161512
161701
  }
161513
161702
  function cycleGridGroups(api, direction, refocus) {
161514
161703
  if (!api) return;
161515
- const groups = getGridGroupsInVisualOrder(api);
161704
+ const groups = getNavigableGroupsInVisualOrder(api);
161516
161705
  if (groups.length < 2) return;
161517
161706
  const current = api.activeGroup;
161518
161707
  const idx = current ? groups.findIndex((g2) => g2.id === current.id) : -1;
@@ -161536,7 +161725,7 @@ function selectNeighbourBeforeRemove(api, panelId) {
161536
161725
  return;
161537
161726
  }
161538
161727
  if (!group) return;
161539
- const ordered = getGridGroupsInVisualOrder(api);
161728
+ const ordered = getNavigableGroupsInVisualOrder(api);
161540
161729
  if (ordered.length <= 1) return;
161541
161730
  const groupIdx = ordered.findIndex((g2) => g2.id === group.id);
161542
161731
  if (groupIdx < 0) return;
@@ -170212,12 +170401,33 @@ function extractMarkdown(item) {
170212
170401
  }
170213
170402
  function StatusDot({ isError, isInProgress }) {
170214
170403
  if (isError) {
170215
- return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 shrink-0 rounded-full bg-red-500" });
170404
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
170405
+ "span",
170406
+ {
170407
+ "data-testid": "tool-call__status-dot",
170408
+ "data-status": "error",
170409
+ className: "size-2 shrink-0 rounded-full bg-red-500"
170410
+ }
170411
+ );
170216
170412
  }
170217
170413
  if (isInProgress) {
170218
- return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 shrink-0 animate-pulse rounded-full bg-orange-500" });
170414
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
170415
+ "span",
170416
+ {
170417
+ "data-testid": "tool-call__status-dot",
170418
+ "data-status": "in-progress",
170419
+ className: "size-2 shrink-0 animate-pulse rounded-full bg-orange-500"
170420
+ }
170421
+ );
170219
170422
  }
170220
- return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 shrink-0 rounded-full bg-green-500" });
170423
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
170424
+ "span",
170425
+ {
170426
+ "data-testid": "tool-call__status-dot",
170427
+ "data-status": "complete",
170428
+ className: "size-2 shrink-0 rounded-full bg-green-500"
170429
+ }
170430
+ );
170221
170431
  }
170222
170432
  function ToolCall({ item }) {
170223
170433
  if (item.toolName === "AskUserQuestion" && item.approvalId && item.isInProgress) {
@@ -170232,20 +170442,29 @@ function ToolCall({ item }) {
170232
170442
  }
170233
170443
  const title = item.displayTitle ?? item.toolName;
170234
170444
  const markdown = extractMarkdown(item);
170445
+ const status = item.isError ? "error" : item.isInProgress ? "in-progress" : "complete";
170235
170446
  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
- ] }),
170447
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
170448
+ Collapsible,
170449
+ {
170450
+ "data-testid": "tool-call__container",
170451
+ "data-status": status,
170452
+ className: "group not-prose w-full rounded border border-border/30 bg-muted/20",
170453
+ children: [
170454
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "flex w-full items-center justify-between gap-4 px-2 py-1.5", children: [
170455
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
170456
+ /* @__PURE__ */ jsxRuntimeExports.jsx(StatusDot, { isError: item.isError, isInProgress: item.isInProgress }),
170457
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-medium text-xs text-muted-foreground", children: title })
170458
+ ] }),
170459
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" })
170460
+ ] }),
170461
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleContent, { className: "space-y-3 border-t border-border/30 px-3 py-2 text-popover-foreground", children: [
170462
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolInput, { input: item.input }),
170463
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolOutput, { output: item.output, errorText: item.errorText })
170464
+ ] })
170465
+ ]
170466
+ }
170467
+ ),
170249
170468
  markdown && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageResponse, { children: markdown })
170250
170469
  ] });
170251
170470
  }
@@ -170512,16 +170731,31 @@ function chatEventReducer(state2, event) {
170512
170731
  };
170513
170732
  }
170514
170733
  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
- });
170734
+ let ownerId;
170735
+ let prevPart;
170736
+ for (let i2 = state2.messages.length - 1; i2 >= 0; i2--) {
170737
+ const msg = state2.messages[i2];
170738
+ if (msg.role !== "assistant") continue;
170739
+ const part = msg.parts.find((p2) => {
170740
+ const pp = p2;
170741
+ return pp.toolCallId === event.toolCallId;
170742
+ });
170743
+ if (part) {
170744
+ ownerId = msg.id;
170745
+ prevPart = part;
170746
+ break;
170747
+ }
170748
+ }
170749
+ if (!ownerId) {
170750
+ console.warn(
170751
+ "[chat] tool-output-available for unknown toolCallId — dropping",
170752
+ event.toolCallId
170753
+ );
170754
+ return { ...state2, lastEventId };
170755
+ }
170522
170756
  const messages = replaceToolPart(
170523
170757
  state2.messages,
170524
- assistantId,
170758
+ ownerId,
170525
170759
  event.toolCallId,
170526
170760
  makeToolOutputPart(prevPart, event)
170527
170761
  );
@@ -172172,29 +172406,32 @@ const closeTabRef = {
172172
172406
  current: null
172173
172407
  };
172174
172408
  const RightHeaderActions = React$1.memo(function RightHeaderActions2(props) {
172409
+ const isGridGroup = (props.location?.type ?? "grid") === "grid";
172175
172410
  const { onAdd: onAdd2, onSplit } = addTabRef.current;
172176
172411
  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
- ),
172412
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full w-full items-center justify-center", children: [
172413
+ isGridGroup && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
172414
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
172415
+ "button",
172416
+ {
172417
+ type: "button",
172418
+ className: "inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors",
172419
+ onClick: () => onSplit(groupId, "right"),
172420
+ title: "Split right",
172421
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Columns2, { className: "size-3.5" })
172422
+ }
172423
+ ),
172424
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
172425
+ "button",
172426
+ {
172427
+ type: "button",
172428
+ className: "inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors",
172429
+ onClick: () => onSplit(groupId, "below"),
172430
+ title: "Split down",
172431
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Rows2, { className: "size-3.5" })
172432
+ }
172433
+ )
172434
+ ] }),
172198
172435
  /* @__PURE__ */ jsxRuntimeExports.jsx(
172199
172436
  "button",
172200
172437
  {
@@ -172223,6 +172460,8 @@ function DockviewChatContainer({
172223
172460
  const apiRef = reactExports.useRef(null);
172224
172461
  const isRestoringRef = reactExports.useRef(false);
172225
172462
  const containerRef = reactExports.useRef(null);
172463
+ const edgeDragDisposerRef = reactExports.useRef(null);
172464
+ const innerRegisterDisposerRef = reactExports.useRef(null);
172226
172465
  const { data: initialData } = useQuery({
172227
172466
  queryKey: chatLayoutKey(workspaceId),
172228
172467
  queryFn: async () => {
@@ -172434,6 +172673,14 @@ function DockviewChatContainer({
172434
172673
  }, [adapter2, workspaceId]);
172435
172674
  addTabRef.current = { onAdd: handleAddTab, onSplit: handleSplit };
172436
172675
  closeTabRef.current = closeTab;
172676
+ reactExports.useEffect(() => {
172677
+ return () => {
172678
+ edgeDragDisposerRef.current?.();
172679
+ edgeDragDisposerRef.current = null;
172680
+ innerRegisterDisposerRef.current?.();
172681
+ innerRegisterDisposerRef.current = null;
172682
+ };
172683
+ }, []);
172437
172684
  const initialLayoutRef = reactExports.useRef(null);
172438
172685
  initialLayoutRef.current = initialData?.layout ?? null;
172439
172686
  const initialChatIdsRef = reactExports.useRef(null);
@@ -172475,6 +172722,13 @@ function DockviewChatContainer({
172475
172722
  createDefaultPanel(event.api, workspaceId);
172476
172723
  persistToServer(workspaceId, event.api.toJSON(), { queryClient: queryClientRef.current });
172477
172724
  }
172725
+ ensureEdgeGroups(event.api);
172726
+ edgeDragDisposerRef.current?.();
172727
+ edgeDragDisposerRef.current = attachEdgeGroupDragVisibility(event.api);
172728
+ innerRegisterDisposerRef.current?.();
172729
+ if (containerRef.current) {
172730
+ innerRegisterDisposerRef.current = registerInnerDockview(containerRef.current, event.api);
172731
+ }
172478
172732
  const persist = () => schedulePersist();
172479
172733
  event.api.onDidLayoutChange(persist);
172480
172734
  event.api.onDidAddPanel(persist);
@@ -172596,6 +172850,33 @@ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
172596
172850
  return next2;
172597
172851
  });
172598
172852
  }, [activeWorkspaceId]);
172853
+ const { projects, isLoading, error } = useProjects();
172854
+ reactExports.useEffect(() => {
172855
+ if (isLoading || error) return;
172856
+ const validIds = /* @__PURE__ */ new Set();
172857
+ for (const project of projects) {
172858
+ for (const worktree of project.worktrees) {
172859
+ validIds.add(toWorkspaceId(project.name, worktree.branch));
172860
+ }
172861
+ }
172862
+ setCache((prev2) => {
172863
+ let hasStale = false;
172864
+ for (const id28 of prev2.keys()) {
172865
+ if (!validIds.has(id28) && id28 !== activeWorkspaceId) {
172866
+ hasStale = true;
172867
+ break;
172868
+ }
172869
+ }
172870
+ if (!hasStale) return prev2;
172871
+ const next2 = new Map(prev2);
172872
+ for (const id28 of next2.keys()) {
172873
+ if (!validIds.has(id28) && id28 !== activeWorkspaceId) {
172874
+ next2.delete(id28);
172875
+ }
172876
+ }
172877
+ return next2;
172878
+ });
172879
+ }, [projects, isLoading, error, activeWorkspaceId]);
172599
172880
  const lastCacheKeysRef = reactExports.useRef(/* @__PURE__ */ new Set());
172600
172881
  reactExports.useEffect(() => {
172601
172882
  const current = new Set(cache.keys());
@@ -172610,6 +172891,7 @@ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
172610
172891
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
172611
172892
  "div",
172612
172893
  {
172894
+ "data-testid": `workspace-panel-host__cached-entry--${workspaceId}`,
172613
172895
  className: "absolute inset-0 transition-opacity duration-150 ease-out",
172614
172896
  style: {
172615
172897
  opacity: isActive ? 1 : 0,
@@ -173857,6 +174139,325 @@ function PrereqDialog({ open: open2, onOpenChange, onReady }) {
173857
174139
  ] })
173858
174140
  ] }) });
173859
174141
  }
174142
+ const BYTES_PER_MB = 1024 * 1024;
174143
+ function formatMB(bytes) {
174144
+ return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;
174145
+ }
174146
+ function formatBytes(bytes) {
174147
+ if (bytes < 1024) return `${bytes} B`;
174148
+ if (bytes < BYTES_PER_MB) return `${(bytes / 1024).toFixed(1)} KB`;
174149
+ if (bytes < BYTES_PER_MB * 1024) return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;
174150
+ return `${(bytes / (BYTES_PER_MB * 1024)).toFixed(2)} GB`;
174151
+ }
174152
+ function formatUptime(seconds) {
174153
+ const s2 = Math.floor(seconds % 60);
174154
+ const m2 = Math.floor(seconds / 60 % 60);
174155
+ const h2 = Math.floor(seconds / 3600 % 24);
174156
+ const d2 = Math.floor(seconds / 86400);
174157
+ const parts = [];
174158
+ if (d2 > 0) parts.push(`${d2}d`);
174159
+ if (h2 > 0) parts.push(`${h2}h`);
174160
+ if (m2 > 0) parts.push(`${m2}m`);
174161
+ parts.push(`${s2}s`);
174162
+ return parts.join(" ");
174163
+ }
174164
+ function formatCpuMs(micros) {
174165
+ const ms = micros / 1e3;
174166
+ if (ms < 1e3) return `${ms.toFixed(1)} ms`;
174167
+ return `${(ms / 1e3).toFixed(2)} s`;
174168
+ }
174169
+ function testIdForWorktree(project, branch) {
174170
+ const safe = (s2) => s2.replace(/[^\w-]/g, "_");
174171
+ return `${safe(project)}__${safe(branch)}`;
174172
+ }
174173
+ const PROJECT_FETCH_CONCURRENCY = 3;
174174
+ async function runWithLimit(items, limit, fn2, isCancelled) {
174175
+ let nextIdx = 0;
174176
+ async function worker() {
174177
+ while (true) {
174178
+ if (isCancelled()) return;
174179
+ const idx = nextIdx++;
174180
+ if (idx >= items.length) return;
174181
+ await fn2(items[idx]);
174182
+ }
174183
+ }
174184
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => worker()));
174185
+ }
174186
+ function ResourcesPage() {
174187
+ const serverQuery = useQuery({
174188
+ queryKey: ["resources", "server"],
174189
+ queryFn: () => trpc.services.resourcesServer.query()
174190
+ });
174191
+ const projectsQuery = useQuery({
174192
+ queryKey: ["resources", "projects"],
174193
+ queryFn: () => trpc.services.resourcesProjects.query(),
174194
+ refetchOnWindowFocus: false,
174195
+ refetchOnReconnect: false,
174196
+ refetchInterval: false,
174197
+ staleTime: Number.POSITIVE_INFINITY
174198
+ });
174199
+ const [sizes, setSizes] = reactExports.useState(() => /* @__PURE__ */ new Map());
174200
+ const [refreshKey, setRefreshKey] = reactExports.useState(0);
174201
+ const server = serverQuery.data;
174202
+ const projects = projectsQuery.data?.projects ?? [];
174203
+ const projectNames = projects.map((p2) => p2.project).join("\n");
174204
+ const projectsRef = reactExports.useMemo(() => projects, [projectNames]);
174205
+ reactExports.useEffect(() => {
174206
+ if (projectsRef.length === 0) return;
174207
+ let cancelled = false;
174208
+ setSizes(/* @__PURE__ */ new Map());
174209
+ void runWithLimit(
174210
+ projectsRef,
174211
+ PROJECT_FETCH_CONCURRENCY,
174212
+ async (p2) => {
174213
+ try {
174214
+ const data = await trpc.services.resourcesProjectSize.query({ project: p2.project });
174215
+ if (cancelled) return;
174216
+ setSizes((prev2) => {
174217
+ const next2 = new Map(prev2);
174218
+ next2.set(p2.project, data);
174219
+ return next2;
174220
+ });
174221
+ } catch (err) {
174222
+ if (cancelled) return;
174223
+ setSizes((prev2) => {
174224
+ const next2 = new Map(prev2);
174225
+ next2.set(p2.project, {
174226
+ project: p2.project,
174227
+ sizeBytes: 0,
174228
+ worktrees: [],
174229
+ error: err instanceof Error ? err.message : String(err)
174230
+ });
174231
+ return next2;
174232
+ });
174233
+ }
174234
+ },
174235
+ () => cancelled
174236
+ );
174237
+ return () => {
174238
+ cancelled = true;
174239
+ };
174240
+ }, [projectsRef, refreshKey]);
174241
+ const handleRefreshSizes = reactExports.useCallback(async () => {
174242
+ await projectsQuery.refetch();
174243
+ setRefreshKey((k2) => k2 + 1);
174244
+ }, [projectsQuery]);
174245
+ const [expandedProjects, setExpandedProjects] = reactExports.useState(() => /* @__PURE__ */ new Set());
174246
+ const toggleProject = (project) => {
174247
+ setExpandedProjects((prev2) => {
174248
+ const next2 = new Set(prev2);
174249
+ if (next2.has(project)) next2.delete(project);
174250
+ else next2.add(project);
174251
+ return next2;
174252
+ });
174253
+ };
174254
+ const sortedProjects = [...projects].sort((a2, b2) => {
174255
+ const sa = sizes.get(a2.project);
174256
+ const sb = sizes.get(b2.project);
174257
+ if (sa && sb) return sb.sizeBytes - sa.sizeBytes;
174258
+ if (sa && !sb) return -1;
174259
+ if (!sa && sb) return 1;
174260
+ return 0;
174261
+ });
174262
+ const knownTotalBytes = Array.from(sizes.values()).reduce((sum, s2) => sum + s2.sizeBytes, 0);
174263
+ const allLoaded = sizes.size === projects.length;
174264
+ 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: [
174265
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-server-card", className: "space-y-3", children: [
174266
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2", children: [
174267
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
174268
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: "Server" }),
174269
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
174270
+ "The Node process serving the Band dashboard (",
174271
+ server ? `pid ${server.pid}` : "…",
174272
+ ")."
174273
+ ] })
174274
+ ] }),
174275
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
174276
+ Button,
174277
+ {
174278
+ variant: "outline",
174279
+ size: "sm",
174280
+ "data-testid": "resources-refresh-server",
174281
+ onClick: () => serverQuery.refetch(),
174282
+ disabled: serverQuery.isFetching,
174283
+ children: [
174284
+ serverQuery.isFetching ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
174285
+ "Refresh"
174286
+ ]
174287
+ }
174288
+ )
174289
+ ] }),
174290
+ serverQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
174291
+ "Failed to load server snapshot: ",
174292
+ String(serverQuery.error)
174293
+ ] }) : !server ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
174294
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }),
174295
+ "Loading…"
174296
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-x-6 gap-y-2 text-sm md:grid-cols-3", children: [
174297
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "PID", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { "data-testid": "resources-server-pid", children: server.pid }) }),
174298
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Uptime", children: formatUptime(server.uptimeSeconds) }),
174299
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Node", children: server.nodeVersion }),
174300
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ServerField, { label: "Platform", children: [
174301
+ server.platform,
174302
+ " (",
174303
+ server.arch,
174304
+ ")"
174305
+ ] }),
174306
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "RSS", children: formatMB(server.memory.rssBytes) }),
174307
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Heap used", children: formatMB(server.memory.heapUsedBytes) }),
174308
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Heap total", children: formatMB(server.memory.heapTotalBytes) }),
174309
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "External", children: formatMB(server.memory.externalBytes) }),
174310
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Array buffers", children: formatMB(server.memory.arrayBuffersBytes) }),
174311
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (user)", children: formatCpuMs(server.cpu.userMicros) }),
174312
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ServerField, { label: "Total CPU time (system)", children: formatCpuMs(server.cpu.systemMicros) })
174313
+ ] })
174314
+ ] }),
174315
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { "data-testid": "resources-worktrees-card", className: "space-y-3", children: [
174316
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start justify-between gap-2", children: [
174317
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
174318
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-semibold leading-none", children: "Worktrees" }),
174319
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
174320
+ "Disk usage per tracked git project (allocated blocks, as reported by",
174321
+ " ",
174322
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "du" }),
174323
+ "). Sizes load per project in batches of ",
174324
+ PROJECT_FETCH_CONCURRENCY,
174325
+ ". Click a project to see its per-worktree breakdown."
174326
+ ] })
174327
+ ] }),
174328
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
174329
+ Button,
174330
+ {
174331
+ variant: "outline",
174332
+ size: "sm",
174333
+ "data-testid": "resources-refresh-worktrees",
174334
+ onClick: handleRefreshSizes,
174335
+ disabled: projectsQuery.isFetching || !allLoaded,
174336
+ children: [
174337
+ projectsQuery.isFetching || !allLoaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
174338
+ "Refresh"
174339
+ ]
174340
+ }
174341
+ )
174342
+ ] }),
174343
+ projectsQuery.isError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
174344
+ "Failed to load projects: ",
174345
+ String(projectsQuery.error)
174346
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
174347
+ "table",
174348
+ {
174349
+ "data-testid": "resources-projects-table",
174350
+ className: "w-full border-collapse text-sm",
174351
+ children: [
174352
+ /* @__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: [
174353
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3", children: "Project" }),
174354
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Worktrees" }),
174355
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "py-2 pr-3 text-right", children: "Total size" })
174356
+ ] }) }),
174357
+ /* @__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) => {
174358
+ const size2 = sizes.get(project.project);
174359
+ const isExpanded = expandedProjects.has(project.project);
174360
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(reactExports.Fragment, { children: [
174361
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
174362
+ "tr",
174363
+ {
174364
+ "data-testid": `resources-project-row-${project.project}`,
174365
+ "data-expanded": isExpanded ? "true" : "false",
174366
+ className: "border-b border-border/60 last:border-0 hover:bg-muted/40",
174367
+ children: [
174368
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 font-medium", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
174369
+ "button",
174370
+ {
174371
+ type: "button",
174372
+ "aria-expanded": isExpanded,
174373
+ onClick: () => toggleProject(project.project),
174374
+ className: "inline-flex w-full cursor-pointer items-center gap-1 text-left",
174375
+ children: [
174376
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174377
+ ChevronRight,
174378
+ {
174379
+ className: `size-3.5 shrink-0 transition-transform ${isExpanded ? "rotate-90" : ""}`
174380
+ }
174381
+ ),
174382
+ project.project
174383
+ ]
174384
+ }
174385
+ ) }),
174386
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: project.worktrees.length }),
174387
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174388
+ "td",
174389
+ {
174390
+ className: "py-2 pr-3 text-right tabular-nums",
174391
+ "data-testid": `resources-project-size-${project.project}`,
174392
+ children: size2 === void 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center justify-end gap-1.5 text-muted-foreground", children: [
174393
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }),
174394
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: "measuring…" })
174395
+ ] }) : size2.error ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", title: size2.error, children: "error" }) : formatBytes(size2.sizeBytes)
174396
+ }
174397
+ )
174398
+ ]
174399
+ }
174400
+ ),
174401
+ isExpanded && (size2 === void 0 ? (
174402
+ // Sizes haven't landed yet — show one
174403
+ // child row with a spinner so the
174404
+ // expand isn't an empty void.
174405
+ /* @__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: [
174406
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }),
174407
+ "Measuring worktrees…"
174408
+ ] }) }) })
174409
+ ) : size2.worktrees.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("tr", { className: "border-b border-border/40 bg-muted/20", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
174410
+ "td",
174411
+ {
174412
+ colSpan: 3,
174413
+ className: "py-2 pl-8 pr-3 text-xs text-muted-foreground",
174414
+ children: "No worktrees"
174415
+ }
174416
+ ) }) : size2.worktrees.map((wt2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
174417
+ "tr",
174418
+ {
174419
+ "data-testid": `resources-worktree-row-${testIdForWorktree(project.project, wt2.branch)}`,
174420
+ className: "border-b border-border/40 bg-muted/20 last:border-0",
174421
+ children: [
174422
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pl-8 pr-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [
174423
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-xs", children: wt2.branch || "—" }),
174424
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-mono text-[11px] text-muted-foreground", children: wt2.path })
174425
+ ] }) }),
174426
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1.5 pr-3" }),
174427
+ /* @__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) })
174428
+ ]
174429
+ },
174430
+ `${project.project}::${wt2.branch}::${wt2.path}`
174431
+ )))
174432
+ ] }, project.project);
174433
+ }) }),
174434
+ projects.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("tfoot", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t-2 border-border font-medium", children: [
174435
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "py-2 pr-3", children: [
174436
+ "Total",
174437
+ allLoaded ? "" : " (partial)"
174438
+ ] }),
174439
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-2 pr-3 text-right tabular-nums", children: projects.reduce((sum, p2) => sum + p2.worktrees.length, 0) }),
174440
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174441
+ "td",
174442
+ {
174443
+ className: "py-2 pr-3 text-right tabular-nums",
174444
+ "data-testid": "resources-projects-total",
174445
+ children: formatBytes(knownTotalBytes)
174446
+ }
174447
+ )
174448
+ ] }) })
174449
+ ]
174450
+ }
174451
+ ) })
174452
+ ] })
174453
+ ] }) });
174454
+ }
174455
+ function ServerField({ label, children: children2 }) {
174456
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-0.5", children: [
174457
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: label }),
174458
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-sm", children: children2 })
174459
+ ] });
174460
+ }
173860
174461
  function relativeTime(ms) {
173861
174462
  const seconds = Math.floor((Date.now() - ms) / 1e3);
173862
174463
  if (seconds < 60) return "just now";
@@ -175532,6 +176133,7 @@ function useAnyToolbarDialogOpen() {
175532
176133
  function ToolbarOverflowProvider({ children: children2 }) {
175533
176134
  const [showTasksDialog, setShowTasksDialog] = reactExports.useState(false);
175534
176135
  const [showCronjobsDialog, setShowCronjobsDialog] = reactExports.useState(false);
176136
+ const [showResourcesDialog, setShowResourcesDialog] = reactExports.useState(false);
175535
176137
  const {
175536
176138
  webServerRunning,
175537
176139
  tunnelUrl,
@@ -175548,11 +176150,19 @@ function ToolbarOverflowProvider({ children: children2 }) {
175548
176150
  const openTasks = reactExports.useCallback(() => setShowTasksDialog(true), []);
175549
176151
  const openCronjobs = reactExports.useCallback(() => setShowCronjobsDialog(true), []);
175550
176152
  const openTunnel = reactExports.useCallback(() => openTunnelDialog(), [openTunnelDialog]);
176153
+ const openResources = reactExports.useCallback(() => setShowResourcesDialog(true), []);
175551
176154
  const tunnelStatus = tunnelError ? "error" : webServerRunning ? "running" : "idle";
175552
- const anyDialogOpen = showTasksDialog || showCronjobsDialog || showTunnelDialog || showPrereq;
176155
+ const anyDialogOpen = showTasksDialog || showCronjobsDialog || showTunnelDialog || showPrereq || showResourcesDialog;
175553
176156
  const value = reactExports.useMemo(
175554
- () => ({ openTasks, openCronjobs, openTunnel, tunnelStatus, anyDialogOpen }),
175555
- [openTasks, openCronjobs, openTunnel, tunnelStatus, anyDialogOpen]
176157
+ () => ({
176158
+ openTasks,
176159
+ openCronjobs,
176160
+ openTunnel,
176161
+ openResources,
176162
+ tunnelStatus,
176163
+ anyDialogOpen
176164
+ }),
176165
+ [openTasks, openCronjobs, openTunnel, openResources, tunnelStatus, anyDialogOpen]
175556
176166
  );
175557
176167
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(ToolbarOverflowContext.Provider, { value, children: [
175558
176168
  children2,
@@ -175564,6 +176174,17 @@ function ToolbarOverflowProvider({ children: children2 }) {
175564
176174
  /* @__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
176175
  /* @__PURE__ */ jsxRuntimeExports.jsx(CronjobsPageContent, {})
175566
176176
  ] }) }),
176177
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: showResourcesDialog, onOpenChange: setShowResourcesDialog, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
176178
+ DialogContent,
176179
+ {
176180
+ className: "sm:max-w-6xl h-[80vh] flex flex-col p-0 gap-0",
176181
+ "data-testid": "resources-dialog",
176182
+ children: [
176183
+ /* @__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" }) }),
176184
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ResourcesPage, {}) })
176185
+ ]
176186
+ }
176187
+ ) }),
175567
176188
  /* @__PURE__ */ jsxRuntimeExports.jsx(PrereqDialog, { open: showPrereq, onOpenChange: setShowPrereq, onReady: onPrereqReady }),
175568
176189
  /* @__PURE__ */ jsxRuntimeExports.jsx(
175569
176190
  TunnelDialog,
@@ -175599,6 +176220,10 @@ function ToolbarOverflowMenuItems() {
175599
176220
  }
175600
176221
  ),
175601
176222
  ctx.tunnelStatus === "running" ? "Mobile access" : "Start tunnel"
176223
+ ] }),
176224
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onClick: ctx.openResources, "data-testid": "menu__resources", children: [
176225
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Activity, { className: "size-4" }),
176226
+ "Resources"
175602
176227
  ] })
175603
176228
  ] });
175604
176229
  }
@@ -175622,12 +176247,12 @@ const PANEL_SHORTCUTS = {
175622
176247
  browser: "⇧⌘B"
175623
176248
  };
175624
176249
  const DockviewTerminalContainer = reactExports.lazy(
175625
- () => import("./DockviewTerminalContainer-BbMZgBJ8.js").then((m2) => ({
176250
+ () => import("./DockviewTerminalContainer-CC7i0yMZ.js").then((m2) => ({
175626
176251
  default: m2.DockviewTerminalContainer
175627
176252
  }))
175628
176253
  );
175629
176254
  const DockviewBrowserContainer = reactExports.lazy(
175630
- () => import("./DockviewBrowserContainer-Bm7ARaqd.js").then((m2) => ({
176255
+ () => import("./DockviewBrowserContainer-BAe7TLKD.js").then((m2) => ({
175631
176256
  default: m2.DockviewBrowserContainer
175632
176257
  }))
175633
176258
  );
@@ -176241,13 +176866,21 @@ function SharedDockviewLayout() {
176241
176866
  window.dispatchEvent(new CustomEvent("band:focus-browser"));
176242
176867
  });
176243
176868
  }
176244
- } else if (key2 === "b" && !e2.shiftKey && api) {
176869
+ } else if (key2 === "b" && !e2.shiftKey && !e2.altKey && api) {
176245
176870
  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
- }
176871
+ const inner2 = findFocusedInnerDockview();
176872
+ if (inner2 && toggleEdgeGroup(inner2, "left")) return;
176873
+ toggleEdgeGroup(api, "left");
176874
+ } else if (e2.code === "KeyB" && e2.altKey && !e2.shiftKey && api) {
176875
+ e2.preventDefault();
176876
+ const inner2 = findFocusedInnerDockview();
176877
+ if (inner2 && toggleEdgeGroup(inner2, "right")) return;
176878
+ toggleEdgeGroup(api, "right");
176879
+ } else if (key2 === "j" && !e2.shiftKey && !e2.altKey && api) {
176880
+ e2.preventDefault();
176881
+ const inner2 = findFocusedInnerDockview();
176882
+ if (inner2 && toggleEdgeGroup(inner2, "bottom")) return;
176883
+ toggleEdgeGroup(api, "bottom");
176251
176884
  } else if (key2 === "m" && e2.shiftKey && api) {
176252
176885
  e2.preventDefault();
176253
176886
  const active = api.activeGroup;
@@ -176871,32 +177504,23 @@ function useZoom() {
176871
177504
  return () => window.removeEventListener("keydown", handler, true);
176872
177505
  }, []);
176873
177506
  }
176874
- function dispatchOpenFileEvent(event, options) {
177507
+ function dispatchOpenFileEvent(event, handlers2) {
176875
177508
  if (event.kind !== "open-file") return { handled: false, reason: "not-open-file" };
176876
177509
  const workspaceId = typeof event.workspaceId === "string" ? event.workspaceId : void 0;
176877
177510
  if (!workspaceId) return { handled: false, reason: "missing-workspace-id" };
176878
177511
  const filePath = typeof event.filePath === "string" ? event.filePath : void 0;
176879
177512
  if (!filePath) return { handled: false, reason: "missing-file-path" };
176880
- const { isDockview, handlers: handlers2 } = options;
176881
177513
  if (event.external === true) {
176882
177514
  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" };
176889
- }
176890
- if (isDockview) {
176891
- handlers2.onOpenFile(workspaceId, filePath);
176892
- return { handled: true, kind: "dockview-in-workspace" };
177515
+ handlers2.onActivateFilesPanel(workspaceId);
177516
+ return { handled: true, kind: "external" };
176893
177517
  }
176894
- handlers2.navigateInWorkspace(workspaceId, filePath);
176895
- return { handled: true, kind: "mobile-in-workspace" };
177518
+ handlers2.onOpenFile(workspaceId, filePath);
177519
+ return { handled: true, kind: "in-workspace" };
176896
177520
  }
176897
177521
  const adapter = isDesktop ? new DesktopDashboardAdapter() : new WebDashboardAdapter();
176898
177522
  const capabilities = isDesktop ? new NativeShellCapabilities() : new WebCapabilities();
176899
- const Route$8 = createRootRoute({
177523
+ const Route$2 = createRootRoute({
176900
177524
  head: () => ({
176901
177525
  meta: [
176902
177526
  { charSet: "utf-8" },
@@ -177060,27 +177684,14 @@ function AppShell() {
177060
177684
  useDesktopLayoutRef.current = useDesktopLayout;
177061
177685
  reactExports.useEffect(() => {
177062
177686
  const unsubscribe = adapter.subscribeStatusEvents((event) => {
177687
+ if (!useDesktopLayoutRef.current) return;
177063
177688
  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
- }
177689
+ onOpenFile: crossPanelHandlers.onOpenFile,
177690
+ onActivateFilesPanel: crossPanelHandlers.onActivateFilesPanel
177080
177691
  });
177081
177692
  });
177082
177693
  return unsubscribe;
177083
- }, [router2]);
177694
+ }, []);
177084
177695
  const panelItems = reactExports.useMemo(
177085
177696
  () => [
177086
177697
  { id: "chat", label: "Chat", icon: MessageSquare, shortcut: "⌃⌘I" },
@@ -177175,112 +177786,42 @@ function RootLayout() {
177175
177786
  ] })
177176
177787
  ] });
177177
177788
  }
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/")({
177789
+ const $$splitComponentImporter$1 = () => import("./index-CXMNOcuN.js");
177790
+ const Route$1 = createFileRoute("/")({
177219
177791
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
177220
177792
  });
177221
- const $$splitComponentImporter = () => import("./workspace._workspaceId.code._-BJdg1-Gs.js");
177222
- const Route2 = createFileRoute("/workspace/$workspaceId/code/$")({
177223
- component: lazyRouteComponent($$splitComponentImporter, "component")
177793
+ const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-ClAAZ5aq.js");
177794
+ const $$splitComponentImporter = () => import("./workspace._workspaceId-DT6Kz8RH.js");
177795
+ const Route2 = createFileRoute("/workspace/$workspaceId")({
177796
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
177797
+ // Bookmarks / shared links from before route unification (`/workspace/$id/changes`,
177798
+ // `/workspace/$id/code/foo.ts`, `/workspace/$id/terminal`) used to resolve to
177799
+ // child routes that no longer exist. Redirect them to the canonical workspace
177800
+ // URL instead of showing the root 404. See issue #467.
177801
+ //
177802
+ // CAVEAT: this catches ANY unmatched sub-path under `/workspace/$id`, not
177803
+ // just the five retired routes. If a future child route is added here, a
177804
+ // typo'd link (e.g. `/workspace/$id/settigns` for a real `/settings` route)
177805
+ // will silently land on the workspace root rather than surfacing a 404.
177806
+ // If that becomes a problem, narrow this to an allowlist of known retired
177807
+ // path prefixes.
177808
+ notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent")
177224
177809
  });
177225
- const IndexRoute = Route$7.update({
177810
+ const IndexRoute = Route$1.update({
177226
177811
  id: "/",
177227
177812
  path: "/",
177228
- getParentRoute: () => Route$8
177813
+ getParentRoute: () => Route$2
177229
177814
  });
177230
- const WorkspaceWorkspaceIdRoute = Route$6.update({
177815
+ const WorkspaceWorkspaceIdRoute = Route2.update({
177231
177816
  id: "/workspace/$workspaceId",
177232
177817
  path: "/workspace/$workspaceId",
177233
- getParentRoute: () => Route$8
177234
- });
177235
- const WorkspaceWorkspaceIdIndexRoute = Route$5.update({
177236
- id: "/",
177237
- path: "/",
177238
- getParentRoute: () => WorkspaceWorkspaceIdRoute
177818
+ getParentRoute: () => Route$2
177239
177819
  });
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
177264
- });
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
177820
  const rootRouteChildren = {
177280
177821
  IndexRoute,
177281
- WorkspaceWorkspaceIdRoute: WorkspaceWorkspaceIdRouteWithChildren
177822
+ WorkspaceWorkspaceIdRoute
177282
177823
  };
177283
- const routeTree = Route$8._addFileChildren(rootRouteChildren)._addFileTypes();
177824
+ const routeTree = Route$2._addFileChildren(rootRouteChildren)._addFileTypes();
177284
177825
  function getRouter() {
177285
177826
  return createRouter({
177286
177827
  routeTree,
@@ -177292,275 +177833,271 @@ const router = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
177292
177833
  getRouter
177293
177834
  }, Symbol.toStringTag, { value: "Module" }));
177294
177835
  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,
177836
+ wrapLabel as $,
177837
+ cycleTabsInActiveGroup as A,
177838
+ cycleGridGroups as B,
177839
+ Columns2 as C,
177840
+ DefaultBufferLength as D,
177841
+ R$4 as E,
177842
+ setAccDescription as F,
177843
+ getAccDescription as G,
177844
+ getAccTitle as H,
177304
177845
  IterMode as I,
177305
- selectNeighbourBeforeRemove as J,
177306
- DockviewReact as K,
177846
+ setAccTitle as J,
177847
+ Ks as K,
177307
177848
  LanguageSupport as L,
177308
- Columns2 as M,
177849
+ getConfig2 as M,
177309
177850
  Nt as N,
177310
- Rows2 as O,
177851
+ select as O,
177311
177852
  Parser$2 as P,
177312
- Plus as Q,
177313
- Route$5 as R,
177314
- cycleTabsInActiveGroup as S,
177853
+ Qe$1 as Q,
177854
+ Route2 as R,
177855
+ log as S,
177315
177856
  Tree as T,
177316
- cycleGridGroups as U,
177317
- R$4 as V,
177318
- Ks as W,
177857
+ configureSvgSize as U,
177858
+ assignWithDepth_default as V,
177859
+ calculateTextWidth as W,
177319
177860
  X$7 as X,
177320
- Qe$1 as Y,
177321
- setAccDescription as Z,
177322
- getAccDescription as _,
177861
+ sanitizeText as Y,
177862
+ distExports as Z,
177863
+ __name as _,
177323
177864
  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,
177865
+ getSubGraphTitleMargins as a$,
177866
+ common_default as a0,
177867
+ calculateTextHeight as a1,
177868
+ lineBreakRegex as a2,
177869
+ setConfig2 as a3,
177870
+ getRegisteredLayoutAlgorithm as a4,
177871
+ render$1 as a5,
177872
+ utils_default as a6,
177873
+ setDiagramTitle as a7,
177874
+ getDiagramTitle as a8,
177875
+ load as a9,
177876
+ atan2 as aA,
177877
+ constant$1 as aB,
177878
+ asin as aC,
177879
+ acos as aD,
177880
+ max as aE,
177881
+ getThemeVariables3 as aF,
177882
+ hasKatex as aG,
177883
+ calculateMathMLDimensions as aH,
177884
+ parseFontSize as aI,
177885
+ ZERO_WIDTH_SPACE as aJ,
177886
+ getUrl as aK,
177887
+ renderKatexSanitized as aL,
177888
+ parseGenericTypes as aM,
177889
+ line$1 as aN,
177890
+ curveBasis as aO,
177891
+ generateId as aP,
177892
+ setupGraphViewbox as aQ,
177893
+ isDark as aR,
177894
+ lighten as aS,
177895
+ darken as aT,
177896
+ commonDb_exports as aU,
177897
+ insertCluster as aV,
177898
+ insertNode as aW,
177899
+ positionNode as aX,
177900
+ getLineFunctionsWithOffset as aY,
177901
+ evaluate as aZ,
177902
+ createText as a_,
177903
+ JSON_SCHEMA as aa,
177904
+ isValidShape as ab,
177905
+ getEdgeId as ac,
177906
+ clear$2 as ad,
177907
+ defaultConfig2 as ae,
177908
+ rgba$1 as af,
177909
+ Utils as ag,
177910
+ Color$1 as ah,
177911
+ __export$1 as ai,
177912
+ setupGraphViewbox2 as aj,
177913
+ cleanAndMerge as ak,
177914
+ defaultConfig_default as al,
177915
+ getConfig as am,
177916
+ random as an,
177917
+ selectSvgElement as ao,
177918
+ package_default as ap,
177919
+ withPath as aq,
177920
+ halfPi as ar,
177921
+ epsilon as as,
177922
+ tau as at,
177923
+ cos as au,
177924
+ sin as av,
177925
+ min as aw,
177926
+ abs$1 as ax,
177927
+ pi as ay,
177928
+ sqrt as az,
177929
+ LRLanguage as b,
177930
+ array$2 as b$,
177931
+ replaceIconSubstring as b0,
177932
+ decodeEntities as b1,
177933
+ getStylesFromArray as b2,
177934
+ delimitedIndent as b3,
177935
+ NodeWeakMap as b4,
177936
+ snippetCompletion as b5,
177937
+ Tag as b6,
177938
+ parseMixed as b7,
177939
+ EditorSelection as b8,
177940
+ countColumn as b9,
177941
+ insertEdge as bA,
177942
+ positionEdgeLabel as bB,
177943
+ insertEdgeLabel as bC,
177944
+ computeDimensionOfText as bD,
177945
+ Ut$1 as bE,
177946
+ Yt$1 as bF,
177947
+ DashboardShell as bG,
177948
+ Qt$1 as bH,
177949
+ MessageSquare as bI,
177950
+ useIsDesktop as bJ,
177951
+ ToolbarOverflowProvider as bK,
177952
+ ToolbarOverflowMenuItems as bL,
177953
+ isDesktop as bM,
177954
+ GitCompare as bN,
177955
+ FolderOpen as bO,
177956
+ useDashboardStore as bP,
177957
+ useNavigate as bQ,
177958
+ DesktopDragRegion as bR,
177959
+ ArrowLeft as bS,
177960
+ DiffView as bT,
177961
+ CodeBrowserView as bU,
177962
+ QuickOpenDialog as bV,
177963
+ SearchFilesDialog as bW,
177964
+ useDiffTarget as bX,
177965
+ useSettingsQuery as bY,
177966
+ agentTypeSupportsSessionListing as bZ,
177967
+ ChatView as b_,
177968
+ Prec as ba,
177969
+ keymap as bb,
177970
+ EditorView as bc,
177971
+ Language as bd,
177972
+ indentUnit as be,
177973
+ foldService as bf,
177974
+ defineLanguageFacet as bg,
177975
+ CompletionContext as bh,
177976
+ EditorState as bi,
177977
+ languageDataProp as bj,
177978
+ LanguageDescription as bk,
177979
+ ParseContext as bl,
177980
+ bracketMatchingHandle as bm,
177981
+ flatIndent as bn,
177982
+ sublanguageProp as bo,
177983
+ baseRest as bp,
177984
+ isArrayLikeObject as bq,
177985
+ constant as br,
177986
+ isFunction as bs,
177987
+ isEmpty as bt,
177988
+ markers_default as bu,
177989
+ clear2 as bv,
177990
+ clear as bw,
177991
+ clear$1 as bx,
177992
+ updateNodeBounds as by,
177993
+ setNodeElem as bz,
177994
+ continuedIndent as c,
177995
+ baseKeys as c$,
177996
+ getUserDefinedConfig as c0,
177997
+ ArrowRight as c1,
177998
+ ArrowUp as c2,
177999
+ ArrowDown as c3,
178000
+ ClipboardPaste as c4,
178001
+ getCurrentZoomLevel as c5,
178002
+ openExternalUrl as c6,
178003
+ subscribeToZoomChanges as c7,
178004
+ SearchBar as c8,
178005
+ ZOOM_CSS_VAR as c9,
178006
+ isIndex as cA,
178007
+ assignValue as cB,
178008
+ constant$2 as cC,
178009
+ interpolateNumber as cD,
178010
+ color as cE,
178011
+ interpolateRgb as cF,
178012
+ interpolateString as cG,
178013
+ styles2String as cH,
178014
+ isLabelStyle as cI,
178015
+ Rgb as cJ,
178016
+ rgbConvert as cK,
178017
+ define as cL,
178018
+ extend$2 as cM,
178019
+ Color as cN,
178020
+ nogamma as cO,
178021
+ hue as cP,
178022
+ dayjs2 as cQ,
178023
+ setToString as cR,
178024
+ overRest as cS,
178025
+ baseFor as cT,
178026
+ baseAssignValue as cU,
178027
+ baseUnary as cV,
178028
+ merge$1 as cW,
178029
+ isObjectLike as cX,
178030
+ baseGetTag as cY,
178031
+ Symbol$1 as cZ,
178032
+ arrayLikeKeys as c_,
178033
+ getIconSVG as ca,
178034
+ registerIconPacks as cb,
178035
+ unknownIcon as cc,
178036
+ invoke as cd,
178037
+ listen as ce,
178038
+ reactDomExports as cf,
178039
+ Globe as cg,
178040
+ Popover as ch,
178041
+ PopoverTrigger as ci,
178042
+ PopoverContent as cj,
178043
+ Search as ck,
178044
+ Trash2 as cl,
178045
+ DropdownMenu as cm,
178046
+ DropdownMenuTrigger as cn,
178047
+ ChevronDown as co,
178048
+ DropdownMenuContent as cp,
178049
+ DropdownMenuItem as cq,
178050
+ TriangleAlert as cr,
178051
+ RotateCw as cs,
178052
+ isObject$1 as ct,
178053
+ isIterateeCall as cu,
178054
+ keysIn as cv,
178055
+ eq as cw,
178056
+ isArrayLike as cx,
178057
+ isArray as cy,
178058
+ identity as cz,
178059
+ foldInside as d,
178060
+ memoize as d0,
178061
+ isArguments as d1,
178062
+ copyObject as d2,
178063
+ getPrototype as d3,
178064
+ cloneArrayBuffer as d4,
178065
+ cloneTypedArray as d5,
178066
+ getTag as d6,
178067
+ nodeUtil as d7,
178068
+ copyArray as d8,
178069
+ isBuffer as d9,
178070
+ cloneBuffer as da,
178071
+ initCloneObject as db,
178072
+ Stack as dc,
178073
+ MapCache as dd,
178074
+ Uint8Array$1 as de,
178075
+ isTypedArray as df,
178076
+ isLength as dg,
178077
+ Set$1 as dh,
178078
+ createAssigner as di,
178079
+ isPrototype as dj,
178080
+ router as dk,
178081
+ ifNotIn as e,
178082
+ foldNodeProp as f,
178083
+ completeFromList as g,
178084
+ syntaxTree as h,
178085
+ indentNodeProp as i,
178086
+ NodeSet as j,
178087
+ NodeType as k,
178088
+ NodeProp as l,
178089
+ createLucideIcon as m,
178090
+ useQueryClient as n,
178091
+ useQuery as o,
178092
+ trpc as p,
178093
+ selectNeighbourBeforeRemove as q,
178094
+ ensureEdgeGroups as r,
177558
178095
  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
178096
+ tags as t,
178097
+ useAdapter as u,
178098
+ attachEdgeGroupDragVisibility as v,
178099
+ registerInnerDockview as w,
178100
+ DockviewReact as x,
178101
+ Rows2 as y,
178102
+ Plus as z
177566
178103
  };