@band-app/server 0.15.0 → 0.16.3

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 (173) hide show
  1. package/dist/client/assets/{DockviewTerminalContainer-DJBIrF63.js → DockviewTerminalContainer-D2lnsm6V.js} +2 -2
  2. package/dist/client/assets/TerminalPanel-SEbvgXv_.js +4 -0
  3. package/dist/client/assets/{_basePickBy-Dc0lZvrW.js → _basePickBy-C-uqClKF.js} +1 -1
  4. package/dist/client/assets/{_baseUniq-Cf73kSyg.js → _baseUniq-sN_xdSud.js} +1 -1
  5. package/dist/client/assets/{arc-CwSM8pE7.js → arc-DOqEiCLs.js} +1 -1
  6. package/dist/client/assets/{architectureDiagram-VXUJARFQ-CH39Gb3A.js → architectureDiagram-VXUJARFQ-DqRs-Rmj.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-VD42YOAC-DDxgl1uo.js → blockDiagram-VD42YOAC-Dxh5tO7I.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-YG6GDRKO-BfEjKk-g.js → c4Diagram-YG6GDRKO-CykynX-A.js} +1 -1
  9. package/dist/client/assets/channel-DijZVjmy.js +1 -0
  10. package/dist/client/assets/{chunk-4BX2VUAB-m8XoXk_H.js → chunk-4BX2VUAB-BckEbEmg.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-CtGE4lZU.js → chunk-55IACEB6-Ds9A0UL5.js} +1 -1
  12. package/dist/client/assets/{chunk-B4BG7PRW-e8RHFxfZ.js → chunk-B4BG7PRW-BbdA9dFb.js} +1 -1
  13. package/dist/client/assets/{chunk-DI55MBZ5-6OH7qKMA.js → chunk-DI55MBZ5-C10prUQu.js} +1 -1
  14. package/dist/client/assets/{chunk-FMBD7UC4-OC-xaPXK.js → chunk-FMBD7UC4-CMO5VhEI.js} +1 -1
  15. package/dist/client/assets/{chunk-QN33PNHL-OAk8wo3f.js → chunk-QN33PNHL-BrbSzW7G.js} +1 -1
  16. package/dist/client/assets/{chunk-QZHKN3VN-BQaX9Wrw.js → chunk-QZHKN3VN-BjFQUCU6.js} +1 -1
  17. package/dist/client/assets/{chunk-TZMSLE5B-BB9WpJAf.js → chunk-TZMSLE5B-B6ZDwm2_.js} +1 -1
  18. package/dist/client/assets/classDiagram-2ON5EDUG-DkjTgKpR.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DkjTgKpR.js +1 -0
  20. package/dist/client/assets/clone-DTHwmURu.js +1 -0
  21. package/dist/client/assets/{cose-bilkent-S5V4N54A-C9h_X8Kk.js → cose-bilkent-S5V4N54A-DbSjwZ4l.js} +1 -1
  22. package/dist/client/assets/{dagre-6UL2VRFP-DqYC11ua.js → dagre-6UL2VRFP-Q5hxi0O0.js} +1 -1
  23. package/dist/client/assets/{diagram-PSM6KHXK-CI1DRC6A.js → diagram-PSM6KHXK-D7kyAUq5.js} +1 -1
  24. package/dist/client/assets/{diagram-QEK2KX5R-fCfXFf0Y.js → diagram-QEK2KX5R-B7mpl_Jj.js} +1 -1
  25. package/dist/client/assets/{diagram-S2PKOQOG-ShkC9z2o.js → diagram-S2PKOQOG-CcIvSvFS.js} +1 -1
  26. package/dist/client/assets/{erDiagram-Q2GNP2WA-CaIQw3Ar.js → erDiagram-Q2GNP2WA-M2OHKSFi.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-NV44I4VS-CBTayrED.js → flowDiagram-NV44I4VS-Ot2zCa0t.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-JELNMOA3-BXX1Htdo.js → ganttDiagram-JELNMOA3-Dtl6PI3C.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-Dwzg4ngG.js → gitGraphDiagram-V2S2FVAM-DJCTwkyi.js} +1 -1
  30. package/dist/client/assets/{graph-CiXo3Prx.js → graph-DhvBAydB.js} +1 -1
  31. package/dist/client/assets/{highlighted-body-B3W2YXNL-7aLtgz8i.js → highlighted-body-B3W2YXNL-C6fHuUGl.js} +1 -1
  32. package/dist/client/assets/{index-Du9yJkB_.js → index-26c50Xcq.js} +1 -1
  33. package/dist/client/assets/index-B1K9dSWl.js +1 -0
  34. package/dist/client/assets/{index-C1zwysWn.js → index-B7VmPIW6.js} +1 -1
  35. package/dist/client/assets/{index-De1kIhJh.js → index-BBv9ZEF9.js} +1 -1
  36. package/dist/client/assets/{index-CVm5Qdu2.js → index-BDHBx5UL.js} +1 -1
  37. package/dist/client/assets/{index-BMWcJGJE.js → index-BUTfo7TS.js} +1 -1
  38. package/dist/client/assets/{index-Cg6YccFW.js → index-BYvWvSws.js} +1 -1
  39. package/dist/client/assets/{index-DmilV26W.js → index-CDbyr_lc.js} +1 -1
  40. package/dist/client/assets/{index-DQmzIoYb.js → index-CHGnZzhm.js} +1 -1
  41. package/dist/client/assets/{index-DRtcpY-M.js → index-CKHhLCNz.js} +1 -1
  42. package/dist/client/assets/{index-Gs7HImF7.js → index-CfsvL24Z.js} +1 -1
  43. package/dist/client/assets/{index-BCNUajNr.js → index-CjXcgzNg.js} +1 -1
  44. package/dist/client/assets/{index-DypgdPcb.js → index-CuNktTO3.js} +1 -1
  45. package/dist/client/assets/{index-CO6I2abN.js → index-DDe15mVl.js} +1 -1
  46. package/dist/client/assets/{index-CfYqVQ5p.js → index-I4Tc5Cuc.js} +1 -1
  47. package/dist/client/assets/{index-Di4toQJ5.js → index-MZ-6_xYm.js} +1 -1
  48. package/dist/client/assets/{index-DZu_2Bx_.js → index-SeTSJcqN.js} +1 -1
  49. package/dist/client/assets/{index-CR-ehys5.js → index-_yteHBmq.js} +1 -1
  50. package/dist/client/assets/{infoDiagram-HS3SLOUP-CWD1TyOW.js → infoDiagram-HS3SLOUP-CbAjFJUe.js} +1 -1
  51. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-DhxNYqmd.js → journeyDiagram-XKPGCS4Q-Bf_0viAE.js} +1 -1
  52. package/dist/client/assets/{kanban-definition-3W4ZIXB7-CnS4C6i0.js → kanban-definition-3W4ZIXB7-CB2ylbw7.js} +1 -1
  53. package/dist/client/assets/{layout-CSID7t17.js → layout-Cp_4dcMO.js} +1 -1
  54. package/dist/client/assets/{linear-DoyBnBXg.js → linear-D1KyszeO.js} +1 -1
  55. package/dist/client/assets/main-CBJTAZFq.css +1 -0
  56. package/dist/client/assets/{main-DqsO5O95.js → main-Cl2c5yKs.js} +236 -236
  57. package/dist/client/assets/{mindmap-definition-VGOIOE7T-DInqVMnG.js → mindmap-definition-VGOIOE7T-Cm_2Y7ZK.js} +1 -1
  58. package/dist/client/assets/{pieDiagram-ADFJNKIX-9NXrhDdT.js → pieDiagram-ADFJNKIX-C9PiUHN5.js} +1 -1
  59. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-C9V_pdwH.js → quadrantDiagram-AYHSOK5B-Cj0nbFw-.js} +1 -1
  60. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-D7InXBsj.js → requirementDiagram-UZGBJVZJ-BVgceiyR.js} +1 -1
  61. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-wucasjR9.js → sankeyDiagram-TZEHDZUN-D7dheggz.js} +1 -1
  62. package/dist/client/assets/{sequenceDiagram-WL72ISMW-z8y3Dw_f.js → sequenceDiagram-WL72ISMW-DVDMYgkc.js} +1 -1
  63. package/dist/client/assets/{square-terminal-BGmf1D-6.js → square-terminal-C64ybmC7.js} +1 -1
  64. package/dist/client/assets/{stateDiagram-FKZM4ZOC-UgwHItEV.js → stateDiagram-FKZM4ZOC-ClAcB9Xo.js} +1 -1
  65. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BH91aEUE.js +1 -0
  66. package/dist/client/assets/{timeline-definition-IT6M3QCI-BFRCSYLj.js → timeline-definition-IT6M3QCI-Cs1CMQvF.js} +1 -1
  67. package/dist/client/assets/{treemap-GDKQZRPO-aQmWnuZQ.js → treemap-GDKQZRPO-DerMxDGL.js} +1 -1
  68. package/dist/client/assets/{useSessionListContext-HoR6j8FY.js → useSessionListContext-BcM5_lz3.js} +1 -1
  69. package/dist/client/assets/{workspace._workspaceId-DGCQw9gi.js → workspace._workspaceId-C4dZT1kN.js} +1 -1
  70. package/dist/client/assets/{workspace._workspaceId.changes-DBE9NcLH.js → workspace._workspaceId.changes-BbnFHDel.js} +1 -1
  71. package/dist/client/assets/workspace._workspaceId.code-5MY9mEL9.js +1 -0
  72. package/dist/client/assets/{workspace._workspaceId.code._-CsnvG2rj.js → workspace._workspaceId.code._-DRRjmZ4D.js} +1 -1
  73. package/dist/client/assets/{workspace._workspaceId.code.index-BdfNmZpz.js → workspace._workspaceId.code.index-CQLsjESL.js} +1 -1
  74. package/dist/client/assets/{workspace._workspaceId.index-C7NyedGf.js → workspace._workspaceId.index-CE3X4XHe.js} +1 -1
  75. package/dist/client/assets/{workspace._workspaceId.terminal-C5ph2UWn.js → workspace._workspaceId.terminal-0Iuu4wZI.js} +2 -2
  76. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DElSdzdM.js → xychartDiagram-PRI3JC2R-BVo__gVD.js} +1 -1
  77. package/dist/migrations/20260518175010_wealthy_talon/migration.sql +1 -0
  78. package/dist/migrations/20260518175010_wealthy_talon/snapshot.json +856 -0
  79. package/dist/openapi.json +11356 -0
  80. package/dist/server/assets/{DockviewTerminalContainer-Btn06b30.js → DockviewTerminalContainer-RbFw8Eo4.js} +3 -3
  81. package/dist/server/assets/{TerminalPanel-DiuUhPK5.js → TerminalPanel-BS0KF1ac.js} +52 -22
  82. package/dist/server/assets/{_basePickBy-D5WFbUhD.js → _basePickBy-Vtp-JFm9.js} +2 -2
  83. package/dist/server/assets/{_baseUniq-DFZeWlPn.js → _baseUniq-CRtvsDi1.js} +1 -1
  84. package/dist/server/assets/{_tanstack-start-manifest_v-UCApGYfd.js → _tanstack-start-manifest_v-787sukfk.js} +1 -1
  85. package/dist/server/assets/{arc-B1QmYB3V.js → arc-ChWehBm_.js} +1 -1
  86. package/dist/server/assets/{architecture-7HQA4BMR-SXElPY6g.js → architecture-7HQA4BMR-BiLezQsp.js} +6 -6
  87. package/dist/server/assets/{architectureDiagram-VXUJARFQ-H4ZI6Opr.js → architectureDiagram-VXUJARFQ-tjTQ4ZaT.js} +6 -6
  88. package/dist/server/assets/{blockDiagram-VD42YOAC-UhTmqpkK.js → blockDiagram-VD42YOAC-C0oBPtSv.js} +6 -6
  89. package/dist/server/assets/{c4Diagram-YG6GDRKO-BcLh1QQl.js → c4Diagram-YG6GDRKO-nGE1cXwD.js} +2 -2
  90. package/dist/server/assets/{channel-DVtl256s.js → channel-CqQOLgw9.js} +1 -1
  91. package/dist/server/assets/{chunk-4BX2VUAB-BYUElNcW.js → chunk-4BX2VUAB-DrJXJmx5.js} +1 -1
  92. package/dist/server/assets/{chunk-55IACEB6-CQXVz3Ix.js → chunk-55IACEB6-CKxRFH9J.js} +1 -1
  93. package/dist/server/assets/{chunk-B4BG7PRW-xbFaXlOL.js → chunk-B4BG7PRW-BxyNZV2w.js} +4 -4
  94. package/dist/server/assets/{chunk-DI55MBZ5-BWUyQjGD.js → chunk-DI55MBZ5-CajwqGPE.js} +3 -3
  95. package/dist/server/assets/{chunk-FMBD7UC4-tuJ9minw.js → chunk-FMBD7UC4-D1CO-v-G.js} +1 -1
  96. package/dist/server/assets/{chunk-QN33PNHL-B9p522HA.js → chunk-QN33PNHL-D4KiZklP.js} +1 -1
  97. package/dist/server/assets/{chunk-QZHKN3VN-C6GPdMrh.js → chunk-QZHKN3VN-CNElfh9C.js} +1 -1
  98. package/dist/server/assets/{chunk-TZMSLE5B-6Ng3t3Od.js → chunk-TZMSLE5B-CHBqvPAr.js} +1 -1
  99. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-BvOdRP7s.js → classDiagram-2ON5EDUG-D3C4Rk7Q.js} +5 -5
  100. package/dist/server/assets/{classDiagram-2ON5EDUG-BvOdRP7s.js → classDiagram-v2-WZHVMYZB-D3C4Rk7Q.js} +5 -5
  101. package/dist/server/assets/{clone-CuDKCzEN.js → clone-DsPS0_DH.js} +1 -1
  102. package/dist/server/assets/{cose-bilkent-S5V4N54A-BhU6LMhN.js → cose-bilkent-S5V4N54A-V_MYkZlm.js} +1 -1
  103. package/dist/server/assets/{dagre-6UL2VRFP-CH-VbyTI.js → dagre-6UL2VRFP-D_Mh5gNH.js} +6 -6
  104. package/dist/server/assets/{diagram-PSM6KHXK-BE0vVJdc.js → diagram-PSM6KHXK-B9dGPsE9.js} +7 -7
  105. package/dist/server/assets/{diagram-QEK2KX5R-rlYyF51_.js → diagram-QEK2KX5R-BcfmavO-.js} +6 -6
  106. package/dist/server/assets/{diagram-S2PKOQOG-CsrxbKjr.js → diagram-S2PKOQOG-B8urPf9c.js} +6 -6
  107. package/dist/server/assets/{erDiagram-Q2GNP2WA-DeBKeqCX.js → erDiagram-Q2GNP2WA-CzG0zKt-.js} +4 -4
  108. package/dist/server/assets/{flowDiagram-NV44I4VS-hg6b4dSR.js → flowDiagram-NV44I4VS-Bk7aIalC.js} +5 -5
  109. package/dist/server/assets/{ganttDiagram-JELNMOA3-oy5gzveG.js → ganttDiagram-JELNMOA3-wmt8nm9q.js} +2 -2
  110. package/dist/server/assets/{gitGraph-G5XIXVHT-DyKGpXFt.js → gitGraph-G5XIXVHT-CmiFNHiv.js} +6 -6
  111. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-CN8rFh7o.js → gitGraphDiagram-V2S2FVAM-OV2DR1Ux.js} +7 -7
  112. package/dist/server/assets/{graph-CdsnxBHP.js → graph-ziMVg61H.js} +2 -2
  113. package/dist/server/assets/{highlighted-body-B3W2YXNL-D6ahbJdi.js → highlighted-body-B3W2YXNL-DX00yTJM.js} +1 -1
  114. package/dist/server/assets/{index-BJorH749.js → index-9M09S61v.js} +2 -2
  115. package/dist/server/assets/{index-Crgd09US.js → index-B5x9IUkQ.js} +2 -2
  116. package/dist/server/assets/{index-CaRM9svU.js → index-BvBMEwhL.js} +4 -4
  117. package/dist/server/assets/{index-D2P0pxCr.js → index-C-k9sCKq.js} +2 -2
  118. package/dist/server/assets/{index-BhJN38EV.js → index-CKmyLecf.js} +2 -2
  119. package/dist/server/assets/{index-DsLZMKNC.js → index-CXnsJrX8.js} +5 -5
  120. package/dist/server/assets/{index-CchdHjwq.js → index-Ce2uXVrE.js} +2 -2
  121. package/dist/server/assets/{index-BT8sxrq0.js → index-CiWhFogO.js} +2 -2
  122. package/dist/server/assets/{index-CsnrxvSd.js → index-D5nqcxSY.js} +3 -3
  123. package/dist/server/assets/{index-BzYp7sVL.js → index-DLmI6-iR.js} +1 -1
  124. package/dist/server/assets/{index-C9H7VUtp.js → index-DNaA-OTp.js} +2 -2
  125. package/dist/server/assets/{index-7k2BqwZv.js → index-DPAkuW3l.js} +2 -2
  126. package/dist/server/assets/{index-XaoY6ovr.js → index-VtjR2oZj.js} +2 -2
  127. package/dist/server/assets/{index-DBbuiN2t.js → index-ayG05uhc.js} +3 -3
  128. package/dist/server/assets/{index-B9hFfb3C.js → index-l8a7u6GS.js} +2 -2
  129. package/dist/server/assets/{index-Dp5TbN68.js → index-sKmEy2Z2.js} +5 -5
  130. package/dist/server/assets/{index-aOrOBCQS.js → index-sbo2EHgw.js} +2 -2
  131. package/dist/server/assets/{index-DIv5BUol.js → index-xVhCXu45.js} +2 -2
  132. package/dist/server/assets/{info-VBDWY6EO-HckNvgz-.js → info-VBDWY6EO-muqpsCRw.js} +6 -6
  133. package/dist/server/assets/{infoDiagram-HS3SLOUP-P_hugt8D.js → infoDiagram-HS3SLOUP-D8EoxteQ.js} +5 -5
  134. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-lQfkL_-i.js → journeyDiagram-XKPGCS4Q-BwZk-fnC.js} +4 -4
  135. package/dist/server/assets/{kanban-definition-3W4ZIXB7-CFh-YdaO.js → kanban-definition-3W4ZIXB7-DEfYos8T.js} +2 -2
  136. package/dist/server/assets/{layout-Ce1d_Ibk.js → layout-CKMmyz2h.js} +4 -4
  137. package/dist/server/assets/{linear-CuiUQTrq.js → linear-DXR7qYUB.js} +1 -1
  138. package/dist/server/assets/{mermaid-3ZIDBTTL-C7xGj9Xg.js → mermaid-3ZIDBTTL-DxhML77C.js} +1 -1
  139. package/dist/server/assets/{mermaid-parser.core-BOlp9l_E.js → mermaid-parser.core-DBGA5y48.js} +11 -11
  140. package/dist/server/assets/{mindmap-definition-VGOIOE7T-Byc-qFo2.js → mindmap-definition-VGOIOE7T-Bg8B0Ls9.js} +3 -3
  141. package/dist/server/assets/{packet-DYOGHKS2-BiRLh9CC.js → packet-DYOGHKS2-CnH_YgfD.js} +6 -6
  142. package/dist/server/assets/{pie-VRWISCQL-hgf7Lgm4.js → pie-VRWISCQL-iceCWNPC.js} +6 -6
  143. package/dist/server/assets/{pieDiagram-ADFJNKIX-YXV3ET4_.js → pieDiagram-ADFJNKIX-Bw3RR9nb.js} +7 -7
  144. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-r_peNHCA.js → quadrantDiagram-AYHSOK5B-CpLsW_Ir.js} +2 -2
  145. package/dist/server/assets/{radar-ZZBFDIW7-CGIDKJlK.js → radar-ZZBFDIW7-Bab4MCR4.js} +6 -6
  146. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-aI3jQPLf.js → requirementDiagram-UZGBJVZJ-DkGtaEnw.js} +3 -3
  147. package/dist/server/assets/{router-BNIoB7QX.js → router-yk-AJHab.js} +1119 -880
  148. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-B1Sb9Zvd.js → sankeyDiagram-TZEHDZUN-CtEV3_Bx.js} +1 -1
  149. package/dist/server/assets/{sequenceDiagram-WL72ISMW-DrJxigNy.js → sequenceDiagram-WL72ISMW-BMW4qEme.js} +3 -3
  150. package/dist/server/assets/{square-terminal-DWTC1p8r.js → square-terminal-Bui9B6KN.js} +1 -1
  151. package/dist/server/assets/{stateDiagram-FKZM4ZOC-Dnsp85zH.js → stateDiagram-FKZM4ZOC-C7xazM8E.js} +8 -8
  152. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-C6x8SVRv.js → stateDiagram-v2-4FDKWEC3-D_rYvDGP.js} +4 -4
  153. package/dist/server/assets/{timeline-definition-IT6M3QCI-DSIrepaO.js → timeline-definition-IT6M3QCI-BaAlfxrc.js} +2 -2
  154. package/dist/server/assets/{treemap-GDKQZRPO-C9hefMmZ.js → treemap-GDKQZRPO-DlP1TABE.js} +6 -6
  155. package/dist/server/assets/{workspace._workspaceId-BY5hpCRH.js → workspace._workspaceId-Be45P7LL.js} +2 -2
  156. package/dist/server/assets/{workspace._workspaceId.changes-CiekaeTG.js → workspace._workspaceId.changes-EoyIscxQ.js} +1 -1
  157. package/dist/server/assets/{workspace._workspaceId.code._-Bi-RxK7c.js → workspace._workspaceId.code._-CcX7Gt0G.js} +1 -1
  158. package/dist/server/assets/{workspace._workspaceId.code.index-DRR8qo6z.js → workspace._workspaceId.code.index-CFbCDVph.js} +1 -1
  159. package/dist/server/assets/{workspace._workspaceId.index-BRFgw3FA.js → workspace._workspaceId.index-DmYHy6nH.js} +1 -1
  160. package/dist/server/assets/{workspace._workspaceId.terminal-BhyASMi7.js → workspace._workspaceId.terminal-D_KPwmYr.js} +2 -2
  161. package/dist/server/assets/{xychartDiagram-PRI3JC2R-0ftH7hFg.js → xychartDiagram-PRI3JC2R-Cq7t_yS-.js} +2 -2
  162. package/dist/server/server.js +2 -2
  163. package/dist/start-server.mjs +710 -467
  164. package/package.json +6 -5
  165. package/dist/client/assets/TerminalPanel-CJRwWyR3.js +0 -4
  166. package/dist/client/assets/channel-CXGOk1aw.js +0 -1
  167. package/dist/client/assets/classDiagram-2ON5EDUG-CN-WyCFd.js +0 -1
  168. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CN-WyCFd.js +0 -1
  169. package/dist/client/assets/clone-BLJrTeWA.js +0 -1
  170. package/dist/client/assets/index-eX1Ljh4a.js +0 -1
  171. package/dist/client/assets/main-DYrDxnSM.css +0 -1
  172. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-B0Y2fSqT.js +0 -1
  173. package/dist/client/assets/workspace._workspaceId.code-Cc2uBW1l.js +0 -1
@@ -1093,44 +1093,44 @@ const createLucideIcon = (iconName, iconNode) => {
1093
1093
  Component.displayName = toPascalCase(iconName);
1094
1094
  return Component;
1095
1095
  };
1096
- const __iconNode$1y = [
1096
+ const __iconNode$1z = [
1097
1097
  ["path", { d: "M12 17V3", key: "1cwfxf" }],
1098
1098
  ["path", { d: "m6 11 6 6 6-6", key: "12ii2o" }],
1099
1099
  ["path", { d: "M19 21H5", key: "150jfl" }]
1100
1100
  ];
1101
- const ArrowDownToLine = createLucideIcon("arrow-down-to-line", __iconNode$1y);
1102
- const __iconNode$1x = [
1101
+ const ArrowDownToLine = createLucideIcon("arrow-down-to-line", __iconNode$1z);
1102
+ const __iconNode$1y = [
1103
1103
  ["path", { d: "M12 5v14", key: "s699le" }],
1104
1104
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
1105
1105
  ];
1106
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$1x);
1107
- const __iconNode$1w = [
1106
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$1y);
1107
+ const __iconNode$1x = [
1108
1108
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
1109
1109
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
1110
1110
  ];
1111
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1w);
1112
- const __iconNode$1v = [
1111
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1x);
1112
+ const __iconNode$1w = [
1113
1113
  ["path", { d: "M5 12h14", key: "1ays0h" }],
1114
1114
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
1115
1115
  ];
1116
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$1v);
1117
- const __iconNode$1u = [
1116
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$1w);
1117
+ const __iconNode$1v = [
1118
1118
  ["path", { d: "m18 9-6-6-6 6", key: "kcunyi" }],
1119
1119
  ["path", { d: "M12 3v14", key: "7cf3v8" }],
1120
1120
  ["path", { d: "M5 21h14", key: "11awu3" }]
1121
1121
  ];
1122
- const ArrowUpFromLine = createLucideIcon("arrow-up-from-line", __iconNode$1u);
1123
- const __iconNode$1t = [
1122
+ const ArrowUpFromLine = createLucideIcon("arrow-up-from-line", __iconNode$1v);
1123
+ const __iconNode$1u = [
1124
1124
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
1125
1125
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
1126
1126
  ];
1127
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$1t);
1128
- const __iconNode$1s = [
1127
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$1u);
1128
+ const __iconNode$1t = [
1129
1129
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1130
1130
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }]
1131
1131
  ];
1132
- const Ban = createLucideIcon("ban", __iconNode$1s);
1133
- const __iconNode$1r = [
1132
+ const Ban = createLucideIcon("ban", __iconNode$1t);
1133
+ const __iconNode$1s = [
1134
1134
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
1135
1135
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
1136
1136
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -1138,8 +1138,8 @@ const __iconNode$1r = [
1138
1138
  ["path", { d: "M15 13v2", key: "1xurst" }],
1139
1139
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
1140
1140
  ];
1141
- const Bot = createLucideIcon("bot", __iconNode$1r);
1142
- const __iconNode$1q = [
1141
+ const Bot = createLucideIcon("bot", __iconNode$1s);
1142
+ const __iconNode$1r = [
1143
1143
  [
1144
1144
  "path",
1145
1145
  { d: "M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1", key: "ezmyqa" }
@@ -1152,62 +1152,62 @@ const __iconNode$1q = [
1152
1152
  }
1153
1153
  ]
1154
1154
  ];
1155
- const Braces = createLucideIcon("braces", __iconNode$1q);
1156
- const __iconNode$1p = [
1155
+ const Braces = createLucideIcon("braces", __iconNode$1r);
1156
+ const __iconNode$1q = [
1157
1157
  ["path", { d: "m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16", key: "d5nyq2" }],
1158
1158
  ["path", { d: "M22 9v7", key: "pvm9v3" }],
1159
1159
  ["path", { d: "M3.304 13h6.392", key: "1q3zxz" }],
1160
1160
  ["circle", { cx: "18.5", cy: "12.5", r: "3.5", key: "z97x68" }]
1161
1161
  ];
1162
- const CaseSensitive = createLucideIcon("case-sensitive", __iconNode$1p);
1163
- const __iconNode$1o = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
1164
- const Check = createLucideIcon("check", __iconNode$1o);
1165
- const __iconNode$1n = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
1166
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$1n);
1167
- const __iconNode$1m = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
1168
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1m);
1169
- const __iconNode$1l = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
1170
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$1l);
1171
- const __iconNode$1k = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
1172
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$1k);
1173
- const __iconNode$1j = [
1162
+ const CaseSensitive = createLucideIcon("case-sensitive", __iconNode$1q);
1163
+ const __iconNode$1p = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
1164
+ const Check = createLucideIcon("check", __iconNode$1p);
1165
+ const __iconNode$1o = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
1166
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1o);
1167
+ const __iconNode$1n = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
1168
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1n);
1169
+ const __iconNode$1m = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
1170
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1m);
1171
+ const __iconNode$1l = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
1172
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1l);
1173
+ const __iconNode$1k = [
1174
1174
  ["path", { d: "m7 20 5-5 5 5", key: "13a0gw" }],
1175
1175
  ["path", { d: "m7 4 5 5 5-5", key: "1kwcof" }]
1176
1176
  ];
1177
- const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$1j);
1178
- const __iconNode$1i = [
1177
+ const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$1k);
1178
+ const __iconNode$1j = [
1179
1179
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
1180
1180
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
1181
1181
  ];
1182
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1i);
1183
- const __iconNode$1h = [
1182
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1j);
1183
+ const __iconNode$1i = [
1184
1184
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1185
1185
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
1186
1186
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
1187
1187
  ];
1188
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$1h);
1189
- const __iconNode$1g = [
1188
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1i);
1189
+ const __iconNode$1h = [
1190
1190
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1191
1191
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
1192
1192
  ];
1193
- const CircleCheck = createLucideIcon("circle-check", __iconNode$1g);
1194
- const __iconNode$1f = [
1193
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$1h);
1194
+ const __iconNode$1g = [
1195
1195
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1196
1196
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
1197
1197
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
1198
1198
  ];
1199
- const CircleX = createLucideIcon("circle-x", __iconNode$1f);
1200
- const __iconNode$1e = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
1201
- const Circle = createLucideIcon("circle", __iconNode$1e);
1202
- const __iconNode$1d = [
1199
+ const CircleX = createLucideIcon("circle-x", __iconNode$1g);
1200
+ const __iconNode$1f = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
1201
+ const Circle = createLucideIcon("circle", __iconNode$1f);
1202
+ const __iconNode$1e = [
1203
1203
  ["path", { d: "M11 14h10", key: "1w8e9d" }],
1204
1204
  ["path", { d: "M16 4h2a2 2 0 0 1 2 2v1.344", key: "1e62lh" }],
1205
1205
  ["path", { d: "m17 18 4-4-4-4", key: "z2g111" }],
1206
1206
  ["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113", key: "bjbb7m" }],
1207
1207
  ["rect", { x: "8", y: "2", width: "8", height: "4", rx: "1", key: "ublpy" }]
1208
1208
  ];
1209
- const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$1d);
1210
- const __iconNode$1c = [
1209
+ const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$1e);
1210
+ const __iconNode$1d = [
1211
1211
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
1212
1212
  [
1213
1213
  "path",
@@ -1217,59 +1217,59 @@ const __iconNode$1c = [
1217
1217
  }
1218
1218
  ]
1219
1219
  ];
1220
- const Clipboard = createLucideIcon("clipboard", __iconNode$1c);
1221
- const __iconNode$1b = [
1220
+ const Clipboard = createLucideIcon("clipboard", __iconNode$1d);
1221
+ const __iconNode$1c = [
1222
1222
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1223
1223
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
1224
1224
  ];
1225
- const Clock = createLucideIcon("clock", __iconNode$1b);
1226
- const __iconNode$1a = [
1225
+ const Clock = createLucideIcon("clock", __iconNode$1c);
1226
+ const __iconNode$1b = [
1227
1227
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
1228
1228
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
1229
1229
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
1230
1230
  ];
1231
- const CodeXml = createLucideIcon("code-xml", __iconNode$1a);
1232
- const __iconNode$19 = [
1231
+ const CodeXml = createLucideIcon("code-xml", __iconNode$1b);
1232
+ const __iconNode$1a = [
1233
1233
  ["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
1234
1234
  ["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
1235
1235
  ];
1236
- const Code = createLucideIcon("code", __iconNode$19);
1237
- const __iconNode$18 = [
1236
+ const Code = createLucideIcon("code", __iconNode$1a);
1237
+ const __iconNode$19 = [
1238
1238
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
1239
1239
  ["path", { d: "M12 3v18", key: "108xh3" }]
1240
1240
  ];
1241
- const Columns2 = createLucideIcon("columns-2", __iconNode$18);
1242
- const __iconNode$17 = [
1241
+ const Columns2 = createLucideIcon("columns-2", __iconNode$19);
1242
+ const __iconNode$18 = [
1243
1243
  [
1244
1244
  "path",
1245
1245
  { d: "M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3", key: "11bfej" }
1246
1246
  ]
1247
1247
  ];
1248
- const Command$1 = createLucideIcon("command", __iconNode$17);
1249
- const __iconNode$16 = [
1248
+ const Command$1 = createLucideIcon("command", __iconNode$18);
1249
+ const __iconNode$17 = [
1250
1250
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
1251
1251
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
1252
1252
  ];
1253
- const Copy = createLucideIcon("copy", __iconNode$16);
1254
- const __iconNode$15 = [
1253
+ const Copy = createLucideIcon("copy", __iconNode$17);
1254
+ const __iconNode$16 = [
1255
1255
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
1256
1256
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
1257
1257
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
1258
1258
  ];
1259
- const Database = createLucideIcon("database", __iconNode$15);
1260
- const __iconNode$14 = [
1259
+ const Database = createLucideIcon("database", __iconNode$16);
1260
+ const __iconNode$15 = [
1261
1261
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
1262
1262
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
1263
1263
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
1264
1264
  ];
1265
- const Download = createLucideIcon("download", __iconNode$14);
1266
- const __iconNode$13 = [
1265
+ const Download = createLucideIcon("download", __iconNode$15);
1266
+ const __iconNode$14 = [
1267
1267
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
1268
1268
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
1269
1269
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
1270
1270
  ];
1271
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$13);
1272
- const __iconNode$12 = [
1271
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$14);
1272
+ const __iconNode$13 = [
1273
1273
  ["path", { d: "m15 15 6 6", key: "1s409w" }],
1274
1274
  ["path", { d: "m15 9 6-6", key: "ko1vev" }],
1275
1275
  ["path", { d: "M21 16v5h-5", key: "1ck2sf" }],
@@ -1279,14 +1279,14 @@ const __iconNode$12 = [
1279
1279
  ["path", { d: "M3 8V3h5", key: "1ln10m" }],
1280
1280
  ["path", { d: "M9 9 3 3", key: "v551iv" }]
1281
1281
  ];
1282
- const Expand = createLucideIcon("expand", __iconNode$12);
1283
- const __iconNode$11 = [
1282
+ const Expand = createLucideIcon("expand", __iconNode$13);
1283
+ const __iconNode$12 = [
1284
1284
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
1285
1285
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
1286
1286
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
1287
1287
  ];
1288
- const ExternalLink$1 = createLucideIcon("external-link", __iconNode$11);
1289
- const __iconNode$10 = [
1288
+ const ExternalLink$1 = createLucideIcon("external-link", __iconNode$12);
1289
+ const __iconNode$11 = [
1290
1290
  [
1291
1291
  "path",
1292
1292
  {
@@ -1296,8 +1296,8 @@ const __iconNode$10 = [
1296
1296
  ],
1297
1297
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
1298
1298
  ];
1299
- const Eye = createLucideIcon("eye", __iconNode$10);
1300
- const __iconNode$$ = [
1299
+ const Eye = createLucideIcon("eye", __iconNode$11);
1300
+ const __iconNode$10 = [
1301
1301
  [
1302
1302
  "path",
1303
1303
  {
@@ -1315,8 +1315,8 @@ const __iconNode$$ = [
1315
1315
  { d: "M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1", key: "mpwhp6" }
1316
1316
  ]
1317
1317
  ];
1318
- const FileBraces = createLucideIcon("file-braces", __iconNode$$);
1319
- const __iconNode$_ = [
1318
+ const FileBraces = createLucideIcon("file-braces", __iconNode$10);
1319
+ const __iconNode$$ = [
1320
1320
  [
1321
1321
  "path",
1322
1322
  {
@@ -1328,8 +1328,8 @@ const __iconNode$_ = [
1328
1328
  ["path", { d: "m5 16-3 3 3 3", key: "331omg" }],
1329
1329
  ["path", { d: "m9 22 3-3-3-3", key: "lsp7cz" }]
1330
1330
  ];
1331
- const FileCodeCorner = createLucideIcon("file-code-corner", __iconNode$_);
1332
- const __iconNode$Z = [
1331
+ const FileCodeCorner = createLucideIcon("file-code-corner", __iconNode$$);
1332
+ const __iconNode$_ = [
1333
1333
  [
1334
1334
  "path",
1335
1335
  {
@@ -1340,8 +1340,8 @@ const __iconNode$Z = [
1340
1340
  ["path", { d: "M12 9v4", key: "juzpu7" }],
1341
1341
  ["path", { d: "M12 17h.01", key: "p32p05" }]
1342
1342
  ];
1343
- const FileExclamationPoint = createLucideIcon("file-exclamation-point", __iconNode$Z);
1344
- const __iconNode$Y = [
1343
+ const FileExclamationPoint = createLucideIcon("file-exclamation-point", __iconNode$_);
1344
+ const __iconNode$Z = [
1345
1345
  [
1346
1346
  "path",
1347
1347
  {
@@ -1353,8 +1353,8 @@ const __iconNode$Y = [
1353
1353
  ["path", { d: "M2 15h10", key: "jfw4w8" }],
1354
1354
  ["path", { d: "m9 18 3-3-3-3", key: "112psh" }]
1355
1355
  ];
1356
- const FileInput = createLucideIcon("file-input", __iconNode$Y);
1357
- const __iconNode$X = [
1356
+ const FileInput = createLucideIcon("file-input", __iconNode$Z);
1357
+ const __iconNode$Y = [
1358
1358
  [
1359
1359
  "path",
1360
1360
  {
@@ -1366,8 +1366,8 @@ const __iconNode$X = [
1366
1366
  ["path", { d: "M9 15h6", key: "cctwl0" }],
1367
1367
  ["path", { d: "M12 18v-6", key: "17g6i2" }]
1368
1368
  ];
1369
- const FilePlus = createLucideIcon("file-plus", __iconNode$X);
1370
- const __iconNode$W = [
1369
+ const FilePlus = createLucideIcon("file-plus", __iconNode$Y);
1370
+ const __iconNode$X = [
1371
1371
  [
1372
1372
  "path",
1373
1373
  {
@@ -1380,8 +1380,8 @@ const __iconNode$W = [
1380
1380
  ["path", { d: "M16 13H8", key: "t4e002" }],
1381
1381
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
1382
1382
  ];
1383
- const FileText = createLucideIcon("file-text", __iconNode$W);
1384
- const __iconNode$V = [
1383
+ const FileText = createLucideIcon("file-text", __iconNode$X);
1384
+ const __iconNode$W = [
1385
1385
  [
1386
1386
  "path",
1387
1387
  {
@@ -1391,8 +1391,8 @@ const __iconNode$V = [
1391
1391
  ],
1392
1392
  ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }]
1393
1393
  ];
1394
- const File = createLucideIcon("file", __iconNode$V);
1395
- const __iconNode$U = [
1394
+ const File = createLucideIcon("file", __iconNode$W);
1395
+ const __iconNode$V = [
1396
1396
  [
1397
1397
  "path",
1398
1398
  {
@@ -1401,8 +1401,8 @@ const __iconNode$U = [
1401
1401
  }
1402
1402
  ]
1403
1403
  ];
1404
- const FolderOpen = createLucideIcon("folder-open", __iconNode$U);
1405
- const __iconNode$T = [
1404
+ const FolderOpen = createLucideIcon("folder-open", __iconNode$V);
1405
+ const __iconNode$U = [
1406
1406
  ["path", { d: "M12 10v6", key: "1bos4e" }],
1407
1407
  ["path", { d: "M9 13h6", key: "1uhe8q" }],
1408
1408
  [
@@ -1413,8 +1413,8 @@ const __iconNode$T = [
1413
1413
  }
1414
1414
  ]
1415
1415
  ];
1416
- const FolderPlus = createLucideIcon("folder-plus", __iconNode$T);
1417
- const __iconNode$S = [
1416
+ const FolderPlus = createLucideIcon("folder-plus", __iconNode$U);
1417
+ const __iconNode$T = [
1418
1418
  [
1419
1419
  "path",
1420
1420
  {
@@ -1423,8 +1423,8 @@ const __iconNode$S = [
1423
1423
  }
1424
1424
  ]
1425
1425
  ];
1426
- const Folder = createLucideIcon("folder", __iconNode$S);
1427
- const __iconNode$R = [
1426
+ const Folder = createLucideIcon("folder", __iconNode$T);
1427
+ const __iconNode$S = [
1428
1428
  [
1429
1429
  "path",
1430
1430
  {
@@ -1437,39 +1437,39 @@ const __iconNode$R = [
1437
1437
  { d: "M3 8.268a2 2 0 0 0-1 1.738V19a2 2 0 0 0 2 2h11a2 2 0 0 0 1.732-1", key: "yxbcw3" }
1438
1438
  ]
1439
1439
  ];
1440
- const Folders = createLucideIcon("folders", __iconNode$R);
1441
- const __iconNode$Q = [
1440
+ const Folders = createLucideIcon("folders", __iconNode$S);
1441
+ const __iconNode$R = [
1442
1442
  ["path", { d: "M15 6a9 9 0 0 0-9 9V3", key: "1cii5b" }],
1443
1443
  ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
1444
1444
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }]
1445
1445
  ];
1446
- const GitBranch = createLucideIcon("git-branch", __iconNode$Q);
1447
- const __iconNode$P = [
1446
+ const GitBranch = createLucideIcon("git-branch", __iconNode$R);
1447
+ const __iconNode$Q = [
1448
1448
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }],
1449
1449
  ["line", { x1: "3", x2: "9", y1: "12", y2: "12", key: "1dyftd" }],
1450
1450
  ["line", { x1: "15", x2: "21", y1: "12", y2: "12", key: "oup4p8" }]
1451
1451
  ];
1452
- const GitCommitHorizontal = createLucideIcon("git-commit-horizontal", __iconNode$P);
1453
- const __iconNode$O = [
1452
+ const GitCommitHorizontal = createLucideIcon("git-commit-horizontal", __iconNode$Q);
1453
+ const __iconNode$P = [
1454
1454
  ["circle", { cx: "18", cy: "18", r: "3", key: "1xkwt0" }],
1455
1455
  ["circle", { cx: "6", cy: "6", r: "3", key: "1lh9wr" }],
1456
1456
  ["path", { d: "M13 6h3a2 2 0 0 1 2 2v7", key: "1yeb86" }],
1457
1457
  ["path", { d: "M11 18H8a2 2 0 0 1-2-2V9", key: "19pyzm" }]
1458
1458
  ];
1459
- const GitCompare = createLucideIcon("git-compare", __iconNode$O);
1460
- const __iconNode$N = [
1459
+ const GitCompare = createLucideIcon("git-compare", __iconNode$P);
1460
+ const __iconNode$O = [
1461
1461
  ["circle", { cx: "18", cy: "18", r: "3", key: "1xkwt0" }],
1462
1462
  ["circle", { cx: "6", cy: "6", r: "3", key: "1lh9wr" }],
1463
1463
  ["path", { d: "M6 21V9a9 9 0 0 0 9 9", key: "7kw0sc" }]
1464
1464
  ];
1465
- const GitMerge = createLucideIcon("git-merge", __iconNode$N);
1466
- const __iconNode$M = [
1465
+ const GitMerge = createLucideIcon("git-merge", __iconNode$O);
1466
+ const __iconNode$N = [
1467
1467
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1468
1468
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
1469
1469
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
1470
1470
  ];
1471
- const Globe = createLucideIcon("globe", __iconNode$M);
1472
- const __iconNode$L = [
1471
+ const Globe = createLucideIcon("globe", __iconNode$N);
1472
+ const __iconNode$M = [
1473
1473
  ["circle", { cx: "12", cy: "9", r: "1", key: "124mty" }],
1474
1474
  ["circle", { cx: "19", cy: "9", r: "1", key: "1ruzo2" }],
1475
1475
  ["circle", { cx: "5", cy: "9", r: "1", key: "1a8b28" }],
@@ -1477,14 +1477,14 @@ const __iconNode$L = [
1477
1477
  ["circle", { cx: "19", cy: "15", r: "1", key: "1a92ep" }],
1478
1478
  ["circle", { cx: "5", cy: "15", r: "1", key: "5r1jwy" }]
1479
1479
  ];
1480
- const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$L);
1481
- const __iconNode$K = [
1480
+ const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$M);
1481
+ const __iconNode$L = [
1482
1482
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
1483
1483
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }],
1484
1484
  ["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
1485
1485
  ];
1486
- const History = createLucideIcon("history", __iconNode$K);
1487
- const __iconNode$J = [
1486
+ const History = createLucideIcon("history", __iconNode$L);
1487
+ const __iconNode$K = [
1488
1488
  ["line", { x1: "2", x2: "22", y1: "2", y2: "22", key: "a6p6uj" }],
1489
1489
  ["path", { d: "M10.41 10.41a2 2 0 1 1-2.83-2.83", key: "1bzlo9" }],
1490
1490
  ["line", { x1: "13.5", x2: "6", y1: "13.5", y2: "21", key: "1q0aeu" }],
@@ -1498,13 +1498,19 @@ const __iconNode$J = [
1498
1498
  ],
1499
1499
  ["path", { d: "M21 15V5a2 2 0 0 0-2-2H9", key: "43el77" }]
1500
1500
  ];
1501
- const ImageOff = createLucideIcon("image-off", __iconNode$J);
1502
- const __iconNode$I = [
1501
+ const ImageOff = createLucideIcon("image-off", __iconNode$K);
1502
+ const __iconNode$J = [
1503
1503
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
1504
1504
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
1505
1505
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
1506
1506
  ];
1507
- const Image$1 = createLucideIcon("image", __iconNode$I);
1507
+ const Image$1 = createLucideIcon("image", __iconNode$J);
1508
+ const __iconNode$I = [
1509
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
1510
+ ["path", { d: "M12 16v-4", key: "1dtifu" }],
1511
+ ["path", { d: "M12 8h.01", key: "e9boi3" }]
1512
+ ];
1513
+ const Info$1 = createLucideIcon("info", __iconNode$I);
1508
1514
  const __iconNode$H = [
1509
1515
  ["path", { d: "M16 5H3", key: "m91uny" }],
1510
1516
  ["path", { d: "M11 12H3", key: "51ecnj" }],
@@ -18343,11 +18349,22 @@ function useUpdateProjectLabel() {
18343
18349
  }
18344
18350
  });
18345
18351
  }
18346
- function useGitInit() {
18352
+ function usePromoteProjectToGit() {
18347
18353
  const adapter2 = useAdapter();
18354
+ const queryClient2 = useQueryClient();
18348
18355
  const setError = useDashboardStore((s2) => s2.setError);
18349
18356
  return useMutation({
18350
- mutationFn: (path2) => adapter2.gitInit(path2),
18357
+ mutationFn: (name2) => {
18358
+ if (!adapter2.promoteProjectToGit) {
18359
+ return Promise.reject(
18360
+ new Error("This dashboard adapter doesn't support promoting plain projects to git.")
18361
+ );
18362
+ }
18363
+ return adapter2.promoteProjectToGit(name2);
18364
+ },
18365
+ onSuccess: () => {
18366
+ queryClient2.invalidateQueries({ queryKey: queryKeys.projects });
18367
+ },
18351
18368
  onError: (err) => {
18352
18369
  setError(String(err));
18353
18370
  }
@@ -18401,42 +18418,39 @@ function useRemoveWorkspace() {
18401
18418
  }
18402
18419
  function AddProjectDialog({ open: open2, onOpenChange, defaultLabel }) {
18403
18420
  const [path2, setPath] = reactExports.useState("");
18404
- const [needsGitInit, setNeedsGitInit] = reactExports.useState(false);
18405
- const [isChecking, setIsChecking] = reactExports.useState(false);
18421
+ const [isGitRepo, setIsGitRepo] = reactExports.useState(null);
18406
18422
  const addProjectMutation = useAddProject();
18407
- const gitInitMutation = useGitInit();
18408
18423
  const adapter2 = useAdapter();
18409
18424
  const capabilities2 = useCapabilities();
18410
18425
  const resetAndClose = () => {
18411
18426
  setPath("");
18412
- setNeedsGitInit(false);
18413
- setIsChecking(false);
18427
+ setIsGitRepo(null);
18414
18428
  onOpenChange(false);
18415
18429
  };
18430
+ reactExports.useEffect(() => {
18431
+ const trimmed = path2.trim();
18432
+ if (!trimmed) {
18433
+ setIsGitRepo(null);
18434
+ return;
18435
+ }
18436
+ let cancelled = false;
18437
+ const timer2 = setTimeout(async () => {
18438
+ try {
18439
+ const res = await adapter2.checkPath(trimmed);
18440
+ if (!cancelled) setIsGitRepo(res.isGitRepo);
18441
+ } catch {
18442
+ if (!cancelled) setIsGitRepo(null);
18443
+ }
18444
+ }, 300);
18445
+ return () => {
18446
+ cancelled = true;
18447
+ clearTimeout(timer2);
18448
+ };
18449
+ }, [path2, adapter2]);
18416
18450
  const handleSubmit = async (e2) => {
18417
18451
  e2.preventDefault();
18418
18452
  if (!path2.trim()) return;
18419
18453
  const trimmedPath = path2.trim();
18420
- if (needsGitInit) {
18421
- await gitInitMutation.mutateAsync(trimmedPath);
18422
- await addProjectMutation.mutateAsync({
18423
- path: trimmedPath,
18424
- label: defaultLabel ?? void 0
18425
- });
18426
- resetAndClose();
18427
- return;
18428
- }
18429
- setIsChecking(true);
18430
- try {
18431
- const { isGitRepo } = await adapter2.checkPath(trimmedPath);
18432
- if (!isGitRepo) {
18433
- setNeedsGitInit(true);
18434
- setIsChecking(false);
18435
- return;
18436
- }
18437
- } catch {
18438
- }
18439
- setIsChecking(false);
18440
18454
  await addProjectMutation.mutateAsync({
18441
18455
  path: trimmedPath,
18442
18456
  label: defaultLabel ?? void 0
@@ -18446,14 +18460,13 @@ function AddProjectDialog({ open: open2, onOpenChange, defaultLabel }) {
18446
18460
  const handleOpenChange = (open22) => {
18447
18461
  if (!open22) {
18448
18462
  setPath("");
18449
- setNeedsGitInit(false);
18450
- setIsChecking(false);
18463
+ setIsGitRepo(null);
18451
18464
  }
18452
18465
  onOpenChange(open22);
18453
18466
  };
18454
18467
  const handlePathChange = (e2) => {
18455
18468
  setPath(e2.target.value);
18456
- setNeedsGitInit(false);
18469
+ setIsGitRepo(null);
18457
18470
  };
18458
18471
  const handleBrowse = async () => {
18459
18472
  if (!capabilities2.pickFolder) return;
@@ -18461,25 +18474,25 @@ function AddProjectDialog({ open: open2, onOpenChange, defaultLabel }) {
18461
18474
  const selected = await capabilities2.pickFolder();
18462
18475
  if (selected) {
18463
18476
  setPath(selected);
18464
- setNeedsGitInit(false);
18477
+ setIsGitRepo(null);
18465
18478
  }
18466
18479
  } catch {
18467
18480
  }
18468
18481
  };
18469
- const isBusy = isChecking || addProjectMutation.isPending || gitInitMutation.isPending;
18482
+ const isBusy = addProjectMutation.isPending;
18470
18483
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogContent, { className: "sm:max-w-[425px]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, children: [
18471
18484
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
18472
18485
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Register Project" }),
18473
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Add a git repository to manage its workspaces." })
18486
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Add a folder to manage its workspaces. Git repositories enable branches and PRs; plain folders work too, with a single implicit workspace." })
18474
18487
  ] }),
18475
18488
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-3 py-4", children: [
18476
- /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "project-path", children: "Repository path" }),
18489
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "project-path", children: "Folder path" }),
18477
18490
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
18478
18491
  /* @__PURE__ */ jsxRuntimeExports.jsx(
18479
18492
  Input,
18480
18493
  {
18481
18494
  id: "project-path",
18482
- placeholder: "Path to git repository",
18495
+ placeholder: "Path to folder (git repo or plain folder)",
18483
18496
  value: path2,
18484
18497
  onChange: handlePathChange,
18485
18498
  autoFocus: true
@@ -18487,19 +18500,14 @@ function AddProjectDialog({ open: open2, onOpenChange, defaultLabel }) {
18487
18500
  ),
18488
18501
  capabilities2.pickFolder && /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: handleBrowse, children: /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, {}) })
18489
18502
  ] }),
18490
- needsGitInit && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3 text-sm", children: [
18491
- /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-4 shrink-0 text-yellow-500 mt-0.5" }),
18492
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
18493
- "This folder is not a git repository. Initialize it with",
18494
- " ",
18495
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 font-mono text-xs", children: "git init" }),
18496
- "?"
18497
- ] })
18503
+ isGitRepo === false && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2 rounded-md border border-blue-500/30 bg-blue-500/10 p-3 text-sm", children: [
18504
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Info$1, { className: "size-4 shrink-0 text-blue-500 mt-0.5" }),
18505
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "This folder isn't a git repo. Branch and PR features will be disabled. You can promote it to git later from the project context menu." })
18498
18506
  ] })
18499
18507
  ] }),
18500
18508
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
18501
18509
  /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", variant: "ghost", onClick: resetAndClose, children: "Cancel" }),
18502
- /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "submit", disabled: isBusy, children: needsGitInit ? "Initialize & Add" : "Add Project" })
18510
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "submit", disabled: isBusy, children: "Add Project" })
18503
18511
  ] })
18504
18512
  ] }) }) });
18505
18513
  }
@@ -40605,53 +40613,53 @@ async function loadLanguage(lang) {
40605
40613
  try {
40606
40614
  switch (lang) {
40607
40615
  case "javascript":
40608
- return import("./index-D2P0pxCr.js").then((m2) => m2.javascript());
40616
+ return import("./index-C-k9sCKq.js").then((m2) => m2.javascript());
40609
40617
  case "jsx":
40610
- return import("./index-D2P0pxCr.js").then((m2) => m2.javascript({ jsx: true }));
40618
+ return import("./index-C-k9sCKq.js").then((m2) => m2.javascript({ jsx: true }));
40611
40619
  case "typescript":
40612
- return import("./index-D2P0pxCr.js").then(
40620
+ return import("./index-C-k9sCKq.js").then(
40613
40621
  (m2) => m2.javascript({ typescript: true })
40614
40622
  );
40615
40623
  case "tsx":
40616
- return import("./index-D2P0pxCr.js").then(
40624
+ return import("./index-C-k9sCKq.js").then(
40617
40625
  (m2) => m2.javascript({ jsx: true, typescript: true })
40618
40626
  );
40619
40627
  case "python":
40620
- return import("./index-BT8sxrq0.js").then((m2) => m2.python());
40628
+ return import("./index-CiWhFogO.js").then((m2) => m2.python());
40621
40629
  case "html":
40622
- return import("./index-CaRM9svU.js").then((m2) => m2.html());
40630
+ return import("./index-BvBMEwhL.js").then((m2) => m2.html());
40623
40631
  case "css":
40624
- return import("./index-7k2BqwZv.js").then((m2) => m2.css());
40632
+ return import("./index-DPAkuW3l.js").then((m2) => m2.css());
40625
40633
  case "scss":
40626
40634
  case "sass":
40627
- return import("./index-DBbuiN2t.js").then((m2) => m2.sass());
40635
+ return import("./index-ayG05uhc.js").then((m2) => m2.sass());
40628
40636
  case "less":
40629
- return import("./index-CsnrxvSd.js").then((m2) => m2.less());
40637
+ return import("./index-D5nqcxSY.js").then((m2) => m2.less());
40630
40638
  case "json":
40631
40639
  case "jsonc":
40632
- return import("./index-C9H7VUtp.js").then((m2) => m2.json());
40640
+ return import("./index-DNaA-OTp.js").then((m2) => m2.json());
40633
40641
  case "markdown":
40634
40642
  case "mdx":
40635
- return import("./index-Dp5TbN68.js").then((m2) => m2.markdown());
40643
+ return import("./index-sKmEy2Z2.js").then((m2) => m2.markdown());
40636
40644
  case "xml":
40637
- return import("./index-DIv5BUol.js").then((m2) => m2.xml());
40645
+ return import("./index-xVhCXu45.js").then((m2) => m2.xml());
40638
40646
  case "yaml":
40639
- return import("./index-B9hFfb3C.js").then((m2) => m2.yaml());
40647
+ return import("./index-l8a7u6GS.js").then((m2) => m2.yaml());
40640
40648
  case "sql":
40641
- return import("./index-BJorH749.js").then((m2) => m2.sql());
40649
+ return import("./index-9M09S61v.js").then((m2) => m2.sql());
40642
40650
  case "rust":
40643
- return import("./index-CchdHjwq.js").then((m2) => m2.rust());
40651
+ return import("./index-Ce2uXVrE.js").then((m2) => m2.rust());
40644
40652
  case "go":
40645
- return import("./index-Crgd09US.js").then((m2) => m2.go());
40653
+ return import("./index-B5x9IUkQ.js").then((m2) => m2.go());
40646
40654
  case "java":
40647
- return import("./index-XaoY6ovr.js").then((m2) => m2.java());
40655
+ return import("./index-VtjR2oZj.js").then((m2) => m2.java());
40648
40656
  case "kotlin":
40649
- return import("./index-XaoY6ovr.js").then((m2) => m2.java());
40657
+ return import("./index-VtjR2oZj.js").then((m2) => m2.java());
40650
40658
  case "c":
40651
40659
  case "cpp":
40652
- return import("./index-BhJN38EV.js").then((m2) => m2.cpp());
40660
+ return import("./index-CKmyLecf.js").then((m2) => m2.cpp());
40653
40661
  case "php":
40654
- return import("./index-DsLZMKNC.js").then((m2) => m2.php());
40662
+ return import("./index-CXnsJrX8.js").then((m2) => m2.php());
40655
40663
  // Legacy modes via StreamLanguage
40656
40664
  case "bash":
40657
40665
  case "fish":
@@ -41459,13 +41467,13 @@ function buildCommands(deps) {
41459
41467
  action: () => deps.openQuickOpen()
41460
41468
  },
41461
41469
  {
41462
- // Note: Cmd+Shift+F is owned by "Format Current File" (matches
41463
- // JetBrains' "Reformat Code" binding). Search-in-Files moves to
41464
- // Cmd+Shift+H same key VS Code uses for "Replace in Files", which
41465
- // is conceptually close enough that the muscle memory transfers.
41470
+ // ⇧⌘F Search in Files (matches VS Code's "Search in Files" /
41471
+ // "Find in Files" binding, the same kbd hint advertised by the
41472
+ // file-tree tooltip and the file-toolbar dropdown). Format
41473
+ // Current File lives at ⇧⌥F (also VS Code parity, see below).
41466
41474
  id: "search-files",
41467
41475
  label: "Search in Files",
41468
- shortcut: "Cmd+Shift+H",
41476
+ shortcut: "Cmd+Shift+F",
41469
41477
  action: () => deps.openSearchFiles()
41470
41478
  },
41471
41479
  {
@@ -41481,9 +41489,14 @@ function buildCommands(deps) {
41481
41489
  // event with detail, so the matching FileViewer responds. The
41482
41490
  // keyboard handler dispatches the same event with the same detail
41483
41491
  // shape — both paths funnel through one FileViewer listener.
41492
+ //
41493
+ // ⇧⌥F mirrors VS Code's default "Format Document" binding. Note
41494
+ // it's the only entry in this registry without Cmd/Ctrl in the
41495
+ // chord — the keyboard handler special-cases it above its mod
41496
+ // gate so the keystroke reaches us in the first place.
41484
41497
  id: "format-current-file",
41485
41498
  label: "Format Current File",
41486
- shortcut: "Cmd+Shift+F",
41499
+ shortcut: "Shift+Alt+F",
41487
41500
  action: () => deps.formatCurrentFile()
41488
41501
  },
41489
41502
  {
@@ -46595,6 +46608,28 @@ function NewWorkspaceDialog({ projectName, open: open2, onOpenChange }) {
46595
46608
  ] })
46596
46609
  ] }) }) });
46597
46610
  }
46611
+ function PromoteToGitDialog({ open: open2, onOpenChange, onConfirm, projectName }) {
46612
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-[425px]", onClick: (e2) => e2.stopPropagation(), children: [
46613
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
46614
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Promote to git" }),
46615
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogDescription, { children: [
46616
+ "This will run ",
46617
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "git init -b main" }),
46618
+ " in ",
46619
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: projectName }),
46620
+ " and turn it into a git repository."
46621
+ ] })
46622
+ ] }),
46623
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-2 text-sm", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2 rounded-md border border-blue-500/30 bg-blue-500/10 p-3", children: [
46624
+ /* @__PURE__ */ jsxRuntimeExports.jsx(GitBranch, { className: "size-4 shrink-0 text-blue-500 mt-0.5" }),
46625
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "After promotion you'll be able to create branches, view diffs, and use git pull / push for this project. The existing workspace stays in place." })
46626
+ ] }) }),
46627
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
46628
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }),
46629
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { onClick: onConfirm, children: "Promote to git" })
46630
+ ] })
46631
+ ] }) });
46632
+ }
46598
46633
  function GitStatusIndicator({ git }) {
46599
46634
  const parts = [];
46600
46635
  if (git.conflict) {
@@ -46650,10 +46685,31 @@ function SetupStatusIndicator({ setup }) {
46650
46685
  }
46651
46686
  return null;
46652
46687
  }
46688
+ const RECENT_ACTIVATION_WINDOW_MS = 300;
46689
+ let recentlyActivatedWorkspaceId = null;
46690
+ let recentlyActivatedTimer = null;
46691
+ function markRecentActivation(workspaceId) {
46692
+ recentlyActivatedWorkspaceId = workspaceId;
46693
+ if (recentlyActivatedTimer) clearTimeout(recentlyActivatedTimer);
46694
+ recentlyActivatedTimer = setTimeout(() => {
46695
+ recentlyActivatedWorkspaceId = null;
46696
+ recentlyActivatedTimer = null;
46697
+ }, RECENT_ACTIVATION_WINDOW_MS);
46698
+ }
46699
+ function consumeRecentActivation(workspaceId) {
46700
+ if (recentlyActivatedWorkspaceId !== workspaceId) return false;
46701
+ recentlyActivatedWorkspaceId = null;
46702
+ if (recentlyActivatedTimer) {
46703
+ clearTimeout(recentlyActivatedTimer);
46704
+ recentlyActivatedTimer = null;
46705
+ }
46706
+ return true;
46707
+ }
46653
46708
  const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46654
46709
  worktree,
46655
46710
  projectName,
46656
46711
  defaultBranch,
46712
+ projectKind,
46657
46713
  status,
46658
46714
  branchStatus,
46659
46715
  setupStatus,
@@ -46662,13 +46718,9 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46662
46718
  showProjectName,
46663
46719
  onTogglePinned
46664
46720
  }) {
46721
+ const isPlain = projectKind === "plain";
46665
46722
  const cardRef = reactExports.useRef(null);
46666
46723
  const capabilities2 = useCapabilities();
46667
- reactExports.useEffect(() => {
46668
- if (isFocused) {
46669
- cardRef.current?.scrollIntoView({ block: "nearest" });
46670
- }
46671
- }, [isFocused]);
46672
46724
  const openWorkspace = useDashboardStore((s2) => s2.openWorkspace);
46673
46725
  const clearNeedsAttention = useDashboardStore((s2) => s2.clearNeedsAttention);
46674
46726
  const runScript = useDashboardStore((s2) => s2.runScript);
@@ -46679,8 +46731,14 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46679
46731
  const workspaceId = toWorkspaceId(projectName, worktree.branch);
46680
46732
  const isActive = useDashboardStore((s2) => s2.activeWorkspaceId === workspaceId);
46681
46733
  const href = capabilities2.getWorkspaceHref?.(workspaceId);
46734
+ reactExports.useEffect(() => {
46735
+ if (!isActive) return;
46736
+ if (consumeRecentActivation(workspaceId)) return;
46737
+ cardRef.current?.scrollIntoView({ block: "center" });
46738
+ }, [isActive, workspaceId]);
46682
46739
  const handleClick = () => {
46683
46740
  clearNeedsAttention(workspaceId);
46741
+ markRecentActivation(workspaceId);
46684
46742
  if (href && capabilities2.navigate) {
46685
46743
  capabilities2.navigate(href);
46686
46744
  } else if (!href) {
@@ -46692,6 +46750,12 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46692
46750
  ref: cardRef,
46693
46751
  className,
46694
46752
  tabIndex: 0,
46753
+ // Semantic markers — let tests, screen readers, and future styling
46754
+ // changes target the active card without depending on the Tailwind
46755
+ // class string. `aria-current="page"` is the standard ARIA pattern for
46756
+ // "currently-active link in a list of related links".
46757
+ "data-active": isActive || void 0,
46758
+ "aria-current": isActive ? "page" : void 0,
46695
46759
  onClick: (e2) => {
46696
46760
  e2.stopPropagation();
46697
46761
  handleClick();
@@ -46737,8 +46801,8 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46737
46801
  ] }),
46738
46802
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden @[10rem]:flex group-hover:flex items-center gap-2 shrink-0 ml-auto pl-2", children: [
46739
46803
  /* @__PURE__ */ jsxRuntimeExports.jsx(SetupStatusIndicator, { setup: setupStatus }),
46740
- branchStatus && /* @__PURE__ */ jsxRuntimeExports.jsx(GitStatusIndicator, { git: branchStatus.git }),
46741
- branchStatus && /* @__PURE__ */ jsxRuntimeExports.jsx(CIStatusIndicator, { ci: branchStatus.ci })
46804
+ !isPlain && branchStatus && /* @__PURE__ */ jsxRuntimeExports.jsx(GitStatusIndicator, { git: branchStatus.git }),
46805
+ !isPlain && branchStatus && /* @__PURE__ */ jsxRuntimeExports.jsx(CIStatusIndicator, { ci: branchStatus.ci })
46742
46806
  ] })
46743
46807
  ] }) }),
46744
46808
  /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
@@ -46763,15 +46827,15 @@ const WorkspaceCard = reactExports.memo(function WorkspaceCard2({
46763
46827
  /* @__PURE__ */ jsxRuntimeExports.jsx(Square, {}),
46764
46828
  "Run teardown"
46765
46829
  ] }),
46766
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPull(projectName, worktree.branch), children: [
46830
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPull(projectName, worktree.branch), children: [
46767
46831
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowDownToLine, {}),
46768
46832
  "Git pull"
46769
46833
  ] }),
46770
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPush(projectName, worktree.branch), children: [
46834
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => gitPush(projectName, worktree.branch), children: [
46771
46835
  /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowUpFromLine, {}),
46772
46836
  "Git push"
46773
46837
  ] }),
46774
- worktree.branch !== defaultBranch && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: handleDelete2, children: [
46838
+ !isPlain && worktree.branch !== defaultBranch && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: handleDelete2, children: [
46775
46839
  /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
46776
46840
  "Delete workspace"
46777
46841
  ] })
@@ -46785,6 +46849,7 @@ function SortableProject({
46785
46849
  setupStatuses,
46786
46850
  removeProject,
46787
46851
  updateProjectLabel,
46852
+ onPromoteToGit,
46788
46853
  labels,
46789
46854
  setWorkspaceDialog,
46790
46855
  onShowDeleteDialog,
@@ -46795,24 +46860,46 @@ function SortableProject({
46795
46860
  hasPinnedSiblings,
46796
46861
  onTogglePinned
46797
46862
  }) {
46863
+ const isPlain = project.kind === "plain";
46798
46864
  const { attributes, listeners: listeners2, setNodeRef, transform: transform2, transition, isDragging } = useSortable({
46799
46865
  id: project.name
46800
46866
  });
46801
46867
  const capabilities2 = useCapabilities();
46868
+ const adapter2 = useAdapter();
46869
+ const canPromoteToGit = typeof adapter2.promoteProjectToGit === "function";
46802
46870
  const { active } = useDndContext();
46803
46871
  const style2 = {
46804
46872
  transform: CSS$1.Translate.toString(transform2),
46805
46873
  transition: active ? transition : void 0,
46806
46874
  opacity: isDragging ? 0.5 : void 0
46807
46875
  };
46876
+ const openWorkspace = useDashboardStore((s2) => s2.openWorkspace);
46877
+ const clearNeedsAttention = useDashboardStore((s2) => s2.clearNeedsAttention);
46878
+ const plainBranch = isPlain ? project.worktrees[0].branch : "";
46879
+ const plainWorkspaceId = isPlain ? toWorkspaceId(project.name, plainBranch) : "";
46880
+ const plainIsActive = useDashboardStore(
46881
+ (s2) => isPlain && s2.activeWorkspaceId === plainWorkspaceId
46882
+ );
46883
+ const plainHref = isPlain ? capabilities2.getWorkspaceHref?.(plainWorkspaceId) : void 0;
46884
+ const plainAgent = isPlain ? statuses.get(plainWorkspaceId)?.agent : void 0;
46885
+ const plainIsFocused = isPlain && workspaceIndexStart === focusedIndex;
46886
+ const handlePlainOpen = () => {
46887
+ clearNeedsAttention(plainWorkspaceId);
46888
+ if (plainHref && capabilities2.navigate) {
46889
+ capabilities2.navigate(plainHref);
46890
+ } else if (!plainHref) {
46891
+ openWorkspace(plainWorkspaceId);
46892
+ }
46893
+ };
46808
46894
  let workspaceIndex = workspaceIndexStart;
46895
+ const headerClassName = isPlain ? `group flex items-center justify-between mb-0.5 pl-1 pr-1 py-1.5 min-w-0 overflow-hidden cursor-pointer select-none touch-pan-y transition-colors hover:bg-accent/50 ${plainIsActive ? "bg-accent/50 border-l-2 border-l-primary" : ""} ${plainIsFocused ? "ring-2 ring-inset ring-ring" : ""}` : "group flex items-center justify-between mb-0.5 pl-1 pr-0 select-none touch-pan-y";
46809
46896
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: setNodeRef, style: style2, className: "min-w-0 px-2", children: [
46810
46897
  /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
46811
46898
  /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
46812
46899
  "div",
46813
46900
  {
46814
- className: "group flex items-center justify-between mb-0.5 pl-1 pr-0 select-none touch-pan-y",
46815
- onClick: () => onToggleCollapse(project.name),
46901
+ className: headerClassName,
46902
+ onClick: () => isPlain ? handlePlainOpen() : onToggleCollapse(project.name),
46816
46903
  children: [
46817
46904
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
46818
46905
  "div",
@@ -46821,15 +46908,30 @@ function SortableProject({
46821
46908
  ...attributes,
46822
46909
  ...listeners2,
46823
46910
  children: [
46824
- collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-4 shrink-0 text-muted-foreground" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-4 shrink-0 text-muted-foreground" }),
46911
+ isPlain ? (
46912
+ // Plain project: agent-status dot when the agent is
46913
+ // working / needs attention, otherwise a project-sized
46914
+ // (size-4) Folder icon. Inlined rather than routing
46915
+ // through AgentStatusIndicator's fallback so the idle
46916
+ // icon can match a git project's folder size — using the
46917
+ // indicator's size-3 fallback would make plain headers
46918
+ // read as nested workspace cards (see #427 review).
46919
+ plainAgent && (plainAgent.status === "working" || plainAgent.status === "needs_attention") ? /* @__PURE__ */ jsxRuntimeExports.jsx(AgentStatusIndicator, { agent: plainAgent, isActive: plainIsActive }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-4 shrink-0 text-muted-foreground" })
46920
+ ) : collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-4 shrink-0 text-muted-foreground" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-4 shrink-0 text-muted-foreground" }),
46825
46921
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
46826
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-sm font-semibold text-foreground/80 truncate", children: project.name }) }),
46922
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
46923
+ "h2",
46924
+ {
46925
+ className: `text-sm font-semibold truncate ${isPlain && plainIsActive ? "text-foreground" : "text-foreground/80"}`,
46926
+ children: project.name
46927
+ }
46928
+ ) }),
46827
46929
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { side: "top", children: project.name })
46828
46930
  ] })
46829
46931
  ]
46830
46932
  }
46831
46933
  ),
46832
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
46934
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1", children: !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
46833
46935
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
46834
46936
  Button,
46835
46937
  {
@@ -46849,7 +46951,7 @@ function SortableProject({
46849
46951
  }
46850
46952
  ) }),
46851
46953
  /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
46852
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onToggleCollapse(project.name), children: [
46954
+ !isPlain && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onToggleCollapse(project.name), children: [
46853
46955
  /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: collapsed ? "" : "rotate-90" }),
46854
46956
  collapsed ? "Expand" : "Collapse"
46855
46957
  ] }),
@@ -46883,6 +46985,10 @@ function SortableProject({
46883
46985
  ))
46884
46986
  ] }) })
46885
46987
  ] }),
46988
+ isPlain && canPromoteToGit && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onPromoteToGit(project.name), children: [
46989
+ /* @__PURE__ */ jsxRuntimeExports.jsx(GitBranch, {}),
46990
+ "Promote to git…"
46991
+ ] }),
46886
46992
  capabilities2.copyPath && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => navigator.clipboard.writeText(project.path), children: [
46887
46993
  /* @__PURE__ */ jsxRuntimeExports.jsx(Clipboard, {}),
46888
46994
  "Copy path"
@@ -46897,7 +47003,7 @@ function SortableProject({
46897
47003
  ] })
46898
47004
  ] })
46899
47005
  ] }),
46900
- !collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-0.5 overflow-hidden", children: project.worktrees.length === 0 ? hasPinnedSiblings ? null : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground px-4 py-2", children: "No workspaces yet" }) : project.worktrees.map((wt2) => {
47006
+ !isPlain && !collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-0.5 overflow-hidden", children: project.worktrees.length === 0 ? hasPinnedSiblings ? null : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground px-4 py-2", children: "No workspaces yet" }) : project.worktrees.map((wt2) => {
46901
47007
  const wsId = toWorkspaceId(project.name, wt2.branch);
46902
47008
  const currentIndex = workspaceIndex++;
46903
47009
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -46906,6 +47012,7 @@ function SortableProject({
46906
47012
  worktree: wt2,
46907
47013
  projectName: project.name,
46908
47014
  defaultBranch: project.defaultBranch,
47015
+ projectKind: project.kind,
46909
47016
  status: statuses.get(wsId),
46910
47017
  branchStatus: branchStatuses.get(wsId),
46911
47018
  setupStatus: setupStatuses.get(wsId),
@@ -46975,9 +47082,11 @@ function ProjectList({ labelFilter }) {
46975
47082
  const removeProjectMutation = useRemoveProject();
46976
47083
  const reorderProjectsMutation = useReorderProjects();
46977
47084
  const updateProjectLabelMutation = useUpdateProjectLabel();
47085
+ const promoteProjectToGitMutation = usePromoteProjectToGit();
46978
47086
  const removeWorkspaceMutation = useRemoveWorkspace();
46979
47087
  const [workspaceDialog, setWorkspaceDialog] = reactExports.useState(null);
46980
47088
  const [deleteDialog, setDeleteDialog] = reactExports.useState(null);
47089
+ const [promoteDialog, setPromoteDialog] = reactExports.useState(null);
46981
47090
  const [focusedIndex, setFocusedIndex] = reactExports.useState(-1);
46982
47091
  const [activeDragId, setActiveDragId] = reactExports.useState(null);
46983
47092
  const containerRef = reactExports.useRef(null);
@@ -46985,7 +47094,11 @@ function ProjectList({ labelFilter }) {
46985
47094
  const projectCollapse = useCollapseState(PROJECTS_COLLAPSE_KEY);
46986
47095
  const labelCollapse = useCollapseState(LABELS_COLLAPSE_KEY);
46987
47096
  const pinnedCollapse = useCollapseState(PINNED_COLLAPSE_KEY);
46988
- const { pinned: pinnedEntries, toggle: togglePinned } = usePinnedWorkspaces();
47097
+ const { pinned: pinnedEntriesRaw, toggle: togglePinned } = usePinnedWorkspaces();
47098
+ const pinnedEntries = reactExports.useMemo(
47099
+ () => pinnedEntriesRaw.filter((e2) => e2.project.kind !== "plain"),
47100
+ [pinnedEntriesRaw]
47101
+ );
46989
47102
  const sensors = useSensors(
46990
47103
  useSensor(MouseSensor, { activationConstraint: { distance: 8 } }),
46991
47104
  useSensor(TouchSensor, { activationConstraint: { delay: 250, tolerance: 5 } })
@@ -46993,6 +47106,7 @@ function ProjectList({ labelFilter }) {
46993
47106
  const { displayProjects, projectsWithPinned } = reactExports.useMemo(() => {
46994
47107
  const withPinned = /* @__PURE__ */ new Set();
46995
47108
  const display = projects.map((p2) => {
47109
+ if (p2.kind === "plain") return p2;
46996
47110
  const filtered = p2.worktrees.filter((w3) => !w3.pinned);
46997
47111
  if (filtered.length !== p2.worktrees.length) withPinned.add(p2.name);
46998
47112
  return { ...p2, worktrees: filtered };
@@ -47134,6 +47248,7 @@ function ProjectList({ labelFilter }) {
47134
47248
  const capabilities2 = useCapabilities();
47135
47249
  const selectWorkspace = reactExports.useCallback(
47136
47250
  (wsId) => {
47251
+ markRecentActivation(wsId);
47137
47252
  const href = capabilities2.getWorkspaceHref?.(wsId);
47138
47253
  if (href && capabilities2.navigate) {
47139
47254
  capabilities2.navigate(href);
@@ -47196,7 +47311,7 @@ function ProjectList({ labelFilter }) {
47196
47311
  if (projects.length === 0) {
47197
47312
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-muted-foreground", children: [
47198
47313
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg mb-2", children: "No projects registered" }),
47199
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", children: "Click the + button to register a git repository" })
47314
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", children: "Click the + button to register a folder" })
47200
47315
  ] });
47201
47316
  }
47202
47317
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
@@ -47237,6 +47352,7 @@ function ProjectList({ labelFilter }) {
47237
47352
  worktree,
47238
47353
  projectName: project.name,
47239
47354
  defaultBranch: project.defaultBranch,
47355
+ projectKind: project.kind,
47240
47356
  status: statuses.get(workspaceId),
47241
47357
  branchStatus: branchStatuses.get(workspaceId),
47242
47358
  setupStatus: setupStatuses.get(workspaceId),
@@ -47285,6 +47401,7 @@ function ProjectList({ labelFilter }) {
47285
47401
  setupStatuses,
47286
47402
  removeProject: (name2) => removeProjectMutation.mutate(name2),
47287
47403
  updateProjectLabel: (name2, label) => updateProjectLabelMutation.mutate({ name: name2, label }),
47404
+ onPromoteToGit: setPromoteDialog,
47288
47405
  labels,
47289
47406
  setWorkspaceDialog,
47290
47407
  onShowDeleteDialog: setDeleteDialog,
@@ -47337,6 +47454,22 @@ function ProjectList({ labelFilter }) {
47337
47454
  isDirty: deleteDialog?.isDirty ?? false,
47338
47455
  hasUnpushedCommits: deleteDialog?.hasUnpushedCommits ?? false
47339
47456
  }
47457
+ ),
47458
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
47459
+ PromoteToGitDialog,
47460
+ {
47461
+ open: promoteDialog !== null,
47462
+ onOpenChange: (open2) => {
47463
+ if (!open2) setPromoteDialog(null);
47464
+ },
47465
+ onConfirm: () => {
47466
+ if (!promoteDialog) return;
47467
+ promoteProjectToGitMutation.mutate(promoteDialog, {
47468
+ onSettled: () => setPromoteDialog(null)
47469
+ });
47470
+ },
47471
+ projectName: promoteDialog ?? ""
47472
+ }
47340
47473
  )
47341
47474
  ] });
47342
47475
  }
@@ -48272,9 +48405,13 @@ function DashboardShell({ toolbarMenuItems, hideTitleBar, hideMenu }) {
48272
48405
  ref: rootRef,
48273
48406
  className: cn$2(
48274
48407
  "w-full overflow-hidden flex flex-col bg-background text-foreground p-0",
48275
- hideTitleBar ? "h-full" : "h-dvh",
48408
+ hideTitleBar && "h-full",
48276
48409
  !isDesktop$1 && "pt-[env(safe-area-inset-top)]"
48277
48410
  ),
48411
+ style: hideTitleBar ? void 0 : {
48412
+ // sync-with: ZOOM_CSS_VAR in apps/web/src/lib/zoom.ts
48413
+ height: "calc(100dvh / var(--app-zoom, 1))"
48414
+ },
48278
48415
  children: [
48279
48416
  isDesktop$1 && !hideTitleBar && /* @__PURE__ */ jsxRuntimeExports.jsx(
48280
48417
  "div",
@@ -50110,6 +50247,22 @@ function useDiffTarget(workspaceId) {
50110
50247
  );
50111
50248
  return { diffMode, compareBranch, setDiffMode, setCompareBranch };
50112
50249
  }
50250
+ function useProjectKindMap() {
50251
+ const { projects } = useProjects();
50252
+ return reactExports.useMemo(() => {
50253
+ const map2 = /* @__PURE__ */ new Map();
50254
+ for (const p2 of projects) {
50255
+ for (const wt2 of p2.worktrees) {
50256
+ map2.set(toWorkspaceId(p2.name, wt2.branch), p2.kind);
50257
+ }
50258
+ }
50259
+ return map2;
50260
+ }, [projects]);
50261
+ }
50262
+ function useProjectKindForWorkspace(workspaceId) {
50263
+ const map2 = useProjectKindMap();
50264
+ return map2.get(workspaceId);
50265
+ }
50113
50266
  const DEFAULT_SEARCH_OPTIONS = {
50114
50267
  caseSensitive: false,
50115
50268
  wholeWord: false,
@@ -50794,11 +50947,20 @@ function ChangesFileTree({
50794
50947
  onRevertPaths
50795
50948
  }) {
50796
50949
  const tree = reactExports.useMemo(() => buildFileTree(fileStatuses), [fileStatuses]);
50797
- const [expandedPaths, setExpandedPaths] = reactExports.useState(() => {
50798
- return new Set(collectDirPaths(tree));
50799
- });
50950
+ const seenDirPathsRef = reactExports.useRef(new Set(collectDirPaths(tree)));
50951
+ const [expandedPaths, setExpandedPaths] = reactExports.useState(
50952
+ () => new Set(seenDirPathsRef.current)
50953
+ );
50800
50954
  reactExports.useEffect(() => {
50801
- setExpandedPaths(new Set(collectDirPaths(tree)));
50955
+ const currentDirs = collectDirPaths(tree);
50956
+ const newDirs = currentDirs.filter((p2) => !seenDirPathsRef.current.has(p2));
50957
+ if (newDirs.length === 0) return;
50958
+ for (const p2 of newDirs) seenDirPathsRef.current.add(p2);
50959
+ setExpandedPaths((prev2) => {
50960
+ const next2 = new Set(prev2);
50961
+ for (const p2 of newDirs) next2.add(p2);
50962
+ return next2;
50963
+ });
50802
50964
  }, [tree]);
50803
50965
  const handleToggle = (path2) => {
50804
50966
  setExpandedPaths((prev2) => {
@@ -50846,9 +51008,6 @@ function ChangesFileTree({
50846
51008
  }
50847
51009
  }, [pendingReset, onRevertPaths]);
50848
51010
  const canReset = Boolean(onRevertPaths);
50849
- if (tree.length === 0) {
50850
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-16 items-center justify-center text-[13px] text-muted-foreground", children: "No files" });
50851
- }
50852
51011
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
50853
51012
  tree.map((node2) => /* @__PURE__ */ jsxRuntimeExports.jsx(
50854
51013
  ChangesTreeNode,
@@ -51668,6 +51827,8 @@ function DiffView({
51668
51827
  onFindInFile
51669
51828
  }) {
51670
51829
  const adapter2 = useAdapter();
51830
+ const projectKind = useProjectKindForWorkspace(workspaceId);
51831
+ const isPlain = projectKind === "plain";
51671
51832
  const [summary, setSummary] = reactExports.useState(null);
51672
51833
  const summaryRef = reactExports.useRef(null);
51673
51834
  const [error, setError] = reactExports.useState(null);
@@ -52037,6 +52198,15 @@ function DiffView({
52037
52198
  reactExports.useEffect(() => {
52038
52199
  const getWorkspaceDiffSummary = adapter2.getWorkspaceDiffSummary;
52039
52200
  if (!getWorkspaceDiffSummary) return;
52201
+ if (isPlain) {
52202
+ setLoading(false);
52203
+ setSummary(null);
52204
+ summaryRef.current = null;
52205
+ setError(null);
52206
+ onStatsChange?.(null);
52207
+ return;
52208
+ }
52209
+ if (projectKind === void 0) return;
52040
52210
  let cancelled = false;
52041
52211
  setLoading(true);
52042
52212
  setSummary(null);
@@ -52078,8 +52248,8 @@ function DiffView({
52078
52248
  }
52079
52249
  }
52080
52250
  }
52081
- const hasChanges = result.stats.filesChanged > 0;
52082
- onStatsChange?.(hasChanges ? result.stats : null);
52251
+ const hasChanges2 = result.stats.filesChanged > 0;
52252
+ onStatsChange?.(hasChanges2 ? result.stats : null);
52083
52253
  }
52084
52254
  }).catch((err) => {
52085
52255
  if (!cancelled) setError(err instanceof Error ? err.message : "Failed to load diff");
@@ -52103,7 +52273,22 @@ function DiffView({
52103
52273
  fetchSummaryRef.current = null;
52104
52274
  unsubscribe?.();
52105
52275
  };
52106
- }, [adapter2, workspaceId, active, onStatsChange, diffMode, compareBranch, fetchFileDiff]);
52276
+ }, [
52277
+ adapter2,
52278
+ workspaceId,
52279
+ active,
52280
+ onStatsChange,
52281
+ diffMode,
52282
+ compareBranch,
52283
+ fetchFileDiff,
52284
+ // `isPlain` and `projectKind` are both listed even though the
52285
+ // former is derived from the latter — required to keep
52286
+ // react/exhaustive-deps quiet. The body references both: `isPlain`
52287
+ // drives the short-circuit, `projectKind` gates the
52288
+ // undefined-during-load early return.
52289
+ isPlain,
52290
+ projectKind
52291
+ ]);
52107
52292
  const summaryCompareBranch = summary?.compareBranch ?? null;
52108
52293
  const defaultBranch = summary?.defaultBranch ?? availableDefaultBranch ?? null;
52109
52294
  const branchOptions = availableBranches.length > 0 ? availableBranches : summaryCompareBranch ? [summaryCompareBranch] : [];
@@ -52134,11 +52319,8 @@ function DiffView({
52134
52319
  otherBranches.map((branch) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: branch, children: branch }, branch))
52135
52320
  ] })
52136
52321
  ] });
52137
- if (loading) {
52138
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: "Loading changes..." });
52139
- }
52140
- if (error) {
52141
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center text-sm text-destructive", children: error });
52322
+ if (isPlain) {
52323
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center px-6 text-center text-sm text-muted-foreground", children: "This folder is not a git repository — changes are not tracked." });
52142
52324
  }
52143
52325
  const ghostBtnClass = "hidden size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground @[40rem]/diff:inline-flex";
52144
52326
  const ghostBtnAlwaysClass = "inline-flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground";
@@ -52187,52 +52369,22 @@ function DiffView({
52187
52369
  }
52188
52370
  )
52189
52371
  ] });
52190
- if (!summary || summary.stats.filesChanged === 0) {
52191
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [
52192
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-9 shrink-0 items-center justify-between gap-3 border-b border-border pl-3 pr-3", children: [
52193
- renderBranchIndicator(summary?.headBranch),
52194
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1", children: renderGitSyncButtons() })
52195
- ] }),
52196
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-h-0 flex-1 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-muted-foreground", children: "No changes" }) }),
52197
- gitOpStatus && /* @__PURE__ */ jsxRuntimeExports.jsxs(
52198
- "div",
52199
- {
52200
- role: gitOpStatus.state === "error" ? "alert" : "status",
52201
- className: `flex shrink-0 items-center gap-2 border-t px-3 py-1.5 text-xs ${gitOpStatus.state === "error" ? "border-destructive/40 bg-destructive/10 text-destructive" : "border-border bg-muted/50 text-muted-foreground"}`,
52202
- children: [
52203
- gitOpStatus.state === "running" && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
52204
- /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }),
52205
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: gitOpStatus.op === "pull" ? "Pulling…" : "Pushing…" })
52206
- ] }),
52207
- gitOpStatus.state === "success" && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
52208
- /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5 text-green-600 dark:text-green-400" }),
52209
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: gitOpStatus.op === "pull" ? "Pulled" : "Pushed" })
52210
- ] }),
52211
- gitOpStatus.state === "error" && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
52212
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium", children: [
52213
- gitOpStatus.op === "pull" ? "Pull failed" : "Push failed",
52214
- ":"
52215
- ] }),
52216
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate", title: gitOpStatus.message, children: gitOpStatus.message }),
52217
- /* @__PURE__ */ jsxRuntimeExports.jsx(
52218
- "button",
52219
- {
52220
- type: "button",
52221
- onClick: () => setGitOpStatus(null),
52222
- className: "shrink-0 rounded px-1 text-destructive hover:bg-destructive/20",
52223
- "aria-label": "Dismiss error",
52224
- children: "×"
52225
- }
52226
- )
52227
- ] })
52228
- ]
52229
- }
52230
- )
52231
- ] });
52232
- }
52233
- const fileStatuses = summary.fileStatuses || {};
52372
+ const renderReloadButton = () => /* @__PURE__ */ jsxRuntimeExports.jsx(
52373
+ "button",
52374
+ {
52375
+ type: "button",
52376
+ onClick: () => fetchSummaryRef.current?.(true),
52377
+ className: ghostBtnAlwaysClass,
52378
+ title: "Reload changes",
52379
+ "aria-label": "Reload changes",
52380
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
52381
+ }
52382
+ );
52383
+ const hasChanges = Boolean(!error && summary && summary.stats.filesChanged > 0);
52384
+ const fileStatuses = hasChanges ? summary?.fileStatuses ?? {} : {};
52234
52385
  const filenames = flattenFileTreeOrder(buildFileTree(fileStatuses));
52235
52386
  filenamesRef.current = filenames;
52387
+ const stats = hasChanges ? summary.stats : null;
52236
52388
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: rootRef, className: "@container/diff flex h-full overflow-hidden", children: [
52237
52389
  sidebarOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs(
52238
52390
  "div",
@@ -52249,7 +52401,8 @@ function DiffView({
52249
52401
  onSelectFile: handleScrollToFile,
52250
52402
  activeFile,
52251
52403
  onRevertPaths: adapter2.revertFile ? handleRevertPaths : void 0
52252
- }
52404
+ },
52405
+ workspaceId
52253
52406
  ) })
52254
52407
  ]
52255
52408
  }
@@ -52265,9 +52418,13 @@ function DiffView({
52265
52418
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-9 shrink-0 items-center justify-between gap-3 border-b border-border pl-2 pr-3", children: [
52266
52419
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
52267
52420
  renderSidebarToggle(),
52268
- renderBranchIndicator(summary.headBranch)
52421
+ renderBranchIndicator(summary?.headBranch)
52269
52422
  ] }),
52270
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden items-center gap-1 @[44rem]/diff:flex", children: [
52423
+ !hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
52424
+ renderGitSyncButtons(),
52425
+ renderReloadButton()
52426
+ ] }),
52427
+ hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden items-center gap-1 @[44rem]/diff:flex", children: [
52271
52428
  canCommit && /* @__PURE__ */ jsxRuntimeExports.jsx(
52272
52429
  "button",
52273
52430
  {
@@ -52304,17 +52461,7 @@ function DiffView({
52304
52461
  children: isPushing ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowUpFromLine, { className: "size-3.5" })
52305
52462
  }
52306
52463
  ),
52307
- /* @__PURE__ */ jsxRuntimeExports.jsx(
52308
- "button",
52309
- {
52310
- type: "button",
52311
- onClick: () => fetchSummaryRef.current?.(true),
52312
- className: ghostBtnAlwaysClass,
52313
- title: "Reload changes",
52314
- "aria-label": "Reload changes",
52315
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" })
52316
- }
52317
- ),
52464
+ renderReloadButton(),
52318
52465
  /* @__PURE__ */ jsxRuntimeExports.jsx(
52319
52466
  "button",
52320
52467
  {
@@ -52365,7 +52512,7 @@ function DiffView({
52365
52512
  )
52366
52513
  ] })
52367
52514
  ] }),
52368
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center @[44rem]/diff:hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
52515
+ hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center @[44rem]/diff:hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
52369
52516
  /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
52370
52517
  "button",
52371
52518
  {
@@ -52377,10 +52524,17 @@ function DiffView({
52377
52524
  }
52378
52525
  ) }),
52379
52526
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "end", children: [
52380
- canCommit && /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onSelect: () => setCommitDialogOpen(true), disabled: gitOpBusy, children: [
52381
- /* @__PURE__ */ jsxRuntimeExports.jsx(GitCommitHorizontal, { className: "size-4" }),
52382
- "Commit changes"
52383
- ] }),
52527
+ canCommit && /* @__PURE__ */ jsxRuntimeExports.jsxs(
52528
+ DropdownMenuItem,
52529
+ {
52530
+ onSelect: () => setCommitDialogOpen(true),
52531
+ disabled: gitOpBusy,
52532
+ children: [
52533
+ /* @__PURE__ */ jsxRuntimeExports.jsx(GitCommitHorizontal, { className: "size-4" }),
52534
+ "Commit changes"
52535
+ ]
52536
+ }
52537
+ ),
52384
52538
  canPull && /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuItem, { onSelect: () => handleGitPull(), disabled: gitOpBusy, children: [
52385
52539
  isPulling ? /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowDownToLine, { className: "size-4" }),
52386
52540
  "Git pull"
@@ -52415,7 +52569,7 @@ function DiffView({
52415
52569
  ] })
52416
52570
  ] }) })
52417
52571
  ] }),
52418
- search2.searchOpen && /* @__PURE__ */ jsxRuntimeExports.jsx(
52572
+ hasChanges && search2.searchOpen && /* @__PURE__ */ jsxRuntimeExports.jsx(
52419
52573
  SearchBar,
52420
52574
  {
52421
52575
  ref: search2.searchBarRef,
@@ -52430,7 +52584,31 @@ function DiffView({
52430
52584
  onClose: search2.handleCloseSearch
52431
52585
  }
52432
52586
  ),
52433
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: scrollContainerRef, 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) => {
52587
+ !hasChanges && // role="status" implies aria-live="polite" spell both out as a
52588
+ // defensive pattern. aria-atomic ensures the whole label is
52589
+ // re-read on each transition (e.g. "Loading changes…" → "No
52590
+ // changes" after a ref switch). `<output>` would be biome's
52591
+ // preferred semantic element but it's specifically for the
52592
+ // result of a form computation; a generic status region is
52593
+ // a better fit here.
52594
+ // biome-ignore lint/a11y/useSemanticElements: see comment above.
52595
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
52596
+ "div",
52597
+ {
52598
+ role: "status",
52599
+ "aria-live": "polite",
52600
+ "aria-atomic": "true",
52601
+ className: "flex min-h-0 flex-1 items-center justify-center",
52602
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
52603
+ "span",
52604
+ {
52605
+ className: `text-sm ${!loading && error ? "text-destructive" : "text-muted-foreground"}`,
52606
+ children: loading ? "Loading changes..." : error ? error : "No changes"
52607
+ }
52608
+ )
52609
+ }
52610
+ ),
52611
+ hasChanges && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: scrollContainerRef, 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) => {
52434
52612
  const isLast = index2 === filenames.length - 1;
52435
52613
  const row2 = /* @__PURE__ */ jsxRuntimeExports.jsx(
52436
52614
  LazyFileRow,
@@ -52500,19 +52678,19 @@ function DiffView({
52500
52678
  ]
52501
52679
  }
52502
52680
  ),
52503
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-9 shrink-0 items-center border-t border-border px-3 text-sm text-muted-foreground", children: [
52504
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: summary.stats.filesChanged }),
52681
+ stats && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-9 shrink-0 items-center border-t border-border px-3 text-sm text-muted-foreground", children: [
52682
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: stats.filesChanged }),
52505
52683
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1", children: [
52506
- summary.stats.filesChanged === 1 ? "file" : "files",
52684
+ stats.filesChanged === 1 ? "file" : "files",
52507
52685
  " changed"
52508
52686
  ] }),
52509
- summary.stats.insertions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-2 text-green-600 dark:text-green-400", children: [
52687
+ stats.insertions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-2 text-green-600 dark:text-green-400", children: [
52510
52688
  "+",
52511
- summary.stats.insertions
52689
+ stats.insertions
52512
52690
  ] }),
52513
- summary.stats.deletions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1 text-red-600 dark:text-red-400", children: [
52691
+ stats.deletions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1 text-red-600 dark:text-red-400", children: [
52514
52692
  "-",
52515
- summary.stats.deletions
52693
+ stats.deletions
52516
52694
  ] })
52517
52695
  ] })
52518
52696
  ] }),
@@ -52522,7 +52700,7 @@ function DiffView({
52522
52700
  open: commitDialogOpen,
52523
52701
  onOpenChange: setCommitDialogOpen,
52524
52702
  workspaceId,
52525
- filesChanged: summary.stats.filesChanged,
52703
+ filesChanged: stats?.filesChanged ?? 0,
52526
52704
  onCommitted: () => {
52527
52705
  fetchSummaryRef.current?.(true);
52528
52706
  }
@@ -54287,8 +54465,12 @@ function QuickOpenDialog({
54287
54465
  const canOpenExternal = !!capabilities2.pickFile;
54288
54466
  const handleOpenExternal = reactExports.useCallback(() => {
54289
54467
  onOpenChange(false);
54290
- window.dispatchEvent(new CustomEvent("band:open-file-external"));
54291
- }, [onOpenChange]);
54468
+ window.dispatchEvent(
54469
+ new CustomEvent("band:open-file-external", {
54470
+ detail: { workspaceId }
54471
+ })
54472
+ );
54473
+ }, [onOpenChange, workspaceId]);
54292
54474
  const displayFiles = showRecent ? recentFiles : files;
54293
54475
  const groupHeading = showRecent ? "Recent files" : void 0;
54294
54476
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2 && dialogVisible, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "overflow-hidden p-0 sm:max-w-[520px]", showCloseButton: false, children: [
@@ -61089,7 +61271,10 @@ class WebDashboardAdapter {
61089
61271
  });
61090
61272
  async listProjects() {
61091
61273
  const data = await this.trpc.projects.list.query();
61092
- return data.projects;
61274
+ return data.projects.map((p2) => ({
61275
+ ...p2,
61276
+ kind: p2.kind ?? "git"
61277
+ }));
61093
61278
  }
61094
61279
  async addProject(path2, label) {
61095
61280
  await this.trpc.projects.add.mutate({ path: path2, label });
@@ -61109,6 +61294,9 @@ class WebDashboardAdapter {
61109
61294
  async gitInit(path2) {
61110
61295
  await this.trpc.projects.gitInit.mutate({ path: path2 });
61111
61296
  }
61297
+ async promoteProjectToGit(name2) {
61298
+ await this.trpc.projects.promoteToGit.mutate({ name: name2 });
61299
+ }
61112
61300
  async createWorkspace(project, branch, base2, prompt) {
61113
61301
  await this.trpc.workspaces.create.mutate({ project, branch, base: base2, prompt });
61114
61302
  }
@@ -61980,45 +62168,6 @@ function DesktopTitleBar({
61980
62168
  function DesktopDragRegion() {
61981
62169
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-[38px] shrink-0", style: DRAG_STYLE });
61982
62170
  }
61983
- function parseWorkspaceFromPath(pathname) {
61984
- const match = pathname.match(/^\/workspace\/([^/]+)/);
61985
- return match ? decodeURIComponent(match[1]) : null;
61986
- }
61987
- const state$1 = /* @__PURE__ */ new Map();
61988
- const listeners$2 = /* @__PURE__ */ new Map();
61989
- const DEFAULT = { wsActive: true };
61990
- function notify(workspaceId) {
61991
- const set2 = listeners$2.get(workspaceId);
61992
- if (set2) {
61993
- for (const cb of set2) cb();
61994
- }
61995
- }
61996
- function setWsActive(workspaceId, wsActive) {
61997
- const prev2 = state$1.get(workspaceId);
61998
- if (prev2?.wsActive === wsActive) return;
61999
- state$1.set(workspaceId, { wsActive });
62000
- notify(workspaceId);
62001
- }
62002
- function getWsActive(workspaceId) {
62003
- return state$1.get(workspaceId)?.wsActive ?? DEFAULT.wsActive;
62004
- }
62005
- function subscribe$3(workspaceId, cb) {
62006
- let set2 = listeners$2.get(workspaceId);
62007
- if (!set2) {
62008
- set2 = /* @__PURE__ */ new Set();
62009
- listeners$2.set(workspaceId, set2);
62010
- }
62011
- set2.add(cb);
62012
- return () => {
62013
- set2.delete(cb);
62014
- if (set2.size === 0) listeners$2.delete(workspaceId);
62015
- };
62016
- }
62017
- function useWsActive(workspaceId) {
62018
- const sub2 = reactExports.useCallback((cb) => subscribe$3(workspaceId, cb), [workspaceId]);
62019
- const snap = reactExports.useCallback(() => getWsActive(workspaceId), [workspaceId]);
62020
- return reactExports.useSyncExternalStore(sub2, snap);
62021
- }
62022
62171
  class TransferObject {
62023
62172
  }
62024
62173
  class PanelTransfer extends TransferObject {
@@ -76986,6 +77135,10 @@ function useRecentFiles(workspaceId) {
76986
77135
  );
76987
77136
  return { recentFiles, trackFile };
76988
77137
  }
77138
+ function parseWorkspaceFromPath(pathname) {
77139
+ const match = pathname.match(/^\/workspace\/([^/]+)/);
77140
+ return match ? decodeURIComponent(match[1]) : null;
77141
+ }
76989
77142
  function gt(e2, t2) {
76990
77143
  const n2 = getComputedStyle(e2), o3 = parseFloat(n2.fontSize);
76991
77144
  return t2 * o3;
@@ -105180,7 +105333,7 @@ var tn = f$5("block", "before:content-[counter(line)]", "before:inline-block", "
105180
105333
  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 });
105181
105334
  var Se$1 = reactExports.createContext({ code: "" }), de$2 = () => reactExports.useContext(Se$1);
105182
105335
  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 }) });
105183
- var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-D6ahbJdi.js").then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), rt = ({ code: e2, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
105336
+ var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-DX00yTJM.js").then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), rt = ({ code: e2, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
105184
105337
  let i2 = reactExports.useMemo(() => e2.replace(cn, ""), [e2]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i2.split(`
105185
105338
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i2]);
105186
105339
  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 }) })] }) });
@@ -105502,7 +105655,7 @@ var Dt = ({ children: e2, className: t2, onDownload: o3, onError: n2 }) => {
105502
105655
  }, []), 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] });
105503
105656
  };
105504
105657
  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 }) })] });
105505
- var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-C7xGj9Xg.js").then((e2) => ({ default: e2.Mermaid }))), Kn = /language-([^\s]+)/;
105658
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-DxhML77C.js").then((e2) => ({ default: e2.Mermaid }))), Kn = /language-([^\s]+)/;
105506
105659
  function ke$1(e2, t2) {
105507
105660
  if (!(e2 != null && e2.position || t2 != null && t2.position)) return true;
105508
105661
  if (!(e2 != null && e2.position && (t2 != null && t2.position))) return false;
@@ -155304,12 +155457,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
155304
155457
  registerLayoutLoaders([
155305
155458
  {
155306
155459
  name: "dagre",
155307
- loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-CH-VbyTI.js"), "loader")
155460
+ loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-D_Mh5gNH.js"), "loader")
155308
155461
  },
155309
155462
  ...[
155310
155463
  {
155311
155464
  name: "cose-bilkent",
155312
- loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-BhU6LMhN.js"), "loader")
155465
+ loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-V_MYkZlm.js"), "loader")
155313
155466
  }
155314
155467
  ]
155315
155468
  ]);
@@ -155748,7 +155901,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
155748
155901
  return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
155749
155902
  }, "detector");
155750
155903
  var loader = /* @__PURE__ */ __name(async () => {
155751
- const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-BcLh1QQl.js");
155904
+ const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-nGE1cXwD.js");
155752
155905
  return { id, diagram: diagram2 };
155753
155906
  }, "loader");
155754
155907
  var plugin = {
@@ -155765,7 +155918,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
155765
155918
  return /^\s*graph/.test(txt);
155766
155919
  }, "detector");
155767
155920
  var loader2 = /* @__PURE__ */ __name(async () => {
155768
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-hg6b4dSR.js");
155921
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Bk7aIalC.js");
155769
155922
  return { id: id2, diagram: diagram2 };
155770
155923
  }, "loader");
155771
155924
  var plugin2 = {
@@ -155788,7 +155941,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
155788
155941
  return /^\s*flowchart/.test(txt);
155789
155942
  }, "detector");
155790
155943
  var loader3 = /* @__PURE__ */ __name(async () => {
155791
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-hg6b4dSR.js");
155944
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Bk7aIalC.js");
155792
155945
  return { id: id3, diagram: diagram2 };
155793
155946
  }, "loader");
155794
155947
  var plugin3 = {
@@ -155802,7 +155955,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
155802
155955
  return /^\s*erDiagram/.test(txt);
155803
155956
  }, "detector");
155804
155957
  var loader4 = /* @__PURE__ */ __name(async () => {
155805
- const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-DeBKeqCX.js");
155958
+ const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-CzG0zKt-.js");
155806
155959
  return { id: id4, diagram: diagram2 };
155807
155960
  }, "loader");
155808
155961
  var plugin4 = {
@@ -155816,7 +155969,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
155816
155969
  return /^\s*gitGraph/.test(txt);
155817
155970
  }, "detector");
155818
155971
  var loader5 = /* @__PURE__ */ __name(async () => {
155819
- const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-CN8rFh7o.js");
155972
+ const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-OV2DR1Ux.js");
155820
155973
  return { id: id5, diagram: diagram2 };
155821
155974
  }, "loader");
155822
155975
  var plugin5 = {
@@ -155830,7 +155983,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
155830
155983
  return /^\s*gantt/.test(txt);
155831
155984
  }, "detector");
155832
155985
  var loader6 = /* @__PURE__ */ __name(async () => {
155833
- const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-oy5gzveG.js");
155986
+ const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-wmt8nm9q.js");
155834
155987
  return { id: id6, diagram: diagram2 };
155835
155988
  }, "loader");
155836
155989
  var plugin6 = {
@@ -155844,7 +155997,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
155844
155997
  return /^\s*info/.test(txt);
155845
155998
  }, "detector");
155846
155999
  var loader7 = /* @__PURE__ */ __name(async () => {
155847
- const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-P_hugt8D.js");
156000
+ const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-D8EoxteQ.js");
155848
156001
  return { id: id7, diagram: diagram2 };
155849
156002
  }, "loader");
155850
156003
  var info = {
@@ -155857,7 +156010,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
155857
156010
  return /^\s*pie/.test(txt);
155858
156011
  }, "detector");
155859
156012
  var loader8 = /* @__PURE__ */ __name(async () => {
155860
- const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-YXV3ET4_.js");
156013
+ const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-Bw3RR9nb.js");
155861
156014
  return { id: id8, diagram: diagram2 };
155862
156015
  }, "loader");
155863
156016
  var pie = {
@@ -155870,7 +156023,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
155870
156023
  return /^\s*quadrantChart/.test(txt);
155871
156024
  }, "detector");
155872
156025
  var loader9 = /* @__PURE__ */ __name(async () => {
155873
- const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-r_peNHCA.js");
156026
+ const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-CpLsW_Ir.js");
155874
156027
  return { id: id9, diagram: diagram2 };
155875
156028
  }, "loader");
155876
156029
  var plugin7 = {
@@ -155884,7 +156037,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
155884
156037
  return /^\s*xychart(-beta)?/.test(txt);
155885
156038
  }, "detector");
155886
156039
  var loader10 = /* @__PURE__ */ __name(async () => {
155887
- const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-0ftH7hFg.js");
156040
+ const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-Cq7t_yS-.js");
155888
156041
  return { id: id10, diagram: diagram2 };
155889
156042
  }, "loader");
155890
156043
  var plugin8 = {
@@ -155898,7 +156051,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
155898
156051
  return /^\s*requirement(Diagram)?/.test(txt);
155899
156052
  }, "detector");
155900
156053
  var loader11 = /* @__PURE__ */ __name(async () => {
155901
- const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-aI3jQPLf.js");
156054
+ const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-DkGtaEnw.js");
155902
156055
  return { id: id11, diagram: diagram2 };
155903
156056
  }, "loader");
155904
156057
  var plugin9 = {
@@ -155912,7 +156065,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
155912
156065
  return /^\s*sequenceDiagram/.test(txt);
155913
156066
  }, "detector");
155914
156067
  var loader12 = /* @__PURE__ */ __name(async () => {
155915
- const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-DrJxigNy.js");
156068
+ const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-BMW4qEme.js");
155916
156069
  return { id: id12, diagram: diagram2 };
155917
156070
  }, "loader");
155918
156071
  var plugin10 = {
@@ -155929,7 +156082,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
155929
156082
  return /^\s*classDiagram/.test(txt);
155930
156083
  }, "detector");
155931
156084
  var loader13 = /* @__PURE__ */ __name(async () => {
155932
- const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-BvOdRP7s.js");
156085
+ const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-D3C4Rk7Q.js");
155933
156086
  return { id: id13, diagram: diagram2 };
155934
156087
  }, "loader");
155935
156088
  var plugin11 = {
@@ -155946,7 +156099,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
155946
156099
  return /^\s*classDiagram-v2/.test(txt);
155947
156100
  }, "detector");
155948
156101
  var loader14 = /* @__PURE__ */ __name(async () => {
155949
- const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-BvOdRP7s.js");
156102
+ const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-D3C4Rk7Q.js");
155950
156103
  return { id: id14, diagram: diagram2 };
155951
156104
  }, "loader");
155952
156105
  var plugin12 = {
@@ -155963,7 +156116,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
155963
156116
  return /^\s*stateDiagram/.test(txt);
155964
156117
  }, "detector");
155965
156118
  var loader15 = /* @__PURE__ */ __name(async () => {
155966
- const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-Dnsp85zH.js");
156119
+ const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-C7xazM8E.js");
155967
156120
  return { id: id15, diagram: diagram2 };
155968
156121
  }, "loader");
155969
156122
  var plugin13 = {
@@ -155983,7 +156136,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
155983
156136
  return false;
155984
156137
  }, "detector");
155985
156138
  var loader16 = /* @__PURE__ */ __name(async () => {
155986
- const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-C6x8SVRv.js");
156139
+ const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-D_rYvDGP.js");
155987
156140
  return { id: id16, diagram: diagram2 };
155988
156141
  }, "loader");
155989
156142
  var plugin14 = {
@@ -155997,7 +156150,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
155997
156150
  return /^\s*journey/.test(txt);
155998
156151
  }, "detector");
155999
156152
  var loader17 = /* @__PURE__ */ __name(async () => {
156000
- const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-lQfkL_-i.js");
156153
+ const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-BwZk-fnC.js");
156001
156154
  return { id: id17, diagram: diagram2 };
156002
156155
  }, "loader");
156003
156156
  var plugin15 = {
@@ -156064,7 +156217,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
156064
156217
  return false;
156065
156218
  }, "detector");
156066
156219
  var loader18 = /* @__PURE__ */ __name(async () => {
156067
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-hg6b4dSR.js");
156220
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-Bk7aIalC.js");
156068
156221
  return { id: id18, diagram: diagram2 };
156069
156222
  }, "loader");
156070
156223
  var plugin16 = {
@@ -156078,7 +156231,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
156078
156231
  return /^\s*timeline/.test(txt);
156079
156232
  }, "detector");
156080
156233
  var loader19 = /* @__PURE__ */ __name(async () => {
156081
- const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-DSIrepaO.js");
156234
+ const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-BaAlfxrc.js");
156082
156235
  return { id: id19, diagram: diagram2 };
156083
156236
  }, "loader");
156084
156237
  var plugin17 = {
@@ -156092,7 +156245,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
156092
156245
  return /^\s*mindmap/.test(txt);
156093
156246
  }, "detector");
156094
156247
  var loader20 = /* @__PURE__ */ __name(async () => {
156095
- const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-Byc-qFo2.js");
156248
+ const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-Bg8B0Ls9.js");
156096
156249
  return { id: id20, diagram: diagram2 };
156097
156250
  }, "loader");
156098
156251
  var plugin18 = {
@@ -156106,7 +156259,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
156106
156259
  return /^\s*kanban/.test(txt);
156107
156260
  }, "detector");
156108
156261
  var loader21 = /* @__PURE__ */ __name(async () => {
156109
- const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-CFh-YdaO.js");
156262
+ const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-DEfYos8T.js");
156110
156263
  return { id: id21, diagram: diagram2 };
156111
156264
  }, "loader");
156112
156265
  var plugin19 = {
@@ -156120,7 +156273,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
156120
156273
  return /^\s*sankey(-beta)?/.test(txt);
156121
156274
  }, "detector");
156122
156275
  var loader22 = /* @__PURE__ */ __name(async () => {
156123
- const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-B1Sb9Zvd.js");
156276
+ const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-CtEV3_Bx.js");
156124
156277
  return { id: id22, diagram: diagram2 };
156125
156278
  }, "loader");
156126
156279
  var plugin20 = {
@@ -156134,7 +156287,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
156134
156287
  return /^\s*packet(-beta)?/.test(txt);
156135
156288
  }, "detector");
156136
156289
  var loader23 = /* @__PURE__ */ __name(async () => {
156137
- const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-CsrxbKjr.js");
156290
+ const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-B8urPf9c.js");
156138
156291
  return { id: id23, diagram: diagram2 };
156139
156292
  }, "loader");
156140
156293
  var packet = {
@@ -156147,7 +156300,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
156147
156300
  return /^\s*radar-beta/.test(txt);
156148
156301
  }, "detector");
156149
156302
  var loader24 = /* @__PURE__ */ __name(async () => {
156150
- const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-rlYyF51_.js");
156303
+ const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-BcfmavO-.js");
156151
156304
  return { id: id24, diagram: diagram2 };
156152
156305
  }, "loader");
156153
156306
  var radar = {
@@ -156160,7 +156313,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
156160
156313
  return /^\s*block(-beta)?/.test(txt);
156161
156314
  }, "detector");
156162
156315
  var loader25 = /* @__PURE__ */ __name(async () => {
156163
- const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-UhTmqpkK.js");
156316
+ const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-C0oBPtSv.js");
156164
156317
  return { id: id25, diagram: diagram2 };
156165
156318
  }, "loader");
156166
156319
  var plugin21 = {
@@ -156174,7 +156327,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
156174
156327
  return /^\s*architecture/.test(txt);
156175
156328
  }, "detector");
156176
156329
  var loader26 = /* @__PURE__ */ __name(async () => {
156177
- const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-H4ZI6Opr.js");
156330
+ const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-tjTQ4ZaT.js");
156178
156331
  return { id: id26, diagram: diagram2 };
156179
156332
  }, "loader");
156180
156333
  var architecture = {
@@ -156188,7 +156341,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
156188
156341
  return /^\s*treemap/.test(txt);
156189
156342
  }, "detector");
156190
156343
  var loader27 = /* @__PURE__ */ __name(async () => {
156191
- const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-BE0vVJdc.js");
156344
+ const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-B9dGPsE9.js");
156192
156345
  return { id: id27, diagram: diagram2 };
156193
156346
  }, "loader");
156194
156347
  var treemap = {
@@ -157809,13 +157962,26 @@ function CodeBrowserView({
157809
157962
  },
157810
157963
  [notifySelectFile, pushDepartureAndArrival, fileTabs.openTabPinned, viewFilePath]
157811
157964
  );
157965
+ const handleTabClose = reactExports.useCallback(
157966
+ (filePath) => {
157967
+ tabState.removeFile(filePath);
157968
+ delete savedEditorStatesRef.current[filePath];
157969
+ window.dispatchEvent(new CustomEvent("band:dirty-change"));
157970
+ fileTabs.closeTab(filePath);
157971
+ },
157972
+ [fileTabs.closeTab, tabState.removeFile]
157973
+ );
157812
157974
  const handleBack = reactExports.useCallback(() => {
157975
+ if (viewFilePath && isUntitledPath(viewFilePath)) {
157976
+ handleTabClose(viewFilePath);
157977
+ return;
157978
+ }
157813
157979
  setViewFilePath("");
157814
157980
  setViewLine(void 0);
157815
157981
  setViewLineEnd(void 0);
157816
157982
  setViewColumn(void 0);
157817
157983
  notifySelectFile(null);
157818
- }, [notifySelectFile]);
157984
+ }, [viewFilePath, handleTabClose, notifySelectFile]);
157819
157985
  const handleTabSelect = reactExports.useCallback(
157820
157986
  (filePath) => {
157821
157987
  const view = editorViewRef.current;
@@ -157840,15 +158006,6 @@ function CodeBrowserView({
157840
158006
  },
157841
158007
  [fileTabs.setActiveTab, notifySelectFile, viewFilePath, tabState.update]
157842
158008
  );
157843
- const handleTabClose = reactExports.useCallback(
157844
- (filePath) => {
157845
- tabState.removeFile(filePath);
157846
- delete savedEditorStatesRef.current[filePath];
157847
- window.dispatchEvent(new CustomEvent("band:dirty-change"));
157848
- fileTabs.closeTab(filePath);
157849
- },
157850
- [fileTabs.closeTab, tabState.removeFile]
157851
- );
157852
158009
  const skipInitialTabSync = reactExports.useRef(true);
157853
158010
  reactExports.useEffect(() => {
157854
158011
  if (skipInitialTabSync.current) {
@@ -157984,12 +158141,14 @@ function CodeBrowserView({
157984
158141
  }, [pickFile, fileTabs.openTabExternal]);
157985
158142
  reactExports.useEffect(() => {
157986
158143
  if (!pickFile) return;
157987
- const handler = () => {
158144
+ const handler = (e2) => {
158145
+ const detail = e2.detail;
158146
+ if (detail?.workspaceId && detail.workspaceId !== workspaceId) return;
157988
158147
  void handleOpenExternalFile();
157989
158148
  };
157990
158149
  window.addEventListener("band:open-file-external", handler);
157991
158150
  return () => window.removeEventListener("band:open-file-external", handler);
157992
- }, [pickFile, handleOpenExternalFile]);
158151
+ }, [pickFile, handleOpenExternalFile, workspaceId]);
157993
158152
  const pickSaveFile = capabilities2.pickSaveFile;
157994
158153
  const handleNewUntitled = reactExports.useCallback(() => {
157995
158154
  const { filePath } = fileTabs.openTabUntitled();
@@ -158065,14 +158224,24 @@ function CodeBrowserView({
158065
158224
  },
158066
158225
  [handleSaveUntitled, tabState]
158067
158226
  );
158227
+ const [, bumpLanguageOverrideVersion] = reactExports.useReducer((x2) => x2 + 1, 0);
158068
158228
  const handleLanguageOverride = reactExports.useCallback(
158069
158229
  (filePath, languageId) => {
158070
158230
  if (languageId === AUTO_DETECT_LANGUAGE_ID) {
158071
158231
  tabState.update(filePath, { language: void 0 });
158072
- return;
158232
+ } else {
158233
+ tabState.setLanguage(filePath, languageId);
158073
158234
  }
158074
- tabState.setLanguage(filePath, languageId);
158235
+ bumpLanguageOverrideVersion();
158075
158236
  },
158237
+ // `bumpLanguageOverrideVersion` is the dispatch returned by
158238
+ // `useReducer`, which React guarantees is referentially stable —
158239
+ // both biome's `useExhaustiveDependencies` rule and
158240
+ // `eslint-plugin-react-hooks` recognise the stable-dispatch
158241
+ // contract and treat its omission as correct (in fact biome flags
158242
+ // its inclusion as over-specifying). If a future refactor swaps
158243
+ // the bump source for something less stable (e.g. a regular
158244
+ // useState setter wrapped in a closure), add it to this array.
158076
158245
  [tabState]
158077
158246
  );
158078
158247
  const flushActiveEditorState = reactExports.useCallback(() => {
@@ -158453,7 +158622,7 @@ function injectInitialUrls(layout, urls) {
158453
158622
  }
158454
158623
  let domOverlayCount = 0;
158455
158624
  let manualHoldCount = 0;
158456
- const listeners$1 = /* @__PURE__ */ new Set();
158625
+ const listeners$2 = /* @__PURE__ */ new Set();
158457
158626
  let lastEmitted = false;
158458
158627
  function isFrozen() {
158459
158628
  return domOverlayCount + manualHoldCount > 0;
@@ -158462,12 +158631,12 @@ function emitIfChanged() {
158462
158631
  const next2 = isFrozen();
158463
158632
  if (next2 === lastEmitted) return;
158464
158633
  lastEmitted = next2;
158465
- for (const l4 of listeners$1) l4();
158634
+ for (const l4 of listeners$2) l4();
158466
158635
  }
158467
158636
  function subscribe$1(l4) {
158468
- listeners$1.add(l4);
158637
+ listeners$2.add(l4);
158469
158638
  return () => {
158470
- listeners$1.delete(l4);
158639
+ listeners$2.delete(l4);
158471
158640
  };
158472
158641
  }
158473
158642
  function getSnapshot$1() {
@@ -158856,13 +159025,13 @@ function useBrowserPaneFreeze(args) {
158856
159025
  return { snapshot };
158857
159026
  }
158858
159027
  let hosts = /* @__PURE__ */ new Set();
158859
- const listeners = /* @__PURE__ */ new Set();
159028
+ const listeners$1 = /* @__PURE__ */ new Set();
158860
159029
  let bootstrapped = false;
158861
159030
  function setHosts(updater) {
158862
159031
  const next2 = updater(hosts);
158863
159032
  if (next2 === hosts) return;
158864
159033
  hosts = next2;
158865
- for (const cb of listeners) cb();
159034
+ for (const cb of listeners$1) cb();
158866
159035
  }
158867
159036
  function addHost(raw2) {
158868
159037
  const h2 = raw2.toLowerCase();
@@ -158892,9 +159061,9 @@ function bootstrap() {
158892
159061
  }
158893
159062
  function subscribe(cb) {
158894
159063
  bootstrap();
158895
- listeners.add(cb);
159064
+ listeners$1.add(cb);
158896
159065
  return () => {
158897
- listeners.delete(cb);
159066
+ listeners$1.delete(cb);
158898
159067
  };
158899
159068
  }
158900
159069
  function getSnapshot() {
@@ -172946,6 +173115,109 @@ function createDefaultPanel(api, workspaceId) {
172946
173115
  }
172947
173116
  });
172948
173117
  }
173118
+ const states = /* @__PURE__ */ new Map();
173119
+ const listeners = /* @__PURE__ */ new Map();
173120
+ const EMPTY_STATE = Object.freeze({ openFilePath: null });
173121
+ function getPerWorkspaceState(workspaceId) {
173122
+ return states.get(workspaceId) ?? EMPTY_STATE;
173123
+ }
173124
+ function setPerWorkspaceState(workspaceId, patch2) {
173125
+ const prev2 = getPerWorkspaceState(workspaceId);
173126
+ const next2 = { ...prev2, ...patch2 };
173127
+ if (prev2.currentFile === next2.currentFile && prev2.openFilePath === next2.openFilePath) return;
173128
+ states.set(workspaceId, next2);
173129
+ const set2 = listeners.get(workspaceId);
173130
+ if (set2) for (const cb of set2) cb();
173131
+ }
173132
+ function subscribePerWorkspaceState(workspaceId, cb) {
173133
+ let set2 = listeners.get(workspaceId);
173134
+ if (!set2) {
173135
+ set2 = /* @__PURE__ */ new Set();
173136
+ listeners.set(workspaceId, set2);
173137
+ }
173138
+ set2.add(cb);
173139
+ return () => {
173140
+ set2?.delete(cb);
173141
+ if (set2 && set2.size === 0) listeners.delete(workspaceId);
173142
+ };
173143
+ }
173144
+ function clearPerWorkspaceState(workspaceId) {
173145
+ states.delete(workspaceId);
173146
+ }
173147
+ function usePerWorkspaceState(workspaceId) {
173148
+ return reactExports.useSyncExternalStore(
173149
+ (cb) => subscribePerWorkspaceState(workspaceId, cb),
173150
+ () => getPerWorkspaceState(workspaceId)
173151
+ );
173152
+ }
173153
+ const DEFAULT_MAX_CACHED_WORKSPACES = 3;
173154
+ const MIN_MAX_CACHED_WORKSPACES = 1;
173155
+ function MultiWorkspacePanelHost({ emptyState, children: children2 }) {
173156
+ const [cache, setCache] = reactExports.useState(/* @__PURE__ */ new Map());
173157
+ const pathname = useRouterState({ select: (s2) => s2.location.pathname });
173158
+ const { settings } = useSettingsQuery();
173159
+ const maxCachedWorkspaces = Math.max(
173160
+ MIN_MAX_CACHED_WORKSPACES,
173161
+ settings.maxCachedWorkspaces ?? DEFAULT_MAX_CACHED_WORKSPACES
173162
+ );
173163
+ const activeWorkspaceId = parseWorkspaceFromPath(pathname);
173164
+ if (activeWorkspaceId && !cache.has(activeWorkspaceId)) {
173165
+ setCache((prev2) => {
173166
+ if (prev2.has(activeWorkspaceId)) return prev2;
173167
+ const next2 = new Map(prev2);
173168
+ next2.set(activeWorkspaceId, {
173169
+ workspaceId: activeWorkspaceId,
173170
+ lastAccessed: Date.now()
173171
+ });
173172
+ if (next2.size > maxCachedWorkspaces) {
173173
+ let oldestKey = null;
173174
+ let oldestTime = Number.POSITIVE_INFINITY;
173175
+ for (const [key2, entry] of next2) {
173176
+ if (key2 !== activeWorkspaceId && entry.lastAccessed < oldestTime) {
173177
+ oldestTime = entry.lastAccessed;
173178
+ oldestKey = key2;
173179
+ }
173180
+ }
173181
+ if (oldestKey) next2.delete(oldestKey);
173182
+ }
173183
+ return next2;
173184
+ });
173185
+ }
173186
+ reactExports.useEffect(() => {
173187
+ if (!activeWorkspaceId) return;
173188
+ setCache((prev2) => {
173189
+ const existing = prev2.get(activeWorkspaceId);
173190
+ if (!existing) return prev2;
173191
+ const next2 = new Map(prev2);
173192
+ next2.set(activeWorkspaceId, { ...existing, lastAccessed: Date.now() });
173193
+ return next2;
173194
+ });
173195
+ }, [activeWorkspaceId]);
173196
+ const lastCacheKeysRef = reactExports.useRef(/* @__PURE__ */ new Set());
173197
+ reactExports.useEffect(() => {
173198
+ const current = new Set(cache.keys());
173199
+ for (const prev2 of lastCacheKeysRef.current) {
173200
+ if (!current.has(prev2)) clearPerWorkspaceState(prev2);
173201
+ }
173202
+ lastCacheKeysRef.current = current;
173203
+ }, [cache]);
173204
+ if (!activeWorkspaceId) return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-full w-full", children: emptyState });
173205
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-full w-full", children: Array.from(cache.values()).map(({ workspaceId }) => {
173206
+ const isActive = workspaceId === activeWorkspaceId;
173207
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
173208
+ "div",
173209
+ {
173210
+ className: "absolute inset-0 transition-opacity duration-150 ease-out",
173211
+ style: {
173212
+ opacity: isActive ? 1 : 0,
173213
+ pointerEvents: isActive ? void 0 : "none"
173214
+ },
173215
+ children: children2(workspaceId, isActive)
173216
+ },
173217
+ workspaceId
173218
+ );
173219
+ }) });
173220
+ }
172949
173221
  const TABS_POLL_MS = 5e3;
172950
173222
  const screencastTabTheme = {
172951
173223
  name: "band",
@@ -175947,10 +176219,20 @@ const PANEL_SHORTCUTS = {
175947
176219
  browser: "⇧⌘B"
175948
176220
  };
175949
176221
  const DockviewTerminalContainer = reactExports.lazy(
175950
- () => import("./DockviewTerminalContainer-Btn06b30.js").then((m2) => ({
176222
+ () => import("./DockviewTerminalContainer-RbFw8Eo4.js").then((m2) => ({
175951
176223
  default: m2.DockviewTerminalContainer
175952
176224
  }))
175953
176225
  );
176226
+ const crossPanelHandlers = {
176227
+ onOpenFile: () => {
176228
+ },
176229
+ onSelectFile: () => {
176230
+ },
176231
+ onFileOpened: () => {
176232
+ },
176233
+ onFindInFile: () => {
176234
+ }
176235
+ };
175954
176236
  function NoWorkspaceMessage({ Icon: Icon2 }) {
175955
176237
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-center px-8", children: [
175956
176238
  /* @__PURE__ */ jsxRuntimeExports.jsx(Icon2, { className: "size-8 text-muted-foreground/30" }),
@@ -175960,61 +176242,95 @@ function NoWorkspaceMessage({ Icon: Icon2 }) {
175960
176242
  function ProjectsPanelComponent() {
175961
176243
  return /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardShell, { hideTitleBar: isDesktop, hideMenu: true });
175962
176244
  }
175963
- function ChatPanelComponent({ params, api }) {
176245
+ function ChatPanelComponent({ api }) {
175964
176246
  const [isVisible, setIsVisible] = reactExports.useState(api.isVisible);
175965
- const wsActive = useWsActive(params.workspaceId ?? "");
175966
176247
  reactExports.useEffect(() => {
175967
176248
  const d2 = api.onDidVisibilityChange((e2) => setIsVisible(e2.isVisible));
175968
176249
  return () => d2.dispose();
175969
176250
  }, [api]);
175970
- const visible = wsActive && isVisible;
175971
- if (!params.workspaceId) return /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: MessageSquare });
175972
- return /* @__PURE__ */ jsxRuntimeExports.jsx(DockviewChatContainer, { workspaceId: params.workspaceId, visible, wsActive });
176251
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MultiWorkspacePanelHost, { emptyState: /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: MessageSquare }), children: (workspaceId, wsActive) => /* @__PURE__ */ jsxRuntimeExports.jsx(
176252
+ DockviewChatContainer,
176253
+ {
176254
+ workspaceId,
176255
+ visible: isVisible && wsActive,
176256
+ wsActive
176257
+ }
176258
+ ) });
175973
176259
  }
175974
- function ChangesPanelComponent({ params }) {
175975
- if (!params.workspaceId) return /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: GitCompare });
175976
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
176260
+ function ChangesPanelComponent(_props) {
176261
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MultiWorkspacePanelHost, { emptyState: /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: GitCompare }), children: (workspaceId, wsActive) => /* @__PURE__ */ jsxRuntimeExports.jsx(
175977
176262
  DiffView,
175978
176263
  {
175979
- workspaceId: params.workspaceId,
175980
- active: true,
175981
- onStatsChange: params.onStatsChange,
175982
- onOpenFile: params.onOpenFile,
175983
- onFindInFile: params.onFindInFile
176264
+ workspaceId,
176265
+ active: wsActive,
176266
+ onOpenFile: (filename) => crossPanelHandlers.onOpenFile(workspaceId, filename),
176267
+ onFindInFile: (fn2) => crossPanelHandlers.onFindInFile(workspaceId, fn2)
175984
176268
  }
175985
- );
176269
+ ) });
175986
176270
  }
175987
- function FilesPanelComponent({ params }) {
175988
- if (!params.workspaceId) return /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: FolderOpen });
176271
+ function FilesPanelComponent(_props) {
176272
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MultiWorkspacePanelHost, { emptyState: /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: FolderOpen }), children: (workspaceId, _wsActive) => /* @__PURE__ */ jsxRuntimeExports.jsx(FilesPanelChild, { workspaceId }) });
176273
+ }
176274
+ function FilesPanelChild({ workspaceId }) {
176275
+ const state2 = usePerWorkspaceState(workspaceId);
175989
176276
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
175990
176277
  CodeBrowserView,
175991
176278
  {
175992
- workspaceId: params.workspaceId,
175993
- file: params.file,
175994
- onSelectFile: params.onSelectFile,
175995
- openFilePath: params.openFilePath,
175996
- onFileOpened: params.onFileOpened,
175997
- onFindInFile: params.onFindInFile
176279
+ workspaceId,
176280
+ file: state2.currentFile,
176281
+ openFilePath: state2.openFilePath,
176282
+ onSelectFile: (filePath) => crossPanelHandlers.onSelectFile(workspaceId, filePath),
176283
+ onFileOpened: () => crossPanelHandlers.onFileOpened(workspaceId),
176284
+ onFindInFile: (fn2) => crossPanelHandlers.onFindInFile(workspaceId, fn2)
175998
176285
  }
175999
176286
  );
176000
176287
  }
176001
- function TerminalPanelComponent({ params, api }) {
176288
+ function TerminalPanelComponent({ api }) {
176002
176289
  const [isVisible, setIsVisible] = reactExports.useState(api.isVisible);
176003
- const wsActive = useWsActive(params.workspaceId ?? "");
176004
176290
  reactExports.useEffect(() => {
176005
176291
  const d2 = api.onDidVisibilityChange((e2) => setIsVisible(e2.isVisible));
176006
176292
  return () => d2.dispose();
176007
176293
  }, [api]);
176008
- const visible = wsActive && isVisible;
176009
- if (!params.workspaceId) return /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: Terminal });
176010
- return /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
176294
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MultiWorkspacePanelHost, { emptyState: /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: Terminal }), children: (workspaceId, wsActive) => /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
176011
176295
  DockviewTerminalContainer,
176012
176296
  {
176013
- workspaceId: params.workspaceId,
176014
- visible,
176297
+ workspaceId,
176298
+ visible: isVisible && wsActive,
176015
176299
  wsActive
176016
176300
  }
176017
- ) });
176301
+ ) }) });
176302
+ }
176303
+ function BrowserPanelComponent({ api }) {
176304
+ const [isVisible, setIsVisible] = reactExports.useState(api.isVisible);
176305
+ const { settings } = useSettingsQuery();
176306
+ const cdpEnabled = settings.webBrowserCdpEnabled ?? false;
176307
+ reactExports.useEffect(() => {
176308
+ const d2 = api.onDidVisibilityChange((e2) => setIsVisible(e2.isVisible));
176309
+ return () => d2.dispose();
176310
+ }, [api]);
176311
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MultiWorkspacePanelHost, { emptyState: /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: Globe }), children: (workspaceId, wsActive) => {
176312
+ const visible = isVisible && wsActive;
176313
+ if (!isDesktop) {
176314
+ if (cdpEnabled) {
176315
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ScreencastPanel, { workspaceId, visible });
176316
+ }
176317
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center p-6 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-md text-center", children: [
176318
+ "The Browser pane is only available in the desktop app. Enable",
176319
+ " ",
176320
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "Settings → Browser → Stream desktop tabs to web" }),
176321
+ " ",
176322
+ "to use it from a browser tab."
176323
+ ] }) });
176324
+ }
176325
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
176326
+ DockviewBrowserContainer,
176327
+ {
176328
+ workspaceId,
176329
+ visible,
176330
+ wsActive
176331
+ }
176332
+ );
176333
+ } });
176018
176334
  }
176019
176335
  function DefaultTab2(props) {
176020
176336
  const Icon2 = PANEL_ICONS[props.api.component];
@@ -176085,38 +176401,6 @@ function BadgeTab(props) {
176085
176401
  ] })
176086
176402
  ] });
176087
176403
  }
176088
- function BrowserPanelComponent({ params, api }) {
176089
- const [isVisible, setIsVisible] = reactExports.useState(api.isVisible);
176090
- const wsActive = useWsActive(params.workspaceId ?? "");
176091
- const { settings } = useSettingsQuery();
176092
- const cdpEnabled = settings.webBrowserCdpEnabled ?? false;
176093
- reactExports.useEffect(() => {
176094
- const d2 = api.onDidVisibilityChange((e2) => setIsVisible(e2.isVisible));
176095
- return () => d2.dispose();
176096
- }, [api]);
176097
- const visible = wsActive && isVisible;
176098
- if (!params.workspaceId) return /* @__PURE__ */ jsxRuntimeExports.jsx(NoWorkspaceMessage, { Icon: Globe });
176099
- if (!isDesktop) {
176100
- if (cdpEnabled) {
176101
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ScreencastPanel, { workspaceId: params.workspaceId, visible });
176102
- }
176103
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center p-6 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-md text-center", children: [
176104
- "The Browser pane is only available in the desktop app. Enable",
176105
- " ",
176106
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "Settings → Browser → Stream desktop tabs to web" }),
176107
- " ",
176108
- "to use it from a browser tab."
176109
- ] }) });
176110
- }
176111
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
176112
- DockviewBrowserContainer,
176113
- {
176114
- workspaceId: params.workspaceId,
176115
- visible,
176116
- wsActive
176117
- }
176118
- );
176119
- }
176120
176404
  const components = {
176121
176405
  projects: ProjectsPanelComponent,
176122
176406
  chat: ChatPanelComponent,
@@ -176161,11 +176445,14 @@ const MainGroupRightActions = reactExports.memo(function MainGroupRightActions2(
176161
176445
  ] })
176162
176446
  ] }) });
176163
176447
  });
176164
- function useDiffFileCount(workspaceId, isActive) {
176165
- const { diffMode, compareBranch } = useDiffTarget(workspaceId);
176448
+ function useDiffFileCount(workspaceId) {
176449
+ const { diffMode, compareBranch } = useDiffTarget(workspaceId ?? "");
176166
176450
  const [count2, setCount] = reactExports.useState(0);
176167
176451
  reactExports.useEffect(() => {
176168
- if (!isActive) return;
176452
+ if (!workspaceId) {
176453
+ setCount(0);
176454
+ return;
176455
+ }
176169
176456
  let cancelled = false;
176170
176457
  const fetchCount = () => {
176171
176458
  trpc.workspace.getDiffSummary.query({
@@ -176183,7 +176470,7 @@ function useDiffFileCount(workspaceId, isActive) {
176183
176470
  cancelled = true;
176184
176471
  clearInterval(interval2);
176185
176472
  };
176186
- }, [workspaceId, isActive, diffMode, compareBranch]);
176473
+ }, [workspaceId, diffMode, compareBranch]);
176187
176474
  return count2;
176188
176475
  }
176189
176476
  const REQUIRED_PANEL_IDS = ["projects", "chat", "changes", "files", "terminal", "browser"];
@@ -176276,17 +176563,13 @@ function stripPanelParams(json2) {
176276
176563
  function saveLayout(api, workspaceId, lastStructureRef) {
176277
176564
  try {
176278
176565
  const json2 = stripPanelParams(api.toJSON());
176279
- const activeState = extractActiveState(json2);
176280
- localStorage.setItem(`${ACTIVE_STATE_KEY_PREFIX}${workspaceId}`, JSON.stringify(activeState));
176281
- localStorage.setItem(GLOBAL_LAYOUT_KEY, JSON.stringify(json2));
176282
- const fingerprint = getStructuralFingerprint(json2);
176283
- if (fingerprint !== lastStructureRef.current) {
176284
- lastStructureRef.current = fingerprint;
176285
- return true;
176566
+ if (workspaceId) {
176567
+ const activeState = extractActiveState(json2);
176568
+ localStorage.setItem(`${ACTIVE_STATE_KEY_PREFIX}${workspaceId}`, JSON.stringify(activeState));
176286
176569
  }
176287
- return false;
176570
+ localStorage.setItem(GLOBAL_LAYOUT_KEY, JSON.stringify(json2));
176571
+ lastStructureRef.current = getStructuralFingerprint(json2);
176288
176572
  } catch {
176289
- return false;
176290
176573
  }
176291
176574
  }
176292
176575
  function stripRemovedPanels(layout) {
@@ -176314,21 +176597,21 @@ function loadLayout(workspaceId) {
176314
176597
  if (!raw2) return null;
176315
176598
  const layout = JSON.parse(raw2);
176316
176599
  stripRemovedPanels(layout);
176317
- const activeRaw = localStorage.getItem(`${ACTIVE_STATE_KEY_PREFIX}${workspaceId}`);
176318
- if (activeRaw) {
176319
- const activeState = JSON.parse(activeRaw);
176320
- applyActiveState(layout, activeState);
176600
+ if (workspaceId) {
176601
+ const activeRaw = localStorage.getItem(`${ACTIVE_STATE_KEY_PREFIX}${workspaceId}`);
176602
+ if (activeRaw) {
176603
+ const activeState = JSON.parse(activeRaw);
176604
+ applyActiveState(layout, activeState);
176605
+ }
176321
176606
  }
176322
176607
  return layout;
176323
176608
  } catch {
176324
176609
  return null;
176325
176610
  }
176326
176611
  }
176327
- const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayout2({
176328
- workspaceId,
176329
- onLayoutChange
176330
- }) {
176331
- const isActive = useWsActive(workspaceId);
176612
+ function SharedDockviewLayout() {
176613
+ const pathname = useRouterState({ select: (s2) => s2.location.pathname });
176614
+ const activeWorkspaceId = parseWorkspaceFromPath(pathname);
176332
176615
  const apiRef = reactExports.useRef(null);
176333
176616
  const containerRef = reactExports.useRef(null);
176334
176617
  const { settings } = useSettingsQuery();
@@ -176338,55 +176621,72 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176338
176621
  );
176339
176622
  const hiddenPanelsRef = reactExports.useRef(hiddenPanels);
176340
176623
  hiddenPanelsRef.current = hiddenPanels;
176341
- const onLayoutChangeRef = reactExports.useRef(onLayoutChange);
176342
- onLayoutChangeRef.current = onLayoutChange;
176343
176624
  const initializedRef = reactExports.useRef(false);
176344
- const injectParamsRef = reactExports.useRef(() => {
176345
- });
176346
- const isActiveRef = reactExports.useRef(isActive);
176347
- isActiveRef.current = isActive;
176348
176625
  const lastStructureRef = reactExports.useRef("");
176349
- const [currentFile, setCurrentFile] = reactExports.useState(void 0);
176350
- const [openFilePath, setOpenFilePath] = reactExports.useState(null);
176351
- const diffFileCount = useDiffFileCount(workspaceId, isActive);
176626
+ const activeWorkspaceIdRef = reactExports.useRef(activeWorkspaceId);
176627
+ activeWorkspaceIdRef.current = activeWorkspaceId;
176628
+ reactExports.useEffect(() => {
176629
+ if (activeWorkspaceId) recordWorkspaceAccess(activeWorkspaceId);
176630
+ }, [activeWorkspaceId]);
176631
+ const { recentFiles, trackFile } = useRecentFiles(activeWorkspaceId ?? "");
176632
+ const diffFileCount = useDiffFileCount(activeWorkspaceId);
176352
176633
  const currentFileRef = reactExports.useRef(void 0);
176353
- currentFileRef.current = currentFile;
176634
+ const findInFileRegistry = reactExports.useRef(/* @__PURE__ */ new Map());
176354
176635
  const [quickOpenOpen, setQuickOpenOpen] = reactExports.useState(false);
176355
176636
  const [quickOpenQuery, setQuickOpenQuery] = reactExports.useState(void 0);
176356
176637
  const [searchFilesOpen, setSearchFilesOpen] = reactExports.useState(false);
176357
176638
  const [workspacePickerOpen, setWorkspacePickerOpen] = reactExports.useState(false);
176358
176639
  const [commandPaletteOpen, setCommandPaletteOpen] = reactExports.useState(false);
176359
176640
  const [lastQuickOpenQuery, setLastQuickOpenQuery] = reactExports.useState("");
176360
- const { recentFiles, trackFile } = useRecentFiles(workspaceId);
176361
- const findInFileRef = reactExports.useRef(null);
176362
- const setFindInFile = reactExports.useCallback((fn2) => {
176363
- findInFileRef.current = fn2;
176364
- }, []);
176365
- const setDiffStats = reactExports.useCallback((_stats) => {
176366
- }, []);
176641
+ const [activeCurrentFile, setActiveCurrentFile] = reactExports.useState(void 0);
176642
+ reactExports.useEffect(() => {
176643
+ if (!activeWorkspaceId) {
176644
+ setActiveCurrentFile(void 0);
176645
+ currentFileRef.current = void 0;
176646
+ return;
176647
+ }
176648
+ const state2 = getPerWorkspaceState(activeWorkspaceId);
176649
+ setActiveCurrentFile(state2.currentFile);
176650
+ currentFileRef.current = state2.currentFile;
176651
+ const unsub = subscribePerWorkspaceState(activeWorkspaceId, () => {
176652
+ const next2 = getPerWorkspaceState(activeWorkspaceId).currentFile;
176653
+ setActiveCurrentFile(next2);
176654
+ currentFileRef.current = next2;
176655
+ });
176656
+ return unsub;
176657
+ }, [activeWorkspaceId]);
176367
176658
  const handleOpenFile = reactExports.useCallback(
176368
- (filename) => {
176659
+ (workspaceId, filename) => {
176369
176660
  const cleanPath = parseFileLocation(filename).filePath;
176370
- setCurrentFile(cleanPath);
176371
- setOpenFilePath(filename);
176661
+ setPerWorkspaceState(workspaceId, {
176662
+ currentFile: cleanPath,
176663
+ openFilePath: filename
176664
+ });
176372
176665
  trackFile(cleanPath);
176373
- const api = apiRef.current;
176374
- if (api) {
176375
- api.getPanel("files")?.api.setActive();
176666
+ if (workspaceId === activeWorkspaceIdRef.current) {
176667
+ apiRef.current?.getPanel("files")?.api.setActive();
176376
176668
  }
176377
176669
  },
176378
176670
  [trackFile]
176379
176671
  );
176380
- const handleFileOpened = reactExports.useCallback(() => {
176381
- setOpenFilePath(null);
176672
+ const handleFileOpened = reactExports.useCallback((workspaceId) => {
176673
+ setPerWorkspaceState(workspaceId, { openFilePath: null });
176382
176674
  }, []);
176383
176675
  const handleSelectFile = reactExports.useCallback(
176384
- (filePath) => {
176385
- setCurrentFile(filePath ?? void 0);
176676
+ (workspaceId, filePath) => {
176677
+ setPerWorkspaceState(workspaceId, { currentFile: filePath ?? void 0 });
176386
176678
  if (filePath) trackFile(filePath);
176387
176679
  },
176388
176680
  [trackFile]
176389
176681
  );
176682
+ const handleSetFindInFile = reactExports.useCallback((workspaceId, fn2) => {
176683
+ if (fn2) findInFileRegistry.current.set(workspaceId, fn2);
176684
+ else findInFileRegistry.current.delete(workspaceId);
176685
+ }, []);
176686
+ crossPanelHandlers.onOpenFile = handleOpenFile;
176687
+ crossPanelHandlers.onFileOpened = handleFileOpened;
176688
+ crossPanelHandlers.onSelectFile = handleSelectFile;
176689
+ crossPanelHandlers.onFindInFile = handleSetFindInFile;
176390
176690
  const paletteCommands = reactExports.useMemo(
176391
176691
  () => buildCommands({
176392
176692
  getApi: () => apiRef.current,
@@ -176394,17 +176694,21 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176394
176694
  openQuickOpen: () => setQuickOpenOpen(true),
176395
176695
  openSearchFiles: () => setSearchFilesOpen(true),
176396
176696
  findInFile: () => {
176397
- if (findInFileRef.current) {
176398
- findInFileRef.current();
176697
+ const ws = activeWorkspaceIdRef.current;
176698
+ const fn2 = ws ? findInFileRegistry.current.get(ws) : void 0;
176699
+ if (fn2) {
176700
+ fn2();
176399
176701
  } else {
176400
176702
  window.dispatchEvent(new CustomEvent("band:find-in-file"));
176401
176703
  }
176402
176704
  },
176403
176705
  formatCurrentFile: () => {
176706
+ const ws = activeWorkspaceIdRef.current;
176707
+ if (!ws) return;
176404
176708
  const filePath = currentFileRef.current;
176405
176709
  window.dispatchEvent(
176406
176710
  new CustomEvent("band:format-current-file", {
176407
- detail: { workspaceId, filePath }
176711
+ detail: { workspaceId: ws, filePath }
176408
176712
  })
176409
176713
  );
176410
176714
  },
@@ -176412,19 +176716,21 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176412
176716
  window.dispatchEvent(new CustomEvent("band:new-untitled-tab"));
176413
176717
  },
176414
176718
  changeLanguageMode: () => {
176719
+ const ws = activeWorkspaceIdRef.current;
176720
+ if (!ws) return;
176415
176721
  const filePath = currentFileRef.current;
176416
176722
  window.dispatchEvent(
176417
176723
  new CustomEvent("band:open-language-picker", {
176418
- detail: { workspaceId, filePath }
176724
+ detail: { workspaceId: ws, filePath }
176419
176725
  })
176420
176726
  );
176421
176727
  }
176422
176728
  }),
176423
- [workspaceId]
176729
+ []
176424
176730
  );
176425
176731
  reactExports.useEffect(() => {
176426
- if (!isActive) return;
176427
176732
  const handler = (e2) => {
176733
+ const ws = activeWorkspaceIdRef.current;
176428
176734
  const terminalFocused = document.activeElement?.closest(".xterm") != null;
176429
176735
  if (e2.ctrlKey && !e2.metaKey && e2.key.toLowerCase() === "r" && !e2.shiftKey) {
176430
176736
  if (terminalFocused) return;
@@ -176469,6 +176775,18 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176469
176775
  window.dispatchEvent(new CustomEvent("band:prev-file-tab"));
176470
176776
  return;
176471
176777
  }
176778
+ if (e2.code === "KeyF" && e2.altKey && e2.shiftKey && !e2.metaKey && !e2.ctrlKey) {
176779
+ if (terminalFocused) return;
176780
+ e2.preventDefault();
176781
+ if (!ws) return;
176782
+ const filePath = currentFileRef.current;
176783
+ window.dispatchEvent(
176784
+ new CustomEvent("band:format-current-file", {
176785
+ detail: { workspaceId: ws, filePath }
176786
+ })
176787
+ );
176788
+ return;
176789
+ }
176472
176790
  const mod = e2.metaKey || e2.ctrlKey;
176473
176791
  if (!mod) return;
176474
176792
  if (terminalFocused && !e2.metaKey) return;
@@ -176486,27 +176804,25 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176486
176804
  } else if (key2 === "p" && !e2.shiftKey) {
176487
176805
  e2.preventDefault();
176488
176806
  setQuickOpenOpen(true);
176489
- } else if (key2 === "f" && e2.altKey) {
176490
- e2.preventDefault();
176491
- const filePath = currentFileRef.current;
176492
- window.dispatchEvent(
176493
- new CustomEvent("band:format-current-file", {
176494
- detail: { workspaceId, filePath }
176495
- })
176496
- );
176497
- } else if (key2 === "f" && e2.shiftKey) {
176807
+ } else if (key2 === "f" && e2.shiftKey && !e2.altKey) {
176498
176808
  e2.preventDefault();
176499
176809
  setSearchFilesOpen(true);
176500
176810
  } else if (key2 === "f" && !e2.shiftKey && !e2.altKey) {
176501
176811
  e2.preventDefault();
176502
- if (findInFileRef.current) {
176503
- findInFileRef.current();
176812
+ const fn2 = ws ? findInFileRegistry.current.get(ws) : void 0;
176813
+ if (fn2) {
176814
+ fn2();
176504
176815
  } else {
176505
176816
  window.dispatchEvent(new CustomEvent("band:find-in-file"));
176506
176817
  }
176507
176818
  } else if (key2 === "o" && !e2.shiftKey && !e2.altKey) {
176508
176819
  e2.preventDefault();
176509
- window.dispatchEvent(new CustomEvent("band:open-file-external"));
176820
+ if (!ws) return;
176821
+ window.dispatchEvent(
176822
+ new CustomEvent("band:open-file-external", {
176823
+ detail: { workspaceId: ws }
176824
+ })
176825
+ );
176510
176826
  } else if (key2 === "i" && e2.ctrlKey && e2.metaKey && api) {
176511
176827
  e2.preventDefault();
176512
176828
  if (!hiddenPanelsRef.current.includes("chat")) {
@@ -176560,9 +176876,8 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176560
176876
  };
176561
176877
  window.addEventListener("keydown", handler, true);
176562
176878
  return () => window.removeEventListener("keydown", handler, true);
176563
- }, [isActive, workspaceId]);
176879
+ }, []);
176564
176880
  reactExports.useEffect(() => {
176565
- if (!isActive) return;
176566
176881
  const handler = (e2) => {
176567
176882
  const detail = e2.detail;
176568
176883
  if (detail?.filename) {
@@ -176572,9 +176887,8 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176572
176887
  };
176573
176888
  window.addEventListener("band:open-file", handler);
176574
176889
  return () => window.removeEventListener("band:open-file", handler);
176575
- }, [isActive]);
176890
+ }, []);
176576
176891
  reactExports.useEffect(() => {
176577
- if (!isActive) return;
176578
176892
  const openQO = () => setQuickOpenOpen(true);
176579
176893
  const openSF = () => setSearchFilesOpen(true);
176580
176894
  window.addEventListener("band:open-quick-open", openQO);
@@ -176583,9 +176897,8 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176583
176897
  window.removeEventListener("band:open-quick-open", openQO);
176584
176898
  window.removeEventListener("band:open-search-files", openSF);
176585
176899
  };
176586
- }, [isActive]);
176900
+ }, []);
176587
176901
  reactExports.useEffect(() => {
176588
- if (!isActive) return;
176589
176902
  const handler = (e2) => {
176590
176903
  const panelId = e2.detail?.panelId;
176591
176904
  if (panelId && apiRef.current && !hiddenPanelsRef.current.includes(panelId)) {
@@ -176594,192 +176907,146 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176594
176907
  };
176595
176908
  window.addEventListener("band:activate-panel", handler);
176596
176909
  return () => window.removeEventListener("band:activate-panel", handler);
176597
- }, [isActive]);
176598
- const injectParams = reactExports.useCallback(
176599
- (api) => {
176600
- api.getPanel("chat")?.api.updateParameters({
176601
- workspaceId
176602
- });
176603
- api.getPanel("changes")?.api.updateParameters({
176604
- workspaceId,
176605
- onStatsChange: setDiffStats,
176606
- onOpenFile: handleOpenFile,
176607
- onFindInFile: setFindInFile,
176608
- badge: diffFileCount
176609
- });
176610
- api.getPanel("files")?.api.updateParameters({
176611
- workspaceId,
176612
- file: currentFile,
176613
- openFilePath,
176614
- onSelectFile: handleSelectFile,
176615
- onFileOpened: handleFileOpened,
176616
- onFindInFile: setFindInFile
176617
- });
176618
- api.getPanel("terminal")?.api.updateParameters({
176619
- workspaceId
176620
- });
176621
- api.getPanel("browser")?.api.updateParameters({
176622
- workspaceId
176623
- });
176624
- },
176625
- [
176626
- workspaceId,
176627
- currentFile,
176628
- openFilePath,
176629
- diffFileCount,
176630
- setDiffStats,
176631
- handleOpenFile,
176632
- handleFileOpened,
176633
- handleSelectFile,
176634
- setFindInFile
176635
- ]
176636
- );
176637
- injectParamsRef.current = injectParams;
176638
- const addMissingPanel = reactExports.useCallback(
176639
- (api, panelId) => {
176640
- if (!(panelId in components)) return;
176641
- const anyExisting = api.getPanel("changes") ?? api.getPanel("files") ?? api.getPanel("terminal") ?? api.getPanel("chat");
176642
- const titleMap = {
176643
- projects: "Projects",
176644
- chat: "Chat",
176645
- changes: "Changes",
176646
- files: "Files",
176647
- terminal: "Terminal",
176648
- browser: "Browser"
176649
- };
176650
- const opts = {
176651
- id: panelId,
176652
- component: panelId,
176653
- title: titleMap[panelId] ?? panelId,
176654
- params: { workspaceId },
176655
- inactive: true
176656
- };
176657
- if (panelId === "changes") {
176658
- opts.tabComponent = "badge";
176659
- }
176660
- if (panelId === "projects") {
176661
- try {
176662
- if (!api.groups.some((g2) => g2.id === "edge-left")) {
176663
- api.addEdgeGroup("left", { id: "edge-left" });
176664
- }
176665
- } catch {
176910
+ }, []);
176911
+ const addMissingPanel = reactExports.useCallback((api, panelId) => {
176912
+ if (!(panelId in components)) return;
176913
+ const anyExisting = api.getPanel("changes") ?? api.getPanel("files") ?? api.getPanel("terminal") ?? api.getPanel("chat");
176914
+ const titleMap = {
176915
+ projects: "Projects",
176916
+ chat: "Chat",
176917
+ changes: "Changes",
176918
+ files: "Files",
176919
+ terminal: "Terminal",
176920
+ browser: "Browser"
176921
+ };
176922
+ const opts = {
176923
+ id: panelId,
176924
+ component: panelId,
176925
+ title: titleMap[panelId] ?? panelId,
176926
+ params: {},
176927
+ inactive: true
176928
+ };
176929
+ if (panelId === "changes") {
176930
+ opts.tabComponent = "badge";
176931
+ }
176932
+ if (panelId === "projects") {
176933
+ try {
176934
+ if (!api.groups.some((g2) => g2.id === "edge-left")) {
176935
+ api.addEdgeGroup("left", { id: "edge-left" });
176666
176936
  }
176667
- opts.position = { referenceGroup: "edge-left", direction: "within" };
176668
- api.addPanel(opts);
176669
- return;
176670
- }
176671
- if (panelId === "chat" && anyExisting) {
176672
- opts.position = { referencePanel: anyExisting.id, direction: "left" };
176673
- } else if (anyExisting) {
176674
- opts.position = { referencePanel: anyExisting.id, direction: "within" };
176937
+ } catch {
176675
176938
  }
176939
+ opts.position = { referenceGroup: "edge-left", direction: "within" };
176676
176940
  api.addPanel(opts);
176677
- },
176678
- [workspaceId]
176679
- );
176680
- const buildDefaultLayout = reactExports.useCallback(
176681
- (api) => {
176682
- const hidden2 = hiddenPanelsRef.current;
176941
+ return;
176942
+ }
176943
+ if (panelId === "chat" && anyExisting) {
176944
+ opts.position = { referencePanel: anyExisting.id, direction: "left" };
176945
+ } else if (anyExisting) {
176946
+ opts.position = { referencePanel: anyExisting.id, direction: "within" };
176947
+ }
176948
+ api.addPanel(opts);
176949
+ }, []);
176950
+ const buildDefaultLayout = reactExports.useCallback((api) => {
176951
+ const hidden2 = hiddenPanelsRef.current;
176952
+ api.addPanel({
176953
+ id: "chat",
176954
+ component: "chat",
176955
+ title: "Chat",
176956
+ params: {}
176957
+ });
176958
+ let rightGroupRef = null;
176959
+ if (!hidden2.includes("changes")) {
176683
176960
  api.addPanel({
176684
- id: "chat",
176685
- component: "chat",
176686
- title: "Chat",
176687
- params: { workspaceId }
176961
+ id: "changes",
176962
+ component: "changes",
176963
+ tabComponent: "badge",
176964
+ title: "Changes",
176965
+ params: {},
176966
+ position: { referencePanel: "chat", direction: "right" }
176688
176967
  });
176689
- let rightGroupRef = null;
176690
- if (!hidden2.includes("changes")) {
176968
+ rightGroupRef = "changes";
176969
+ }
176970
+ if (!hidden2.includes("files")) {
176971
+ if (rightGroupRef) {
176691
176972
  api.addPanel({
176692
- id: "changes",
176693
- component: "changes",
176694
- tabComponent: "badge",
176695
- title: "Changes",
176696
- params: { workspaceId },
176973
+ id: "files",
176974
+ component: "files",
176975
+ title: "Files",
176976
+ params: {},
176977
+ position: { referencePanel: rightGroupRef, direction: "within" },
176978
+ inactive: true
176979
+ });
176980
+ } else {
176981
+ api.addPanel({
176982
+ id: "files",
176983
+ component: "files",
176984
+ title: "Files",
176985
+ params: {},
176697
176986
  position: { referencePanel: "chat", direction: "right" }
176698
176987
  });
176699
- rightGroupRef = "changes";
176700
- }
176701
- if (!hidden2.includes("files")) {
176702
- if (rightGroupRef) {
176703
- api.addPanel({
176704
- id: "files",
176705
- component: "files",
176706
- title: "Files",
176707
- params: { workspaceId },
176708
- position: { referencePanel: rightGroupRef, direction: "within" },
176709
- inactive: true
176710
- });
176711
- } else {
176712
- api.addPanel({
176713
- id: "files",
176714
- component: "files",
176715
- title: "Files",
176716
- params: { workspaceId },
176717
- position: { referencePanel: "chat", direction: "right" }
176718
- });
176719
- rightGroupRef = "files";
176720
- }
176721
- }
176722
- if (!hidden2.includes("terminal")) {
176723
- if (rightGroupRef) {
176724
- api.addPanel({
176725
- id: "terminal",
176726
- component: "terminal",
176727
- title: "Terminal",
176728
- params: { workspaceId },
176729
- position: { referencePanel: rightGroupRef, direction: "within" },
176730
- inactive: true
176731
- });
176732
- } else {
176733
- api.addPanel({
176734
- id: "terminal",
176735
- component: "terminal",
176736
- title: "Terminal",
176737
- params: { workspaceId },
176738
- position: { referencePanel: "chat", direction: "right" }
176739
- });
176740
- rightGroupRef = "terminal";
176741
- }
176742
- }
176743
- if (!hidden2.includes("browser")) {
176744
- if (rightGroupRef) {
176745
- api.addPanel({
176746
- id: "browser",
176747
- component: "browser",
176748
- title: "Browser",
176749
- params: { workspaceId },
176750
- position: { referencePanel: rightGroupRef, direction: "within" },
176751
- inactive: true
176752
- });
176753
- } else {
176754
- api.addPanel({
176755
- id: "browser",
176756
- component: "browser",
176757
- title: "Browser",
176758
- params: { workspaceId },
176759
- position: { referencePanel: "chat", direction: "right" }
176760
- });
176761
- }
176988
+ rightGroupRef = "files";
176762
176989
  }
176763
- try {
176764
- api.getPanel("chat")?.api.setSize({ width: api.width * 0.5 });
176765
- } catch {
176990
+ }
176991
+ if (!hidden2.includes("terminal")) {
176992
+ if (rightGroupRef) {
176993
+ api.addPanel({
176994
+ id: "terminal",
176995
+ component: "terminal",
176996
+ title: "Terminal",
176997
+ params: {},
176998
+ position: { referencePanel: rightGroupRef, direction: "within" },
176999
+ inactive: true
177000
+ });
177001
+ } else {
177002
+ api.addPanel({
177003
+ id: "terminal",
177004
+ component: "terminal",
177005
+ title: "Terminal",
177006
+ params: {},
177007
+ position: { referencePanel: "chat", direction: "right" }
177008
+ });
177009
+ rightGroupRef = "terminal";
176766
177010
  }
176767
- try {
176768
- if (!api.groups.some((g2) => g2.id === "edge-left")) {
176769
- api.addEdgeGroup("left", { id: "edge-left", initialSize: 240 });
176770
- }
176771
- } catch {
177011
+ }
177012
+ if (!hidden2.includes("browser")) {
177013
+ if (rightGroupRef) {
177014
+ api.addPanel({
177015
+ id: "browser",
177016
+ component: "browser",
177017
+ title: "Browser",
177018
+ params: {},
177019
+ position: { referencePanel: rightGroupRef, direction: "within" },
177020
+ inactive: true
177021
+ });
177022
+ } else {
177023
+ api.addPanel({
177024
+ id: "browser",
177025
+ component: "browser",
177026
+ title: "Browser",
177027
+ params: {},
177028
+ position: { referencePanel: "chat", direction: "right" }
177029
+ });
176772
177030
  }
176773
- api.addPanel({
176774
- id: "projects",
176775
- component: "projects",
176776
- title: "Projects",
176777
- params: { workspaceId },
176778
- position: { referenceGroup: "edge-left", direction: "within" }
176779
- });
176780
- },
176781
- [workspaceId]
176782
- );
177031
+ }
177032
+ try {
177033
+ api.getPanel("chat")?.api.setSize({ width: api.width * 0.5 });
177034
+ } catch {
177035
+ }
177036
+ try {
177037
+ if (!api.groups.some((g2) => g2.id === "edge-left")) {
177038
+ api.addEdgeGroup("left", { id: "edge-left", initialSize: 240 });
177039
+ }
177040
+ } catch {
177041
+ }
177042
+ api.addPanel({
177043
+ id: "projects",
177044
+ component: "projects",
177045
+ title: "Projects",
177046
+ params: {},
177047
+ position: { referenceGroup: "edge-left", direction: "within" }
177048
+ });
177049
+ }, []);
176783
177050
  const onReady = reactExports.useCallback(
176784
177051
  (event) => {
176785
177052
  apiRef.current = event.api;
@@ -176788,8 +177055,9 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176788
177055
  localStorage.removeItem("band:group-expanded-widths");
176789
177056
  } catch {
176790
177057
  }
177058
+ const initialWorkspaceId = activeWorkspaceIdRef.current;
176791
177059
  let restored = false;
176792
- const saved = loadLayout(workspaceId);
177060
+ const saved = loadLayout(initialWorkspaceId);
176793
177061
  if (saved) {
176794
177062
  try {
176795
177063
  event.api.fromJSON(saved);
@@ -176832,14 +177100,12 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176832
177100
  } catch {
176833
177101
  }
176834
177102
  }
176835
- setTimeout(() => injectParamsRef.current(event.api), 0);
176836
177103
  event.api.onDidRemovePanel((panel) => {
176837
177104
  const id28 = panel.id;
176838
177105
  if (REQUIRED_PANEL_IDS.includes(id28) && !hiddenPanelsRef.current.includes(id28)) {
176839
177106
  setTimeout(() => {
176840
177107
  if (!event.api.getPanel(id28) && !hiddenPanelsRef.current.includes(id28)) {
176841
177108
  addMissingPanel(event.api, id28);
176842
- injectParamsRef.current(event.api);
176843
177109
  }
176844
177110
  }, 0);
176845
177111
  }
@@ -176850,20 +177116,35 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176850
177116
  }
176851
177117
  event.api.onDidLayoutChange(() => {
176852
177118
  if (!initializedRef.current) return;
176853
- if (!isActiveRef.current) return;
176854
- const structureChanged = saveLayout(event.api, workspaceId, lastStructureRef);
176855
- if (structureChanged) {
176856
- onLayoutChangeRef.current?.();
176857
- }
177119
+ saveLayout(event.api, activeWorkspaceIdRef.current, lastStructureRef);
176858
177120
  });
176859
177121
  initializedRef.current = true;
176860
177122
  },
176861
177123
  [buildDefaultLayout, addMissingPanel]
176862
177124
  );
176863
177125
  reactExports.useEffect(() => {
177126
+ const panel = apiRef.current?.getPanel("changes");
177127
+ if (!panel) return;
177128
+ panel.api.updateParameters({ badge: diffFileCount });
177129
+ }, [diffFileCount]);
177130
+ reactExports.useEffect(() => {
177131
+ if (!initializedRef.current) return;
176864
177132
  const api = apiRef.current;
176865
- if (api) injectParams(api);
176866
- }, [injectParams]);
177133
+ if (!api || !activeWorkspaceId) return;
177134
+ try {
177135
+ const raw2 = localStorage.getItem(`${ACTIVE_STATE_KEY_PREFIX}${activeWorkspaceId}`);
177136
+ if (!raw2) return;
177137
+ const activeState = JSON.parse(raw2);
177138
+ for (const [_groupId, viewId] of Object.entries(activeState.groups)) {
177139
+ const panel = api.getPanel(viewId);
177140
+ if (!panel) continue;
177141
+ if (panel.api.isActive) continue;
177142
+ if (panel.group.panels.length <= 1) continue;
177143
+ panel.api.setActive();
177144
+ }
177145
+ } catch {
177146
+ }
177147
+ }, [activeWorkspaceId]);
176867
177148
  const prevHiddenRef = reactExports.useRef(hiddenPanels);
176868
177149
  reactExports.useEffect(() => {
176869
177150
  const api = apiRef.current;
@@ -176881,12 +177162,11 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176881
177162
  for (const id28 of nowShown) {
176882
177163
  if (!api.getPanel(id28)) {
176883
177164
  addMissingPanel(api, id28);
176884
- injectParamsRef.current(api);
176885
177165
  }
176886
177166
  }
176887
177167
  }, [hiddenPanels, addMissingPanel]);
176888
177168
  reactExports.useEffect(() => {
176889
- if (!isActive || !apiRef.current || !containerRef.current) return;
177169
+ if (!apiRef.current || !containerRef.current) return;
176890
177170
  const api = apiRef.current;
176891
177171
  const el = containerRef.current;
176892
177172
  requestAnimationFrame(() => {
@@ -176895,9 +177175,8 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176895
177175
  api.layout(clientWidth, clientHeight);
176896
177176
  }
176897
177177
  });
176898
- }, [isActive]);
177178
+ }, []);
176899
177179
  reactExports.useEffect(() => {
176900
- if (!isActive) return;
176901
177180
  const api = apiRef.current;
176902
177181
  if (!api) return;
176903
177182
  let isDragging = false;
@@ -176937,18 +177216,23 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176937
177216
  document.removeEventListener("drop", onDragEndNative, true);
176938
177217
  document.removeEventListener("dragend", onDragEndNative, true);
176939
177218
  };
176940
- }, [isActive]);
177219
+ }, []);
176941
177220
  const toolbarDialogOpen = useAnyToolbarDialogOpen();
176942
177221
  reactExports.useEffect(() => {
176943
177222
  if (!isDesktop) return;
177223
+ if (!activeWorkspaceId) return;
176944
177224
  const isDialogOpen = quickOpenOpen || searchFilesOpen || workspacePickerOpen || commandPaletteOpen || toolbarDialogOpen;
176945
177225
  if (isDialogOpen) {
176946
- invoke("browser_hide_all_for_workspace", { workspaceId }).catch(() => {
177226
+ invoke("browser_hide_all_for_workspace", {
177227
+ workspaceId: activeWorkspaceId
177228
+ }).catch(() => {
176947
177229
  });
176948
177230
  } else {
176949
177231
  const browserPanel = apiRef.current?.getPanel("browser");
176950
177232
  if (browserPanel?.api.isActive) {
176951
- invoke("browser_show_all_for_workspace", { workspaceId }).catch(() => {
177233
+ invoke("browser_show_all_for_workspace", {
177234
+ workspaceId: activeWorkspaceId
177235
+ }).catch(() => {
176952
177236
  });
176953
177237
  }
176954
177238
  }
@@ -176958,10 +177242,10 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176958
177242
  workspacePickerOpen,
176959
177243
  commandPaletteOpen,
176960
177244
  toolbarDialogOpen,
176961
- workspaceId
177245
+ activeWorkspaceId
176962
177246
  ]);
176963
177247
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
176964
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: containerRef, className: "h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
177248
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: containerRef, className: "absolute inset-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
176965
177249
  DockviewReact,
176966
177250
  {
176967
177251
  theme: bandTheme,
@@ -176976,14 +177260,16 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176976
177260
  /* @__PURE__ */ jsxRuntimeExports.jsx(
176977
177261
  QuickOpenDialog,
176978
177262
  {
176979
- workspaceId,
177263
+ workspaceId: activeWorkspaceId ?? "",
176980
177264
  open: quickOpenOpen,
176981
177265
  onOpenChange: (open2) => {
176982
177266
  setQuickOpenOpen(open2);
176983
177267
  if (!open2) setQuickOpenQuery(void 0);
176984
177268
  },
176985
- onOpenFile: handleOpenFile,
176986
- currentFile,
177269
+ onOpenFile: (filename) => {
177270
+ if (activeWorkspaceId) handleOpenFile(activeWorkspaceId, filename);
177271
+ },
177272
+ currentFile: activeCurrentFile,
176987
177273
  initialQuery: quickOpenQuery,
176988
177274
  autoOpen: quickOpenQuery != null,
176989
177275
  recentFiles,
@@ -176994,10 +177280,12 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
176994
177280
  /* @__PURE__ */ jsxRuntimeExports.jsx(
176995
177281
  SearchFilesDialog,
176996
177282
  {
176997
- workspaceId,
177283
+ workspaceId: activeWorkspaceId ?? "",
176998
177284
  open: searchFilesOpen,
176999
177285
  onOpenChange: setSearchFilesOpen,
177000
- onOpenFile: handleOpenFile
177286
+ onOpenFile: (filename) => {
177287
+ if (activeWorkspaceId) handleOpenFile(activeWorkspaceId, filename);
177288
+ }
177001
177289
  }
177002
177290
  ),
177003
177291
  /* @__PURE__ */ jsxRuntimeExports.jsx(WorkspacePickerDialog, { open: workspacePickerOpen, onOpenChange: setWorkspacePickerOpen }),
@@ -177010,90 +177298,6 @@ const DockviewWorkspaceLayout = reactExports.memo(function DockviewWorkspaceLayo
177010
177298
  }
177011
177299
  )
177012
177300
  ] });
177013
- });
177014
- const DEFAULT_MAX_CACHED_WORKSPACES = 3;
177015
- const MIN_MAX_CACHED_WORKSPACES = 1;
177016
- function DockviewInstanceManager() {
177017
- const [cache, setCache] = reactExports.useState(/* @__PURE__ */ new Map());
177018
- const pathname = useRouterState({ select: (s2) => s2.location.pathname });
177019
- const { settings } = useSettingsQuery();
177020
- const maxCachedWorkspaces = Math.max(
177021
- MIN_MAX_CACHED_WORKSPACES,
177022
- settings.maxCachedWorkspaces ?? DEFAULT_MAX_CACHED_WORKSPACES
177023
- );
177024
- const activeWorkspaceId = parseWorkspaceFromPath(pathname);
177025
- if (activeWorkspaceId && !cache.has(activeWorkspaceId)) {
177026
- setCache((prev2) => {
177027
- if (prev2.has(activeWorkspaceId)) return prev2;
177028
- const next2 = new Map(prev2);
177029
- next2.set(activeWorkspaceId, {
177030
- workspaceId: activeWorkspaceId,
177031
- lastAccessed: Date.now()
177032
- });
177033
- if (next2.size > maxCachedWorkspaces) {
177034
- let oldestKey = null;
177035
- let oldestTime = Infinity;
177036
- for (const [key2, entry] of next2) {
177037
- if (key2 !== activeWorkspaceId && entry.lastAccessed < oldestTime) {
177038
- oldestTime = entry.lastAccessed;
177039
- oldestKey = key2;
177040
- }
177041
- }
177042
- if (oldestKey) next2.delete(oldestKey);
177043
- }
177044
- return next2;
177045
- });
177046
- }
177047
- reactExports.useEffect(() => {
177048
- if (!activeWorkspaceId) return;
177049
- recordWorkspaceAccess(activeWorkspaceId);
177050
- setCache((prev2) => {
177051
- const existing = prev2.get(activeWorkspaceId);
177052
- if (!existing) return prev2;
177053
- const next2 = new Map(prev2);
177054
- next2.set(activeWorkspaceId, { ...existing, lastAccessed: Date.now() });
177055
- return next2;
177056
- });
177057
- }, [activeWorkspaceId]);
177058
- const activeWorkspaceIdRef = reactExports.useRef(activeWorkspaceId);
177059
- activeWorkspaceIdRef.current = activeWorkspaceId;
177060
- const handleLayoutChange = reactExports.useCallback(() => {
177061
- setCache((prev2) => {
177062
- const awId = activeWorkspaceIdRef.current;
177063
- if (!awId) return prev2;
177064
- const active = prev2.get(awId);
177065
- if (!active) return prev2;
177066
- if (prev2.size === 1) return prev2;
177067
- const next2 = /* @__PURE__ */ new Map();
177068
- next2.set(awId, active);
177069
- return next2;
177070
- });
177071
- }, []);
177072
- if (cache.size === 0 || activeWorkspaceId === null) return null;
177073
- for (const { workspaceId } of cache.values()) {
177074
- setWsActive(workspaceId, workspaceId === activeWorkspaceId);
177075
- }
177076
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0", children: Array.from(cache.values()).map(({ workspaceId }) => {
177077
- const isActive = workspaceId === activeWorkspaceId;
177078
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
177079
- "div",
177080
- {
177081
- className: "absolute inset-0 transition-opacity duration-150 ease-out",
177082
- style: {
177083
- opacity: isActive ? 1 : 0,
177084
- pointerEvents: isActive ? void 0 : "none"
177085
- },
177086
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
177087
- DockviewWorkspaceLayout,
177088
- {
177089
- workspaceId,
177090
- onLayoutChange: handleLayoutChange
177091
- }
177092
- )
177093
- },
177094
- workspaceId
177095
- );
177096
- }) });
177097
177301
  }
177098
177302
  const WS_PREFIX = "/workspace/";
177099
177303
  function extractWorkspaceId(pathname) {
@@ -177178,6 +177382,8 @@ const DEFAULT_ZOOM = 1;
177178
177382
  const MIN_ZOOM = 0.5;
177179
177383
  const MAX_ZOOM = 2;
177180
177384
  const ZOOM_STEP = 0.1;
177385
+ const ZOOM_CSS_VAR = "--app-zoom";
177386
+ const ZOOM_CHANGE_EVENT = "band:zoom-changed";
177181
177387
  function loadZoomLevel() {
177182
177388
  try {
177183
177389
  const stored = localStorage.getItem(ZOOM_LEVEL_KEY);
@@ -177199,11 +177405,42 @@ function saveZoomLevel(level) {
177199
177405
  } catch {
177200
177406
  }
177201
177407
  }
177408
+ function applyZoomLevelToDom(level) {
177409
+ const clamped = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, level));
177410
+ const rounded = Math.round(clamped * 100) / 100;
177411
+ const root2 = document.documentElement;
177412
+ root2.style.zoom = String(rounded);
177413
+ root2.style.setProperty(ZOOM_CSS_VAR, String(rounded));
177414
+ window.dispatchEvent(new CustomEvent(ZOOM_CHANGE_EVENT, { detail: rounded }));
177415
+ return rounded;
177416
+ }
177202
177417
  function applyZoomLevel(level) {
177203
177418
  const clamped = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, level));
177204
177419
  const rounded = Math.round(clamped * 100) / 100;
177205
- document.documentElement.style.zoom = String(rounded);
177206
177420
  saveZoomLevel(rounded);
177421
+ applyZoomLevelToDom(rounded);
177422
+ }
177423
+ function getCurrentZoomLevel() {
177424
+ if (typeof document !== "undefined") {
177425
+ const css = document.documentElement.style.getPropertyValue(ZOOM_CSS_VAR);
177426
+ if (css) {
177427
+ const parsed = Number.parseFloat(css);
177428
+ if (!Number.isNaN(parsed) && parsed >= MIN_ZOOM && parsed <= MAX_ZOOM) {
177429
+ return parsed;
177430
+ }
177431
+ }
177432
+ }
177433
+ return loadZoomLevel();
177434
+ }
177435
+ function subscribeToZoomChanges(handler) {
177436
+ if (typeof window === "undefined") return () => {
177437
+ };
177438
+ const listener = (e2) => {
177439
+ const detail = e2.detail;
177440
+ if (typeof detail === "number") handler(detail);
177441
+ };
177442
+ window.addEventListener(ZOOM_CHANGE_EVENT, listener);
177443
+ return () => window.removeEventListener(ZOOM_CHANGE_EVENT, listener);
177207
177444
  }
177208
177445
  function zoomIn() {
177209
177446
  applyZoomLevel(loadZoomLevel() + ZOOM_STEP);
@@ -177262,7 +177499,7 @@ function NotFound() {
177262
177499
  ] });
177263
177500
  }
177264
177501
  const THEME_INIT_SCRIPT = `(function(){try{var t=localStorage.getItem("band-theme")||"dark";var d=document.documentElement;if(t==="system"){if(window.matchMedia("(prefers-color-scheme:dark)").matches)d.classList.add("dark");else d.classList.remove("dark")}else if(t==="dark"){d.classList.add("dark")}else{d.classList.remove("dark")}}catch(e){document.documentElement.classList.add("dark")}})()`;
177265
- const ZOOM_INIT_SCRIPT = `(function(){try{var z=localStorage.getItem("band:zoom-level");if(z){var n=parseFloat(z);if(!isNaN(n)&&n>=0.5&&n<=2)document.documentElement.style.zoom=String(n)}}catch(e){}})()`;
177502
+ const ZOOM_INIT_SCRIPT = `(function(){try{var z=localStorage.getItem("band:zoom-level");var n=1;if(z){var p=parseFloat(z);if(!isNaN(p)&&p>=0.5&&p<=2)n=p;}var d=document.documentElement;d.style.zoom=String(n);d.style.setProperty("--app-zoom",String(n));}catch(e){}})()`;
177266
177503
  function applyTheme(theme2) {
177267
177504
  const root2 = document.documentElement;
177268
177505
  if (theme2 === "system") {
@@ -177362,7 +177599,7 @@ function ZoomSync() {
177362
177599
  if (e2.key !== "band:zoom-level" || !e2.newValue) return;
177363
177600
  const level = Number.parseFloat(e2.newValue);
177364
177601
  if (!Number.isNaN(level) && level >= 0.5 && level <= 2) {
177365
- document.documentElement.style.zoom = String(level);
177602
+ applyZoomLevelToDom(level);
177366
177603
  }
177367
177604
  };
177368
177605
  window.addEventListener("storage", handleStorage);
@@ -177465,7 +177702,7 @@ function AppShell() {
177465
177702
  ),
177466
177703
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full min-w-0 overflow-hidden relative", children: [
177467
177704
  /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}),
177468
- /* @__PURE__ */ jsxRuntimeExports.jsx(DockviewInstanceManager, {}),
177705
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SharedDockviewLayout, {}),
177469
177706
  /* @__PURE__ */ jsxRuntimeExports.jsx(BrowserHostBridge, {})
177470
177707
  ] }) })
177471
177708
  ] }) });
@@ -177488,11 +177725,11 @@ function RootLayout() {
177488
177725
  ] })
177489
177726
  ] });
177490
177727
  }
177491
- const $$splitComponentImporter$7 = () => import("./index-aOrOBCQS.js");
177728
+ const $$splitComponentImporter$7 = () => import("./index-sbo2EHgw.js");
177492
177729
  const Route$7 = createFileRoute("/")({
177493
177730
  component: lazyRouteComponent($$splitComponentImporter$7, "component")
177494
177731
  });
177495
- const $$splitComponentImporter$6 = () => import("./workspace._workspaceId-BY5hpCRH.js");
177732
+ const $$splitComponentImporter$6 = () => import("./workspace._workspaceId-Be45P7LL.js");
177496
177733
  const Route$6 = createFileRoute("/workspace/$workspaceId")({
177497
177734
  component: lazyRouteComponent($$splitComponentImporter$6, "component")
177498
177735
  });
@@ -177511,11 +177748,11 @@ const FindInFileContext = reactExports.createContext({
177511
177748
  function useFindInFileContext() {
177512
177749
  return reactExports.useContext(FindInFileContext);
177513
177750
  }
177514
- const $$splitComponentImporter$5 = () => import("./workspace._workspaceId.index-BRFgw3FA.js");
177751
+ const $$splitComponentImporter$5 = () => import("./workspace._workspaceId.index-DmYHy6nH.js");
177515
177752
  const Route$5 = createFileRoute("/workspace/$workspaceId/")({
177516
177753
  component: lazyRouteComponent($$splitComponentImporter$5, "component")
177517
177754
  });
177518
- const $$splitComponentImporter$4 = () => import("./workspace._workspaceId.terminal-BhyASMi7.js");
177755
+ const $$splitComponentImporter$4 = () => import("./workspace._workspaceId.terminal-D_KPwmYr.js");
177519
177756
  const Route$4 = createFileRoute("/workspace/$workspaceId/terminal")({
177520
177757
  component: lazyRouteComponent($$splitComponentImporter$4, "component")
177521
177758
  });
@@ -177523,15 +177760,15 @@ const $$splitComponentImporter$3 = () => import("./workspace._workspaceId.code-C
177523
177760
  const Route$3 = createFileRoute("/workspace/$workspaceId/code")({
177524
177761
  component: lazyRouteComponent($$splitComponentImporter$3, "component")
177525
177762
  });
177526
- const $$splitComponentImporter$2 = () => import("./workspace._workspaceId.changes-CiekaeTG.js");
177763
+ const $$splitComponentImporter$2 = () => import("./workspace._workspaceId.changes-EoyIscxQ.js");
177527
177764
  const Route$2 = createFileRoute("/workspace/$workspaceId/changes")({
177528
177765
  component: lazyRouteComponent($$splitComponentImporter$2, "component")
177529
177766
  });
177530
- const $$splitComponentImporter$1 = () => import("./workspace._workspaceId.code.index-DRR8qo6z.js");
177767
+ const $$splitComponentImporter$1 = () => import("./workspace._workspaceId.code.index-CFbCDVph.js");
177531
177768
  const Route$1 = createFileRoute("/workspace/$workspaceId/code/")({
177532
177769
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
177533
177770
  });
177534
- const $$splitComponentImporter = () => import("./workspace._workspaceId.code._-Bi-RxK7c.js");
177771
+ const $$splitComponentImporter = () => import("./workspace._workspaceId.code._-CcX7Gt0G.js");
177535
177772
  const Route2 = createFileRoute("/workspace/$workspaceId/code/$")({
177536
177773
  component: lazyRouteComponent($$splitComponentImporter, "component")
177537
177774
  });
@@ -177764,75 +178001,77 @@ export {
177764
178001
  defineLanguageFacet as by,
177765
178002
  CompletionContext as bz,
177766
178003
  agentTypeSupportsSessionListing as c,
177767
- isLength as c$,
177768
- DockviewWorkspaceLayout as c0,
177769
- array$2 as c1,
177770
- getUserDefinedConfig as c2,
177771
- ArrowRight as c3,
177772
- ArrowUp as c4,
177773
- ArrowDown as c5,
177774
- ClipboardPaste as c6,
178004
+ Uint8Array$1 as c$,
178005
+ array$2 as c0,
178006
+ getUserDefinedConfig as c1,
178007
+ ArrowRight as c2,
178008
+ ArrowUp as c3,
178009
+ ArrowDown as c4,
178010
+ ClipboardPaste as c5,
178011
+ getCurrentZoomLevel as c6,
177775
178012
  openExternalUrl as c7,
177776
- SearchBar as c8,
177777
- getIconSVG as c9,
177778
- setToString as cA,
177779
- overRest as cB,
177780
- baseFor as cC,
177781
- baseAssignValue as cD,
177782
- baseUnary as cE,
177783
- merge$1 as cF,
177784
- isObjectLike as cG,
177785
- baseGetTag as cH,
177786
- Symbol$1 as cI,
177787
- arrayLikeKeys as cJ,
177788
- baseKeys as cK,
177789
- memoize as cL,
177790
- isArguments as cM,
177791
- copyObject as cN,
177792
- getPrototype as cO,
177793
- cloneArrayBuffer as cP,
177794
- cloneTypedArray as cQ,
177795
- getTag as cR,
177796
- nodeUtil as cS,
177797
- copyArray as cT,
177798
- isBuffer as cU,
177799
- cloneBuffer as cV,
177800
- initCloneObject as cW,
177801
- Stack as cX,
177802
- MapCache as cY,
177803
- Uint8Array$1 as cZ,
177804
- isTypedArray as c_,
177805
- registerIconPacks as ca,
177806
- unknownIcon as cb,
177807
- isObject$1 as cc,
177808
- isIterateeCall as cd,
177809
- keysIn as ce,
177810
- eq as cf,
177811
- isArrayLike as cg,
177812
- isArray as ch,
177813
- identity as ci,
177814
- isIndex as cj,
177815
- assignValue as ck,
177816
- constant$2 as cl,
177817
- interpolateNumber as cm,
177818
- color as cn,
177819
- interpolateRgb as co,
177820
- interpolateString as cp,
177821
- styles2String as cq,
177822
- isLabelStyle as cr,
177823
- Rgb as cs,
177824
- rgbConvert as ct,
177825
- define as cu,
177826
- extend$2 as cv,
177827
- Color as cw,
177828
- nogamma as cx,
177829
- hue as cy,
177830
- dayjs2 as cz,
178013
+ subscribeToZoomChanges as c8,
178014
+ SearchBar as c9,
178015
+ hue as cA,
178016
+ dayjs2 as cB,
178017
+ setToString as cC,
178018
+ overRest as cD,
178019
+ baseFor as cE,
178020
+ baseAssignValue as cF,
178021
+ baseUnary as cG,
178022
+ merge$1 as cH,
178023
+ isObjectLike as cI,
178024
+ baseGetTag as cJ,
178025
+ Symbol$1 as cK,
178026
+ arrayLikeKeys as cL,
178027
+ baseKeys as cM,
178028
+ memoize as cN,
178029
+ isArguments as cO,
178030
+ copyObject as cP,
178031
+ getPrototype as cQ,
178032
+ cloneArrayBuffer as cR,
178033
+ cloneTypedArray as cS,
178034
+ getTag as cT,
178035
+ nodeUtil as cU,
178036
+ copyArray as cV,
178037
+ isBuffer as cW,
178038
+ cloneBuffer as cX,
178039
+ initCloneObject as cY,
178040
+ Stack as cZ,
178041
+ MapCache as c_,
178042
+ ZOOM_CSS_VAR as ca,
178043
+ getIconSVG as cb,
178044
+ registerIconPacks as cc,
178045
+ unknownIcon as cd,
178046
+ isObject$1 as ce,
178047
+ isIterateeCall as cf,
178048
+ keysIn as cg,
178049
+ eq as ch,
178050
+ isArrayLike as ci,
178051
+ isArray as cj,
178052
+ identity as ck,
178053
+ isIndex as cl,
178054
+ assignValue as cm,
178055
+ constant$2 as cn,
178056
+ interpolateNumber as co,
178057
+ color as cp,
178058
+ interpolateRgb as cq,
178059
+ interpolateString as cr,
178060
+ styles2String as cs,
178061
+ isLabelStyle as ct,
178062
+ Rgb as cu,
178063
+ rgbConvert as cv,
178064
+ define as cw,
178065
+ extend$2 as cx,
178066
+ Color as cy,
178067
+ nogamma as cz,
177831
178068
  Route$4 as d,
177832
- Set$1 as d0,
177833
- createAssigner as d1,
177834
- isPrototype as d2,
177835
- router as d3,
178069
+ isTypedArray as d0,
178070
+ isLength as d1,
178071
+ Set$1 as d2,
178072
+ createAssigner as d3,
178073
+ isPrototype as d4,
178074
+ router as d5,
177836
178075
  Route$2 as e,
177837
178076
  useNavigate as f,
177838
178077
  useDiffStatsContext as g,